Skip to content

CDP attribution and conversions

Device attribution, shared state and outbound conversions.

Sources / partners Airflow / dbt processing Storage / BigQuery Messaging / queues Functions / Lambda Reports / destinations Reliability / recovery

Drag to pan; use + / −, Fit or Fullscreen to inspect a flow. Solid arrows show event delivery; dashed arrows show reads and writes to shared state.

Device attribution

flowchart LR
    sdk["Adjust SDK<br/>Device callbacks"] --> callback["adjust-callback<br/>HTTP receiver · Data API project"]
    callback --> topic["cdp-events-topic<br/>event-hub-prod-f62ua2"]
    topic -->|"Excludes impression callbacks"| device["adjust-device-data<br/>Upsert identity + attribution"]
    warehouse["events-topic<br/>dw-prod-gwiiag"] -->|"Attribution / KYC / plan events"| device
    device -.->|"Upsert"| store["Firestore<br/>adjust-deviceinfo-store"]
    class sdk flow-sources
    class callback,device flow-function
    class topic,warehouse flow-messaging
    class store flow-storage
Hold "Alt" / "Option" to enable pan & zoom

adjust-device-data receives backend_prod events named UserAttributionDataEvent, KycCustomerDocumentResultEvent, PlanChangedEvent and KycSuccessfullyVerifiedEvent. The callback receiver is configured in the Data API project.

The store holds device identity, correlation and send state. Collections include deviceinfo, tiktok-whatsapp-users and tiktok-transfer-intents.

Mobile conversions

flowchart LR
    topic["events-topic<br/>dw-prod-gwiiag"] -->|"Selected backend_prod events"| adjust["adjust-api<br/>Map qualifying conversions"]
    adjust -.->|"Read mobile identity<br/>Claim send-once events"| store["Firestore<br/>adjust-deviceinfo-store"]
    adjust --> destination["Adjust S2S API"]
    class topic flow-messaging
    class adjust flow-function
    class store flow-storage
    class destination flow-destination
Hold "Alt" / "Option" to enable pan & zoom

iOS / Android identity is required. Conversion families shown are signup, KYC, funds, credit and completed WhatsApp remittances.

Web conversions

flowchart TB
    topic["Event Hub events-topic<br/>event-hub-prod-f62ua2"]
    topic -->|"Separate filtered push subscriptions"| tiktok["tiktok-api"]
    topic -->|"Separate filtered push subscriptions"| meta["meta-api"]
    topic -->|"Separate filtered push subscriptions"| google["google-ads-api<br/>Enabled in production"]
    tiktok --> td["TikTok Events API"]
    meta --> md["Meta Conversions API"]
    google --> gd["Google Data Manager API"]
    class topic flow-messaging
    class tiktok,meta,google flow-function
    class td,md,gd flow-destination
Hold "Alt" / "Option" to enable pan & zoom

Each function has two subscriptions on the Event Hub topic: backend events (User.UserCreatedEvent, User.UserAttributionDataEvent, PspFunding.ExternalCardUpdatedEvent, Remittance.RemittanceTransactionEvent) and WhatsApp.TransferEvent from producer whatsapp-remittance-agent, company Majority. The functions have access to the shared Firestore store.

Conversion rules are implemented in dt-cdp-realtime-events:

  • Events: CompleteRegistration, AddPaymentInfo, Purchase.
  • Purchase requires a completed remittance and a stored WhatsApp intent.
  • TikTok requires ttclid.
  • Meta requires a matching identifier.
  • Google Ads uses a click ID or hashed email/phone.

Braze event delivery

This event stream runs alongside the scheduled Airflow user-attribute exports.

flowchart LR
    topic["Event Hub events-topic"] --> backend["Filtered Auditing subscription"]
    topic --> whatsapp["WhatsApp.FormEvent subscription"]
    backend -->|"Pull"| worker["braze-api<br/>Cloud Run worker pool"]
    whatsapp -->|"Pull"| worker
    worker --> destination["Braze REST API"]
    backend -.->|"About 5 delivery attempts"| dlq["braze-events-dlq-topic<br/>7-day retention"]
    whatsapp -.-> dlq
    worker -.->|"Rejected events"| dlq
    dlq --> queue["braze-events-dlq-subscription"]
    class topic,backend,whatsapp,queue flow-messaging
    class worker flow-processing
    class destination flow-destination
    class dlq flow-reliability
Hold "Alt" / "Option" to enable pan & zoom
  • Backend filter: producer auditing, tenant Majority; excludes Ach.* and Transactions.ProcessorCallbackSettlementReportingEvent.
  • WhatsApp filter: producer whatsapp-remittance-agent, company Majority, event WhatsApp.FormEvent.
  • Both pull subscriptions: 10–600 second retry backoff, 120 second acknowledgment deadline and 7-day retention.
  • Worker configuration: 2 instances, DRY_RUN=false.
  • Braze dead-letter arrivals and backend subscription backlog alerts go to #dt-cloud-functions-alerts.

Callback archive and delivery monitoring

cdp-events-topic also writes through a native BigQuery subscription to dw-prod-gwiiag.event_hub.cdp_event_log. Failed archive deliveries go to cdp-events-bq-dlq-topic and cdp-events-bq-dlq-subscription after approximately 5 attempts, with 7-day retention; arrival alerts go to #dt-event-hub-dlq.

Adjust and web sender push subscriptions have a 30-second minimum retry backoff. Their configuration has no dead-letter policy. Push backlog and sustained rejection alerts go to #dt-cloud-functions-alerts; adjust-api uses a longer backlog threshold to accommodate its device-attribution retry window.

Archive configuration: Event Hub infrastructure. Application source: dt-cdp-realtime-events. Return to data flows.