The auction simulator: floor, bidder, and bid-level controls beside charts of RPM and fill rate across floor prices

Tags

TypeScriptReactSVGad auctionsyield managementpricingsimulation

Open the simulator →

Floor prices are one of the simplest yield levers in programmatic advertising, and one of the easiest to get wrong. A higher floor lifts the price paid on the impressions that still sell, but it rejects more bids and lowers fill. This simulator makes that trade-off something you can push on directly.

What it does

Pick a floor, the number of bidders per impression, the typical bid, how dispersed bids are, and whether the auction is first- or second-price. The simulator reports four numbers for that scenario and charts revenue per 1,000 impressions (RPM) and fill rate across a sweep of floors, marking the floor that maximizes RPM.

The model

  • 2,000 impressions from a seeded random number generator, so results are reproducible.
  • Each impression gets k bidders (1–10). Each bid is a CPM in dollars drawn from a lognormal distribution: the median bid times exp(spread × a standard normal draw).
  • Every scenario and every floor in the sweep reuses the same draws, so differences come from the settings alone.

Definitions

  • Bid-rejection rate = bids below the floor ÷ all bids.
  • Fill rate = impressions with at least one bid at or above the floor ÷ impressions.
  • Clearing price: first-price pays the highest bid. Second-price pays the higher of the second-highest eligible bid and the floor; with one eligible bid, it pays the floor.
  • RPM = mean clearing CPM across all impressions, counting unfilled impressions as $0.

Checks

The model lives in a pure module with a sanity-check script that runs on every change:

  • A $0 floor with at least one bidder gives 100% fill and 0% rejection.
  • A floor above every bid gives 0% fill.
  • The second-price clearing price is never above the first-price price for the same draws, checked impression by impression.
  • Adding bidders never lowers first-price RPM at a $0 floor for the same seed.

Limits

This is a simplified model on synthetic data; it does not represent any company's systems or data. It leaves out bid shading, budgets and pacing, inventory-specific floors, and bidders who adapt to the floor.