Publisher Page
A user loads a page containing an available ad impression.
PROGRAMMATIC ADVERTISING SANDBOX
Run a browser-side header bidding auction, follow the Mini SSP and DSP decisions, inspect the OpenRTB supply path and see why the ad server chose the final creative.
Simulated inventory. No real ads are served.
Follow one impression from the publisher page to the final creative.
A user loads a page containing an available ad impression.
The real browser wrapper starts an auction and calls three custom bidder adapters.
Each adapter converts its simulated SSP result into a standard Prebid bid.
The impression is evaluated and a bid or no-bid decision is returned.
The Prebid winner competes with direct demand under the selected delivery rule.
The selected ad is rendered back into the publisher's ad slot.
Choose a module to learn how it was built and get a practical experiment to run.
| Supply path | DSP selected | CPM | Latency | Result |
|---|---|---|---|---|
| Run an auction to generate SSP responses. | ||||
Observe the browser wrapper create an auction, request three SSP bids, receive responses and hand its highest eligible candidate to the ad server.
300 × 250Detecting version…Runtime adaptersRenderPrebid selects the best programmatic bid. The ad server then compares that candidate with direct demand and chooses what the publisher finally renders.
Awaiting candidatesThe header bidding winner is not necessarily the creative that ultimately appears.
This is a deliberately simplified ad server. It teaches price priority and guaranteed sponsorship behavior; it is not Google Ad Manager and does not model pacing, forecasting, targeting, frequency caps or every delivery rule.
The browser now requests auction data from a separately deployed Node.js service.
Add your Render service URL in config.js to activate the backend.
Each SSP asks its connected DSPs for bids, validates the responses, and returns one result to the publisher.
Run an auction to inspect the DSP competition inside each path.
Notice the duplicated buyers. The same DSP can access the impression through more than one SSP. Each route is a separate supply path and can produce a different price or latency.
Compare every SSP route with the publisher's public seller declarations before the simulated buyer allows it into the auction.
Important boundary: ads.txt is publicly hosted and normally crawled by buyers outside the live page auction. Prebid.js does not automatically read or enforce it. This lab applies a simulated buyer policy so the authorization consequence is visible.
# Run an auction to evaluate the file.
Run an auction to compare the three supply paths with the selected file scenario.
Resolve every asi + sid pair to a disclosed seller, then follow the ordered payment nodes carried in source.schain.
How the standards divide the work: ads.txt declares which advertising-system account may sell the publisher's inventory; sellers.json identifies the entity behind an account; schain travels with the bid request and orders the entities involved in payment. This lab's public sellers.json is a combined educational snapshot. Normally, each advertising system hosts its own file.
Run an auction to resolve seller identities.
ver 1.0Run an auction to inspect the SupplyChain object for every SSP route.
Inspect the bid request sent by an SSP and the response returned by a connected DSP.
The payloads are structurally realistic and educational. Each server-generated bid request includes source.schain. The SSP-to-DSP exchange is still simulated inside one Node.js process.
Run an auction, then select any SSP path and DSP connection.
Select a DSP exchange to see how the SSP evaluates it.
Choose a field
Select one of the OpenRTB fields to understand its role in the transaction.
Replay the modeled SSP response times alongside the real Prebid auction result and see which supply paths qualified before the timeout.
Choose your settings and run an auction. SSP responses will appear here in chronological order.
The lab combines browser technology, a separately deployed auction service and controlled market simulations so every decision can be inspected safely.
Creates the impression and collects the experiment settings.
Calls three custom adapters and ranks eligible SSP responses.
Validates the request and creates the server-side auction model.
Produces inspectable bids, latency and OpenRTB exchanges.
Compares the Prebid candidate with direct demand and renders the winner.
source.schain.ads.txt and sellers.json are publicly served files after deployment.One impression fans out through three SSP routes. Each SSP runs its own DSP competition and returns one candidate to Prebid. Direct demand enters later, at the ad server, after header bidding has finished.
Floor, timeout and consent
Sends parallel requests
Each SSP returns only its strongest valid DSP bid.
Highest eligible SSP response
Price priority or guaranteed
Prebid candidate vs. direct demand
One final ad reaches the slot
Important: the direct campaign does not bid through an SSP and does not compete inside Prebid. It joins only when the ad server compares the completed header-bidding result with direct demand.
Programmatic advertising is difficult to learn because the most important decisions happen across systems that users rarely see together. This project exposes those decisions in one coherent experience.
Explain browser auctions, supply paths, transparency files, protocol payloads and final delivery without relying on disconnected diagrams.
Model one impression end to end, keep every module synchronized to the same auction and make each rejection or winning decision explainable.
Interactive controls, Prebid adapters, a Node.js API, Mini SSP/DSP logic, OpenRTB inspection, authorization explorers, infrastructure monitoring and automated tests.
Programmatic architecture, technical product thinking, troubleshooting, API design, data visualization and the ability to translate complexity into practical learning.
Programmatic Lab is an independent educational project created by a programmatic advertising professional with experience across campaign operations, consulting and platform solutions.
Contact the Creator ✉Programmatic Lab is free to use and independently maintained. If it helped you learn, you can make an optional contribution toward hosting and future improvements.
The complete learning experience remains free.Educational purpose: Programmatic Lab models advertising infrastructure for learning. It does not sell media, serve commercial ads or represent an SSP, DSP or ad server vendor.
Data boundary: The lab does not intentionally collect advertising identifiers or build user profiles. Auction settings are used to generate the demonstration and may be sent to the configured auction API.
External services: Prebid.js is loaded from a CDN. Ko-fi opens as an external website and applies its own privacy terms.
Audience measurement: Vercel Web Analytics records anonymous, aggregated page-view information to help improve the Lab. It does not use third-party cookies or associate visits with an individual or IP address.
Before activating support: Add the provider identification, tax and privacy information required for your own location and payment setup. Optional contributions do not unlock features.