Bytown benchmarks come from 2 sources: reporting from ad accounts Bytown manages, and Google's public ad-transparency dataset for the EU. Every figure has a named source, a stated window and a committed query or script behind it.
- Method: rates come from summed raw counts, never averaged. Medians where a distribution exists, and n on every row.
- Publication tiers: a figure counts as a benchmark only with at least 4 consenting businesses and none above 50% of the spend. Thinner rows show as rounded early reads or single readings, never quoted.
- Never published: client names, an account's figure next to anything that identifies it, or any number we can't reproduce.
- Updates: monthly. New data lands on the 1st, pages publish the first Tuesday, and corrections stay noted.
- Reuse: everything under /benchmarks is CC BY 4.0. Quote it with attribution and a link.
A benchmark you can't audit is a rumour with a chart. If a page disagrees with this method, that's a bug, so tell us.
Who we are, and why we see this data
Bytown is an AI marketing platform that builds and runs ad campaigns for small businesses across Google, Microsoft, Meta, LinkedIn, and ChatGPT. That is why we see this data, and why we have an interest in how it is read. The method below is designed so you don't have to trust our motives, only our arithmetic — every input that can be public is public, and every rule is written down here before it's applied.
Sources
Bytown-managed ad accounts. Cost benchmarks (like the ChatGPT Ads cost page and the Microsoft Ads benchmarks) come from advertiser reporting across accounts we manage.
Inputs are raw counts only — spend, impressions, clicks, conversions — never pre-computed rates, because rates can't be correctly re-aggregated across accounts. Each page states its window and whether the data was hand-compiled or synced.
Google Ads Transparency Center (public BigQuery dataset). The EU ad-disclosure dataset behind North American brands in Europe. Updated daily by Google, history back to March 2023.
One disclosure matters everywhere volumes appear: which ads ran, and where, is current to the day, but Google reports impression ranges on a lag of roughly 90 days.
Pages built on this dataset rank by ad counts, which are current, and label impression figures with the lag. The SQL that produces every figure is committed alongside the site, and each monthly run is capped by a dry-run byte budget before it executes.
What we cite but never ingest. Some context figures on benchmark pages come from third parties — a platform's recommended bid, another company's published study. Those are always attributed inline, and our build tooling requires every such figure to be explicitly allow-listed, so a stale external number fails the build rather than silently surviving a refresh.
Aggregation rules
- Raw counts in, rates out. Rates are computed from summed counts (or per account, then aggregated) — never averaged from per-row rates.
- Medians, not means, wherever a distribution exists. Means let one whale describe a market. Where you see a single figure per cell on cost pages, it's a median or a summed-count rate, and the page says which.
- n on every row. Every table shows how many accounts or advertisers sit behind each figure. A thin row is shown thin, so you can discount it — not hidden.
- Fixed cohorts for month-over-month. Any trend line plots a fixed cohort of accounts present in every month of the window, alongside the all-accounts line, so composition changes can't masquerade as price changes.
Client-data publication tiers
Every client-data cell (a platform × currency × industry, industry group or whole platform) gets 1 of 3 tiers. The build script assigns it, so nobody picks the flattering one by hand.
| Tier | Rule | What it shows | Where it may appear |
|---|---|---|---|
| Benchmark | At least 4 consenting businesses, and no single business above 50% of the cell's spend | The median, the middle half of accounts (25th to 75th percentile) and the total-based rate | Anywhere: headlines, summaries, FAQs, structured data |
| Early read | 2 or 3 businesses, or 4 or more with 1 business above 50% of the spend | The lowest-to-highest range, rounded | Tables, charts and the budget calculator only, labelled "early read" |
| Single business | 1 business | 1 rounded reading | Tables, charts and the budget calculator only, labelled "1 business" |
The thin tiers exist because a dental practice choosing a platform would rather see what 2 real accounts paid than see nothing. They are never quoted as a benchmark, and the build fails if page copy cites one. Charts plot them at the same rounded values the tables print.
Rules for every tier:
- Rounding: early reads and single readings round cost per click to the nearest $0.10, cost per lead to the nearest $5 (nearest $1 under $20) and rates to the nearest half point.
- Businesses, not accounts: 2 accounts of 1 business on the same platform count as 1 business.
- No spend is shown for early reads or single readings, because spend is what makes an account recognisable.
- Leads mean leads: cost per lead and conversion rate count leads, calls and bookings. Months whose conversions are mostly purchases (online sales, donations) are left out of both.
- Currencies stay apart. US and Canadian dollar figures are never added together or converted in anything we publish. Click-through and conversion rates carry no currency, so those pool both; for the 50% test on a pooled cell only, Canadian dollars are converted at a fixed rate.
- Industry groups: industries roll up into broader groups (health, professional services, B2B tech and finance, home and local services, retail, education and non-profit), which publish as benchmarks wherever they pass.
- Consent: accounts enter only with written consent (a contract clause or an explicit email). An account whose consent is revoked leaves the next build; published history isn't rewritten.
The live ChatGPT Ads page predates these tiers and follows its own disclosed rule: every vertical shown, with its account count printed beside it.
What we will never publish
Client names attached to performance data. An account's figure next to anything that identifies it: a name, a city, an account ID or its spend. A thin row presented as a benchmark.
Data collected against a platform's terms — our ad-library work uses official public APIs and public datasets only, no logged-in scraping. And numbers we can't reproduce: if a figure can't be regenerated from a committed query or script plus a named input, it doesn't ship.
A note on restricted categories. Some benchmarked verticals sit in categories that ad platforms review rather than open by default. Accounts in those verticals run on a mix of the compliance routes each platform allows, account by account.
We do not attribute a route to any specific vertical or client, because doing so would identify them. Category-level cost data is published; compliance posture never is.
Cadence and revisions
Data refreshes on the 1st of each month; updated pages publish the first Tuesday. Each release updates the tables, charts, and open-data files together, from the same build.
When a methodology changes — a metric definition, a gate, a source — the change is dated in the changelog below and the affected pages say so. Corrections work the same way: we fix the page, note the correction, and leave the note up. Published numbers are never silently rewritten.
License and reuse
Everything under /benchmarks — pages, tables, and the CSV/JSON downloads — is licensed CC BY 4.0: reuse, republish, chart, and quote freely, with attribution to Bytown Benchmarks and a link to the page you drew from. Download files carry license and provenance in their headers so the numbers stay traceable after they leave this site.
FAQ
Where do the cost benchmarks come from?
Advertiser reporting across ad accounts Bytown manages. Inputs are raw counts only — spend, impressions, clicks, conversions — never pre-computed rates, because rates cannot be correctly re-aggregated across accounts. Each page states its window and whether the data was hand-compiled or synced.
Why medians rather than averages?
Means let one whale describe a market. Wherever a distribution exists we publish the median, and where a page shows a single figure per cell it is either a median or a summed-count rate — the page says which.
What stops one client's numbers being identifiable?
No names, cities, account IDs or spend appear next to any thin row, and early reads and single readings are rounded, in the charts too. A figure only counts as a benchmark with at least 4 consenting businesses behind it and none above 50% of the spend.
What will you never publish?
Client names attached to performance data, an account's figure next to anything that identifies it, a thin row presented as a benchmark, data collected against a platform's terms, and any number we cannot regenerate from a committed query or script plus a named input.
How often does this update?
Data refreshes on the 1st of each month and updated pages publish the first Tuesday, with tables, charts and open-data files rebuilt together from the same build. Methodology changes and corrections are dated in the changelog and left up.
Can I reuse these numbers?
Yes. Everything under /benchmarks is licensed CC BY 4.0 — reuse, republish, chart and quote freely, with attribution to Bytown Benchmarks and a link to the page you drew from.
Changelog
- 2026-08-16 — Methodology page published. Covers the ChatGPT Ads cost benchmark (live since August 2026) and the first North American brands in Europe edition, and sets the client-data publication gates ahead of the Canadian ads cost benchmarks.
- 2026-10-23 — Publication gates become 3 tiers: benchmark (4+ businesses, none above 50% of spend), early read (2–3 businesses, rounded range) and single business (1 rounded reading). Thin rows now appear, labelled and rounded, instead of being suppressed. First applied to the Microsoft Ads benchmarks.