One of my clients tracks Power Platform training in a SharePoint list. Each time an employee enrolls in a course, a new item is added with their name and the course they chose.
For a long time, someone in HR then had to find the right course material, copy its address and paste it into the item by hand, which was slow and easy to get wrong. We replaced that step with a small flow that builds the correct link for the selected course and saves it in the list automatically.
Along the way, I found out that Power Automate’s standard actions can only do half the job with a Hyperlink column: they can set the address, but not the friendly text people click on. In this tutorial, I’ll show you how to do both.
Quick answer: For a Hyperlink column, Update item can set the web address. To also set the text people see, use Send an HTTP request to SharePoint with method POST, the headers X-HTTP-Method: MERGE and IF-MATCH: *, and a body that sets the column’s Url and Description. For a link to the item itself, use the trigger’s Link to item.
I’ll walk through both methods, show you how to find the internal names the HTTP request needs, and finish with how to put a clickable link in an email.
The example list
The list is called Power Platform Training Records and has four columns: Employee Name (Person), Training Course (Choice), Date Enrolled (Date and time) and Training Resource Link (Hyperlink). The flow’s job is to fill in the last one.

Each course has its own SharePoint site, and the addresses follow a predictable pattern: https://contoso.sharepoint.com/sites/powerapps/..., .../sites/powerautomate/... and so on. That pattern is what lets the flow build the link from the course name.
Step 1: Build the link
Create an automated cloud flow with the SharePoint trigger When an item is created, and select your Site Address and List Name.

Next, add a Compose action that builds the address from the selected course. The expression inside it removes the spaces from the course name and makes it lowercase, so Power Automate becomes powerautomate:
https://contoso.sharepoint.com/sites/@{toLower(replace(triggerBody()?['TrainingCourse/Value'], ' ', ''))}/Forms/AllItems.aspx

For the course Power Automate, the result is https://contoso.sharepoint.com/sites/powerautomate/Forms/AllItems.aspx. Your own addresses will be different, so adjust the pattern to match how your sites or pages are named.
Step 2, option A: Set only the address with Update item
If you only need the address, the simplest approach is the SharePoint Update item action. Select the same site and list, set Id to the trigger’s ID, and put the Compose output in the Hyperlink column. The list then shows the full address as the link text.
That works, but long addresses look messy in a list, and there’s no field in Update item for a separate display text (the description). If you want a friendly label such as Open training material, use option B instead.
Step 2, option B: Set the address and display text with an HTTP request
For this, add the SharePoint action Send an HTTP request to SharePoint. It talks directly to SharePoint’s REST API, which lets you set both parts of the Hyperlink column. Fill it in like this:
| Field | Value |
|---|---|
| Site Address | Your site |
| Method | POST |
| Uri | _api/web/lists/getbytitle('Power Platform Training Records')/items(@{triggerBody()?['ID']}) |
| Headers | The four headers below |
| Body | The JSON below |
These are the headers:
Content-Type: application/json;odata=verbose
Accept: application/json;odata=verbose
X-HTTP-Method: MERGE
IF-MATCH: *
And this is the body. Url takes the address from the Compose action, and Description is the text people will see in the list:
{
"__metadata": { "type": "SP.Data.Power_x0020_Platform_x0020_Training_x0020_RecordsListItem" },
"TrainingResourceLink": {
"Url": "@{outputs('Compose')}",
"Description": "Open training material"
}
}

The combination of X-HTTP-Method: MERGE and IF-MATCH: * tells SharePoint to update only the columns in the body, whatever the item’s current version is. It’s the standard way to update an item through REST, as described in Microsoft’s list items REST documentation.
Save the flow and test it by adding an item to the list. When the run succeeds, refresh the list, and you’ll see the new link with its friendly text:

How to find the two internal names
The body of the HTTP request needs two names that aren’t the ones you see in the list, and getting either of them wrong is the most common reason the request fails.
The first is the list’s entity type, which looks like SP.Data.…ListItem. To find it, run a Send an HTTP request to SharePoint with method GET and the Uri _api/web/lists/getbytitle('Your List')?$select=ListItemEntityTypeFullName, then copy the value from the run output. You’ll notice that spaces in list names become _x0020_.
The second is the column’s internal name. Open List settings, select the column, and look at the end of the page address, which ends with something like Field=TrainingResourceLink. It’s the name the column had when it was first created, without spaces, and it doesn’t change if you rename the column later.
Microsoft’s guidance on working with Send an HTTP request to SharePoint has more examples of this action if you want to go further.
Example 2: Use the item title as the link text
In another list, called Resources, I wanted each link to show the resource’s own name. The approach is the same: store the name without spaces in a variable (here varTitle), use it to build the address, and put the original title in Description. This expression gives you the name without spaces:
toLower(replace(triggerOutputs()?['body/Title'], ' ', ''))
And this is the body of the HTTP request:
{
"__metadata": { "type": "SP.Data.ResourcesListItem" },
"Website": {
"Url": "https://www.@{variables('varTitle')}.com/",
"Description": "@{triggerOutputs()?['body/Title']}"
}
}

If you’d rather every link said the same thing, such as Click here, just put that text in Description instead:

Link to the list item itself
Sometimes the link you need isn’t to an outside page but to the list item, for example so an approver can open it from an email. You don’t need to build anything for that: SharePoint triggers such as When an item is created include Link to item in the dynamic content. If you ever do need to build it yourself, the address of the item’s display form looks like this:
concat('https://contoso.sharepoint.com/sites/HR/Lists/TrainingRecords/DispForm.aspx?ID=', triggerOutputs()?['body/ID'])
Add a clickable link to an email
The body of Send an email (V2) is HTML, so instead of pasting a long address, you can give people a proper link with friendly text. Switch the email body to code view and use something like this:
<p>Your training is booked: <a href="@{outputs('Compose')}">open the course material</a>.</p>
<p><a href="[Link to item]">View your enrollment</a></p>
Replace [Link to item] with the Link to item dynamic content from the trigger. The email then shows short, readable link text instead of long addresses.
Troubleshooting
If the HTTP request fails with 400 Bad Request and a message that the type SP.Data… doesn’t exist, the entity type in __metadata is wrong. Get the exact value with the GET request described above. If the message says the property … does not exist, you’ve used the column’s display name instead of its internal name.
When the link works but opens the wrong page, check the Compose output in the run history. A space or capital letter in the course name changes the address, so the pattern may need another replace().
Finally, if the flow runs twice or keeps looping, you’re probably using the When an item is created or modified trigger. The update the flow makes counts as a modification and triggers the flow again. Use When an item is created instead, or add a trigger condition that skips items that already have a link.
More ways to update SharePoint lists with Power Automate:
- How to Update SharePoint List Items Using Power Automate?
- How to Update Only One Field in a SharePoint List Item Using Power Automate?
- How to Add Attachments to SharePoint List Items using Power Automate? [5 Different Examples]
- How to Add Comments to SharePoint List Items Using Power Automate?
- How to Update SharePoint List Items Based On Condition Using Power Automate?
- How to Use Power Automate Send an Email (V2) Action?
Frequently Asked Questions
How do I add a hyperlink to a SharePoint list with Power Automate?
Use Update item and put the web address in the Hyperlink column. To also set the display text, use Send an HTTP request to SharePoint with a MERGE request that sets the column’s Url and Description.
Can Power Automate set the description of a Hyperlink column?
Not with Create item or Update item. Use Send an HTTP request to SharePoint with method POST, the headers X-HTTP-Method: MERGE and IF-MATCH: *, and a JSON body with Url and Description.
How do I get a link to a SharePoint list item in Power Automate?
Use the Link to item dynamic content from the SharePoint trigger. You can also build it with concat() and the list’s DispForm.aspx?ID= address.
How do I make a link clickable in a Power Automate email?
In Send an email (V2), switch the body to code view and write an HTML link such as <a href=”URL”>link text</a>, with the URL from dynamic content.
Where do I find the list entity type for the HTTP request?
Send a GET request to _api/web/lists/getbytitle(‘Your List’)?$select=ListItemEntityTypeFullName and use the value it returns in __metadata type.

I have worked with Microsoft technologies for more than 18 years, including SharePoint, Microsoft 365 and the Power Platform (Power Apps, Power Automate and Power BI), at companies like HP, TCS and KPIT. I started EnjoySharePoint in 2011 to share the solutions I build in real projects with readers in the United States, Canada, the United Kingdom, Australia, New Zealand and beyond. Microsoft has recognized this work with the Microsoft MVP award 13 times since 2014.