Cordial

Cordial is a cross-channel marketing platform. Datafly Signal records your events as Cordial contact activities (POST /v2/contactactivities): browse, cart, checkout, order and custom actions keyed on the contact’s email, for browse and cart abandonment, post-purchase and lifecycle journeys.

Why route Cordial through Datafly Signal

  • Events come from your server, not the browser. They reach Cordial 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. Cordial is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.

Get your Cordial credentials

Create an API key

In Cordial go to Settings > Account Settings > API Keys and create a key. Add the egress IP of your Signal delivery workers to the key’s IP allow-list.

Find your API URL

Your account’s API base URL is under Account Settings > Account > API (for example https://api.cordial.io/v2).

Configuration

FieldRequiredDescription
api_keyYesCordial account API key from Settings > API Keys in the Cordial platform. Sent as the HTTP Basic username (blank password). The key is bound to allow-listed source IPs at creation — add your Signal delivery-workers egress IP to the key’s IP allow-list.
api_base_urlYesCordial API base URL for your account’s pod. Accounts on admin.cordial.io use https://api.cordial.io/v2. Confirm yours in the Cordial platform if your account is on a different pod.

Management UI setup

  1. Go to Integrations in the sidebar and open the Integration Library tab.
  2. Find Cordial under Marketing Automation and click Install.
  3. Choose a preset, enter the fields above and click Install Integration.

Management API setup

curl -X POST http://localhost:8084/v1/admin/integration-catalog/cordial/install \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
  "name": "Cordial",
  "variant": "default",
  "config": {
    "api_key": "your_api_key",
    "api_base_url": "your_api_base_url"
  },
  "delivery_mode": "server_side"
}'

What Signal sends

An example request, rendered from the ecommerce preset for purchase:

POST https://api.cordial.io/v2/contactactivities
 
{
  "a": "order",
  "ats": "2025-09-22T00:13:20Z",
  "email": "neill@example.com",
  "properties": {
    "amount": 279.98,
    "coupon": "AUTUMN10",
    "currency": "GBP",
    "items": [
      {
        "brand": "NorthEdge",
        "category": "Jackets",
        "name": "Parka Jacket",
        "price": 129.99,
        "productID": "SKU-1",
        "qty": 2,
        "variant": "Blue"
      },
      {
        "category": "Hats",
        "name": "Wool Hat",
        "price": 20,
        "productID": "SKU-2",
        "qty": 1
      }
    ],
    "orderID": "ORD-1001",
    "shipping": 4.99,
    "tax": 46.66,
    "url": "https://www.example.co.uk/shop/jackets"
  }
}
FieldSource
aThe action: browse (product view), cart (add/remove, with properties.action), wishlist, checkout, order, refund, search or the Signal event name. Up to 40 characters.
emailThe contact identifier, from identify() traits, trimmed and lower-cased. Required.
atsEvent time, ISO 8601.
propertiesThe event’s properties: product fields from the first items[] element on product events, the item list on checkout and order, currency upper-cased. Keys never contain a dot (Cordial strips them).

Cordial looks the contact up by email and accepts no hashed identifier, so the email is sent in plain text. An event without an email is not sent. If your account’s primary key is a customer ID, map it to that key’s name (for example custID) in the global section.

Presets

PresetSignal event → vendor event
Retailsearch, view_item → browse, add_to_cart → cart, remove_from_cart → cart, add_to_wishlist → wishlist, begin_checkout → checkout, purchase → order, refund, sign_up, login
B2B / SaaSsign_up, login, search, trial_started, trial_converted, subscription_started, subscription_cancelled, demo_requested, generate_lead → lead
Defaultsign_up, login, search, view_item → browse, add_to_cart → cart, begin_checkout → checkout, purchase → order, generate_lead → lead
Travelsearch, view_item → browse, booking_started, purchase → order, booking_cancelled, sign_up, login

Events not listed are not sent. Each preset is a starting point: add, rename or remove mappings on the installed integration.

Notes and limits

  • pageview is a reserved Cordial action the API does not accept; page views are left to Cordial’s own JavaScript listener. browse is the product-view action behind browse abandonment.

Marketing-automation integrations have no consent category by default. Assign the marketing category when you install Cordial, 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 Cordial.

Verify it’s working

  1. Open the integration in the Signal Management UI and watch Live Events while you trigger a mapped event.
  2. Confirm a 2xx response from Cordial.
  3. Find the contact in Cordial and check the event or record arrived.

Troubleshooting

SymptomResolution
401 / 403The API key is wrong, or the delivery workers’ IP is not on the key’s allow-list.
404The API base URL is not your account’s host.
CONTACT_ACTIVITIES_INCORRECT_ACTION_NAMEAn action name is reserved or over 40 characters.