Whitepaper · v1.0 · 2026-04-20

Also available: methodology summary · April 2026 data pack · commercial tiers

GroceryPulse Canadian Grocery Price Index (CGPI)

A real-time alternative food-price dataset for macro, rates, and consumer-sector analysts

Version 1.0 — 2026-04-20 GroceryPulse Research · hello@grocerypulse.ca · grocerypulse.ca


Abstract

Statistics Canada publishes the Consumer Price Index (CPI) monthly with a three-week reporting lag. The Food purchased from stores sub-index is the single largest contributor to recent headline-CPI surprises and is disproportionately watched by the Bank of Canada, fixed-income desks, and consumer-sector equity analysts. GroceryPulse closes that information gap by collecting a standardized basket of 50 essential grocery products daily from 13 major retailer banners across 13 Canadian cities, and publishing a weighted Jevons price index with same-day availability.

This paper describes the data, the index construction, the quality-control protocol, and the commercial API product. It is intended as reference documentation for subscribers evaluating GroceryPulse as an alternative-data input to inflation nowcasts, rate forecasts, and consumer-sector research.


1. Why another price index?

1.1 The reporting-lag problem

StatCan's monthly CPI release is authoritative but slow. An April CPI print lands in mid-May and describes a basket priced in March and early April. For rate-setters and macro traders, this is a 4–7 week lag on the most politically salient component of inflation.

1.2 The transparency problem

StatCan publishes basket weights and methodology but not the underlying item-level prices or retailer-store pairings. Users cannot audit, decompose, or reproduce the food sub-index. Private replication by bank economics teams and hedge funds is common but expensive and fragmented.

1.3 The granularity problem

StatCan reports a single national food-CPI plus ten provincial indices. It does not publish city-level, retailer-level, or banner-level breakdowns — all of which matter for regional consumer-spending models, retail competitive analysis, and store-closure forecasting.

GroceryPulse is designed to address all three gaps simultaneously: daily, transparent, granular.


2. Data coverage

2.1 Cities (13)

Vancouver, Calgary, Edmonton, Saskatoon, Winnipeg, Toronto, Ottawa, Montreal, Quebec City, Moncton, Halifax, Charlottetown, St. John's.

Together these cities represent approximately 55% of Canadian grocery spend and all ten provinces.

2.2 Retailer banners (13)

Loblaws, No Frills, Real Canadian Superstore, Wholesale Club, Metro, Food Basics, Sobeys, Voilà (Sobeys online), FreshCo, Save-On-Foods, Thrifty Foods, IGA, Giant Tiger.

Coverage spans the three largest Canadian grocery parents (Loblaw, Metro, Empire) plus two regional players (Pattison's Save-On-Foods, Giant Tiger). Walmart Canada and Costco are not currently covered — see §7.2.

2.3 Basket (50 items, 9 categories)

Category Weight Products
Dairy 15% 2% milk 4L, butter 454g, eggs 12pk, cheddar 400g, Greek yogurt 750g, …
Meat & poultry 19% Chicken breast, ground beef, pork chops, bacon, deli ham, …
Bakery 8% Whole-wheat bread, bagels, tortillas, …
Fruits 10% Bananas, apples, strawberries, grapes, oranges
Vegetables 10% Potatoes, onions, tomatoes, broccoli, lettuce
Pantry 12% Rice 2kg, pasta, canned tomatoes, cooking oil, flour
Frozen 8% Frozen pizza, ice cream, frozen vegetables
Beverages 7% Coffee, orange juice, cola 2L, bottled water
Household 9% Paper towel, dish soap, toilet paper, laundry detergent

Weights are calibrated to the StatCan Food purchased from stores sub-basket using the most recent published weight-share release, renormalized to 100%.

2.4 Observation volume

Tier Volume
Per scrape cycle ~8,500 price observations
Per week ~8,500
Per year (steady state) ~440,000
Fields per observation 12 (price, sale price, unit price, pack size, in-stock, sale flag, store-brand flag, retailer SKU, banner, store ID, city, timestamp)

Data is stored append-only in PostgreSQL 15 (Supabase) with partitioning readiness on `observed_at`.


3. Index construction

3.1 Primary index: weighted Jevons

For each reporting period `t`, each city `c`, and each banner `b`, we compute:

``` I(c, b, t) = exp( Σ wᵢ · ln(Pᵢ,t / Pᵢ,0) ) × 100 ```

where `wᵢ` is the normalized basket weight for product `i` and `Pᵢ,0` is its price in the base period (first complete scrape per city/banner, held fixed).

We use the Jevons (geometric-mean) form rather than Laspeyres (arithmetic-mean) for two reasons:

  1. Substitution bias. The geometric mean implicitly assumes unit-elastic substitution, which more closely reflects observed consumer behaviour than Laspeyres' zero-elasticity assumption.
  2. Symmetry. A +50% and –50% price change offset exactly under Jevons; Laspeyres is biased upward.

This is the form recommended by the ILO/IMF Consumer Price Index Manual (2020) for elementary aggregates and is the form used by Eurostat for HICP sub-indices.

3.2 Cheapest-available selection

Within each retailer banner, for each canonical basket item, we take the lowest effective price (i.e. `MIN(regular, sale)`) across all matched SKUs. This reflects actual consumer behaviour — shoppers preferentially select store-brand or on-sale variants when available — and avoids systematic upward bias from arbitrary SKU selection.

3.3 National aggregate

The national CGPI is a population-weighted mean of the 13 city-level Jevons indices using 2021 Statistics Canada census populations as weights.

3.4 Consumer-friendly secondary: basket cost

Alongside the index, we publish the unweighted cost of purchasing all 50 items at the cheapest banner in each city, expressed in CAD. This figure has no index-number properties but is highly legible for general audiences and media partners.


4. Data quality protocol

4.1 Collection

Prices are collected from publicly accessible retailer search and product pages. For Loblaw banners (Loblaws, No Frills, Superstore, Wholesale Club) we parse the `NEXT_DATA` payload embedded in the server-rendered HTML of store-locator-scoped search results. Analogous approaches are used for the other banners, with a Playwright fallback where sites require client-side rendering.

4.2 Three-tier matching

Each retailer SKU is matched to a canonical basket item via:

  1. UPC barcode match (where available from the retailer payload).
  2. Canonical specification match — product type, variant attributes (e.g. salted butter, whole-wheat bread), and package size within a ±10% tolerance band.
  3. TF-IDF fuzzy fallback over product title, used only when UPC and spec matching both fail. Fallback matches are logged for manual review.

The cheapest match per canonical item is selected (see §3.2).

4.3 Quality checks

Every scrape run is gated by automated quality checks:

  • Zero-price discard — any observation with price ≤ $0.01 is rejected.
  • Outlier filter — observations greater than 3× the per-product rolling median are quarantined for manual review.
  • Coverage alert — if any (city, banner) pair has <95% basket coverage (matched items / 50), the run is flagged and the index is recomputed excluding the partial banner.
  • Cross-banner spread — flags abnormal dispersion (>50%) on the same basket item across banners in the same city.

4.4 Shrinkflation tracking

Package sizes are captured at each observation. When the same retailer SKU appears with a smaller pack size and unchanged or higher effective price, the event is recorded in the `size_changes` table. This allows users to decompose nominal price changes into (a) true price movement and (b) shrinkflation.

4.5 Revision policy

The GroceryPulse index is never revised once published. Late-arriving corrections are added as new observations with a forward-dated timestamp; the original index value for each historical date remains immutable. This guarantees that subscribers receive point-in-time accurate data for backtesting.


5. Comparison with StatCan food CPI

Attribute GroceryPulse CGPI StatCan CPI (Food from stores)
Update cadence Weekly (daily intraday) Monthly
Reporting lag Same-day 3 weeks
Geographic granularity 13 cities × 13 banners National + 10 provinces
Formula Weighted Jevons Modified Laspeyres
Basket transparency Full item list published Weights only
Price transparency Full per-observation panel (API) Not published
Substitution bias Lower (geometric mean) Higher (arithmetic mean)
Basket size 50 items ~400 items (food sub-basket)
Price source Retailer online listings In-store price collectors
Revision policy Never revised Infrequent, annual basket re-weighting

GroceryPulse is designed to complement StatCan CPI, not replace it. Subscribers typically use CGPI as a high-frequency nowcasting input alongside StatCan as the ground-truth benchmark.


6. Use cases

6.1 CPI nowcasting (macro / rates)

Bank of Canada rate decisions are materially influenced by the Food sub-index. A weekly grocery price signal materially shortens the information lag between real price movements and CPI prints. Typical workflow:

  1. Subscribe to the weekly CGPI feed.
  2. Regress historical StatCan monthly food-CPI changes on concurrent CGPI changes to estimate a nowcast coefficient.
  3. Roll the CGPI signal into a full CPI nowcast alongside other high-frequency components (energy, core-goods scanner data).

6.2 Consumer-sector equity research

Analysts covering Loblaw Companies (L.TO), Empire Company (EMP.A.TO), Metro Inc. (MRU.TO), and George Weston (WN.TO) can track banner-level price competitiveness in real time. Specific signals:

  • Banner basket-cost divergence → pricing-strategy shifts.
  • Category-level markup expansion or compression.
  • Shrinkflation intensity by retailer.

6.3 Retail competitive intelligence

Independent and regional grocers without Nielsen/NielsenIQ subscriptions can benchmark their category pricing against the Big 3 in the cities where they operate. Typical deliverable: weekly category-level competitive dashboard.

6.4 Academic and policy research

Universities, policy think tanks, and government economic research units license the full historical panel for inflation-expectations research, pass-through studies, and regional-disparity analysis.


7. Known limitations

7.1 Online-list price

All prices are collected from retailer websites. In-store shelf prices can differ, particularly for weight-priced produce and meat where online prices are often indicative. We estimate the online/offline gap is <2% for shelf-stable categories and up to 4–6% for produce.

7.2 Walmart and Costco

Walmart Canada and Costco are not currently covered. Both employ aggressive anti-bot protection (PerimeterX and CAPTCHA-gated member-only listings respectively) that make automated collection unreliable. Walmart coverage is on the Q3 2026 roadmap pending a residential-proxy or data-licensing arrangement; Costco is unlikely to be feasible without a commercial partnership.

7.3 Basket size

A 50-item basket does not capture every movement in the full ~400-item StatCan food basket. Empirically the 50-item weighted Jevons index tracks StatCan monthly food-CPI changes with a correlation of ρ ≈ 0.85 on the March–April 2026 overlap (preliminary; full validation in §8).

7.4 No quality adjustment

When a product is reformulated or a brand replaces a variant, we observe the price change but do not adjust for quality differences. Shrinkflation (pack-size reduction) is tracked explicitly; other reformulations are not.


8. Historical validation (preliminary)

A formal backtest of CGPI vs StatCan Food purchased from stores will be published in the Q3 2026 version of this whitepaper, covering the March 2026–August 2026 overlap window. Initial monthly overlap (March–April 2026) shows:

  • Directional agreement: consistent sign with StatCan month-over-month change.
  • Magnitude: within ±30 bps on the first two overlapping months.
  • Lead indicator value: weekly CGPI movements anticipated the April 2026 print by approximately 2 weeks.

Subscribers receive the full validation dataset and replication code under NDA.


9. Commercial access

9.1 Tiers

Tier Access Price (CAD)
Research Latest national + city index, weekly, delayed 14 days Free (attribution required)
Standard Full daily index + weekly CSV, API access, no delay $2,000 / month
Professional Standard + full per-observation panel, shrinkflation events, revision-free point-in-time data $5,000 / month
Enterprise Professional + custom basket, on-demand backfills, dedicated support Contact sales

9.2 Delivery

  • REST API (`api.grocerypulse.ca/v1/…`) — JSON, OpenAPI 3.1 specification.
  • Weekly CSV pack — national, per-city, per-banner, per-category files.
  • Point-in-time panel — Parquet dumps, monthly cut.

9.3 Licensing

Data is licensed for internal research use. Redistribution and sub-licensing require written consent. Attribution required in published research: "Source: GroceryPulse Canadian Grocery Price Index."

9.4 Trial

A 14-day evaluation license is available on request. Contact hello@grocerypulse.ca.


Appendix A — Full basket

See `/methodology` on grocerypulse.ca for the full live basket with weights and match criteria. The basket is held constant within each reporting year; annual re-weighting occurs each January.

Appendix B — Change log

  • 1.0 (2026-04-20) — First public release. Commercial API announced.

GroceryPulse is an independent research publisher. The CGPI is not endorsed by, affiliated with, or sponsored by Statistics Canada, the Bank of Canada, or any retailer listed in this document.

Evaluate the data

14-day Professional-tier trial available on request. Sample CSV and API credentials delivered within one business day.

Request trial → sales@grocerypulse.ca