Kustomer
Identifies the customer and records a tracking event on their Kustomer timeline in one call to /v1/tracking/identityEvent.
Why route Kustomer through Datafly Signal
- Profiles are updated from the server, not the browser. Events reach Kustomer 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. Kustomer is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
Create an API key
In Kustomer, open Settings > Security > API Keys and create a key with the org.tracking role.
Note your organisation name
The subdomain of your Kustomer URL; it forms https://{org}.api.kustomerapp.com.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
org_name | string | Yes | Your Kustomer organization subdomain. It forms the API host https://<org_name>.api.kustomerapp.com. Find it in your Kustomer URL (https://<org_name>.kustomerapp.com) or under Settings > Security > API Keys, which shows your base URL. |
api_key | secret | Yes | A Kustomer API key (JWT) with the org.tracking role, plus org.user.customer if it should create or update customer records. Create one under Settings > Security > API Keys. Sent as ‘Authorization: Bearer <api_key>’. |
Signal setup
- Navigate to Integrations in the sidebar and open the Integration Library tab.
- Find Kustomer, click Install and fill in the fields above.
- Pick the preset for your use, then review the mappings in the blueprint editor.
API endpoint
POST https://{org_name}.api.kustomerapp.com/v1/tracking/identityEvent
Authorization: Bearer {api_key}Example request:
{"identity": {"email": "jane.doe@example.com", "externalId": "crm-user-7", "name": "Jane Doe"},
"event": {"name": "OrderCompleted", "meta": {"orderId": "ORD-1001", "revenueNum": 279.98, "currency": "GBP",
"taxNum": 46.66, "shippingNum": 4.99, "coupon": "SPRING10", "productIds": "SKU-1,SKU-2",
"productNames": "Parka Jacket,Wool Hat", "occurredAt": "2026-09-22T10:13:20Z", "anonymousId": "df_anon_...",
"pageUrl": "https://www.example.co.uk/checkout"}}}The presets turn on the strict output contract: only the fields the blueprint maps are sent.
Event mapping
Default preset (default)
Retail support context: page views, sign-up, login, search, product views, cart adds, checkout, orders and refunds. Each event identifies the customer by email (trimmed, lower-cased) and the Signal user ID as externalId, with their name, in plain text because Kustomer’s agents see and match the customer on them, and records a tracking event on the customer’s timeline. Event names have no spaces (Kustomer rejects them); meta keys follow Kustomer’s suffixes (Num numbers, At date-times), currency upper-case. Events with neither an email nor a user ID are not sent.
| Signal event | Sent to the vendor as | Enabled |
|---|---|---|
page | PageViewed | yes |
sign_up | SignedUp | yes |
login | LoggedIn | yes |
search | ProductsSearched | yes |
view_item | ProductViewed | yes |
add_to_cart | ProductAdded | yes |
begin_checkout | CheckoutStarted | yes |
purchase | OrderCompleted | yes |
refund | OrderRefunded | yes |
B2B / SaaS preset (saas)
SaaS support context: sign-up, login, trial and subscription lifecycle, support tickets and feature use. Each event identifies the customer by email (trimmed, lower-cased) and the Signal user ID as externalId, with their name, in plain text because Kustomer’s agents see and match the customer on them, and records a tracking event on the customer’s timeline. Event names have no spaces (Kustomer rejects them); meta keys follow Kustomer’s suffixes (Num numbers, At date-times), currency upper-case. Events with neither an email nor a user ID are not sent.
| Signal event | Sent to the vendor as | Enabled |
|---|---|---|
sign_up | SignedUp | yes |
login | LoggedIn | yes |
trial_started | TrialStarted | yes |
subscription_started | SubscriptionStarted | yes |
subscription_cancelled | SubscriptionCancelled | yes |
support_ticket_created | SupportTicketCreated | yes |
feature_used | FeatureUsed | yes |
Identity and personal data
The customer is identified by the email trait (trimmed, lower-cased) and the Signal user ID as externalId, with their name. These are sent in plain text because Kustomer matches the customer on them and shows them to agents. Events with neither an email nor a user ID are not sent.
Consent
Map the integration to the consent category your organisation uses for CRM or sales data. Signal does not write cookie consent into the CRM: no subscription status, do-not-disturb flag, list or tag is set from it, because a cookie banner choice is not a permission to email or call someone.
Known limitations
- Event names cannot contain spaces (Kustomer’s pattern is
^[a-zA-Z][a-zA-Z0-9-_.]+$), so they are PascalCase. - Meta values are flat: keys ending
Numare numbers, keys endingAtare date-times, everything else is a string. Product IDs and names are comma-separated lists.
Troubleshooting
| Symptom | Cause and fix |
|---|---|
400 | An event name with a space, or a meta key whose value does not match its suffix. |
403 | The key lacks org.tracking. |