Deep where it counts.
Relay isn't a thin wrapper over someone else's SDK. Each pillar is a real, shipped subsystem — here's what's actually inside.
Measure people without tracking them.
Real, useful numbers built on a privacy floor you can defend to a DPO — not a cookie banner bolted on afterward.
No banner for the basics
Basic analytics needs no consent banner. Identity is a daily-rotating salted hash that's unlinkable after two days.
Raw IP & UA never stored
Sensitive identifiers are dropped at ingest. What lands in your database is already anonymized.
Credit without surveillance
First, last, and linear-touch attribution — computed same-day only, so you get channel insight without a permanent identity graph.
Beacons hit your domain
Events go to your own ingestion endpoint, not a third-party tracker — better data quality, fewer blocked requests.
Offline & CRM conversions
POST events from a backend with a server ingest key; they flow through the same outbox and show up in the same trace.
Self-hosted, unsampled
Your analytics live in your own database — no sampling thresholds, no export limits, no vendor lock-in.
A GTM-class container, built to not break.
Everything you expect from a visual tag manager, plus guardrails that stop a bad publish before it ships.
3 tag types
Event, pixel, and custom-HTML tags — the full range from a tracked click to an arbitrary marketing snippet.
10 trigger types
Scroll depth, timers, element visibility, form-submit, history-change, JS-error, and more — no code required.
Lookup & regex tables
Map inputs to values with lookup and regex-table variables, then reference them across tags and triggers.
Tags / Variables / Errors
Preview mode shows exactly which tags fired, every variable's resolved value, and any errors — before you publish.
Consent gating
Gate any tag behind consent state so regulated pixels only fire when they're actually allowed to.
Lint blocks bad publishes
A 12-rule container lint runs on publish and blocks the release if it would ship something broken.
Publish & rollback
Every publish is a version. Roll back to any previous container state in one click.
One-click GTM import
Import an existing GTM container and get an honest report of what mapped cleanly, what was approximated, and what was skipped.
No silent approximations
When a GTM feature can't map 1:1, Relay tells you — instead of quietly guessing and drifting your setup.
Your own first-party event gateway.
The sGTM / Stape-class layer — running on your domain, in your cloud, with delivery guarantees you can inspect.
~2KB, on-demand chunk
A tiny first-party loader pulls the rest on demand — fast to load, light on every page.
Anti-adblock loader path
A custom first-party loader path plus a Google Tag Gateway reverse proxy serve gtag.js first-party, past most blockers.
GA4, Meta, Reddit, LinkedIn
Forward to GA4 and the major Conversions APIs, plus a generic HTTP/webhook destination with HMAC signing.
Transactional outbox
Every event goes through a transactional outbox with automatic retries — nothing is fire-and-forget.
Dead-letter management
Events that exhaust retries land in a dead-letter queue you can inspect, fix, and replay — not silently lost.
Per-destination shaping
Filter events, map fields, add delays, and batch-flush independently for each destination.
Google Tag Gateway
Serve gtag.js from your own domain via the reverse proxy — first-party Google tags with fewer blocked requests.
HMAC-signed webhooks
Your generic HTTP destination can sign every payload with HMAC so downstream systems can verify authenticity.
User-data hashing
Match keys like phone are SHA-256 hashed before they leave for a destination — the raw value is never forwarded.
Proof, not hope.
The part no other stack gives you: a straight answer to "did my conversion actually arrive?"
End-to-end waterfall
Follow one event from the browser, through the server, out to every destination — with each real HTTP response inline.
Plain-language answers
"Your purchase reached GA4 — proof." No decoding status codes; Relay tells you in words whether it worked.
Then-vs-now diff
Replay a past delivery and diff what would send today against what sent then — catch config drift instantly.
Duplicate-conversion detection
Relay flags the same conversion firing twice so you don't over-report ROAS to your ad platforms.
Proactive alert rules
Get notified on dead-letter thresholds or a destination that's gone silent — before someone asks why numbers dropped.
Delivery-log export
Export the full delivery log to Azure Blob for your own auditing, warehousing, or compliance retention.
One app. Your infrastructure.
No microservice sprawl, no data leaving your control.
One ASP.NET Core service
Analytics, tag manager, and gateway ship as a single self-contained ASP.NET Core app — easy to run and reason about.
Scale-to-zero on Azure
Deploy to Azure with scale-to-zero so it costs nothing when idle and wakes on the first request.
Runs fully offline
Run the entire stack on your laptop with no internet — ideal for development, demos, and air-gapped testing.