The canonical event payload
SupremeTracking accepts events from different sources, including browser tags and webhooks. Each source is translated into the same canonical Supreme Event Payload before the Node processes it.
That canonical-first rule keeps shared pipeline code generic. Source translators handle inbound differences, and each destination integration maps the canonical event to its own platform format.
A representative canonical event
The exact optional fields depend on the source and available context, but a normalized event has this shape:
{
"event_id": "evt_example_123",
"event_name": "purchase",
"event_time": 1730000000,
"channel": "webevents",
"action_source": "browser",
"provider": "direct",
"property_id": 1,
"source": "browser",
"source_platform": "direct",
"context": {
"stuid": "0123456789abcdef0123456789abcdef",
"session_id": "1.1730000000.0123456789abcdef",
"page_url": "https://shop.example.com/thank-you",
"page_title": "Order complete",
"referrer": "https://shop.example.com/checkout",
"utm": {},
"tracking_ids": {}
},
"user": {
"email": "buyer@example.com",
"phone": null
},
"params": {
"transaction_id": "order_123",
"value": 99.9,
"currency": "USD",
"items": []
}
}
This is the Node's normalized representation, not a raw request body to copy into the ingestion endpoint.
Core fields
event_ididentifies the event and supports deduplication.event_nameis the canonical action, such aspage_view,lead,add_to_cart, orpurchase.event_timeis normalized to Unix seconds.channelidentifies the ingestion family: web events, webhooks, internal events, or imports.action_sourcedescribes where the action occurred, such as browser or server.provideridentifies the normalized provider associated with the source.property_idassigns the event to an active Node Property, falling back to the Node's configured default when necessary.sourceandsource_platformretain useful origin context.contextcarries page, session, first-party identity, attribution, and request context when available.usercontains normalized user fields. Email casing, phone formatting, and aliases are normalized by the Node.paramscontains event-specific values such as transaction ID, value, currency, status, and items.
Do not add platform-specific destination logic to this shared shape. Meta, GA4, Google Ads, CRM, and other handlers own their canonical-to-platform mapping inside their modules.
The five pipeline stages
After translation, EventPipeline::process() runs these stages in order:
- Filter applies rejection rules before further processing.
- Validation checks whether the canonical event is acceptable.
- Enrichment resolves and adds locally available identity and context.
- Persistence stores the resulting event on the Node.
- Forwarding passes the canonical event to each active integration handler.
Because Persistence runs before Forwarding, an event can be visible in the Console even when a destination later rejects or fails to receive it. Use the Node logs and the destination's own diagnostics to investigate that second half.
From GTM to a destination
The current GTM template builds a browser envelope and calls window.supremeSend. The Node translates that input into the canonical shape above. Learn how to configure the source in Connect Google Tag Manager.
Forwarding modules then read the canonical event and build destination payloads. Learn how modules are separated in Integrations overview.
To inspect the result on your own Node, verify your first event.