Marketing, Advertising & AdTech// diagnostic

The tagging server's cost is growing faster than the traffic it serves

In short

Tagging-server hosting is billed on requests multiplied by fan-out, which is why the curve detaches from your sessions curve: one extra destination raises the work per visit for every visitor at once. Measure requests per session, outbound calls per inbound request, and instance-minutes per thousand requests, then pull the 4 levers in the order that keeps the events you need.

Key takeaways

  • Hosting tracks inbound requests multiplied by outbound fan-out, so sessions can be flat while the bill doubles.
  • Three measurements settle it: requests per session, outbound calls per inbound request, and instance-minutes per thousand requests.
  • Health checks, preview traffic, crawlers and bots consume the same capacity as customers and rarely appear in any tag report.
  • Cold starts are paid twice — in latency on the request and in capacity you provision and discard.
  • Trim at source before you filter at the edge; filtering a request you never needed to send is the more expensive half of the same fix.

The bill is not tracking your traffic because it never did. A tagging server is billed on inbound requests multiplied by what each one triggers, and the multiplier is the part that changes without anyone deciding to change it. Adding a sixth destination to the container turns one inbound hit into seven units of work — the transform, plus six outbound calls, each with its own connection, latency and retry behaviour — for every visitor at once. Sessions stay flat, compute does not.

This is about your own cloud spend and your own egress, and the numbers below are illustrative shapes rather than anybody's real invoice. The point is the arithmetic: once you can state your multiplier, the four levers that move it are obvious and can be ordered by what each one costs you in lost measurement.

Three numbers explain the whole bill

Before touching the container, get these three from your own logs. Together they decompose the cost into a volume term, a fan-out term and an efficiency term, and every fix is aimed at exactly one of them.

MeasurementHow to get itWhat a bad value looks like
Requests per sessionInbound requests at your endpoint divided by sessions over the same windowA chatty client pushing 40 or more where a purposeful one sends 8 to 12 — most of the excess is scroll, timer and visibility events nobody queries
Outbound calls per inbound requestVendor requests emitted by the container divided by requests receivedAnything above 1 is fan-out you are paying for; above 5 the container is a broadcast hub and every new destination raises the bill for all traffic
Instance-minutes per thousand requestsBilled instance time divided by request count, bucketed by hourA figure that spikes in low-traffic hours means you are paying for start-up rather than for work
Share of requests that are not customersRequests from health checks, preview mode, crawlers and known bot signatures, as a proportion of the totalA double-digit percentage, which is common and almost never in anyone's dashboard
The three measurements, what each one exposes, and an illustrative healthy shape

Five things inflating the multiplier

DriverSignature in the three measurementsWhat it actually costs
Fan-out to many destinationsOutbound calls per inbound request well above 1, rising on the date a destination was addedCompute, egress and tail latency, all multiplied by every request including the ones no destination needed
Health checks, previews and crawlersA share of requests with no session, no consent field and a uniform arrival patternFull request handling for traffic that will never convert and is not in any report
Untuned scalingInstance-minutes per thousand requests worst in the quietest hoursStart-up work billed repeatedly, plus latency on the requests unlucky enough to arrive cold
Chatty client eventsRequests per session far above the number of events anyone queriesVolume across the whole multiplier — every unnecessary inbound hit is fanned out like a real one
Bot traffic that looks humanSessions with plausible headers, one hit each, concentrated in a few networksCost, plus contaminated measurement, which is the more expensive half
Ranked by how often each turns out to be the driver

Fan-out leads because it is the only driver that is multiplicative. Every other row adds requests; this one changes what each request is worth in compute. It is also the one that grows by accident: destinations get added one at a time by people solving a real problem, and no single addition ever looks like the moment the curve turned.

Health checks, previews and crawlers bill exactly like customers

This is the fastest saving available and the most often overlooked, because none of this traffic appears in a tag report. A load balancer probing the endpoint every 2 seconds generates 43,200 requests a day, and most deployments run more than one checker across more than one region. Container preview and debug sessions can produce more requests per minute than a busy customer. Crawlers execute page scripts, and with a first-party endpoint they reach your infrastructure exactly like everyone else.

  • Answer probes with an HTTP 204 on a dedicated path that terminates before any transform, consent evaluation or destination logic runs. An hour of work, and it removes a permanent baseline.
  • Make preview and debug traffic identifiable, then exclude it from destination sending rather than only from reports. A preview session that still fans out to 6 vendors costs what a real one costs.
  • Drop crawlers at the edge on User-Agent plus network — an ASN or CIDR match is harder to spoof than a header alone — so the request is refused before it becomes compute. Log the count, so nobody has to guess later how much was dropped.
  • Watch the client identifier as you filter. Any request that also carries the first-party identifier write is not free to discard — the churn it creates is the subject of returning visitors arriving as new ones.

Cold starts: paying twice for capacity you keep discarding

Autoscaling to zero looks thrifty and often is not. A container that starts, serves a handful of requests and stops has spent most of its billed life initialising, and the requests that arrive during that window pay for it in latency — which matters here because a slow response on a conversion hit is a lost conversion, not a slow page. The counter-intuitive result is that a small floor of always-warm instances usually reduces total billed time on any endpoint with steady low-volume traffic.

Set the floor from your own hourly request distribution rather than from a default. If the quietest hour still sees continuous traffic, one warm instance is almost certainly cheaper than repeated starts. If traffic genuinely stops overnight, scaling to zero is correct and the cold starts are the price of that being true.

A tagging endpoint that scales to zero has not saved you the request. It has moved the cost from compute into latency, on exactly the requests you least want to be slow.

Four levers, in the order that keeps every event you need

  1. Trim at source. Stop sending client events nobody queries. This is the only lever that reduces the inbound term and the fan-out term at once, and it is free — the work is deciding which events are load-bearing, not writing code. Protect the landing hit that captures the click identifier, because losing that one is the failure traced in the click identifier missing by the time the form submits.
  2. Filter at the edge. Refuse probes, previews, bots and malformed payloads before they become compute. Second because it removes work you should not have accepted, but it does not reduce anything a real visitor generates.
  3. Cut the fan-out. Send each destination only the events it actually consumes, rather than every event to every destination. Most containers broadcast by default, and most destinations use a fraction of what they receive. Which fields each destination genuinely needs is the subject of assembling a server-sent conversion a platform will match.
  4. Right-size the runtime. Set a minimum instance count from the hourly distribution, size memory to the observed working set rather than to a default, and check whether outbound calls reuse a pooled connection or perform a fresh TLS handshake each time — repeated 6 times per request, that handshake is pure overhead. Last, because tuning a runtime that is doing unnecessary work only makes the waste more efficient.

What to watch afterwards, so the curve stays flat

  • Publish cost per thousand events beside the absolute figure. The absolute number rises with a good quarter; the ratio only rises when something got worse, and it is the number to alert on.
  • Alert on outbound calls per inbound request. It is the multiplier, it changes when someone adds a destination, and a step change in it is the earliest warning you will get.
  • Make adding a destination a reviewed change with a stated event subset and an owner, not a container edit. The same admission discipline applies to anything third parties inject into your pages — the checks in pre-flight checks before accepting a creative tag exist for exactly this reason.
  • Give the operators a view they can read without a warehouse query. A small dashboard showing requests, fan-out and non-customer share by hour is the sort of internal tooling that pays for itself the first time a bot wave arrives on a weekend.

The honest summary is that a tagging server is not expensive; broadcasting every event to every vendor is expensive, and a server-side container makes that habit visible for the first time by putting a bill against it. Fix the multiplier and the same architecture gets cheaper as it gets more useful. The rest of this silo sits under tracking, consent and event pipelines, part of our marketing and advertising practice.

Frequently asked questions

Short answers to the follow-ups this page tends to raise.

Why is server-side tagging hosting cost rising faster than traffic?

Because the bill is a product of two terms and only one of them is traffic. Inbound requests multiplied by fan-out — the number of outbound vendor calls each request triggers — determines the work done, so adding a destination raises the cost of every visit at once while sessions stay flat. Non-customer traffic and cold-start overhead then sit on top of that product.

How do I measure cost per event on a tagging server?

Divide billed instance time by the count of inbound requests, bucketed by hour rather than by day. Then divide vendor calls emitted by requests received to get the fan-out multiplier, and multiply the two to see what one visitor event really consumes. Hourly buckets matter because cold-start overhead and bot load both hide inside a daily average.

Should the tagging server scale to zero?

Only if traffic genuinely stops. On an endpoint with continuous low-volume traffic, a small floor of warm instances usually costs less total billed time than repeated cold starts, and it removes the latency spike on requests that arrive while a container is initialising. Set the floor from your own hourly distribution rather than accepting a platform default.

Is it safe to stop sending some client events to the server?

Yes, once you can name every reader of each event and confirm it has none. Check destinations, warehouse models and audience definitions before removing anything, because an event with a live consumer will fail quietly rather than loudly. Trimming at source is the cheapest lever available precisely because it reduces both the request count and the fan-out at the same time.

  • server-side tagging
  • infrastructure
  • event pipelines
  • diagnostics
// shipped work

The work behind this page

Builds from our portfolio that this page draws on.

Read next

Working on something in this space?

Tell us where you are in a sentence or two. We'll tell you honestly whether we're the right team, and what a sensible first slice of the work looks like.

Start the conversation