Blog

The Anatomy of a Bid Decision

A programmatic bid is decided in a few milliseconds across dozens of sequential gates. Here is what actually happens between a bid request arriving and a bid response leaving — and how to read it.

Author
Ad360 engineering
Discipline
Platform engineering

Every programmatic impression begins with a question and ends, a few milliseconds later, with an answer. The question arrives as an OpenRTB bid request: here is an opportunity to show an ad — do you want it, and how much is it worth to you? The answer is a bid response, or silence.

What happens in between is the most consequential process in programmatic advertising, and the least understood. It is where eligibility is resolved, where targeting is enforced, where budget is paced, where a model scores the opportunity, and where a price is formed. It runs continuously, at volume, inside a latency budget measured in milliseconds. And for most of the market, it is a black box.

This article opens the box. It walks through the decisioning funnel a real bidder runs on every request — not as a diagram of an idealized DSP, but as the ordered sequence of gates that actually executes in production.

Why the decision is worth understanding

It is tempting to treat the bidder as a commodity: requests go in, bids come out, and the interesting work is assumed to live in targeting setup or reporting. That assumption is wrong in a way that quietly costs advertisers money.

The bid decision is where strategy becomes execution. A targeting rule that looks correct in a campaign UI only matters if the bidder enforces it on the right request, in the right order, within the latency budget, while respecting the campaign's pace. When delivery underperforms, the cause is usually somewhere in this funnel — a filter removing more candidates than expected, a pacing gate throttling harder than intended, a contextual signal that never matched. You cannot diagnose what you cannot see.

Owning and instrumenting this layer is what separates a platform that executes from one that resells someone else's execution. The bidder is not only a UI layer on top of third-party tools — it evaluates programmatic signals, pacing constraints, curation rules, and optimization feedback before dispatching governed decisions at execution speed.

The funnel is a sequence of gates

A bid decision is not a single calculation. It is a pipeline of sequential filters, each of which can remove an opportunity from contention. An opportunity that survives every gate becomes a bid; one that fails any gate becomes a no-bid.

Drawn from a production win-rate waterfall — an instrumented chart that counts how many opportunities survive each stage — the funnel runs, in order, through roughly thirty named stages. They group naturally into phases.

Phase 1 — Eligibility and candidate retrieval

Start → Eligible → Get Candidates → Billing ID → Deal ID

Before anything is scored, the system establishes whether there is anything to do. It confirms the request is eligible, retrieves the set of candidate line items that could conceivably serve, and resolves commercial context — the billing identity and any deal (PMP) the request belongs to. This phase answers: do we have buyers who could want this, under what commercial terms?

Phase 2 — Hard targeting filters

Property Types → Viewability → Slot Visibility → Historical CTR → Operating System → Device → Creative Types → Creative Sizes → Native Context Types → Native Context Subtypes → Native Placement Types → Languages → Day Parting → Hour Parting → Geolocation → Hyperlocal → CPM Floor

This is the longest phase and the one most operators underestimate. Each stage is a binary or near-binary constraint: the inventory type, the viewability and slot conditions, the device and operating system, the creative formats and sizes that can physically render, the native placement structure, language, time-of-day and hour windows, geography, hyperlocal precision, and the price floor.

Every one of these can legitimately end the decision. A creative that does not fit the slot, a request outside the day-parting window, a geo that falls outside the fence, a floor above the line item's willingness to pay — any of these produces a no-bid that is correct. The art is distinguishing correct attrition from accidental over-filtering.

Phase 3 — Context and audience

Domains → Context → Audience Segments → Site Contextual Content → App Contextual Content → First-Party Audience

Having survived the hard filters, the opportunity is matched against the richer, softer signals: domain-level rules, contextual taxonomies for site and app content, audience segments, and first-party audiences. In a typical funnel this is where a large share of remaining candidates drop out — contextual and audience matching is selective by design. This phase answers: is this the right context and the right person, not merely a renderable slot?

Phase 4 — Pacing

Pacing Cap → With Pacing Controller

Pacing is where eligibility meets economics over time. Even a perfectly matched opportunity can be declined because the line item has already spent its share for this interval. Two stages appear distinctly in the funnel: a pacing cap, and the pacing controller itself, which decides — often probabilistically — whether to participate in this specific auction in order to keep delivery on its intended curve. Pacing is a deep enough discipline that it deserves its own treatment; what matters here is that it sits after matching and before allocation. The system first decides the opportunity is worth wanting, then decides whether now is the right moment to want it.

Phase 5 — Allocation, winner selection, and inference

Allocate Ad Slots → Remove Empty Ad Slots → Winning Line Item → Run Inference → Get Bid Response

With a paced, eligible, matched set of candidates, the system allocates available ad slots, discards empties, and selects the winning line item. Then — and only then — it runs inference: a machine-learning model scores the opportunity (for example, a calibrated probability tied to the campaign's goal), feeding the final value and price. Run Inference is a discrete, in-path production stage, not an offline afterthought. Finally, the bid response is assembled and dispatched.

The ordering is deliberate. Inference is comparatively expensive, so it runs near the end, on the small fraction of opportunities that have already survived every cheaper gate. There is no value in scoring an impression the campaign was never eligible to win.

How to read a win-rate waterfall

The waterfall is more than a record of one decision — it is a diagnostic instrument. Plotted as a bar per stage, it shows the proportion of opportunities surviving each gate, shaded from green (most survive) through amber to red (few survive). The shape tells a story:

Win-rate waterfall: the production bid decisioning funnel
A production win-rate waterfall — the share of opportunities surviving each stage of the decisioning funnel, from Start to Get Bid Response. · Ad360
  • Tall green early bars mean eligibility and candidate retrieval are healthy.
  • A sharp drop at a single hard filter flags a misconfiguration — for example, an unexpectedly large fall at Creative Sizes suggests creatives that do not fit available slots.
  • The amber band at contextual and audience stages is normal selectivity; a collapse there can indicate over-narrow targeting.
  • The final red stages — pacing, allocation, winner selection, inference — are where the surviving few become actual bids.

Read this way, win rate stops being a single opaque number and becomes a map of where and why opportunities are lost. That is the difference between knowing a campaign is under-delivering and knowing which gate to fix.

The latency budget is the hidden constraint

All of this must happen fast. The bidder runs against a sub-50ms target, and in practice processing time for requests with ads sits largely in the 1–5ms range, with occasional spikes (into the teens of milliseconds) clustered around top-of-hour load. That budget is not a vanity metric: exceed it and the exchange times out, the bid never lands, and delivery and win rates suffer regardless of how good the decision would have been.

Bidder request processing time for requests with ads
Per-request processing time for requests with ads — largely in the 1–5ms range against a sub-50ms target, with occasional top-of-hour spikes. · Ad360

This constraint shapes the architecture. It is why the funnel front-loads cheap, decisive filters and defers expensive model inference to the end. It is why inference must execute in-path within the same millisecond budget rather than as a separate round trip. Every stage in the waterfall is also a line item in a latency budget, and the funnel's order is partly an economic ordering of compute cost against elimination power.

Common misconceptions

  • "The DSP just bids the maximum." No. The bid is the output of a long elimination process followed by a value estimate; price formation is the last step, not the whole story.
  • "Bidding is solved and commoditized." The number of independents that have built and sustained a real bidder is small. The engineering — instrumented, low-latency, in-path inference — is rare precisely because it is hard.
  • "AI makes the bid." Most of the decision is deterministic gating. Machine learning enters at one discrete, late stage. Conflating the two obscures both what the model does and what it doesn't.
  • "A no-bid is a failure." Most no-bids are correct: the opportunity genuinely failed a constraint. The goal is not to bid more often; it is to bid on the right opportunities and to understand the ones you decline.

What good operation looks like

Teams that understand the funnel operate differently. They treat the win-rate waterfall as a first stop when delivery drifts, rather than guessing at targeting. They distinguish structural attrition (a floor that is simply too high for the inventory) from accidental attrition (a creative-size mismatch). They reason about pacing as a control decision sitting between matching and allocation, not as a mysterious throttle. And they respect the latency budget as the boundary inside which every other decision must fit.

Open questions

The funnel is not static, and several questions are genuinely unresolved across the industry:

  • How should the decisioning sequence adapt as third-party signals continue to degrade? Which contextual and first-party stages carry more weight when identity carries less?
  • Where should an agentic or automated optimization layer sit relative to deterministic gating — above it, setting constraints, or inside it?
  • What is the right standard of transparency for bid logic itself, so that buyers can audit why an opportunity was declined without exposing competitive internals?

These are the questions worth arguing about. They are only answerable, though, once the decision is legible — once the bid is understood not as a black box, but as an ordered, instrumented sequence of gates running inside a few milliseconds.