Latest release

What's new in Relay.

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.

See it: admin portal → Container Overview → Container lint panel
Preview

Preview: Variables & Errors tabs

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.

See it: admin portal → Container → Preview → Variables / Errors
Shipping this week

Delivery replay

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.

See it: admin portal → Settings → delivery alerts → anomaly threshold + email
Export

Log & trace export, with retention tiers

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.