Iterable
Sends custom events to Iterable’s events/track and purchases to the commerce trackPurchase endpoint, so Iterable attributes revenue to campaigns.
Why route Iterable through Datafly Signal
- Profiles are updated from the server, not the browser. Events reach Iterable even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
- One consent decision governs every destination. Iterable is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
Create a server-side API key
In Iterable, Integrations > API Keys > New API Key, type Server-side. Keys are project-scoped.
Check your data centre
EU projects (app.eu.iterable.com) must use api.eu.iterable.com.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
api_key | secret | Yes | A server-side Iterable API key (Integrations > API Keys). Keys are project-scoped, so the key selects the project. |
api_host | select | Yes | The Iterable data centre your project is hosted in; EU projects must use api.eu.iterable.com. Options: api.iterable.com, api.eu.iterable.com. |
Signal Setup
- Navigate to Integrations in the sidebar and open the Integration Library tab.
- Find Iterable, click Install and fill in the fields above.
- Pick the preset for your vertical, then review the mappings in the blueprint editor.
curl -X POST http://localhost:8084/v1/admin/integration-catalog/iterable/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Iterable",
"config": {
"api_key": "xxxxxxxxxxxxxxxxxxxx",
"api_host": "api.iterable.com"
},
"delivery_mode": "server_side"
}'API endpoint
POST https://{api_host}/api/events/track
POST https://{api_host}/api/commerce/trackPurchase (purchase)
Api-Key: {api_key}Example body:
{"user": {"email": "jane.doe@example.com"}, "id": "T-1001", "total": 439.99,
"items": [{"id": "SKU_1", "sku": "SKU_1", "name": "Helmet", "price": 120, "quantity": 2}],
"createdAt": 1758500000, "dataFields": {"currency": "GBP", "coupon": "SUMMER"}}The presets turn on the strict output contract: only the fields the blueprint maps are sent.
Event mapping
Retail preset (ecommerce)
Commerce tracking: product viewed, add to cart and checkout started as custom events, and purchases through Iterable’s commerce API (trackPurchase) with the order ID as the purchase id, total and items, so Iterable attributes revenue to campaigns. Users are identified by email (trimmed, lowercased, plain text: Iterable sends to it), for email-based projects; events without an email are not sent (userId-only delivery is #1220). Custom events carry the Signal event ID as id, so a retry updates rather than duplicates the event.
| Signal event | Sent to the vendor as |
|---|---|
view_item | productViewed |
add_to_cart | addToCart |
begin_checkout | checkoutStarted |
purchase | trackPurchase |
sign_up | signUp |
Default preset (default)
Sign-up, login and lead as custom events and purchases through trackPurchase. Users are identified by email (trimmed, lowercased, plain text: Iterable sends to it), for email-based projects; events without an email are not sent (userId-only delivery is #1220). Custom events carry the Signal event ID as id, so a retry updates rather than duplicates the event.
| Signal event | Sent to the vendor as |
|---|---|
sign_up | signUp |
login | login |
generate_lead | leadSubmitted |
purchase | trackPurchase |
Identity and personal data
Users are identified by email (trimmed, lowercased), for email-based projects. The email is sent in plain text: Iterable sends to it. Iterable takes an email or a userId, not both; events without an email are not sent. Custom events carry the Signal event ID as id, and purchases the order ID, so retries update rather than duplicate.
Consent
Iterable events should be sent under the marketing consent category. Iterable has its own subscription list opt-in records — Signal forwards CMP consent state so server-side workflows can suppress messaging for visitors who declined.
Known limitations
- userId-based projects need the email mapping switched to
userId.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
401 | API key wrong, or used against the other data centre. |
400 on purchase | items, total and user are required; each item needs id, name, price and quantity. |
See also
- Braze — multi-channel engagement alternative
- Klaviyo — email and SMS alternative
- Customer.io — behavioural messaging