Dynamics 365 Integration
Last updated: September 18, 2026
What's new in your Dynamics 365 integration
Your Microsoft Dynamics 365 integration now matches the depth of your Salesforce and HubSpot connections. If Dynamics is already connected to Iris, everything below is already live in your account — there's nothing to install or turn on.
Already live — no setup needed
Unlink a project from its Dynamics Opportunity whenever you need to, not just link one.
Link completed projects to an Opportunity — previously only open, in-progress projects could be linked.
Link and unlink from Win/Loss, right from the new Dynamics column, in addition to the project page.
Daily status sync keeps mapped fields and Won/Lost status current automatically, even if no one opens the project in Iris.
More reliable Won/Lost tracking — a background issue that could reset a Dynamics deal's status back to "Open" has been fixed.
One note on scope: Project Hubs (folders) aren't part of Win/Loss linking for Dynamics yet, the same as Salesforce today. If your projects are organized in a hub, link each child project individually — the hub itself stays read-only for Win/Loss. And the connection is one-way: Iris reads your Opportunity's stage, it doesn't write anything back onto the Opportunity record itself.
1. Azure — leave the existing Web callbacks
HeyIRIS.AI already had Web redirect URIs for Settings → Connect (…/api/integrations/dynamics/callback). Do not delete these.
2. Azure — add an SPA redirect for the Dynamics origin
The Opportunity card is MSAL in the browser. Add a Single-page application URI that is the Dynamics org URL with no path.
Trial: https://orge73b82a6.crm.dynamics.com
Filter the list (here: crm.dynamics.com) so you can confirm it landed as Single-page application, not Web.
3. Azure — Expose an API: access_as_user
Same app → Expose an API:
Application ID URI:
api://bcc39c1b-3413-4cad-9cb2-c3f711fad63cScope name (exact):
access_as_userAdmin consent display name:
Access HeyIRIS.AI as the signed-in userWho can consent: Admins only is fine
State: Enabled
Authorized client applications: leave empty
The widget requests api://<client-id>/access_as_user.
Copy Application (client) ID and the Entra tenant ID (f0f51b18-37df-4743-9cac-a5b2497e95ba for IrisAITech) for the HTML DEFAULTS.
4. Stage Iris — Dynamics already connected
On stagev2.heyiris.ai → Settings → Integrations, the Heyiris org already shows Dynamics 365 → Connected (connected as tucker@IrisAITech.onmicrosoft.com). Skip reconnect.
The card still authenticates as whoever is signed into Dynamics. Noah’s Dynamics UPN is noah@IrisAITech.onmicrosoft.com; his Iris account is noah@heyiris.ai. Until that UPN exists as an Iris user in this org, the card will show invite / not-a-member.
5. Edit DEFAULTS on a copy of the HTML
Do not commit stage values to git. Copy integration/dynamics/webresource/iris_opportunity_status.html and set:
irisApiBase must be stagev2-api (Django), not stagev2.heyiris.ai. Leave irisAppBase empty so Open in Iris derives the frontend.
Keep the sibling msal-browser.min.js from the same folder. Never a CDN.
Trial copies used on 2026-09-15:
6. Dynamics — open Customization (not Sales Hub)
Sales Hub cannot edit web resources (“You don’t have access to edit Web Resources” / no main form). Use classic customization:
Dynamics gear → Advanced Settings → Customizations.
7. Open Solutions, then Default Solution
Solutions lists managed first-party packages plus unmanaged tenant work (Common Data Services Default Solution, and Default Solution).
Open Default Solution (or Customize the System). Left nav → Components → Web Resources.
On the trial tenant the two files were created here with publisher prefix new_:
new_dynamics/iris_opportunity_status.html(Webpage / HTML) — Iris Opportunity Statusnew_dynamics/msal-browser.min.js(Script / JScript) — Iris MSAL Browser
They must stay siblings under the same prefix. Toolbar Publish All Customizations after upload.
In the UI you would New twice, name dynamics/… (do not type new_ yourself), upload the edited HTML then the JS, Save, Publish. This trial’s files were published into that same Default/Active layer.
8. Open the Opportunity main form
Still in Default Solution: Entities → Opportunity → Forms. Open the Opportunity main form Sales Hub uses (not a quick-create).
9. Insert → Web Resource
Select the Insert ribbon. Web Resource sits in the IFRAME group.
Add Web Resource → lookup Iris Opportunity Status (new_dynamics/iris_opportunity_status.html). Leave Name/Label as-is. Check Visible by default.
Pass record object-type code and unique identifier as parameters is on General, below the fold — scroll the dialog. Leave Custom Parameter empty.
Formatting: one column, about 6 rows, scrolling As necessary. That checkbox is not on this tab.
After OK, the canvas shows an Iris tab with new_dynamics/iris_opportunity_status.html.
Drag Iris so it sits immediately after Summary. Save → Publish.
10. If Iris is last, Sales Hub hides it
A trailing tab does not appear on the record. It is not in Related either.
After the reorder, the live form is Summary | Iris | Products | Quotes | Files | Related.
11. Open a live Opportunity
Click Iris. MSAL opens Pick an account for whoever is signed into Dynamics (noah@IrisAITech.onmicrosoft.com here).
Until that UPN exists as an Iris user in the connected org, the card shows invite / not a member. Do not expect noah@heyiris.ai to match this Dynamics login.
Trial IDs
Item | Value |
|---|---|
Dynamics org |
|
Azure app |
|
Entra tenant |
|
HTML web resource |
|
MSAL web resource |
|
Opportunity main form |
|
Test opportunity |
|