Activate segments into Braze, Iterable, and Customer.io
Orbit’s CDP activates segments into martech destinations as native object writes — the profile object each app upserts. This guide walks Braze end to end, then covers the Iterable and Customer.io deltas. For Salesforce and HubSpot, the bidirectional OAuth walk (inbound sync + outbound writeback) lives in Connect HubSpot & Salesforce end to end; this page is the segment-activation half.1. What a martech destination is
The CRM/martech destination family has six slugs, each with a closed list of object types and a default upsert identifier:
The
object_type is validated against this list when you PATCH your config, so a bad target fails at config time — not mid-run. Segment-object sync is the only destination shape on this surface: it syncs a batch of segment profiles into one native object. It does not stream per-event tracking into Braze or Iterable; per-event dispatch to this same family lives on the destinations panel.
2. Connect Braze via Nango
The same connected integration that powers per-event contact upsert powers the batch object sync — one connection, both paths. If your organization connected Braze on the destinations page, object sync can run against it with no new auth. Braze, Iterable, and Customer.io each route through a Nango integration id you authorize once; the upstream OAuth token lives only inside that connection, never in a sync config.A run against a destination with no connected account is still recorded — every batch reports as skipped dispatch — so you can validate the mapping end to end before you wire the integration.
3. Build the segment to activate
Object sync draws from one segment. Build or pick it in CDP segments — the segment’s membership is also your consent filter: only profiles whose definition you wrote reach the destination. Note thesegment_id, you pass it in the config and on every run.
4. Configure the Braze mapping
Read every destination’s current mapping withGET /api/v1/cdp/crm-sync/config. Then PATCH Braze with only the keys you want to change — the merge is scoped to that one destination:
- Flattened trait paths. Each
field_mapkey is a source trait path — a flat key or a dotted path liketraits.email, up to 5 segments. Segments named__proto__,prototype, orconstructorare rejected outright, so a polluted key can never reach the per-record projector. - The identifier must be a mapped value.
external_idmust appear as one of yourfield_mapdestination values (here, from theuser_idtrait), or the config is rejected — without a mapped upsert key every record would be a blind-inserted duplicate. - No duplicate destination fields. Two source traits writing the same Braze attribute would silently clobber one another, so the mapping rejects it.
5. Run the on-demand sync
Trigger a run withPOST /api/v1/cdp/crm-sync/run/braze:
skipped, never blind-inserted.
The response is the recorded run object:
status reads ok (every batch upserted), partial, failed, or skipped (nothing matched or no connected account yet).
6. Iterate: Iterable and Customer.io
Same walk, two deltas:- Iterable — PATCH
/api/v1/cdp/crm-sync/config/iterablewithobject_type: "user"and the upsert key you email on:identifier_field: "email". Records upsert as Iterable users. - Customer.io — PATCH
/api/v1/cdp/crm-sync/config/customer_iowithobject_type: "person"andidentifier_field: "id"(Customer.io’s canonical customer id). Records upsert as persons.
7. Read the sync history
GET /api/v1/cdp/crm-sync/runs returns your most recent runs, newest first, capped at the last 50 per organization:
skipped (profiles missing the upsert key) and rows.failed (per-batch provider errors, with record counts — never the profile records) to find the leg that needs a fix. The sync run log guide walks the full reading loop.