Research Working Papers

UQO Working Papers · WP37 · v1.0

The Hidden Architecture of Grocery Prices: Promotions, Retail Competition, and the Cost of Living in Quebec

Evidence from 300,613 posted-price events across 54 Quebec grocery feeds, August–November 2026

Simon-Pierre Boucher

Year
2026
First release
November 2026
Latest revision
November 2026
Publication status
Working paper
PDF · 45 pages

Grocery prices are not one inflation process: banners differ by 10–25 log points on identical products, and promotions are half of all price changes

From 300,613 posted-price events in 54 Quebec feeds, the paper separates persistent banner gaps, deep but rare promotions that return exactly to their reference price, store-mixture artefacts in scraped storefronts, and matched-model from naive indices; a five-component Quebec Grocery Price and Affordability Index is published with uncertainty bands.

Abstract

Grocery prices are not a single inflation process. Using a read-only research copy of Food-Ka, a Quebec grocery price aggregator, the paper assembles an auditable panel of 124,579 listings from 54 active source feeds (26 retail companies, two channels: online storefronts and weekly circulars) observed every seven hours between 12 August and 1 November 2026 (300,613 logged price events, 723,140 listing-weeks). A first, measurement finding applies to any study of scraped prices: storefronts that serve store-specific prices to anonymous sessions produce intra-day oscillation among three to five price levels, so sub-weekly volatility in such feeds is a mixture over unidentified stores, not repricing.

A calibrated matching procedure (exact UPC within Metro Inc.; brand, package and token-identical names elsewhere; precision 0.93 and recall 0.98 on 4,413 UPC-identified pairs, plus a 240-pair reviewed sample) yields 5,909 cross-banner groups. On identical products in the same week, the median max–min log price gap across banners is 0.154 (79% of group-weeks exceed 5%), banner-pair gaps are persistent (AR(1) 0.66 against a 0.00 permutation placebo), and banner fixed effects range from −0.20 (Walmart, Giant Tiger, Maxi) to +0.12 (specialty shops) relative to Metro. Inferred promotions cover 4.6% of storefront listing-weeks with a median depth of 22%; half of all weekly price changes are promotion entries or exits, doubling measured volatility (ratio 1.92, CI 1.84–2.02). Temporary sales return exactly to their pre-sale reference (mean change −0.0003 log points): no reference-price drift within the window; a pre-sale price elevation is mostly a store-mixture artefact and shrinks to about two log points in single-store shops.

Lead–lag price associations between rivals are small and fail a lead placebo for cross-company pairs, so no causal response is claimed. Matched-model and naive indices agree within one point at the market level over eleven weeks, but naive averages are off by 10–30 points for banners with assortment turnover. A fixed-basket mixed-integer program shows that unconstrained cheapest-banner shopping saves 15% relative to the best single banner, 85% of which two banners capture; store geography and travel costs are unobserved. The paper publishes a five-component Quebec Grocery Price and Affordability Index with uncertainty bands and a prospective collection plan, and reports null and failed tests alongside positive ones.

Key findings

  • 300,613

    posted-price events on 124,579 listings from 54 feeds, 26 companies, 12 Aug–1 Nov 2026

  • 0.154

    median max–min log price gap across banners on identical products (79% of group-weeks above 5%)

  • −0.20 to +0.12

    banner fixed effects relative to Metro (Walmart, Giant Tiger, Maxi vs specialty shops)

  • ×1.92

    measured volatility with promotions vs without (CI 1.84–2.02); promotions are half of weekly price changes

  • −0.0003

    mean log change after a temporary sale: prices return exactly to their reference

  • 15%

    saving from unconstrained cheapest-banner shopping, 85% captured by two banners

Scientific contributions

A measurement warning for scraped storefront prices
Storefronts that serve store-specific prices to anonymous sessions oscillate among three to five levels within a day; sub-weekly volatility in such feeds measures cross-store dispersion, not repricing, and the pre-sale price elevation seen in mixed feeds shrinks to about two log points in single-store shops.
Persistent banner architecture on identical products
5,909 cross-banner groups matched at precision 0.93 / recall 0.98 show a median 0.154 log gap, banner-pair gaps with AR(1) 0.66 against a 0.00 placebo, and fixed effects from −0.20 to +0.12 relative to Metro, mostly inside chains whose discount and conventional formats carry the same UPCs.
Promotions quantified
Rare in catalogues (4.6% of storefront listing-weeks) but deep (median 22%), recurring every few weeks, half of all posted-price changes, doubling measured volatility and returning exactly to the reference price within the window.
No evidence of rival response
Lead–lag associations between rivals are small and fail a lead placebo for cross-company pairs; visible co-movement is the calendar of a chain, not a reaction.
Index design and a shopping-cost bound
Matched-model and naive indices agree at market level but diverge by 10–30 points for banners with assortment turnover; a fixed-basket mixed-integer program bounds the saving from multi-banner shopping; a five-component Quebec Grocery Price and Affordability Index with uncertainty bands is published with a prospective, store-pinned collection design.

Methodology

Methodology (5)

Panel reconstruction and unit normalisation

Ingestion to Parquet with checksum verification, unit normalisation, retailer hierarchy, daily and weekly panel reconstruction in DuckDB, with fifteen tests on parsing, panel invariants and matching rules.

Dispersion and persistence models

Within-group max–min log gaps, banner-pair gap persistence (AR(1)) against a permutation placebo, and banner fixed effects with Metro as reference.

Promotion inference and event analysis

Promotion entries and exits inferred from listing histories, depth and recurrence measured, post-sale return to reference tested, and the store-mixture artefact isolated on single-store shops.

Lead–lag tests with placebos

Cross-banner lead–lag price associations with a lead placebo for cross-company pairs; no causal claim where the placebo is not passed.

Indices and basket optimisation

Matched-model vs naive indices over eleven weeks; a fixed-basket mixed-integer program for cheapest-banner shopping; the QGPAI index with bootstrap uncertainty bands.

Research data

Food-Ka research copy
Read-only export of the author's grocery price aggregator: 124,579 listings from 54 active feeds (26 companies; online storefronts and weekly circulars) observed every seven hours, 300,613 price events and 723,140 listing-weeks; not redistributed, available to referees under a data-use agreement with the file's SHA-256.
Cross-banner product matches
Tiered matching (exact UPC within Metro Inc.; brand, package and token-identical names elsewhere) calibrated on 4,413 UPC-identified pairs and a 240-pair reviewed sample, with an auxiliary LLM second annotation (four runs, 1.58 USD) whose labels are stored so the pipeline runs without API access.
Statistics Canada reference series
CPI tables 18-10-0004-01 and 18-10-0245-01 from the public Web Data Service, raw JSON kept with download timestamps, used to compare matched-model and naive indices.

Datasets: Food-Ka grocery price feeds, Statistics Canada reference series

Reproducibility

  • Python 3.12 pipeline with pinned dependencies runs from the raw snapshot to the compiled paper with make; every stochastic step uses seed 20261101
  • Each stage writes a manifest with SHA-256 hashes and a line in a structured run ledger; all numbers in text and tables are generated from JSON model summaries
  • Preregistration and basket hashed before estimation; the decision log records three amendments
  • Prospective collection design (store pinning, regular-price logging, circulars by postal code) specified but not implemented

Research artifacts

Version history

VersionDateDescriptionFile
v1.0currentNovember 2026Current manuscript as published on www.spboucher.ai (revised edition after the 2026-10-17 scientific review for papers 1–17).PDF · 45 p.