Dotdigital
Dotdigital is a customer engagement platform. Datafly Signal writes your events to Dotdigital as insight (transactional) data on the contact (POST /v2/contacts/transactional-data/{collectionName}), for programs, automations and segments.
Why route Dotdigital through Datafly Signal
- Events come from your server, not the browser. They reach Dotdigital even when a tracker blocker or a failed page unload would have dropped a client-side call.
- Delivery is queued and retried. Signal buffers to Kafka and retries on 429 or a transient failure rather than dropping the event; a permanent rejection goes to the dead-letter queue with the vendor’s reason.
- One consent decision governs every destination. Dotdigital is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Get your Dotdigital credentials
Create an API user
In Dotdigital go to Settings > Access > API users and create one. Note its email address and password.
Note your region
The host of your API user page tells you the region: r1, r2 or r3.
Choose a collection name
Letters, digits and underscores, not starting with a digit. Use one collection per preset (for example signal_events); for the Retail preset use orders, the collection name Dotdigital’s commerce features read.
Configuration
| Field | Required | Description |
|---|---|---|
region | Yes | Your Dotdigital region prefix (e.g. r1, r2, r3). This forms the API host https://{region}-api.dotdigital.com. Find it in the host portion of your Dotdigital app URL or your API user setup page. |
api_user_email | Yes | The email address of a Dotdigital API user. Create one under Settings > Access > API users. Used as the Basic Auth username. |
api_user_password | Yes | The password for the Dotdigital API user. Used as the Basic Auth password. |
collection_name | Yes | The transactional-data collection these events are written to. Alphanumeric and underscores only, no spaces, must not start with a digit, max 255 characters. Use different collections to keep pipelines separate. |
Management UI setup
- Go to Integrations in the sidebar and open the Integration Library tab.
- Find Dotdigital under Marketing Automation and click Install.
- Choose a preset, enter the fields above and click Install Integration.
Management API setup
curl -X POST http://localhost:8084/v1/admin/integration-catalog/dotdigital/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Dotdigital",
"variant": "default",
"config": {
"region": "your_region",
"api_user_email": "your_api_user_email",
"api_user_password": "your_api_user_password",
"collection_name": "your_collection_name"
},
"delivery_mode": "server_side"
}'What Signal sends
An example request, rendered from the default preset for purchase:
POST https://r1-api.dotdigital.com/v2/contacts/transactional-data/signal_events
{
"contactIdentifier": "neill@example.com",
"json": {
"coupon": "AUTUMN10",
"currency": "GBP",
"eventName": "order_completed",
"orderId": "ORD-1001",
"pageUrl": "https://www.example.co.uk/shop/jackets",
"products": [
{
"category": "Jackets",
"price": 129.99,
"productId": "SKU-1",
"productName": "Parka Jacket",
"quantity": 2
},
{
"category": "Hats",
"price": 20,
"productId": "SKU-2",
"productName": "Wool Hat",
"quantity": 1
}
],
"revenue": 279.98,
"shipping": 4.99,
"tax": 46.66,
"timestamp": "2025-09-22T00:13:20Z",
"userId": "crm-user-7"
},
"key": "msg-m2-1"
}| Field | Source |
|---|---|
key | The record key: the Signal message ID, or the order ID for order records (Retail preset), so a retried order is the same record. |
contactIdentifier | The contact’s email from identify() traits, trimmed and lower-cased. Required. |
json | The event name (eventName), user ID, timestamp, page URL and the event’s properties; products as a list; currency upper-cased. Retail order records use the names of Dotdigital’s orders schema: order_total, order_subtotal (sum of price x qty), currency, purchase_date, delivery_total, couponCode and products (sku, name, category, price, qty). |
Dotdigital matches the contact on the email address and accepts no hashed identifier, so it is sent in plain text. Names are not copied into records: the contact already holds them. An event without an email is not sent.
Presets
| Preset | Signal event → vendor event |
|---|---|
| Default | search, view_item → product_viewed, add_to_cart, begin_checkout → checkout_started, purchase → order_completed, refund → order_refunded, sign_up → signed_up, generate_lead → lead_generated |
| Retail | purchase → order |
Events not listed are not sent. Each preset is a starting point: add, rename or remove mappings on the installed integration.
Notes and limits
- The v2 transactional-data call is marked deprecated by Dotdigital in favour of the Insight Data v3 service; no sunset date is published. The move to v3 is tracked in #1493.
- Page views are not sent: the Dotdigital tag records site browsing, and this call is in the low call-rate tier.
Consent
Marketing-automation integrations have no consent category by default. Assign the marketing category when you install Dotdigital, so an event is delivered only when the visitor has granted it. Cookie-banner consent is not email or SMS opt-in: keep messaging opt-in in Dotdigital.
Verify it’s working
- Open the integration in the Signal Management UI and watch Live Events while you trigger a mapped event.
- Confirm a 2xx response from Dotdigital.
- Find the contact in Dotdigital and check the event or record arrived.
Troubleshooting
| Symptom | Resolution |
|---|---|
401 | The API user email or password is wrong. |
404 | Wrong region, or an invalid collection name. |
429 | Your account’s call-rate tier is exhausted; Signal retries with backoff. |