Bidding above the floor
A fixed price cannot clear a market. GHAN therefore prices in two layers: a published floor anyone can always buy at, which never rises, and a second-price auction above it for priority when inventory is contested. You bid a price per retained install, not per click.
The problem with a purely fixed price
The original rate card was fixed, published and unchangeable. That solved one real problem and created another.
It solved being priced out. In a search auction the clearing price is the price. When a better-funded competitor enters your keyword, the floor rises under you and eventually you cannot buy at all. That is the arithmetic that pushes one-time-licence desktop apps out of paid search entirely.
But a fixed price cannot clear a market. If three advertisers want creator-tool inventory and there is only enough for two, a fixed price has no way to decide, and it systematically underpays the apps supplying that inventory. Supply then does not grow, because supplying more earns no more. A price that never responds to demand is not a protection, it is a cap on the whole network.
Two layers
| Layer | What it does | Who sets it |
|---|---|---|
| Floor | The published rate card. Any approved advertiser can always buy at it. It never rises. | GHAN, published in code |
| Bid | Optional. Buys priority in contested inventory, above the floor. | The market |
You do not have to participate in the second layer. Leave the bid unset and you buy at floor price, forever, at the price on the pricing page.
How the auction works
Second price. You set max_bid_cents — the most you are willing to pay for a cleared install in that category. If you win, you pay one cent more than the next-highest competing bid, never your own maximum.
That single property is what removes the objection to auctions. Under second-price clearing, bidding your honest value is the best strategy available to you. There is no gain from watching competitors, no gain from re-bidding, and no spiral, because the thing you are competing against is somebody else's honest value rather than their nerve.
Per category, per slot type. There is no single global auction. Contention is resolved inside a category band for a given lifecycle slot, because a first_success impression in a creator tool is a different asset from an idle impression in a utility.
On cleared installs, not clicks. This is the difference that matters most. A bid is a price for an install that is still in use 48 hours later. If the install does not survive, you pay nothing regardless of what you bid. You cannot lose money to a high bid on traffic that never converts, which is the normal way an auction hurts you.
A worked example
Creator tools, floor EUR 24. Three advertisers want the same contested impression:
| Advertiser | Max bid | Outcome |
|---|---|---|
| A | EUR 41 | Wins. Pays EUR 33.01 |
| B | EUR 33 | Loses this impression |
| C | unset (floor buyer) | Buys from the reserved tranche at EUR 24 |
A bid 41 and paid 33.01 — one cent above B. A's honest maximum cost them nothing extra. C never entered the auction and still bought at 24.
The serving app earns 70 percent of 33.01, not of 24. That is the market doing its job: the app that supplied a contested placement captured the contention.
The three protections that stay
Bidding is added on top of the guarantees, not instead of them.
1. The floor never rises. It is a published number in packages/shared/ratecard.ts, changed only as a versioned change announced in the changelog before it takes effect. No amount of bidding moves it. This is the whole of what "never enter an auction" was protecting, and it is intact.
2. Thirty percent is reserved. In every category, 30 percent of inventory is sold only at floor price and is never auctioned. It is allocated round-robin among approved floor-price advertisers. A bidder with unlimited money wins priority in the contested 70 percent and cannot touch the reserved 30.
3. Pair caps still bind. Net flow between any two apps stays capped at EUR 500 per month until both have behaviour scores, and clearing above EUR 500 per day per pair still moves to day-7 engagement. A bid cannot buy its way out of a fraud control.
Why this is not the thing that broke search advertising
The objection to auctions in the original manifesto was real but imprecisely aimed. Stated properly, there are four things wrong with the search auction for a small desktop app, and bidding is only implicated in one of them:
| The actual problem | Present on GHAN? |
|---|---|
| The clearing price is the only price — no floor to fall back to | No. The floor is guaranteed and permanent |
| You bid per click, and pay whether or not anything happens | No. You bid per cleared install |
| First-price dynamics reward nerve over value | No. Second price |
| A funded competitor can take 100% of your category | No. 30% reserved at floor |
Price discovery was never the problem. Price discovery with no floor, on the wrong unit, with the wrong clearing rule, was.
Setting a bid
create_campaign {
app_id: "app_...",
categories: ["creator_tools"],
daily_budget_cents: 20000,
max_bid_cents: 4100 // optional; omit to buy at floor
}
max_bid_cents must be at or above the category floor. Omit it and the campaign is a floor-price campaign. Change it at any time; it takes effect on the next placement fetch.
get_stats reports avg_clearing_price_cents alongside the floor, so you can always see what contention actually cost you — and see when it cost you nothing, which for most categories most of the time is the expected answer.
For the apps serving placements
You earn 70 percent of the price that cleared, not 70 percent of the floor — or 84 percent of it in value if you take credits.
This is the half of the argument that makes the market worth having. Under a purely fixed price, an app with genuinely valuable inventory — high retention, high-intent moments, a category people want — earned exactly the same as an app with poor inventory. There was no mechanism by which being good at this paid more, and therefore no mechanism by which the network grew the supply it most needed.
Questions people ask about this
Does GHAN have an auction?
Partly, and deliberately. The rate card is a floor that any approved advertiser can always buy at, and that floor never rises. Above the floor there is a second-price auction that decides who gets priority when more advertisers want a category's inventory than there is inventory. So the price discovery is a real market and the access guarantee is not auctioned away.
How is this different from the Google Ads auction?
Three differences, and they are the ones that matter. First, there is a floor you can always buy at - in a search auction the clearing price is the floor, so when a better-funded competitor enters your keyword you are priced out entirely. Second, you bid per cleared install rather than per click, so a bid is a price for a user still using your software two days later. Third, a reserved share of every category's inventory only ever sells at floor price, so a funded bidder cannot take all of it at any price.
Can a well-funded app outbid me and take all the inventory?
No. Thirty percent of every category's inventory is reserved for floor-price buyers and is never auctioned, allocated round-robin among approved advertisers. Pair caps still apply on top of that. A bidder with unlimited money can win priority in the contested seventy percent and cannot touch the rest.
What is second-price clearing?
You set the most you are willing to pay. If you win, you pay one cent more than the next-highest competing bid, not your own maximum. The consequence is that bidding your true value is the best strategy available to you, and there is no advantage in watching competitors and re-bidding. It is the mechanism that removes the panic-bidding spiral, which was the real objection to auctions in the first place.
Do I have to bid?
No. Leave max_bid_cents unset and you buy at floor price forever, out of the reserved tranche and out of whatever contested inventory nobody bid on. Most members are expected to never set a bid.
What happens to the serving app's earnings when a bid clears above the floor?
The serving app earns 70 percent of the price that actually cleared, not 70 percent of the floor. That is the point of having a market at all - when demand for a category rises, the apps supplying that inventory are the ones who capture it, which is what makes more of them supply it.
Why was GHAN originally designed without bidding?
Because the first version of the spec treated every auction as the thing that broke desktop advertising. That was half right. What breaks a one-time-licence app is not price discovery, it is that the auction clearing price becomes the only price, so the floor rises until you cannot buy at all. Separating the floor from the discovery keeps the protection and restores the market.
Machine-readable versions of this page: markdown · llms.txt · llms-full.txt · OpenAPI · AI catalog