A benchmark you can't audit is a rumour with a chart. This page is the standing contract behind every page under /benchmarks: where the numbers come from, how they're aggregated, the gates that decide what publishes, and what we do when something changes.
We manage real ad accounts, which is where the cost benchmarks come from — actual spend, not surveys. We are also a marketing company publishing marketing benchmarks, so the method is stated in full. When a benchmark page and this page disagree, that's a bug — 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, 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) 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 gates
As anonymized client-account benchmarks expand (Canadian ads cost is next), a cell — a vertical × channel × month combination — publishes only if both of these hold:
- At least 4 consenting accounts contribute to the cell.
- No single account contributes more than half of the cell's spend.
A cell that fails either gate is merged into its parent category or suppressed — never published thin and identifiable. Vertical labels are broadened where a precise label could identify a client. Accounts enter only with written consent (contract clause or explicit email), and an account whose consent is revoked leaves the next build; already-published history is not retroactively rewritten, which is part of why these gates exist.
The live ChatGPT Ads page predates these gates 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. Account-level figures, even anonymized. Cells that fail the gates above. 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? Two gates, and a cell has to pass both: at least 4 consenting accounts contribute to it, and no single account contributes more than half of its spend. A cell that fails either is merged into its parent category or suppressed, never published thin and identifiable.
What will you never publish? Client names attached to performance data, account-level figures even when anonymized, cells that fail the gates above, 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.