Ad Platforms (Google, Meta)
Syncs customer segments and hashed identifiers to ad platforms for audience targeting and suppression — activation aimed at paid media rather than owned channels.
High-Level Design
Audiences are synced as hashed identifiers, never raw PII, to every connected ad platform.
💼 Business Context
- Lets paid media target or suppress audiences based on real first-party data (propensity, LTV) instead of only the ad platform's own inferred signals
- Suppression sync (e.g., stop advertising to customers who just purchased) is often the higher-value use case, avoiding wasted spend
- Owned by Marketing Technology, in partnership with the Paid Media team
🔌 Technical Overview
A scheduled .NET Core Activation API job (Docker container on Azure Container Apps Jobs) resolves an audience defined as a Semantic Layer query — often combined with a Propensity Scores threshold — into a customer list, hashes identifiers (email, phone) per each platform's required format, and syncs via the Google Ads Customer Match API and Meta Conversions API. No raw PII ever leaves the platform; only irreversibly hashed identifiers are transmitted.
Sync Types
💾 Audience Sync Payload
{
"audience": "high_churn_risk_gold_tier",
"platform": "meta_conversions_api",
"member_count": 4218,
"identifier_format": "sha256_hashed_email",
"sync_type": "targeting"
}
🔗 Integration Points
- Semantic Layer — defines audience membership as a governed query
- Propensity Scores — common input for behaviorally-defined audiences
- Google Ads Customer Match API / Meta Conversions API — destination platforms
- Consent Enforcement — audiences exclude customers who have withdrawn marketing consent before the sync ever runs
🧰 Services Consumed
- Owning microservice —
Cxos.Activation.Api(see the Full Application Service Map) - Database — Azure Cosmos DB (dispatch log) + Azure Cache for Redis (frequency caps)
⚠️ Non-Functional Considerations
- Scale: audience syncs run on a scheduled batch cadence (typically daily), sized for list sizes in the hundreds of thousands without per-record API calls
- Latency: not real-time by design — ad platform audience syncs typically run within the platform's own daily refresh window
- Reliability: a failed sync retains the platform's last successfully synced audience rather than clearing it, avoiding an accidental blank targeting list
- Security/Privacy: only hashed identifiers are ever transmitted, and consent-withdrawn customers are excluded before hashing, not filtered after the fact
🎯 Enterprise Example
A "recently purchased" suppression audience syncs to Meta nightly, preventing customers from seeing the same product ad for days after buying it — a change that measurably reduced wasted ad spend and customer-reported ad fatigue complaints.