Skip to main content

Event field mappings

One normalized event rarely fits every destination as-is. Your SDK sends email_address; the CRM expects email. Your events schema declares plan_tier; the ad platform only accepts plan. Event field mappings rename event properties at outbound dispatch time per destination — the stored event stays in your normalized schema, and each destination receives the shape its own API expects. The /settings/event-field-mappings dashboard route is still being built — today it redirects to the Integrations hub rather than showing a mapping editor, because the backing hooks land after the API contract. Everything in this guide runs against the live API now, and the pages below also back the surfaces already in the dashboard (CDP subscriptions, CRM / ERP sync, reverse ETL). When the editor ships it will drive the same fields documented here.

1. What a field mapping does

A mapping is a rename, applied to a copy of the outbound payload:
  • Inbound unchanged. Ingest and the stored event keep your normalized property names. Mappings never rewrite history.
  • Per-destination. The same event can go to HubSpot with email and to a warehouse with email_address — one event, two delivery shapes.
  • At dispatch time. The transform runs immediately before the payload is signed and sent. For webhook subscriptions the HMAC signature reflects the post-mapping body, so a verifier on the other side validates what actually arrived.
Two mapping shapes exist side by side, because two dispatch families exist:
  • Path-to-path renames for event subscriptions and warehouse exports — { "from": "properties.email_address", "to": "properties.email" }.
  • Record key-pairs for CRM / ERP object syncs — the destination upsert receives flat records such as { "email": <value>, "FirstName": <value> } built from a source→destination field map plus an upsert identifier field.

2. Coverage matrix — where mappings apply today

The full destination inventory your workspace can wire is read from the destination catalog:
Each connector row carries its category, delivery routing, accepted objects, connect-form fields, and maturity status — the same rows the Integrations → CDP → Destination catalog tab renders. Filter by the warehouse, esp, crm, or advertising category to see the destinations mappings can target. A connector marked for a later maturity phase can be validated but not yet activated, matching the visible badge.

3. Where the dashboard stands

The Settings → Integrations → Event field mappings route currently redirects to the Integrations hub. That is deliberate: a mapping editor without the backing hooks would accept Add / Edit / Delete input and silently discard it on reload, so the surface stays hidden until the hooks land. Treat “event field mappings” as an API-level capability today with a dedicated editor following; the concept — map normalized events onto destination schemas — is fully usable through the endpoints below and through the Subscription / CRM-sync surfaces already in the dashboard. Do not build on an assumed editor UI. Wire your tenant through the API, and the editor will read the same stored policies when it launches.

4. Wire a webhook destination with mappings

policy.field_mappings renames event properties before sign + dispatch. It applies after any policy.field_redactions, so a redacted field cannot be reintroduced under a new name. Create a subscription with both a redaction and a mapping:
Update an existing subscription the same way:
Field paths are dot-separated into the event payload (properties.*, context.*). Both sides of a mapping obey the same path rules; an event that lacks the from path is delivered without that rename applied. A 422 on create or update means one of the policy shapes failed validation — check the field names against your tracking plan.

5. CRM / ERP object sync field maps

A CRM or ERP sync upserts flat destination records on a cadence. Two settings control the schema the destination sees:
  • field_map — source-trait → destination-field pairs. Keys are contact / trait paths on your side; values are the destination API’s field names.
  • identifier_field — the destination field the upsert matches on. It must be one of the field_map’s destination values, and two source fields may not map to the same destination field.
A profile whose mapped record has no value for the identifier field is skipped rather than upserted — an upsert with no key would insert a duplicate downstream. The run history is read with GET /api/v1/cdp/crm-sync/runs; ERP destinations use the erp-sync routes (for example PATCH /api/v1/cdp/erp-sync/config/netsuite) with the same validation rules.

6. Operational notes

  • Validation is pair-wise. For object syncs the identifier is validated together with the field map — set field_map before (or with) identifier_field, or the update is rejected.
  • Signatures cover the mapped body. Your webhook verifier validates the post-mapping payload, so rotate property names freely without touching verification code.
  • Tracking plans stay canonical. Mappings adapt outbound shape only; govern inbound property names with a tracking plan so each destination rename has a stable source.
  • Consent gates first. Where a subscription sets a consent channel, the consent check runs before dispatch — a mapped event to a consent-gated destination is still dropped when the contact has no active grant.