Kustomer
Datafly Signal delivers events to Kustomer server-to-server using the tracking identity + event API. Each event both identifies the customer (creating or updating their record by email or external ID) and records a named tracking event on their Kustomer timeline, giving support agents first-party behavioural context with no client-side script.
Prerequisites
Before configuring Kustomer in Signal you need your Kustomer organization name and an API key with the tracking role.
Find your organization name
Your Kustomer URL is https://<org_name>.kustomerapp.com. The <org_name> portion (for example acme) is your organization name. It also forms your API host: https://<org_name>.api.kustomerapp.com.
Create an API key
- In Kustomer, go to Settings > Security > API Keys.
- Click Add API Key.
- Give it a name (e.g. “Datafly Signal”).
- Assign the org.tracking role. If you want events to be able to create or update customer records, also assign org.user.customer.
- Click Save and copy the generated key (a JWT). It is shown once.
Store the API key securely. It grants write access to your Kustomer tracking and customer data. If you lose it, revoke it and create a new one.
Configuration
| Field | Required | Description |
|---|---|---|
org_name | Yes | Your Kustomer organization subdomain. Forms the API host https://<org_name>.api.kustomerapp.com. |
api_key | Yes | A Kustomer API key with the org.tracking role (and org.user.customer for customer upsert). Sent as Authorization: Bearer <api_key>. |
Configure in Signal
- Go to Integrations > Add Integration > Kustomer.
- Select the Default variant.
- Enter your
org_nameandapi_key. - Select consent categories (typically
marketing). Kustomer’s tracking API has no consent field, so Signal gates delivery on the visitor’s consent at the pipeline level. - Click Save.
API Endpoint
POST https://<org_name>.api.kustomerapp.com/v1/tracking/identityEvent
Authorization: Bearer <api_key>
Content-Type: application/jsonA successful request returns 201 Created. The body carries an identity object (used to match or create the customer) and an event object (the tracking event recorded on the timeline).
Identity Signals
Kustomer matches each event to a customer using the identity object. When both email and externalId are provided, Kustomer resolves on email first and falls back to externalId, so supplying both gives the highest match and dedup rate.
| Signal | Field | Source | Description |
|---|---|---|---|
identity.email | datafly.identify() traits | The customer’s email. Trimmed and lowercased before sending. Primary match key. | |
| External ID | identity.externalId | datafly.identify() user ID | Your own user/customer ID. Secondary match key, and the key Kustomer creates the record under when no email matches. |
| Name | identity.name | datafly.identify() traits | The customer’s display name, used when creating a new record. |
Kustomer is a CRM: it must read email, phone, and name to deduplicate customers and surface them to support agents. Unlike advertising connectors, Signal sends these identity fields to Kustomer in clear text rather than hashed. Only enable this integration for consent categories your customer is comfortable sharing as first-party CRM data.
How to send identity data
Call datafly.identify() when a user logs in, registers, or submits a form:
datafly.identify("user-123", {
email: "jane.doe@example.com",
name: "Jane Doe"
});Signal carries these traits onto every subsequent event so each tracking event arrives already attached to the right customer.
Event Mapping
Signal’s GA4-style event names map to Kustomer tracking event names, and event properties land under event.meta.
Default preset
| Signal event | Kustomer event |
|---|---|
page | Page Viewed |
Signed Up | Signed Up |
Logged In | Logged In |
Products Searched | Products Searched |
Product Viewed | Product Viewed |
Product Added | Product Added |
Checkout Started | Checkout Started |
Order Completed | Order Completed |
Meta key conventions
Kustomer enforces naming rules on event.meta keys, which the blueprint follows:
- Numeric values use keys ending in
Num(e.g.revenueNum,priceNum,quantityNum). - Date-time string values use keys ending in
At(e.g.occurredAt). - All other custom properties are free-form strings.
To customise, edit the integration’s Field Mappings in the Management UI — but keep the Num / At suffixes, or Kustomer will reject the event with 400.
Example: Order Completed event
Datafly.js call:
datafly.identify("user-123", {
email: "jane.doe@example.com",
name: "Jane Doe"
});
datafly.track("Order Completed", {
order_id: "ORD-001",
revenue: 129.99,
currency: "USD",
tax: 8.50,
shipping: 4.99,
coupon: "SUMMER10"
});Kustomer payload sent by Signal:
{
"identity": {
"email": "jane.doe@example.com",
"externalId": "user-123",
"name": "Jane Doe"
},
"event": {
"name": "Order Completed",
"meta": {
"orderId": "ORD-001",
"revenueNum": 129.99,
"currency": "USD",
"taxNum": 8.50,
"shippingNum": 4.99,
"coupon": "SUMMER10",
"anonymousId": "a1b2c3d4-...",
"occurredAt": "2026-06-06T10:00:00Z"
}
}
}Testing
- Configure the integration with your
org_nameandapi_key. - Trigger an
Order Completed(or any mapped) event on your site after callingdatafly.identify(). - In Kustomer, open the customer by the email or external ID you sent. Their timeline should show the new tracking event within a few seconds.
- Use Signal’s Event Debugger to inspect the exact payload Signal sent and the
201response from Kustomer.
Troubleshooting
| Problem | Solution |
|---|---|
401 / 403 Unauthorized | The API key is wrong or lacks the org.tracking role. For customer upsert, also add org.user.customer. Regenerate the key in Settings > Security > API Keys. |
404 Not Found | The org_name in the host is wrong. Confirm it matches your Kustomer subdomain. |
400 Bad Request | A meta key violates the naming rules — numeric values need a Num suffix, date-time strings need an At suffix. Check the failing field in the Event Debugger. |
| Event arrives but no customer attached | No identity.email or identity.externalId was present. Make sure datafly.identify() runs before the tracked event so traits are carried through. |
| Duplicate customer records | Send both email and externalId so Kustomer can match an existing record instead of creating a new one. |