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

FieldTypeRequiredDescription
api_keysecretYesA server-side Iterable API key (Integrations > API Keys). Keys are project-scoped, so the key selects the project.
api_hostselectYesThe 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

  1. Navigate to Integrations in the sidebar and open the Integration Library tab.
  2. Find Iterable, click Install and fill in the fields above.
  3. 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 eventSent to the vendor as
view_itemproductViewed
add_to_cartaddToCart
begin_checkoutcheckoutStarted
purchasetrackPurchase
sign_upsignUp

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 eventSent to the vendor as
sign_upsignUp
loginlogin
generate_leadleadSubmitted
purchasetrackPurchase

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.

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

SymptomCause and fix
401API key wrong, or used against the other data centre.
400 on purchaseitems, 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