CDP attribution and conversions
Device attribution, shared state and outbound conversions.
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
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
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
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. Purchaserequires a completed remittance and a stored WhatsApp intent.TikTokrequiresttclid.Metarequires a matching identifier.Google Adsuses 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
- Backend filter: producer
auditing, tenantMajority; excludesAch.*andTransactions.ProcessorCallbackSettlementReportingEvent. - WhatsApp filter: producer
whatsapp-remittance-agent, companyMajority, eventWhatsApp.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.