VynnAI

Methodology

How the data is made

What we collect, how the panel is built, what an observation does and does not mean, and exactly how the price index is computed. Written to be cited and to be argued with.

Collection eras

History is two systems, not one continuous series. Store identifiers do not bridge the eras — store_id and store_id_v1 belong to different systems and must not be joined. The current era’s start is verified against the database; the historical era’s boundaries are taken from our collection documentation and are not re-queried here.

Historical baseline

Span pending verification
historical_v1
An earlier collection system with different store identifiers and coverage. Not a seamless continuation of the current panel. Ask us for its exact span before relying on it — we do not publish a boundary we have not re-queried.

Current era

2026-03-22 – present
current_v2
83 core reference stores, verified against the database 2026-08-20 22:26 UTC, plus a wider pool of satellite stores collected less frequently.

Reading an observation

  • A missing date means “not observed”, not “price unchanged”. Collection is scheduled; not every offer is seen every day. Build observation-frequency controls rather than assuming continuity.
  • Reference vs satellite stores. Reference stores are the core, most consistently collected panel — one banner-province pair each. Satellite stores are collected less frequently with varying start dates. Screen them against your own inclusion standard.
  • SKUs are retailer-scoped. external_sku identifies a product within a banner only. A UPC, where present, helps link equivalents across banners, but we do not claim every SKU is reliably matched across retailers. Ask us for the current UPC coverage rate on the scope you care about and we will measure it.
  • Quality guard. Current-era observations pass an automated price guard before acceptance; only accepted observations are published. Rejections are rare, and the rejection rate for a given scope is available on request.

Promotion classification

Promotion classification is not available for the whole series: earlier collection has no comparable classification, and there is a transitional period before it becomes consistent. We are not publishing the boundary month here because we have not re-queried it — ask us and we will confirm the timeline for your window. unknown means the observation was collected but not classified — it is not evidence of a regular price.

The price index

The Vynn Canadian Grocery Price Index is a chained, matched-model Jevons index computed over reference stores, joined at event time to the designation in force when each price was observed — a later panel change (a store failover, a re-designation) never rewrites published history.

  • Each link joins a week to the most recent preceding week that had usable observations — normally the week before, but longer across a collection gap. Only items priced in both of those weeks contribute. This is the “matched model”: it prevents a change in which products happened to be collected from registering as a price change.
  • Links are therefore between consecutive measured weeks, not necessarily consecutive ISO weeks. weeks_spanned records the real calendar separation, so a multi-week link is never mistaken for a one-week move.
  • The link between two weeks is the geometric mean of price relatives across matched items. Geometric rather than arithmetic, so a price and its reversal cancel exactly.
  • Links are chained onto a running index. The base week is 100.
  • An item is keyed by banner, store and SKU, so the same product at two retailers — or at two stores of one banner — is two items. Neither a price difference between retailers nor a change in geographic sample composition is ever read as a price change.
  • Only closed ISO weeks aggregate. The in-progress week is mid-collection by construction, so it publishes no measurement and reports carried-forward instead of a value that would drift as batches land.
  • The base seats at the first week with at least the minimum matched items: a thin first week cannot become the permanent base, and with no adequate week the series is reported unavailable rather than a flat 100.
  • A week with fewer than 30 matched items is suppressed, not published: the previous value is carried forward and the point is flagged carried_forward.
  • A week with no usable observations publishes no measurement. It carries the previous value, is flagged, and does not become the base of the next link. The series always has one point per calendar week, so week-over-week and year-over-year offsets mean what they say.
  • When a link spans a gap, weeks_spanned reports the real interval and the week-over-week figure is withheld — a multi-week move is not a one-week move.

What this is not. It is not an official consumer price index. It is not weighted by expenditure share, and it is not adjusted for quality change. It is a transparent, reproducible measure of observed shelf prices across a defined panel.

Known gaps and corrections

Correction policy

When we find that something we published about coverage is wrong, we correct it in writing and leave the correction visible. We do not quietly restate. The entry below is an example of that policy in use.

  • Longo’s and Farm Boy (corrected). These were previously described as having continuous weekly observations from late March 2026. That was not accurate: both series have a collection pause across April and May 2026 before weekly observations resume. If the exact boundary dates matter to your analysis, ask us and we will query and confirm them for your window rather than restate a figure we have not re-verified.
  • Longo’s and Farm Boy are banner-level series, associated with a Toronto-area postal market rather than individually validated physical stores. They support banner-level price-change measurement; they are not multi-store panels.
  • Costco is not covered.
  • Per-SKU series are intermittent even in continuously collected weeks, because flyer content rotates.

Citing this data

Cite the series, the access date, and the method version. Every numeric coverage figure published on this site is verified against the database and dated — the current set was verified 2026-08-20 22:26 UTC. Where we do not have a current verified measurement, this page says so and offers to measure it for your scope rather than quoting a figure we cannot reproduce.