Web / App Personalization
Serves personalized content, recommendations, and offers back into the website or app in near-real-time based on the customer's current profile and propensity.
High-Level Design
Personalization closes the loop: the same channel that generated the data now consumes it back.
💼 Business Context
- Closes the loop between data collection and the customer's own next experience — the most direct, visible payoff of the entire CXOS pipeline
- Higher-converting than generic content because it is grounded in the same unified profile every other capability reads from
- Owned by Product Engineering, in partnership with Marketing Technology
🔌 Technical Overview
The website/app calls a low-latency personalization endpoint on the .NET Core Activation API (Docker container on AKS, fronted by Azure API Management) at page-render or session-start time, which combines Unified Customer Profile attributes and Propensity Scores' next-best-action output, cached in Azure Cache for Redis to keep response times inside a page-render budget. This is the one activation destination where the Cxos.Ingestion.Client SDK's own touchpoint is also the read target, making it the tightest latency requirement in the module.
Personalization Inputs
💾 Personalization Response
GET /v1/personalize?customer_key=cust_004821&surface=homepage
{
"hero_variant": "gold_tier_loyalty_banner",
"recommended_products": ["sku_2291", "sku_4471"],
"next_best_action": "upgrade_offer"
}
🔗 Integration Points
- Client SDKs (Ingestion Layer) — the same touchpoint that generates the data this endpoint reads
- Unified Customer Profile, Propensity Scores — primary inputs to the personalization decision
- Azure Cache for Redis — keeps response latency inside a page-render budget
- Azure API Management — gateway in front of the personalization endpoint
🧰 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: must handle full site/app traffic concurrency, not just campaign-triggered bursts — the highest-QPS destination in this module
- Latency: p99 under 150ms, since this call sits directly in the page-render or session-start critical path
- Reliability: falls back to a sensible default (non-personalized) experience if the profile or propensity lookup times out, rather than blocking the page
- Security/Privacy: personalization decisions respect consent_basis for the "analytics/personalization" purpose specifically, distinct from marketing consent
🎯 Enterprise Example
A returning gold-tier customer lands on the homepage and sees a loyalty-tier banner and two recommended products chosen from their browsing history — rendered in the same request as the page itself, with the fallback default experience used automatically on the rare occasion the personalization call doesn't return in time.