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

  1. In Split, go to Admin settings > API keys.

  2. Click Create API key.

  3. 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.

  4. Select the environment (for example, Production) and copy the key.

Step 2: Confirm your traffic type

  1. In Split, go to Admin settings > Traffic types.
  2. 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

FieldRequiredDescription
api_keyYesYour Split server-side SDK API key. Found under Admin settings > API keys.
traffic_typeYesThe Split traffic type the event key belongs to (for example, user). Must exist in your Split account.

Configure in Signal

  1. Go to Integrations > Add Integration > Split.
  2. Enter your api_key (server-side SDK key) and traffic_type (usually user).
  3. Select the consent categories that should gate delivery (typically analytics or personalisation).
  4. 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/json

The 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.

SignalFieldDescription
keykeyThe 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().
trafficTypeNametrafficTypeNameThe 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 eventSplit eventTypeId
pagepage_view
Products Searchedproducts_searched
Product Viewedproduct_viewed
Product Addedproduct_added
Checkout Startedcheckout_started
Order Completedorder_completed
Signed Upsigned_up
Lead Generatedlead_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

ProblemSolution
401 / 403 responsesThe API key is not a server-side SDK key. Create a new key with the Server-side type and update the integration.
400 responsesThe 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 experimentThe 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 updatingSplit 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 SplitProperty values must be strings, numbers, or booleans. Remove any mappings that target properties.* with object or array values.