Split
Datafly Signal delivers events to Split (Harness Feature Management & Experimentation) server-to-server using the Events API. Events arrive keyed by the same traffic key your Split SDK uses to evaluate treatments, so behavioural events attribute correctly to feature flags and feed experiment metrics — without any client-side tag and unaffected by ad blockers or browser tracking prevention.
Prerequisites
Before configuring Split in Signal, you need a Split account, a server-side SDK API key, and a traffic type that matches how you key users in your SDK.
Step 1: Create a server-side SDK API key
-
In Split, go to Admin settings > API keys.
-
Click Create API key.
-
Choose the Server-side key type.
⚠️The Events API only accepts server-side SDK keys. Client-side keys and Admin API keys are rejected. Make sure you select Server-side.
-
Select the environment (for example, Production) and copy the key.
Step 2: Confirm your traffic type
- In Split, go to Admin settings > Traffic types.
- Note the traffic type your application uses when calling
getTreatment()— most accounts use user.
The key you send with each event and the traffic type must match how you evaluate treatments, otherwise events will not attribute to the right users or metrics.
Configuration Fields
| Field | Required | Description |
|---|---|---|
api_key | Yes | Your Split server-side SDK API key. Found under Admin settings > API keys. |
traffic_type | Yes | The Split traffic type the event key belongs to (for example, user). Must exist in your Split account. |
Configure in Signal
- Go to Integrations > Add Integration > Split.
- Enter your
api_key(server-side SDK key) andtraffic_type(usuallyuser). - Select the consent categories that should gate delivery (typically
analyticsorpersonalisation). - Click Save.
To customise which events are sent or how properties are mapped, edit the integration’s Field Mappings in the Management UI.
API Endpoint
POST https://events.split.io/api/events/bulk
Authorization: Bearer {api_key}
Content-Type: application/jsonThe request body is a JSON array of event objects. Signal batches events automatically and posts them in bulk. A successful request returns 202 Accepted.
Identity Signals
Split does not match on hashed PII. Attribution is based entirely on the event key — the same traffic key your application passes to getTreatment() in the Split SDK.
| Signal | Field | Description |
|---|---|---|
key | key | The visitor’s traffic key. Signal sends the identified user_id when available, falling back to the canonical anonymous_id. This must match the key you use for getTreatment(). |
trafficTypeName | trafficTypeName | The traffic type the key belongs to, taken from your integration config (default user). |
For events to count toward an experiment, the key Signal sends must be the same identifier you pass to getTreatment(). If your app keys treatments by a logged-in user ID, call datafly.identify() with that same ID so Signal uses it as the event key.
How to send the matching key
Call datafly.identify() with the identifier you use for treatment evaluation:
datafly.identify("user-123");After identify, Signal sends "key": "user-123". Before identify, Signal sends the anonymous ID so anonymous experiment exposure is still attributed.
Event Mapping
Signal maps GA4-style event names to Split eventTypeId values. Split requires each eventTypeId to match the pattern [a-zA-Z0-9][-_.a-zA-Z0-9]{0,62} (start with a letter or number; letters, numbers, hyphen, underscore, or period only). Signal’s snake_case names comply by default.
Default preset
| Signal event | Split eventTypeId |
|---|---|
page | page_view |
Products Searched | products_searched |
Product Viewed | product_viewed |
Product Added | product_added |
Checkout Started | checkout_started |
Order Completed | order_completed |
Signed Up | signed_up |
Lead Generated | lead_generated |
Each event carries the visitor’s key, the configured trafficTypeName, a millisecond timestamp, an optional numeric value (for example, order revenue), and a properties object. Split properties values must be strings, numbers, or booleans — nested objects and arrays are not supported.
Example: Order Completed
Datafly.js call:
datafly.track("Order Completed", {
order_id: "ORD-001",
revenue: 129.99,
currency: "USD",
tax: 8.50,
shipping: 5.00
});Split payload sent by Signal:
[
{
"eventTypeId": "order_completed",
"trafficTypeName": "user",
"key": "user-123",
"timestamp": 1717660800000,
"value": 129.99,
"properties": {
"order_id": "ORD-001",
"currency": "USD",
"tax": 8.5,
"shipping": 5
}
}
]The order revenue lands in value so it can be used directly as an experiment metric, while the remaining fields are passed as properties for filtering and analysis.
Testing
Trigger an event
Browse your site (or call datafly.track(...)) so Signal delivers an event to Split.
Confirm acceptance
Use Signal’s event debugger to confirm the delivery returned 202 Accepted from https://events.split.io/api/events/bulk.
Verify in Split
In Split, open the event type (for example order_completed) and confirm events are arriving for your traffic type. Aggregated metrics may take a few minutes to appear.
Troubleshooting
| Problem | Solution |
|---|---|
401 / 403 responses | The API key is not a server-side SDK key. Create a new key with the Server-side type and update the integration. |
400 responses | The eventTypeId is invalid (must match [a-zA-Z0-9][-_.a-zA-Z0-9]{0,62}), key is missing, or properties contains a nested object/array. Review the payload in Signal’s event debugger. |
| Events accepted but not attributed to an experiment | The key does not match the key used in getTreatment(), or the trafficTypeName does not match your account’s traffic type. Confirm both via datafly.identify() and the integration config. |
| Metrics not updating | Split aggregates events on a schedule; allow a few minutes. Confirm the event type and traffic type match those used in your metric definition. |
| Properties missing in Split | Property values must be strings, numbers, or booleans. Remove any mappings that target properties.* with object or array values. |