A batch focused on getting off GTM without losing work and proving your conversions actually land — now with the client variables and tag scheduling that make a container feel complete, sharper geo and anomaly alerting, and full export of your own data. Every entry ships with a way to see it — in the live demo or the admin portal.
Migration
One-click GTM import
Paste a GTM container export and Relay maps your tags, triggers, and variables onto its own container — then shows an honest parity report: what mapped cleanly, what was approximated, and what was skipped, with a coverage percentage. Custom-JS and vendor templates are flagged for re-authoring, never silently dropped, so you switch without quietly losing setup.
See it: admin portal → a site → Container → Import
Runtime
On-demand runtime, plus history & JS-error triggers
The loader stays tiny and pulls the runtime on demand, so every page pays the smallest possible cost up front. Two new triggers ride along: a history-change trigger fires on SPA route changes, and a JS-error trigger lets you turn a broken page into a tracked event — coverage you'd otherwise write code for.
See it: the SPA pageviews and events firing on demo.hwsinc.com
Safety
Container lint
Before you publish, Relay checks the container for dead tags with no firing trigger, dangling trigger references, fire/block contradictions, unused triggers, and empty config. It also folds in a GA4 payload linter that catches what GA4 accepts then silently ignores — reserved names, camelCase params, missing key-event params — each with a plain-language fix.
Preview mode now shows more than which tags fired. A Variables tab lists every variable's resolved value for the event you're inspecting, and an Errors / Consent tab separates a failed-regex from a consent-blocked from a trigger-blocked tag — so "why didn't it fire?" has an answer on screen, before you publish.
Fixed a broken destination? Replay re-sends a failed event's exact stored payload through the live forwarder as a dry-run — never persisted, never double-counted — and tells you whether it works now, with a then-vs-now diff against your current config. Google and Stape can't replay a past event; they keep no re-sendable record.
See it: admin portal → /outbox → a dead-letter row → Replay
Integrity
Duplicate-conversion detection
The same purchase firing twice quietly inflates the ROAS you report to your ad platforms. Relay reads the durable outbox and flags a conversion that was delivered more than once, so you catch double-counting at the source instead of arguing with a spend report weeks later.
See it: admin portal → a delivery trace with a duplicate badge
Analytics
Privacy-respecting attribution
See first, last, and linear credit from traffic source to conversion — "which channel earned this purchase" — without building an identity graph. Because the visitor salt rotates daily, journeys only span the two-day linkable window: attribution without long-term person tracking, and we say plainly where that line is.
See it: admin portal → site dashboard → Attribution
Reliability
Alert rules
Get told the moment a destination starts failing. When deliveries hit the dead-letter queue, or a destination goes quiet while work is still pending, Relay fires an alert — event-driven, so it stays safe with scale-to-zero and never costs you a warm instance. Silent-failure alerting is free here; Stape gates it behind a plan.
See it: admin portal → Settings → delivery alerts
Forwarding
Per-destination batching
Each destination can flush events in batches and hold them behind a send delay before their first forward — useful to smooth traffic toward a rate-limited vendor. It rides on the same durable outbox, so the retry and dead-letter machinery is unchanged; only the timing of the first attempt moves.
See it: admin portal → a destination → batching / Send delay
Resilience
Custom anti-adblock loader
Serve the loader from a custom first-party path so ad-blockers that pattern-match the default filename don't quietly drop your tracking. Paired with the Google Tag Gateway reverse proxy that serves gtag.js first-party, it recovers events that a third-party request would lose — honestly, without fragile cookie-restoration tricks.
See it: the first-party loader path in the demo.hwsinc.com install snippet
Organization
Destination folders
Group your destinations into folders so a site with GA4, three CAPIs, and a couple of webhooks stays readable. It's a small quality-of-life change that keeps the destination list scannable as your forwarding setup grows — no more hunting through a flat wall of endpoints.
See it: admin portal → Settings → Destinations
Export
Blob log export
Export the full delivery log to Azure Blob for your own auditing, warehousing, or compliance retention. The record of what was sent where — and how each destination responded — is yours to keep and query outside Relay, with no export caps or sampling.
See it: admin portal → delivery log → export to Blob
Destinations
Reddit & LinkedIn CAPI
Two new first-class Conversions API destinations join GA4, Meta, and the generic HTTP forwarder. Forward server-side conversions to Reddit and LinkedIn with the same per-destination filters, field mapping, delay, and user-data hashing — match keys are SHA-256 hashed before they leave, so the raw value is never sent.
See it: admin portal → Settings → Add destination
Runtime
Client variables
Pull values straight from the page without writing code: read part of the URL or a query parameter, the referrer, a random number, the text of a DOM element, or a value off a JavaScript global — then use it anywhere you'd use a variable. It's the GTM variable toolkit you already know, so migrating a container doesn't mean losing the resolvers your tags depend on. The heavier resolvers load only when a container actually uses one, so pages that don't stay just as light.
See it: admin portal → Container → add a variable → URL / Query / Referrer / Random / DOM / JS
Tag manager
Tag firing schedule
Give any tag a start and end time so a promotion goes live Friday and stops itself Monday — no redeploy, no reminder to switch it off. Relay validates the window when you publish and enforces it in the runtime, so a limited-time pixel or campaign event fires only when it should. It pairs with tag priority to give you full control over what runs, and when.
See it: admin portal → Container → a tag → Schedule
Data quality
Region & city geo
Add a city-level geo database and every forwarded event carries region and city, not just country — so the geography your ad platforms see is accurate and GA4 stops reporting "(not set)" behind the first-party gateway. It stays deliberately coarse: region and city only, no latitude/longitude and no postal code, so you enrich matching without turning location into a fingerprint.
See it: region & city on a forwarded event's payload in a trace
Reliability
Anomaly detection & email alerts
A tag that quietly stops firing after a redesign usually surfaces weeks later in a spend report. Now Relay watches each event's volume against its own baseline and alerts you when it drops off a cliff — "purchase is down 96%" — so you catch it in a day, not a quarter. And alerts can now arrive by email as well as webhook, delivered through both channels at once, so the right person hears about it without wiring up an integration first.
Your data is yours to keep. Beyond the delivery log, Relay can now archive the full analytics/trace stream to your own Azure Blob storage, and you set how far back each export reaches — tune the retention window per record type instead of accepting one fixed cutoff. No export caps, no sampling: warehouse it, audit it, or hold it for compliance on your terms.
See it: admin portal → delivery + trace log → export to Blob
Authoring
A friendlier variable editor
Authoring server-side variables no longer means hand-writing JSON. A simple row-by-row editor lets you add each variable with a name, a type, and its source — field, prop, constant, or lookup table — and it saves through the same path as before, with the raw-JSON view still there when you want it. Less syntax to get wrong, faster to set up the values your destinations depend on.
See it: admin portal → a destination → Variables
Want to watch one land?
Open the live demo, complete a purchase, and follow it browser → server → GA4 in a real trace waterfall.