Braze

Sends custom events and user attributes to Braze’s /users/track endpoint server-side.

Why route Braze through Datafly Signal

  • Profiles are updated from the server, not the browser. Events reach Braze even when a tracker blocker or a failed page unload would have dropped a client-side call, so the profile reflects what actually happened.
  • Delivery is batched, rate-limited, and retried. Signal buffers to Kafka, respects the Braze rate limit, and retries on 429 or transient failure rather than dropping the event.
  • Presets for Retail, B2B / SaaS and Media. The mapping starts from a working configuration for your vertical instead of a blank field map.
  • One consent decision governs every destination. Braze is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.

Prerequisites

Create a REST API key

In Braze, Settings > APIs and Identifiers > Create API Key, with the users.track permission.

Find your REST endpoint

Your instance (US-01 to US-10, EU-01, EU-02, AU-01, ID-01, JP-01, KR-01) appears in the dashboard URL; pick its REST endpoint in the settings.

App identifier (optional)

Settings > APIs and Identifiers > App Identifiers. Sent as app_id on each event when set.

Configuration

FieldTypeRequiredDescription
rest_api_keysecretYesA Braze REST API key with the users.track permission (Settings > APIs and Identifiers). Sent as a Bearer token.
app_idstringNoOptional app identifier (Settings > APIs and Identifiers > App Identifiers). Sent as app_id on each event to attribute it to an app; leave blank for server-side events.
rest_endpointselectYesThe REST endpoint of your Braze instance (Settings > APIs and Identifiers, or your dashboard URL’s cluster). Options: https://rest.iad-01.braze.com, https://rest.iad-02.braze.com, https://rest.iad-03.braze.com, https://rest.iad-04.braze.com, https://rest.iad-05.braze.com, https://rest.iad-06.braze.com, https://rest.iad-07.braze.com, https://rest.iad-08.braze.com, https://rest.us-10.braze.com, https://rest.fra-01.braze.eu, https://rest.fra-02.braze.eu, https://rest.au-01.braze.com, https://rest.id-01.braze.com, https://rest.jp-01.braze.com, https://rest.kr-01.braze.com.
sdk_endpointselectNoThe Braze SDK endpoint for client-side SDK mode. Required when ‘Also load client-side SDK’ is enabled. Matches the REST endpoint cluster. Options: sdk.iad-01.braze.com, sdk.iad-02.braze.com, sdk.iad-03.braze.com, sdk.fra-01.braze.eu, sdk.fra-02.braze.eu.

Signal Setup

  1. Navigate to Integrations in the sidebar and open the Integration Library tab.
  2. Find Braze, click Install and fill in the fields above.
  3. Pick the preset for your vertical, then review the mappings in the blueprint editor.
curl -X POST http://localhost:8084/v1/admin/integration-catalog/braze/install \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Braze",
    "config": {
      "rest_api_key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "rest_endpoint": "https://rest.iad-01.braze.com"
    },
    "delivery_mode": "server_side"
  }'

API endpoint

POST {rest_endpoint}/users/track
Authorization: Bearer {rest_api_key}

Example body:

{"attributes": [{"external_id": "user-123", "email": "jane.doe@example.com", "first_name": "Jane", "last_name": "Doe", "phone": "+447700900123"}],
 "events": [{"external_id": "user-123", "app_id": "app-1", "name": "Order Completed", "time": "2026-09-22T10:00:00.000Z",
   "properties": {"order_id": "T-1001", "value": 120, "currency": "GBP", "items": [...]}}]}

The presets turn on the strict output contract: only the fields the blueprint maps are sent.

Event mapping

Retail preset (ecommerce)

Retail engagement: product viewed, product added, checkout started, order completed, sign-up. Every request carries the user’s external_id (Signal user_id; events without one are not sent) and a user attributes object with email, first and last name and phone (E.164) in plain text, because Braze sends messages to them. Purchases are sent as the custom event Order Completed: Braze’s purchase object needs the user identifier repeated in every product, which a blueprint cannot yet express (#1392).

Signal eventSent to the vendor as
view_itemProduct Viewed
add_to_cartProduct Added
begin_checkoutCheckout Started
purchaseOrder Completed
sign_upSigned Up

B2B / SaaS preset (saas)

Product lifecycle: sign-up, login, trial start, feature used, subscription start and cancellation. Every request carries the user’s external_id (Signal user_id; events without one are not sent) and a user attributes object with email, first and last name and phone (E.164) in plain text, because Braze sends messages to them. Purchases are sent as the custom event Order Completed: Braze’s purchase object needs the user identifier repeated in every product, which a blueprint cannot yet express (#1392).

Signal eventSent to the vendor as
sign_upSigned Up
loginLogged In
trial_startedTrial Started
feature_usedFeature Used
subscription_startedSubscribed
subscription_cancelledSubscription Cancelled

Media preset (media)

Content engagement: content viewed, video played, sign-up, subscription renewal and cancellation, purchases. Every request carries the user’s external_id (Signal user_id; events without one are not sent) and a user attributes object with email, first and last name and phone (E.164) in plain text, because Braze sends messages to them. Purchases are sent as the custom event Order Completed: Braze’s purchase object needs the user identifier repeated in every product, which a blueprint cannot yet express (#1392).

Signal eventSent to the vendor as
content_viewedContent Viewed
video_playedVideo Played
sign_upSigned Up
subscription_renewedSubscription Renewed
subscription_cancelledSubscription Cancelled
purchaseOrder Completed

Default preset (default)

Core lifecycle: sign-up, login, lead, order completed. Every request carries the user’s external_id (Signal user_id; events without one are not sent) and a user attributes object with email, first and last name and phone (E.164) in plain text, because Braze sends messages to them. Purchases are sent as the custom event Order Completed: Braze’s purchase object needs the user identifier repeated in every product, which a blueprint cannot yet express (#1392).

Signal eventSent to the vendor as
sign_upSigned Up
loginLogged In
generate_leadLead Submitted
purchaseOrder Completed

Identity and personal data

Every request carries the user’s external_id (the Signal user_id); an event without one is not sent. The attributes object carries email (trimmed, lowercased; from the identity traits, which carry the profile email Signal attaches to a signed-in visitor’s events, or the event’s own email), first and last name and phone (E.164) from the identity traits. These are sent in plain text: Braze sends messages to them.

Braze events should be sent under the marketing consent category. Braze maintains subscription groups (email_marketing, sms_marketing, push) which are updated via the User API — Signal forwards the visitor’s CMP consent state so server-side logic can keep the two in sync.

Known limitations

  • Purchases are sent as the custom event Order Completed. Braze’s purchase object (revenue reporting) needs the user identifier repeated in every product, which a blueprint cannot yet express (#1392).

Troubleshooting

SymptomCause and fix
401REST API key wrong or missing users.track.
Request to the wrong hostPick the REST endpoint of your instance; keys do not work across instances.

See also

  • Iterable — cross-channel marketing alternative
  • Customer.io — behavioural messaging alternative
  • Airship — push notifications and in-app messaging