Tutorials/Power Apps/Power Apps Deep Linking: Navigate Directly to Records from Email Notifications
Power Appsintermediate

Power Apps Deep Linking: Navigate Directly to Records from Email Notifications

Craft a personalized URL that opens a canvas app to a specific record, allowing recipients to view or edit details with one click.

NA
Narmer Abader
@narmer · Published June 3, 2026

When a colleague receives an automated email from Power Apps, clicking a link that opens the app exactly to the item they need can save minutes of navigation. Deep links make this possible by passing a record identifier as a URL parameter. In this article you’ll build a simple request‑tracking app, trigger an email from Power Automate, and handle the incoming parameter so the app opens on the correct record—no extra clicks required.

We’ll reuse the same app for both creating new items and viewing existing ones. The form mode will switch automatically when a deep link is detected, and a separate screen will list all records.

Scenario: IT Request Management

Imagine your company uses a canvas app called IT Self‑Service Portal where employees submit hardware or software requests. Each request is stored in a SharePoint list named IT Requests. After submission, the employee receives a confirmation email with a deep link back to that specific request. If they ever need to check the status or edit the details, one click opens the app in view mode.

The SharePoint list has these columns (default columns ID, Created, Created By are used as is):

ColumnTypeNotes
TitleSingle line of textShort summary of the request
DepartmentChoiceOptions: Finance, HR, IT, Marketing, Ops
IssueDescriptionMultiple lines of textFull description
UrgencyChoiceLow, Medium, High, Critical

You can add any other columns you need, but these are enough for our example.

Setting Up the Canvas App

  1. Create a new canvas app from blank (phone or tablet, whichever suits your design).
  2. Connect the app to your IT Requests SharePoint list via the data source panel.
  3. Insert an Edit form and set its data source to IT Requests. In the form’s Fields pane, add only Title, Department, IssueDescription, and Urgency. The default fields (ID, Created, Created By) will be generated automatically when a new record is saved.
  4. Change the form’s DefaultMode to FormMode.New so it starts ready for a new entry.

Add a label at the top of the screen to serve as a dynamic title bar.

powerfxTitle bar Text property
If(
  EditForm1.Mode = FormMode.New,
  "New Request",
  "Request #" & varRequest.ID
)

Submitting the Form and Capturing the Record

Place a Button below the form with the text “Submit”. Set its OnSelect to:

powerfxSubmit button OnSelect
SubmitForm(EditForm1)

In the form’s OnSuccess property, store the newly created record in a variable and switch the form to view mode, then show a success notification:

powerfxEdit form OnSuccess
Set(varRequest, EditForm1.LastSubmit);
ViewForm(EditForm1);
Notify("Your request has been saved.", NotificationType.Success);

Set the form’s Item property to varRequest so it knows what to display in view mode.

Finally, hide the Submit button when the form is not in new mode by setting its Visible property to:

powerfxSubmit button Visible
EditForm1.Mode = FormMode.New

Save and publish your app. Then go to make.powerapps.com, click the three dots (⋯) next to IT Self‑Service Portal, and choose Details. Copy the Web link (it looks something like the example below) and keep it ready for the next step.

textExample web link
https://apps.powerapps.com/play/d77ba81c-d7e4-4131-bb06-12b172225819?tenantId=f1b8b509-50a4-4a5c-8e48-bf3d3e7c10ed

The web link includes your app ID and tenant ID. Do not share this URL publicly—it can be used to open the app.

Creating the Automated Email with Power Automate

We’ll build a flow that triggers each time a new item is added to the IT Requests list and sends an email containing a deep link to that item.

  1. In Power Automate, create a new automated cloud flow.
  2. Set the trigger to When an item is created and point it to your SharePoint list.
  3. Add a Compose (Data Operation) action to build the email body in HTML. In the Inputs field, paste the HTML below, replacing the <a> href value with your own web link. The dynamic content @{triggerOutputs()?['body/ID']} appends the record’s ID as a query parameter named requestid.
htmlCompose action – email body
<html>
<body>
You submitted an IT request. To review or update it, click the link below.<br><br>
<a href="https://apps.powerapps.com/play/d77ba81c-d7e4-4131-bb06-12b172225819?tenantId=f1b8b509-50a4-4a5c-8e48-bf3d3e7c10ed&requestid=@{triggerOutputs()?['body/ID']}">View Request</a>
</body>
</html>
  1. Add a Send an email (V2) action. Fill in the recipient, subject, and set the Body to the output of the Compose step.

Save and close the flow. It will run automatically after a new item is created.

When a user opens the app via the deep link, the URL contains the requestid parameter. We need the app to detect that parameter, look up the corresponding record, and switch the form to view mode.

Place the following code in the app’s OnStart property (accessible from the App tree):

powerfxApp OnStart
Set(
  varRequest,
  LookUp(
      'IT Requests',
      ID = Value(Param("requestid"))
  )
);
If(
  !IsBlank(varRequest),
  ViewForm(EditForm1)
)

Param("requestid") returns the value from the query string as text; Value() converts it to a number for comparison with the ID column. If a matching record is found, the form switches to view mode and displays that record.

Testing the deep link

You can test by sending yourself an email with the deep link or by manually adding &requestid=1 to the web link URL in a browser. The app must be published and you must have permissions to the SharePoint list.

If you want to give users a full list of their requests, add a new screen with a Gallery connected to the IT Requests list. Use a layout that shows Title, Department, and Urgency. In the gallery’s OnSelect, navigate to the form screen and load the selected item:

powerfxGallery OnSelect
Set(varRequest, ThisItem);
EditForm(EditForm1);
Navigate(RequestFormScreen, Fade);

Add an “+” icon to the gallery screen to create a new request, with OnSelect setting the form back to new mode and navigating to the form screen:

powerfxNew request icon OnSelect
NewForm(EditForm1);
Navigate(RequestFormScreen, Fade);

On the form screen, you may want a back button to return to the gallery. Its OnSelect could be Back() or Navigate(GalleryScreen).

Security and Delegation Considerations

  • Permissions: Only users who have access to the SharePoint list will be able to view the record. The deep link does not grant additional access.
  • Data Exposure: The app ID and tenant ID are visible in the deep link. Treat the full URL as sensitive information.
  • Delegation: The LookUp function in OnStart delegates correctly for the ID column, so no delegation warning appears.
  • Param() function: It returns an empty string if the parameter is not present. Always check for blankness before using the value.

Common Mistakes and Troubleshooting

IssueLikely CauseFix
App opens in new mode instead of showing the recordOnStart code not saved/published, or parameter name mismatchVerify Param("requestid") matches the query string in the email link
Email contains a broken linkWeb link is incorrect or app is not publishedCopy the correct link from app details and publish the app
Flow does not triggerList permissions or trigger configurationCheck the flow run history; ensure the connection is valid
Record not found when clicking the linkThe ID was passed as text and not converted to numberUse Value(Param("requestid")) in the LookUp

Final Recommendation

Deep links turn a one‑way notification into an interactive experience. For any app where users need to quickly access a specific record from an email, this pattern is simple to implement and highly effective. Always test with a published app and verify that the parameter name is consistent between the flow and the OnStart code. If your app has multiple screens, consider adding logic in OnStart to navigate to the appropriate screen based on the presence of the parameter.

References