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.
| Measurement | How to get it | What a bad value looks like |
|---|---|---|
| Requests per session | Inbound requests at your endpoint divided by sessions over the same window | A 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 request | Vendor requests emitted by the container divided by requests received | Anything 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 requests | Billed instance time divided by request count, bucketed by hour | A figure that spikes in low-traffic hours means you are paying for start-up rather than for work |
| Share of requests that are not customers | Requests from health checks, preview mode, crawlers and known bot signatures, as a proportion of the total | A double-digit percentage, which is common and almost never in anyone's dashboard |
Five things inflating the multiplier
| Driver | Signature in the three measurements | What it actually costs |
|---|---|---|
| Fan-out to many destinations | Outbound calls per inbound request well above 1, rising on the date a destination was added | Compute, egress and tail latency, all multiplied by every request including the ones no destination needed |
| Health checks, previews and crawlers | A share of requests with no session, no consent field and a uniform arrival pattern | Full request handling for traffic that will never convert and is not in any report |
| Untuned scaling | Instance-minutes per thousand requests worst in the quietest hours | Start-up work billed repeatedly, plus latency on the requests unlucky enough to arrive cold |
| Chatty client events | Requests per session far above the number of events anyone queries | Volume across the whole multiplier — every unnecessary inbound hit is fanned out like a real one |
| Bot traffic that looks human | Sessions with plausible headers, one hit each, concentrated in a few networks | Cost, plus contaminated measurement, which is the more expensive half |
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
- 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.
- 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.
- 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.
- 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
The work behind this page
Builds from our portfolio that this page draws on.
ShipSight
A supply-chain control tower that tracks every shipment across ocean, air and ground, predicts each ETA with a confidence score, and flags at-risk shipments before they slip.
LogisticsPipelineIQ
An AI SDR platform that scores every lead for fit, runs multichannel sequences across email, LinkedIn and call, drafts the replies, and books the meeting.
Sales AIRead next
- The tagging server: a first-party endpoint that owns the payloadA tagging server is not a proxy. It parses one first-party event, adds and strips fields, and emits a vendor-shaped request per destination from your infrastructure.definition
- A slice of events lands before the visitor has answered the bannerEvents arriving with an absent consent field are not a compliance abstraction. They are a race between two scripts, and the race has a rate you can measure this afternoon.diagnostic
- Click identifiers: the URL parameters that let a server-sent conversion find the ad that caused itA campaign tag describes where traffic came from. A click identifier is the key that joins a sale back to a specific click — and only one of the two is load-bearing.definition
- Consent state: a typed field on each event, not a switch on the pageThe pageview before the banner answer and the purchase after it are both correct, and they carry different consent values. That only works if consent travels per event.definition
- Conversions started counting twice the week server-side sending was switched onA step change in reported conversions on the rollout date with flat order volume means deduplication failed. Five candidates, and one report that names which.diagnostic
- Event ID: the value that lets two systems agree a conversion happened onceThe same identifier, the same conversion, both transports, inside the platform's window. Four generation strategies, and the guarantee each one keeps or breaks.definition
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