How Digital Vantage moved tagging out of the browser and onto its own server — first-party, adblock-resistant and controlled from one place for every domain
Internal Digital Vantage infrastructure: a self-hosted server-side Google Tag Manager container that tags traffic for six domains across three countries from a single place. There is no client and no interface — the case sells DevOps and analytics competence: tracking that survives adblockers, with Consent Mode and monitoring of our own that catches an outage in five minutes instead of a day. A reference build, live in production.

Classic tracking (gtag.js plus fbevents.js) has three known weaknesses: adblockers strip third-party scripts, Safari ITP deletes third-party cookies after seven days, and every additional script costs Core Web Vitals. So we moved tagging onto our own server — one light script from a first-party domain and one point of control over tags for six domains at once.
The real challenge arrived after the rollout. On 7 May 2026 tracking died on all six domains: Google rotated the container image tag, and with it came a configuration requirement the containers did not have, so /gtag/destination began returning 400. The outage lasted over a day and nobody noticed — monitoring existed, but it checked whether the container was alive (always 200) rather than whether the tag actually accepted an event; and it had never worked anyway, because it read its host list from a file that did not contain one. A human found the outage by hand, in the browser console.
Every decision answers something that failed. The health check now hits two endpoints per host — "the container is alive" AND "GA4 genuinely accepts an event" — because it was the second class of failure that went unnoticed. Configuration (hosts, measurement IDs) is read straight from a single README so it cannot drift apart the way it did before.
The image is pinned to a specific SHA instead of a moving tag that Google rotates without warning — and because a pin is a debt, a weekly cron watches for the rotation before it reaches production. Alerts have a lifecycle on GitHub Issues: the first failure opens an issue and pings Discord, subsequent ones only add a comment, recovery closes it — because twelve identical pings in an hour teach a team to ignore them. The whole monitoring layer is ~1,027 lines of bash with 84 tests under CI, because an unverified monitoring script is the same problem all over again.
Detection time fell from over a day to under five minutes: the synthetic check runs 10 probes every 5 minutes and pings Discord on the first failure. Measured 16 July 2026 — 10 of 10 probes healthy, every one a 200. Six domains across three countries run on one container with 512 MB of RAM and half a core, on an existing VPS, at no extra cost compared with a managed cloud runtime.
We read that as an engineering result and present it as one. We do not claim "99.9% uptime" — there is no run history here to compute it from. A mean time to detection under five minutes is correct by construction, but it is backed by a single outage from before the rollout, not by a series of detections after it. That is exactly the honesty — measure what was measured — that this project is meant to demonstrate.
Self-hosted server-side GTM for 6 domains, with monitoring that cut tracking-outage detection from over a day to 5 minutes.
I will move tracking onto your own server — first-party, adblock-resistant, controlled from one place.