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
| Field | Type | Required | Description |
|---|---|---|---|
rest_api_key | secret | Yes | A Braze REST API key with the users.track permission (Settings > APIs and Identifiers). Sent as a Bearer token. |
app_id | string | No | Optional 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_endpoint | select | Yes | The 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_endpoint | select | No | The 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
- Navigate to Integrations in the sidebar and open the Integration Library tab.
- Find Braze, click Install and fill in the fields above.
- 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 event | Sent to the vendor as |
|---|---|
view_item | Product Viewed |
add_to_cart | Product Added |
begin_checkout | Checkout Started |
purchase | Order Completed |
sign_up | Signed 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 event | Sent to the vendor as |
|---|---|
sign_up | Signed Up |
login | Logged In |
trial_started | Trial Started |
feature_used | Feature Used |
subscription_started | Subscribed |
subscription_cancelled | Subscription 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 event | Sent to the vendor as |
|---|---|
content_viewed | Content Viewed |
video_played | Video Played |
sign_up | Signed Up |
subscription_renewed | Subscription Renewed |
subscription_cancelled | Subscription Cancelled |
purchase | Order 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 event | Sent to the vendor as |
|---|---|
sign_up | Signed Up |
login | Logged In |
generate_lead | Lead Submitted |
purchase | Order 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.
Consent
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
| Symptom | Cause and fix |
|---|---|
401 | REST API key wrong or missing users.track. |
| Request to the wrong host | Pick 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