Cost-Per-Click (CPC) Models
Cost per click is an advertising pricing model in which the advertiser pays each time someone clicks the ad, and nothing when it is merely shown.
\[ \text{CPC} = \frac{\text{total advertising cost}}{\text{clicks}} \]
Spend \$500 and receive 2,000 clicks and the CPC is \$0.25. From the advertiser’s side the job is to bid for placements and keep the cost per click low while winning enough of them. From the platform’s side, revenue arrives on each click, and the auction is tuned to balance bid, relevance and ad quality.
In data science, “CPC models” usually means the predictive machinery around that auction: models that estimate click probability — CTR prediction by logistic regression, gradient boosting or neural networks — models that set bids, and feature work on user, context, device and time of day.
How a simplified auction ranks bids and sets a price
The following hypothetical example ranks bid times predicted click-through rate for one fixed slot and sets the clearing price from the runner-up. It omits reserve prices, thresholds, and additional quality terms.
Ranking by bid times predicted CTR
Four advertisers bid for the slot. Each has a bid per click and a model-predicted CTR, and the auction ranks them by bid value per impression: bid times predicted CTR.
bids = (("A", 4.00, 0.020), ("B", 2.50, 0.045), ("C", 6.00, 0.008), ("D", 3.00, 0.030))
ranked = sorted(((name, bid, ctr, bid * ctr) for name, bid, ctr in bids), key=lambda r: -r[3])
for rank, (name, bid, ctr, value) in enumerate(ranked, 1):
print(f"{rank}. {name}: bid {bid:.2f} x predicted CTR {ctr:.1%} = {value:.4f} per impression")
1. B: bid 2.50 x predicted CTR 4.5% = 0.1125 per impression
2. D: bid 3.00 x predicted CTR 3.0% = 0.0900 per impression
3. A: bid 4.00 x predicted CTR 2.0% = 0.0800 per impression
4. C: bid 6.00 x predicted CTR 0.8% = 0.0480 per impression
In this simplified quality-weighted second-price auction, the slot goes to the highest value per impression. Multiply by 1,000 to express it per thousand impressions. Actual expected publisher revenue is the clearing CPC times actual click probability, not automatically bid times predicted CTR. The example ranks a \$2.50 bidder above a \$6.00 bidder because their predicted click rates differ.
Setting the clearing price from the runner-up
The illustrative clearing rule charges the winner the price at which its own value per impression would equal the runner-up’s:
\[ \text{clearing CPC} = \frac{\text{runner-up value per impression}}{\text{winner’s predicted CTR}} \]
winner, runner_up = ranked[0], ranked[1]
cpc = runner_up[3] / winner[2]
print(f"price to clear = {runner_up[3]:.4f} / {winner[2]:.3f} = {cpc:.2f} a click")
print(f"winner {winner[0]} bid {winner[1]:.2f} and pays {cpc:.2f}")
price to clear = 0.0900 / 0.045 = 2.00 a click
winner B bid 2.50 and pays 2.00
The rule gives \$2.00 for a \$2.50 bid. It assumes a fixed slot and no binding reserve, thresholds or additional quality terms. Google Ads uses a broader Ad Rank calculation including quality, thresholds and auction context; this formula is not a complete description of that system.
What predicted CTR does to the price
Now hold the strongest competing value fixed at 0.1125, which is advertiser B’s value per impression from above, and let an advertiser who bids \$4.00 have different predicted CTRs. It wins only if its value per impression exceeds 0.1125, and then pays 0.1125 divided by its predicted CTR per click.
competing = ranked[0][3] # 0.1125, advertiser B's value per impression
for ctr in (0.010, 0.020, 0.030, 0.050, 0.080):
value = 4.00 * ctr
if value > competing:
price = competing / ctr
print(f"predicted CTR {ctr:.1%}: value {value:.4f}, wins, pays {price:.2f} a click, "
f"{price * ctr * 1000:.2f} per 1,000 impressions")
else:
print(f"predicted CTR {ctr:.1%}: value {value:.4f}, does not win")
predicted CTR 1.0%: value 0.0400, does not win
predicted CTR 2.0%: value 0.0800, does not win
predicted CTR 3.0%: value 0.1200, wins, pays 3.75 a click, 112.50 per 1,000 impressions
predicted CTR 5.0%: value 0.2000, wins, pays 2.25 a click, 112.50 per 1,000 impressions
predicted CTR 8.0%: value 0.3200, wins, pays 1.41 a click, 112.50 per 1,000 impressions
Keeping the competing ranking value, slot and pricing assumptions fixed, the price is the competing value divided by predicted CTR, so doubling predicted CTR halves clearing CPC in the example and leaves predicted revenue per thousand impressions at \$112.50. Changes to competitors, eligibility, slot, quality or reserve can break that relationship.
Who carries the risk under CPM, CPC and CPA
Finally, compare three pricing models over 1,000,000 impressions: CPM at \$8.00 per thousand impressions, CPC at \$0.40 per click and CPA at \$8.00 per conversion. The baseline has a 2.0% CTR and a 5.0% conversion rate; the other two scenarios halve the CTR or halve the conversion rate. The quantity compared is what the advertiser pays per conversion.
impressions = 1_000_000
scenarios = {"2.0% CTR, 5.0% CVR": (0.02, 0.05),
"1.0% CTR, 5.0% CVR": (0.01, 0.05),
"2.0% CTR, 2.5% CVR": (0.02, 0.025)}
for label, (ctr, cvr) in scenarios.items():
clicks = impressions * ctr
conversions = clicks * cvr
cost = {"CPM": 8.00 * impressions / 1000, # 8.00 per 1,000 impressions
"CPC": 0.40 * clicks, # 0.40 per click
"CPA": 8.00 * conversions} # 8.00 per conversion
print(f"{label}: " + " ".join(f"{m} {c / conversions:.2f}" for m, c in cost.items()))
2.0% CTR, 5.0% CVR: CPM 8.00 CPC 8.00 CPA 8.00
1.0% CTR, 5.0% CVR: CPM 16.00 CPC 8.00 CPA 8.00
2.0% CTR, 2.5% CVR: CPM 16.00 CPC 16.00 CPA 8.00
This places CPC among its neighbors by asking who carries which risk. Under CPM the advertiser pays for impressions, so a halved click rate doubles the cost per conversion. Under CPC that risk sits with the platform and the conversion risk stays with the advertiser, so a halved conversion rate doubles the cost. Under CPA both sit with the platform. Each step transfers variance, and a platform that takes on more of it may charge for the transfer. The hypothetical rates here are set so that all three models cost \$8.00 per conversion in the baseline scenario; that isolates who carries the risk and does not show how real CPA prices compare with CPC prices.
Strengths, weaknesses and the models around it
CPC is performance-based in a narrow but real sense: no click, no charge. It is easier to tie to return than cost per impression, and it aligns the platform’s incentive with showing ads to people who will click.
Its weaknesses follow from the comparison of who carries the risk. A click is not a conversion, so the advertiser still pays for people who do not buy — and the more the platform optimizes for clicks, the more true that becomes. Competitive categories bid the price up until the margin is thin. And clicks can be faked, which is a cost the impression and conversion models do not share in the same way.
Alongside it: CPM charges per thousand impressions, CPA per conversion, and smart bidding is the platform’s own model choosing bids on the advertiser’s behalf — which is worth reading as the platform taking over the bid-optimization problem in exchange for the advertiser handing over the objective. The measurements above are what to check when deciding whether that trade is a good one: which of CTR and conversion rate is doing the work, and who is carrying the variance in each.
References
- Google Ads, Ad Rank thresholds. Source
Discover more from Insightful Data Lab
Subscribe to get the latest posts sent to your email.
