Zendesk
Zendesk records customer activity on the end-user profile timeline through its Events API (POST /api/v2/user_profiles/events). Datafly Signal sends first-party events there server-side, so agents see what the customer did before the ticket.
Why route Zendesk through Datafly Signal
- Records come from your server, not the browser. They reach Zendesk even when a tracker blocker or a failed page unload would have dropped a client-side call, and no form integration or browser tag is needed.
- 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. Zendesk is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Get your Zendesk credentials
Create an API token
In Admin Center open Apps and integrations > APIs > Zendesk API, turn on token access and add a token. Signal authenticates as <agent email>/token with it.
Configuration
| Field | Required | Description |
|---|---|---|
subdomain | Yes | Your Zendesk subdomain only (the ‘acme’ in acme.zendesk.com). Do not include ‘.zendesk.com’ or ‘https://’. |
email | Yes | Email address of an admin or agent in your Zendesk account. Combined with the API token to authenticate (sent as ‘{email}/token’). |
api_token | Yes | A Zendesk API token. Create one in Admin Center > Apps and integrations > APIs > Zendesk API > Add API token. Token access must be enabled. |
Management UI setup
- Go to Integrations in the sidebar and open the Integration Library tab.
- Find Zendesk under CRM and click Install.
- Choose a preset, enter the fields above and click Install Integration.
Management API setup
curl -X POST http://localhost:8084/v1/admin/integration-catalog/zendesk/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Zendesk",
"variant": "default",
"config": {
"subdomain": "your_subdomain",
"email": "your_email",
"api_token": "your_api_token"
},
"delivery_mode": "server_side"
}'What Signal sends
An example request, rendered from the default preset for purchase:
POST https://acme.zendesk.com/api/v2/user_profiles/events
{
"event": {
"created_at": "2025-09-22T00:13:20Z",
"description": "Completed an order",
"properties": {
"coupon": "AUTUMN10",
"currency": "GBP",
"items": "Parka Jacket, Wool Hat",
"order_id": "ORD-1001",
"shipping": 4.99,
"tax": 46.66,
"value": 279.98
},
"source": "datafly_signal",
"type": "order_completed"
},
"profile": {
"identifiers": [
{
"type": "email",
"value": "neill@example.com"
},
{
"type": "external_id",
"value": "0f8fad5b-d9cb-469f-a165-70867728950e"
}
],
"name": "Neill Mcfixture",
"source": "datafly_signal",
"type": "visitor"
}
}| Field | Source |
|---|---|
profile.identifiers | The email (trimmed, lower-cased) and your product user ID as external_id. An event with neither is not sent. |
profile.source, profile.type, profile.name | datafly_signal, visitor, and the name trait. |
event.source, event.type, event.description | datafly_signal, the event type (order_completed …) and a short description. |
event.created_at | When the event happened, ISO 8601. |
event.properties | The event’s details: order ID, value, currency (ISO 4217, upper-cased), item names, plan, ticket ID, booking reference … |
Zendesk matches the end user by email and external ID, so the email and name are sent in plain text to your own Zendesk account. When no profile matches, Zendesk creates one, and the end user with it.
Presets
| Preset | Signal events |
|---|---|
Default (default) | page, sign_up, login, view_item, purchase, generate_lead |
Retail (ecommerce) | sign_up, login, view_item, add_to_cart, begin_checkout, purchase, order_shipped, refund |
B2B / SaaS (saas) | sign_up, login, trial_started, subscription_started, subscription_upgraded, subscription_downgraded, subscription_cancelled, feature_used, support_ticket_created |
Travel (travel) | sign_up, login, purchase, booking_modified, booking_cancelled, check_in_completed |
Events not listed are not sent. Each preset is a starting point: add, rename or remove mappings on the installed integration.
Notes and limits
- The Events API is available on Suite Team plans and above and is turned on in Admin Center.
external_idis also set as the Zendesk user’s external ID. If you use external IDs for SSO, make sure your product user ID is the same value.
Consent
Assign the consent category you use for this processing when you install Zendesk, so an event is delivered only when the visitor has granted it. Signal never writes a cookie-banner choice into Zendesk’s contact permissions (no consent value is written to the profile): consent to cookies is not consent to be emailed, called or messaged. Record communication opt-in and opt-out in Zendesk.
Verify it’s working
- Open the integration in the Signal Management UI and watch Live Events while you trigger a mapped event.
- Confirm a 2xx response from Zendesk.
- Find the record in Zendesk and check it arrived.
Troubleshooting
| Symptom | Resolution |
|---|---|
401 | Wrong agent email or token, or token access is off. |
403 | The agent’s role cannot manage people. |
404 | Wrong subdomain (enter acme, not acme.zendesk.com). |
| Nothing sent for an event | The visitor had neither an email nor a user ID. |