IntegrationsCRMMicrosoft Dynamics 365

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:

  1. Under App registrations, select New registration, give it a name (e.g. “Datafly Signal”), and register it.
  2. Copy the Application (client) ID and the Directory (tenant) ID from the Overview page.
  3. 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

FieldDescription
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_OrderCompleted

Authentication 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 sourceDynamics fieldNotes
user_idmsdynmkt_profileid, msdynmkt_signaluserauthidThe Customer Insights - Data profile id (or contact/lead id) that the trigger is bound to.
$traits.emailcontactpoint_emailNormalised (trimmed + lowercased). Fallback contact point used to reach the customer by email.
$traits.phonecontactpoint_phoneNormalised 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 eventRaised as
Signed Upthe configured custom trigger
Lead Generatedthe configured custom trigger
Product Addedthe configured custom trigger
Order Completedthe 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

SymptomLikely causeFix
401 UnauthorizedBad 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 ForbiddenThe 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 FoundWrong org host or trigger name.Confirm org_url_host and that trigger_name matches the msdynmkt_ Custom API name exactly.
400 Bad RequestUnknown 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 RequestsDataverse 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 startCustomer can’t be resolved.Ensure contactpoint_email is populated and the journey/trigger are published and Ready to use.

Sources