Research

What we’ve measured

Building a tender service means measuring things nobody had counted. This page is what we found — every figure with its method, its date, and its caveats, so it can be checked rather than taken on trust.

It opens with the Ontario Tender Access Census: the first public map of how every one of Ontario’s 444 municipalities publishes its tenders, built by surveying each municipality’s own website. More than half of Ontarians live in a municipality whose tenders sit behind a single private platform, and under 1% live in one that posts its tender documents openly.

All 444 Ontario municipalities, searchable by name or county.

Weighted by population

Counting municipalities makes open publishing look more common than it is: the municipalities that post openly are overwhelmingly small townships.

Hover a segment for detail. Width is share of population, not share of municipalities — a township and Ottawa are not equal inventory.

Excludes one municipality misattributed in the provincial register (0.7% of population); see caveats.

Full distribution

Where tenders are publishedMunicipalities% of munisPopulation% of pop
On bids&tenders16136.3%11,569,39451.0%
No procurement page found7416.7%5,613,05324.7%
Could not be read398.8%2,203,2079.7%
Notices visible, documents gated or absent7917.8%1,889,3398.3%
On Biddingo327.2%771,6503.4%
Open documents on their own site4610.4%170,2790.75%
On another platform61.4%217,7011.0%
No website in the register40.9%95,1000.4%
Crawling disallowed20.5%11,6100.1%
Total44422,703,113

Excludes the County of Frontenac, for which the provincial register lists a neighbouring township's website. Including it would report 47 municipalities and 332,059 residents (1.5%) on the strength of a data error.

Beyond the census

Four more findings from building the ranking and estimation models. Each carries its number, how it was measured, and where it breaks down.

Ranking model

recall@10 0.219 — 2.3× the deterministic baseline

A gradient-boosted ranker trained on real bidding behaviour puts 21.9% of a firm’s actual next-window bids in its top ten, against 9.4% for deterministic trade-and-region rules alone. Embedding similarity alone reaches 14.2%; a compact linear model 16.5%.

Splits are temporal, never random — a random split lets a model learn from bids placed after the ones it is asked to predict. Every firm-history feature takes an as-of date and excludes anything dated on or after it with a strict inequality.

The cohort result is the interesting one, and it inverts the expectation. Firms with 20–49 observed bids rank best (recall@10 0.250). The heaviest bidders — 50 or more, and 334 of the 400 firms evaluated — rank worst at 0.215, below even the 5–19 cohort at 0.222. More history does not mean more predictable: a firm bidding hundreds of times a year across many categories is genuinely harder to anticipate than a specialist, because its next bid is drawn from a much wider distribution.

Two figures that are easy to mix up: on a later-window split (settled, 2025-10-01) the same model reaches 2.8× the deterministic baseline, but at recall@10 0.217. The 0.219 and the 2.8× come from different splits — quoting them together overstates the result, so we quote the primary split throughout.

Measured quality is understated by an amount we cannot quantify: only observed bids are labelled, so a tender a firm would have wanted but never saw counts against us.

Method · Held-out temporal split at 2026-05-01, 400 evaluation firms ranked against the full pool of ~4,996 candidates. Trained on 756,872 competitive bid interactions across 11,182 firms. Model report 2026-08-02.

How we rank tenders for a firm

Contract-size estimation

41.7% exact band · 92.1% within one band

Under 1% of open notices publish a value — 241 of 48,834 — so we learned contract size from what comparable work actually went for.

The obvious method does not work, and that is the finding. A median lookup by trade × buyer type × region — built from 168,541 real contracts — scores 34.9% exact-band accuracy. Always guessing the single most common band scores 34.4%. The lookup beats a constant by half a percentage point, and is actually worse on the within-one-band measure.

Knowing the trade, the buyer type and the region tells you almost nothing about contract size. A municipal watermain job is $80K or $4M depending on how many metres of pipe, and none of those three fields carries that.

What does carry it is the title. Adding a multilingual sentence embedding of the notice title lifts exact-band accuracy to 41.7% — a 7.3-point gain over guessing, entirely from wording. Scope plurals, facility nouns, phase markers and date ranges are what separate a programme from a job.

41.7% exact means the specific band is wrong more often than right, so 92.1% within one band is the number worth trusting. Roughly 44% of open notices get no band at all, because we would rather say “unknown” than force one.

Method · 187,870 past public contracts with known winning bid amounts, inflation-adjusted to current dollars. Held-out temporal split at 2025-07-01: 168,541 train, 19,329 test. Evaluated 2026-08-04.

What a $200K job looks like vs a $2M job

Bilingual matching

A French tender title lands closer to its English equivalent than to unrelated French

SEAO publishes in French and CanadaBuys in English, and both have to share one vector space or half the corpus is noise. The model does carry meaning across the boundary: French égouts pluviaux scores 0.51 against English watermain replacement and 0.22 against French mobilier de bureau. Meaning beats language.

But the effect is much weaker than same-language similarity, and that gap caused a real defect. Our open pool is roughly 65% French SEAO notices, so trade centroids built from it are French-dominated. Cosine against them partly measures how French a title is: English notices carry a systematic penalty of about 0.2 — enough that an English watermain notice scored below an English janitorial contract for a watermain firm.

Within one language the similarity is meaningful. Across languages it cannot carry a threshold on its own. So eligibility is decided by trade agreement, which is language-independent, and the similarity floor is only a backstop. Per-language centroids would fix the confound properly and are a known follow-up rather than a solved problem.

Method · sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2, 384 dimensions. Cross-lingual cosine checks, 2026-08-02. Pool composition measured 2026-08-04.

CanadaBuys vs SEAO vs municipal portals

Data access asymmetry

199,644 priced Québec awards. Nine from Ontario.

Québec publishes public procurement as open data under CC-BY 4.0, including results: for a completed procurement, who bid and what they bid. Ontario publishes nothing systematically comparable.

The consequence is not subtle. Of the contracts we hold with a known winning bid amount, 199,644 are Québec and 9 are Ontario. That is not a sampling artifact or a gap we could close by trying harder — it is what each province’s publishing policy produces.

Everything on this site that learns from bidding behaviour learns it from Québec, because that is the only place the behaviour is recorded. Ontario firms get a weaker product for the same effort, and the ranking and size models are trained on one province and applied to another.

We should be straight about our position: we benefit from Québec’s openness and are constrained by Ontario’s closure, so we are not a neutral party. The number is accurate either way, and you should weigh the argument knowing who is making it.

Method · TenderSentry bid-interaction database, 2004–2026, queried 2026-08-04. Same pipeline, same period, same effort applied to both provinces.

Québec publishes everything. Ontario doesn't.

Methodology & caveats

Sources

  • Register. Municipalities, Ministry of Municipal Affairs and Housing, dataset 62e83cbc-0731-4d66-abdc-2f2b31bcd76c, Open Government Licence – Ontario. Retrieved 2026-07-31. It carries each municipality’s official website, so no domain was guessed.
  • Population. Statistics Canada, table 98-10-0002 (2021 Census), matched for 442 of 444 municipalities. Census divisions and subdivisions are told apart by DGUID, because Ontario has six names shared by two governments.

How we crawled

  • Identified as TenderSentryBot, at least five seconds between requests to any one host.
  • robots.txt honoured; two municipalities disallow crawling and were recorded without being fetched.
  • Procurement platforms were never contacted. We record only that a municipality uses one.
  • Public pages only. No logins, and no documents downloaded.

Known limits

  • One register error, excluded. The province lists a neighbouring township’s website against the County of Frontenac. It is excluded from the openly-posted figures above rather than silently repointed.
  • Two cities block bots. Ottawa and Vaughan return 403 to our crawler, which says nothing about whether they publish openly. They are counted as unread, not as absent.
  • JavaScript-rendered pages are undercounted. Where a municipality’s procurement page is drawn by scripts, this survey cannot see it, so “no procurement page found” is a floor rather than a finding. We did not run a headless browser.
  • What open publishing is worth. A Québec civil contractor in our system sees more than four times the ranked opportunities of an Ontario firm of comparable trades and size — 586 against 130 — because Québec publishes centrally and openly. The gap is unchanged when the Québec firm is given the Ontario firm’s exact trade list, so it is the market, not the profile.

Full methodology on GitHub →

Research — What We've Measured About Canadian Public Tendering