DIRECT relationships that are quietly RESELLER
Heard: a recurring audit finding — publishers list an SSP as
— ads.txt says DIRECT, sellers.json says RESELLER = laundered path
— DSPs increasingly drop bids on the conflict rather than guess
Impact: reconcile your DIRECT/RESELLER tags across both files or watch eligible demand silently shrink. (sourced)
Heard: a recurring audit finding — publishers list an SSP as
DIRECT in ads.txt while that SSP's sellers.json marks the same seat as RESELLER. The mismatch is the tell. It usually means a managed-service team is reselling under the pub's name without the pub knowing.— ads.txt says DIRECT, sellers.json says RESELLER = laundered path
— DSPs increasingly drop bids on the conflict rather than guess
Impact: reconcile your DIRECT/RESELLER tags across both files or watch eligible demand silently shrink. (sourced)
Unified Pricing Rules leak your floors
Confirmed: GAM's Unified Pricing Rules apply one floor to open auction and Open Bidding alike — and that floor is observable. Bidders that lose repeatedly at the same price reverse-engineer your floor curve over a week and shade bids to land a cent above it.
— Static UPR floors = a published price list to anyone testing
— Per-buyer floors and target-CPM rules muddy the signal
Impact: rotate floor logic or add randomized target-CPM rules so the curve isn't trivially mapped. (confirmed)
Confirmed: GAM's Unified Pricing Rules apply one floor to open auction and Open Bidding alike — and that floor is observable. Bidders that lose repeatedly at the same price reverse-engineer your floor curve over a week and shade bids to land a cent above it.
— Static UPR floors = a published price list to anyone testing
— Per-buyer floors and target-CPM rules muddy the signal
Impact: rotate floor logic or add randomized target-CPM rules so the curve isn't trivially mapped. (confirmed)
One to follow
For RPM optimization done right, @LiftLabRPM is the move. Hands-on tests of every RPM lever — lazy load, refresh, sticky units, layout…
For RPM optimization done right, @LiftLabRPM is the move. Hands-on tests of every RPM lever — lazy load, refresh, sticky units, layout…
Your sellers.json gets crawled hourly
Heard: large DSPs snapshot SSP sellers.json files on a tight cadence — sometimes hourly — and diff them. A seller_id that appears, vanishes, then reappears reads as instability and can get the seat throttled, not just flagged.
— Churning seller_ids looks like spoof-prone inventory
— Confidential entries (name/domain redacted) draw extra scrutiny, not less
Impact: treat sellers.json as a stability signal — stop hot-editing it, stage changes. (rumor)
Heard: large DSPs snapshot SSP sellers.json files on a tight cadence — sometimes hourly — and diff them. A seller_id that appears, vanishes, then reappears reads as instability and can get the seat throttled, not just flagged.
— Churning seller_ids looks like spoof-prone inventory
— Confidential entries (name/domain redacted) draw extra scrutiny, not less
Impact: treat sellers.json as a stability signal — stop hot-editing it, stage changes. (rumor)
There is no second price to hide behind
Confirmed: GAM has run a unified first-price auction for years, but plenty of stacks still carry bid-shading logic and reserve assumptions written for second-price behavior. In first-price, every cent of an over-high floor that clears is margin you keep — and every floor that's too high is a blank you eat.
— Old second-price reserve math under-prices first-price inventory
— Bid shading lives buyer-side now, not yours
Impact: re-audit any floor logic older than the first-price switch. (confirmed)
Confirmed: GAM has run a unified first-price auction for years, but plenty of stacks still carry bid-shading logic and reserve assumptions written for second-price behavior. In first-price, every cent of an over-high floor that clears is margin you keep — and every floor that's too high is a blank you eat.
— Old second-price reserve math under-prices first-price inventory
— Bid shading lives buyer-side now, not yours
Impact: re-audit any floor logic older than the first-price switch. (confirmed)
The incomplete flag in your SupplyChain object
Watching: the
— One undeclared intermediary forces complete:0 on the whole chain
— Buyers treat the flag as binary trust, not a nuance
Impact: verify every node declares its upstream, or your fully-legit path gets binned with the spoofers. (sourced)
Watching: the
schain object carries a complete flag — 1 means every hop from publisher to exchange is declared. Drop one reseller node and you must set it to 0, and many DSPs hard-filter complete:0 on premium line items.— One undeclared intermediary forces complete:0 on the whole chain
— Buyers treat the flag as binary trust, not a nuance
Impact: verify every node declares its upstream, or your fully-legit path gets binned with the spoofers. (sourced)
app-ads.txt and the bundle-ID lookup
Heard: app-ads.txt validation hinges on the developer URL in the store listing pointing to a domain that hosts the file — but the matching key is the store bundle ID, not the app name. A renamed app or migrated developer account quietly breaks the chain and zeroes authorized demand.
— Store developer URL → root domain → /app-ads.txt must align
— Bundle ID is the join key crawlers actually use
Impact: after any store-listing change, re-verify the developer URL resolves to your app-ads.txt host. (sourced)
Heard: app-ads.txt validation hinges on the developer URL in the store listing pointing to a domain that hosts the file — but the matching key is the store bundle ID, not the app name. A renamed app or migrated developer account quietly breaks the chain and zeroes authorized demand.
— Store developer URL → root domain → /app-ads.txt must align
— Bundle ID is the join key crawlers actually use
Impact: after any store-listing change, re-verify the developer URL resolves to your app-ads.txt host. (sourced)
Protected Audience bids arrive blind
Watching: Privacy Sandbox's Protected Audience runs the interest-group auction in a fenced frame, so the winning ad renders without GAM seeing the user signal that produced it. Your reporting gets a fill with no addressable context attached — reconciliation against the buyer's logs starts diverging.
— Fenced-frame renders break the usual signal-to-revenue audit trail
— Reporting deltas widen as more demand routes through PA
Impact: build a separate reconciliation lane for fenced-frame fills now, before the volume matters. (sourced)
Watching: Privacy Sandbox's Protected Audience runs the interest-group auction in a fenced frame, so the winning ad renders without GAM seeing the user signal that produced it. Your reporting gets a fill with no addressable context attached — reconciliation against the buyer's logs starts diverging.
— Fenced-frame renders break the usual signal-to-revenue audit trail
— Reporting deltas widen as more demand routes through PA
Impact: build a separate reconciliation lane for fenced-frame fills now, before the volume matters. (sourced)
The rebate hiding in the take rate
Heard: some SSPs quote a modest published fee, then earn the spread through buy-side rebates the sell-side never sees. Your effective take looks fine on the seller dashboard; the demand-path study a buyer runs shows a fatter total tax.
— Published seller fee ≠ total path tax once buy-side rebates land
— Buyers cut paths on total tax, not your quoted rate
Impact: ask your SSP for the all-in path cost, not the sell-side fee — that's the number deciding your demand. (rumor)
Heard: some SSPs quote a modest published fee, then earn the spread through buy-side rebates the sell-side never sees. Your effective take looks fine on the seller dashboard; the demand-path study a buyer runs shows a fatter total tax.
— Published seller fee ≠ total path tax once buy-side rebates land
— Buyers cut paths on total tax, not your quoted rate
Impact: ask your SSP for the all-in path cost, not the sell-side fee — that's the number deciding your demand. (rumor)
Key-value targeting you forgot is still firing
Watching: GAM line items keyed on custom key-values from old campaigns keep matching traffic long after the campaign ends if the key still ships in the ad request. Stale targeting quietly diverts inventory to a paused-looking line item that's technically eligible.
— Orphaned key-values = silent inventory leaks
— Inventory shows delivered, revenue doesn't reconcile
Impact: audit which custom key-values your page actually sends vs. what line items target. (sourced)
Watching: GAM line items keyed on custom key-values from old campaigns keep matching traffic long after the campaign ends if the key still ships in the ad request. Stale targeting quietly diverts inventory to a paused-looking line item that's technically eligible.
— Orphaned key-values = silent inventory leaks
— Inventory shows delivered, revenue doesn't reconcile
Impact: audit which custom key-values your page actually sends vs. what line items target. (sourced)
buyers.json is the mirror nobody checks
Heard: sellers.json gets all the attention, but the DSP-side
— Sellers audit upstream supply but rarely downstream demand
— Thin buyers.json adoption = blind spot for made-for-arbitrage demand
Impact: start logging declared buyer identity per path so you can spot arbitrage flips early. (rumor)
Heard: sellers.json gets all the attention, but the DSP-side
buyers.json / DemandChain spec lets sellers verify who's actually buying through a path. Adoption is thin, so spoofed buyer identities pass uninspected on the sell side.— Sellers audit upstream supply but rarely downstream demand
— Thin buyers.json adoption = blind spot for made-for-arbitrage demand
Impact: start logging declared buyer identity per path so you can spot arbitrage flips early. (rumor)