Dotdigital
Datafly Signal delivers events to Dotdigital server-to-server, writing each event as a transactional (insight) data record attached to a contact. Dotdigital programs, automations and segments can then react to the first-party activity Signal captures, without a client-side Dotdigital tracking script.
Prerequisites
Before configuring Dotdigital in Signal you need a Dotdigital account, an API user, and a transactional-data collection name.
Find your region
Dotdigital hosts each account in a region. The API host is https://{region}-api.dotdigital.com, where {region} is a short prefix such as r1, r2, or r3. You can read it from the host portion of your Dotdigital app URL or your API user setup page.
Create an API user
- In Dotdigital, go to Settings > Access > API users.
- Click New user.
- Dotdigital generates an email address of the form
apiuser-xxxx@apiconnector.com. Set a strong password. - Ensure the API user has permission to manage contacts and insight (transactional) data.
- Note the API user email and password.
Choose a collection name
Transactional data is grouped into named collections. Pick a name for Signal’s events, for example signal_events.
Collection names may contain only letters, numbers and underscores. They cannot contain spaces, cannot start with a number, and must be 255 characters or fewer.
Configuration
| Field | Required | Description |
|---|---|---|
region | Yes | Your Dotdigital region prefix (e.g. r1). Forms the API host https://{region}-api.dotdigital.com. |
api_user_email | Yes | The API user’s email address. Used as the Basic Auth username. |
api_user_password | Yes | The API user’s password. Used as the Basic Auth password. |
collection_name | Yes | The transactional-data collection events are written to (e.g. signal_events). |
Configure in Signal
- Go to Integrations > Add Integration > Dotdigital.
- Select the Default preset.
- Enter your
region,api_user_email,api_user_password, andcollection_name. - Select consent categories (typically
marketing). - Click Save.
API Endpoint
POST https://{region}-api.dotdigital.com/v2/contacts/transactional-data/{collection_name}Authentication is HTTP Basic Auth: the API user email is the username and its password is the password. Signal Base64-encodes the credentials into the Authorization: Basic header. A successful write returns 201 Created.
Dotdigital is deprecating the v2 transactional-data endpoint in favour of its newer insight-data service. The v2 endpoint remains fully supported and is the most widely deployed behavioural-data sink today. This page will be updated when the newer service is supported.
Identity Signals
Dotdigital attaches each transactional-data record to a contact by email address. Signal sends the email from the identified contact’s traits as the contactIdentifier, so a user must be identified before their events can attach to a known contact.
| Signal source | Dotdigital field | Notes |
|---|---|---|
$traits.email | contactIdentifier | Required. The contact’s email address. |
message_id | key | Required. Unique id for the transactional-data record. |
anonymous_id | json.anonymousId | Signal’s stable pseudonymous identifier. |
user_id | json.userId | Your application’s user id, when available. |
Call datafly.identify() when a user logs in, registers, or submits a form so that Signal has an email to attach events to:
datafly.identify("user-123", {
email: "jane.doe@example.com",
firstName: "Jane",
lastName: "Doe"
});Events for visitors with no known email still create a transactional-data record, but it only becomes useful once a matching contact exists in Dotdigital. For best results, identify users early.
Event Mapping
The Default preset maps these Signal events to Dotdigital transactional data. The Signal event name is stored at json.eventName and event properties are stored under json.
| Signal event | json.eventName |
|---|---|
page | page_view |
Products Searched | search |
Product Viewed | product_viewed |
Product Added | add_to_cart |
Checkout Started | checkout_started |
Order Completed | order_completed |
Signed Up | signed_up |
Events not in the preset are dropped (defaults.action: drop). To customise, edit the integration’s Field Mappings in the Management UI.
Example: Order Completed
Datafly.js call:
datafly.identify("user-123", { email: "jane.doe@example.com" });
datafly.track("Order Completed", {
order_id: "ORD-001",
revenue: 129.99,
currency: "GBP",
products: [
{ product_id: "SKU-A", product_name: "Widget", price: 49.99, quantity: 2 },
{ product_id: "SKU-B", product_name: "Gadget", price: 30.01, quantity: 1 }
]
});Dotdigital payload sent by Signal:
{
"key": "evt_abc123def456",
"contactIdentifier": "jane.doe@example.com",
"json": {
"eventName": "order_completed",
"anonymousId": "a1b2c3d4e5f6",
"userId": "user-123",
"timestamp": "2026-06-06T12:00:00Z",
"orderId": "ORD-001",
"revenue": 129.99,
"currency": "GBP",
"products": [
{ "product_id": "SKU-A", "product_name": "Widget", "price": 49.99, "quantity": 2 },
{ "product_id": "SKU-B", "product_name": "Gadget", "price": 30.01, "quantity": 1 }
]
}
}Testing
- Identify a test contact and trigger an event from your site (or use Signal’s event debugger).
- In Dotdigital, open the test contact’s record and check the Insight data section for the new record in your collection.
- Alternatively, fetch the record via the API:
GET https://{region}-api.dotdigital.com/v2/contacts/transactional-data/{collection_name}/{key}A 201 Created from the write endpoint and the record appearing against the contact confirm end-to-end delivery.
Troubleshooting
| Problem | Solution |
|---|---|
401 Unauthorized | Check the API user email and password. Confirm the user is enabled and has contact/insight permissions. |
404 Not Found | The region prefix is wrong, or the host is malformed. Verify the region from your Dotdigital app URL. |
400 Bad Request | The collection_name is invalid (spaces, leading digit, too long), or key / contactIdentifier is missing. |
| Records not visible against a contact | The contact’s email must match an existing Dotdigital contact. Identify users with datafly.identify() before tracking. |
429 Too Many Requests | Dotdigital enforces per-account API rate limits. Signal retries automatically; lower the integration’s request rate if persistent. |