Microsoft Dynamics 365
Send first-party server-side events to Microsoft Dynamics 365 Customer Insights - Journeys as custom triggers. Each event raises a trigger that can start or advance a real-time customer journey (order confirmation, abandoned cart, sign-up nurture) without any client-side tag.
This integration is currently in alpha. Configuration and behaviour may change.
Prerequisites
Complete these steps in Dynamics 365 and Microsoft Entra ID before configuring Signal.
Create a custom trigger
In Customer Insights - Journeys, open the Triggers section and select + New trigger. Choose When a customer interacts with a website/app, give the trigger a name (e.g. “Order Completed”), and define any attributes you want the journey to act on (e.g. order total, currency, product name). Bind the trigger to a Customer Insights - Data profile so it can use the contact-point email and phone fallbacks.
Once the trigger is created, open Go to code snippet and note the Custom API unique name — it is prefixed msdynmkt_ (e.g. msdynmkt_OrderCompleted). You will need this exact name.
Find your environment host
Your Dynamics environment host is the domain of your environment URL, e.g. contoso.api.crm.dynamics.com or a regional host like contoso.crm4.dynamics.com. You can confirm it under Settings > Advanced settings > Developer Resources. Copy the host without https:// and without a trailing slash.
Register an Entra app for server-to-server access
In the Microsoft Entra admin centre, register a new application:
- Under App registrations, select New registration, give it a name (e.g. “Datafly Signal”), and register it.
- Copy the Application (client) ID and the Directory (tenant) ID from the Overview page.
- Under Certificates & secrets, create a New client secret and copy its value immediately.
Add the app as an application user in Dynamics
In the Power Platform admin centre, open your environment, go to Settings > Users + permissions > Application users, and add a New app user for the Entra app registration above. Assign a security role that grants privilege to invoke the trigger’s Custom API (e.g. a role with the required custom-API and message-process privileges). Without this step the API returns 403.
Configuration
| Field | Description |
|---|---|
Dynamics Org Host (org_url_host) | Environment host, e.g. contoso.api.crm.dynamics.com. No scheme, no trailing slash. |
Entra Tenant ID (tenant_id) | Your Microsoft Entra directory/tenant ID. |
Application (Client) ID (client_id) | The Entra app registration’s Application (client) ID. |
Client Secret (client_secret) | A client secret for the app registration. |
Trigger (Custom API) Name (trigger_name) | The msdynmkt_-prefixed Custom API name of the trigger to raise. |
Configure in Signal
Add the integration
In your Signal management UI, open the pipeline you want to deliver from and add the Microsoft Dynamics 365 integration from the catalog.
Enter your credentials
Fill in the org host, tenant ID, client ID, client secret, and the trigger name from the prerequisites.
Select a blueprint preset and map events
Choose the Default preset. Map your Signal events to the custom attributes you defined on the trigger — the attribute names in the preset (msdynmkt_ordertotal, msdynmkt_currency, etc.) are illustrative and should be renamed to match your trigger. The system signal fields and contact-point fallbacks are pre-mapped.
Save and publish the pipeline
Save the integration and publish the pipeline. Events now raise your custom trigger in real time.
API Endpoint
Signal delivers each event as a Dataverse Custom API action invocation:
POST https://{org_url_host}/api/data/v9.2/{trigger_name}For example:
POST https://contoso.api.crm.dynamics.com/api/data/v9.2/msdynmkt_OrderCompletedAuthentication uses the OAuth 2.0 client-credentials grant against Microsoft Entra ID. Signal mints a token at https://login.microsoftonline.com/{tenant_id}/oauth2/v2.0/token with the scope https://{org_url_host}/.default and sends it as Authorization: Bearer <token>, along with OData-MaxVersion: 4.0 and OData-Version: 4.0. A successful invocation returns HTTP 204 No Content.
Identity Signals
Dynamics 365 is a CRM and marketing-orchestration destination, so identity is sent in plaintext (not hashed) — Dynamics matches contacts and leads on plaintext email and uses it to deliver journey emails and texts.
| Signal source | Dynamics field | Notes |
|---|---|---|
user_id | msdynmkt_profileid, msdynmkt_signaluserauthid | The Customer Insights - Data profile id (or contact/lead id) that the trigger is bound to. |
$traits.email | contactpoint_email | Normalised (trimmed + lowercased). Fallback contact point used to reach the customer by email. |
$traits.phone | contactpoint_phone | Normalised to E.164. Fallback contact point used to reach the customer by text. |
Timestamps (msdynmkt_signaltimestamp, msdynmkt_signalingestiontimestamp) are sent as UTC ISO-8601. Local time or null values cause time-based journey branches to compute incorrectly.
Event Mapping
The Default preset maps common Signal events to a custom trigger. Rename the msdynmkt_* attribute targets to match the attributes you defined on your trigger.
| Signal event | Raised as |
|---|---|
Signed Up | the configured custom trigger |
Lead Generated | the configured custom trigger |
Product Added | the configured custom trigger |
Order Completed | the configured custom trigger |
Events not in the map are dropped (defaults.action: drop).
Example
A datafly.track call on your site:
datafly.track('Order Completed', {
order_id: 'ORD-10231',
revenue: 129.00,
currency: 'GBP'
}, {
traits: { email: 'Jane@Example.com', phone: '07700 900123' }
})is delivered to Dynamics 365 as:
POST https://contoso.api.crm.dynamics.com/api/data/v9.2/msdynmkt_OrderCompleted
Authorization: Bearer eyJ0eXAi...
Content-Type: application/json
OData-MaxVersion: 4.0
OData-Version: 4.0
{
"msdynmkt_profileid": "b6a8c2e0-1234-4f9a-9c3d-aa11bb22cc33",
"msdynmkt_signaluserauthid": "b6a8c2e0-1234-4f9a-9c3d-aa11bb22cc33",
"msdynmkt_signaltimestamp": "2026-06-06T14:30:00Z",
"msdynmkt_signalingestiontimestamp": "2026-06-06T14:30:00Z",
"contactpoint_email": "jane@example.com",
"contactpoint_phone": "+447700900123",
"msdynmkt_orderid": "ORD-10231",
"msdynmkt_ordertotal": 129.00,
"msdynmkt_currency": "GBP"
}Testing
Send a test event
Trigger the mapped event on your site (or use Signal’s Event Debugger) and watch the delivery in Signal — a successful trigger returns HTTP 204.
Confirm the trigger fired in Dynamics
In Customer Insights - Journeys, open the trigger and check its analytics/insights to confirm signals are being received. A published journey using the trigger should show contacts entering it.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
401 Unauthorized | Bad client secret, wrong tenant ID, or wrong scope. | Verify tenant_id, client_id, client_secret, and that org_url_host matches the environment the app user lives in. |
403 Forbidden | The Entra app is not an application user, or its security role lacks privilege to invoke the trigger Custom API. | Add/repair the application user and assign a role with the required custom-API privileges. |
404 Not Found | Wrong org host or trigger name. | Confirm org_url_host and that trigger_name matches the msdynmkt_ Custom API name exactly. |
400 Bad Request | Unknown attribute name, or a null required system field. | Ensure mapped attribute names match the trigger’s attributes and that user_id / email are present. |
429 Too Many Requests | Dataverse service-protection limit (6,000 requests per 5-minute window). | Signal retries with backoff; reduce volume or split across triggers if sustained. |
| Trigger fires but journey doesn’t start | Customer can’t be resolved. | Ensure contactpoint_email is populated and the journey/trigger are published and Ready to use. |