On-site Messages
In-session banners, modals, and inline messages triggered by real-time behavior — the fastest-firing destination, reacting within the same visit rather than a later one.
High-Level Design
On-site Messages react within the same session the triggering behavior happened in.
💼 Business Context
- The only activation channel that can react and be seen within the same visit — exit-intent offers, low-stock nudges, and session-based upsells all depend on this speed
- Lower cost per impression than paid channels since it uses a customer's own already-open session
- Owned by Product Engineering / Marketing Technology
🔌 Technical Overview
A Stream Worker (Transformation & Processing) evaluates in-session behavioral rules (time-on-page, exit intent, cart value threshold) against the live event stream and, on a match, publishes to Azure Service Bus. The Activation API — a Docker container on Azure Container Apps — pushes the resulting message to the client over a WebSocket/Server-Sent-Events connection already established by the Client SDK, giving true within-session reaction rather than requiring a page reload.
Trigger Signals
💾 On-site Message Push
{
"customer_key": "cust_004821",
"trigger": "exit_intent",
"message_variant": "10_percent_first_order",
"suppressed_if": "existing_customer"
}
🔗 Integration Points
- Client SDKs — maintains the live connection this destination pushes through
- Stream Worker (Transformation & Processing) — evaluates in-session behavioral rules in real time
- Azure Service Bus — carries the triggering event to the Activation API
- Workflow Engine (Operational Services) — shared frequency-capping mechanism with SMS/Push
🧰 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: bounded by concurrent active sessions, not total customer base — spikes with traffic, not campaign size
- Latency: sub-second from triggering behavior to message display, the tightest latency requirement of any destination in this module
- Reliability: if the live connection has dropped, the trigger is simply not delivered rather than queued for a later session — on-site messages are inherently session-scoped
- Security/Privacy: suppression rules (e.g., never show to existing subscribers) are enforced before the message is even evaluated, not just before delivery
🎯 Enterprise Example
A visitor adds an item to their cart, browses for two more minutes without checking out, and shows exit-intent behavior. Within milliseconds a 10%-off modal appears — a conversion path only possible because the trigger, evaluation, and delivery all happen inside the same live session.