Methodology
Full transparency on how the Canadian Grocery Price Index is constructed — published for researchers, journalists, and analysts evaluating GroceryPulse as an alternative-data input.
Overview
The Canadian Grocery Price Index (CGPI) is a weighted Jevons price index computed from a fixed basket of 50 essential grocery products. Prices are collected weekly from publicly available product listings on major Canadian retailer websites.
Unlike Statistics Canada's Consumer Price Index (CPI), which is published monthly with a 3-week lag, CGPI provides weekly price tracking with same-week publication.
Index Formula
Where:
- It — Index value at time t (base = 100)
- wi — Normalized weight of product i in the basket
- Pit — Price of product i at time t (current period)
- Pi0 — Price of product i at the base period
The Jevons index uses a geometric mean (via log-transformation) rather than the arithmetic mean used in a Laspeyres index. This has two advantages:
- Substitution bias correction — The geometric mean naturally accounts for consumers switching to cheaper alternatives when one product's price rises.
- Symmetric treatment of price changes — A 50% price increase and a 50% decrease offset each other (they don't with an arithmetic mean).
This is the same approach recommended by the ILO/IMF Consumer Price Index Manual and used by Eurostat for elementary price aggregates.
Basket Composition
The basket contains 50 products across 9 categories, weighted to approximate a typical Canadian household's grocery spending pattern.
| Category | Weight | Products |
|---|---|---|
| Dairy & Eggs | 15.0% | 6 |
| Meat & Protein | 19.0% | 7 |
| Bread & Bakery | 8.0% | 5 |
| Produce — Fruits | 10.0% | 5 |
| Produce — Vegetables | 10.0% | 6 |
| Pantry Staples | 12.0% | 7 |
| Frozen | 8.0% | 4 |
| Beverages | 7.0% | 5 |
| Household Essentials | 9.0% | 5 |
| Total | 100.0% | 50 |
Full Product List
| # | Product | Category | Weight |
|---|---|---|---|
| 1 | 2% Milk, 4L | Dairy & Eggs | 3.0% |
| 2 | Butter, Salted, 454g | Dairy & Eggs | 2.5% |
| 3 | Large Eggs, 12-pack | Dairy & Eggs | 3.0% |
| 4 | Cheddar Cheese, Medium, 400g | Dairy & Eggs | 2.5% |
| 5 | Greek Yogurt, Plain, 750g | Dairy & Eggs | 2.0% |
| 6 | Cream Cheese, 250g | Dairy & Eggs | 2.0% |
| 7 | Chicken Breast, Boneless Skinless, per kg | Meat & Protein | 4.0% |
| 8 | Ground Beef, Lean, per kg | Meat & Protein | 3.5% |
| 9 | Pork Chops, Centre Cut, per kg | Meat & Protein | 2.5% |
| 10 | Bacon, 375g | Meat & Protein | 2.0% |
| 11 | Salmon Fillet, Atlantic, per kg | Meat & Protein | 3.0% |
| 12 | Canned Tuna, Chunk Light, 170g | Meat & Protein | 1.5% |
| 13 | White Bread, 675g | Bread & Bakery | 2.0% |
| 14 | Whole Wheat Bread, 675g | Bread & Bakery | 2.0% |
| 15 | Bagels, ~6-pack | Bread & Bakery | 1.3% |
| 16 | English Muffins, 6-pack | Bread & Bakery | 1.3% |
| 17 | Hamburger Buns, 8-pack | Bread & Bakery | 1.4% |
| 18 | Bananas, per kg | Produce — Fruits | 2.5% |
| 19 | Apples, ~2kg Bag | Produce — Fruits | 2.0% |
| 20 | Strawberries, 454g | Produce — Fruits | 2.0% |
| 21 | Oranges, per kg | Produce — Fruits | 1.8% |
| 22 | Blueberries, Fresh 454g (1lb) | Produce — Fruits | 1.8% |
| 23 | Potatoes, 10lb Bag | Produce — Vegetables | 2.0% |
| 24 | Onions, 3lb Bag | Produce — Vegetables | 1.5% |
| 25 | Carrots, 2lb Bag | Produce — Vegetables | 1.5% |
| 26 | Broccoli, per Head | Produce — Vegetables | 1.8% |
| 27 | Tomatoes, per kg | Produce — Vegetables | 1.8% |
| 28 | Romaine Lettuce, per Head | Produce — Vegetables | 1.5% |
| 29 | White Rice, 2kg | Pantry Staples | 2.0% |
| 30 | Pasta, Spaghetti, 900g | Pantry Staples | 1.7% |
| 31 | Canned Tomatoes, Diced, 796mL | Pantry Staples | 1.3% |
| 32 | Peanut Butter, 1kg | Pantry Staples | 1.5% |
| 33 | Canola Oil, 946mL | Pantry Staples | 1.5% |
| 34 | Granulated Sugar, 2kg | Pantry Staples | 1.0% |
| 35 | All-Purpose Flour, 2.5kg | Pantry Staples | 1.0% |
| 36 | Frozen Pizza, Pepperoni | Frozen | 2.0% |
| 37 | Frozen Mixed Vegetables, 750g | Frozen | 2.0% |
| 38 | Ice Cream, 1L | Frozen | 2.0% |
| 39 | Frozen Chicken Nuggets, 700g | Frozen | 2.0% |
| 40 | Orange Juice, 2.63L | Beverages | 1.8% |
| 41 | Ground Coffee, 300g | Beverages | 1.8% |
| 42 | Tea Bags, ~72-pack | Beverages | 1.0% |
| 43 | Coca-Cola, 2L | Beverages | 1.3% |
| 44 | Bottled Water, 24-pack 500mL | Beverages | 1.3% |
| 45 | Paper Towels, ~6-roll | Household Essentials | 2.0% |
| 46 | Toilet Paper, 12-roll | Household Essentials | 2.0% |
| 47 | Dish Soap, 535mL | Household Essentials | 1.5% |
| 48 | Laundry Detergent, 1.47L | Household Essentials | 2.5% |
| 49 | Garbage Bags, 40-count | Household Essentials | 1.0% |
| 50 | Chicken Thighs, Bone-In, per kg | Meat & Protein | 2.5% |
Data Collection
Retailers
GroceryPulse tracks 23 banners across the three largest Canadian grocery parent companies plus two regional players.
Loblaw Companies
- Loblaws — Ontario full-service flagship
- No Frills — national discount banner
- Real Canadian Superstore — large-format (Western Canada and Ontario)
- Atlantic Superstore — large-format (Atlantic provinces)
- Dominion — Newfoundland full-service
- Maxi — Quebec discount banner
- Provigo — Quebec full-service
- Fortinos — Ontario full-service
- Wholesale Club — bulk / small-format
- Your Independent Grocer — smaller-market full-service
Metro Inc.
- Metro — Ontario / Quebec full-service
- Food Basics — Ontario discount banner
- Super C — Quebec discount banner
Empire Company (Sobeys)
- Sobeys — national full-service
- FreshCo — national discount banner
- IGA — Quebec full-service
- Safeway — Western Canada full-service
- Foodland — smaller-market full-service
- Thrifty Foods — BC full-service
- Farm Boy — Ontario specialty (via Voilà delivery)
- Voilà — Sobeys online grocery delivery
Independents / regional
- Save-On-Foods — Jim Pattison Group, Western Canada
- Giant Tiger — discount / general merchandise with grocery
Method
Prices are collected from publicly accessible retailer websites. Product listings are accessed via the same pages any consumer can view, and price data is extracted from the server-rendered HTML.
Product Matching
Each retailer's product listing is matched to our canonical basket using a Tier 2 specification matching system:
- Type match — Product category must match (e.g., "milk", "butter", "chicken breast")
- Size verification — Package size must be within ±10% of the target
- Variant matching — Specific variants checked (e.g., "salted" butter, "whole wheat" bread)
The cheapest available match is used for the index, reflecting actual consumer behavior where shoppers tend to choose store brands over national brands.
Update Schedule
Data is collected every Thursday at 08:00 UTC (04:00 Eastern) via an automated pipeline. The index is recomputed after each collection run. A complete run covers all 13 cities and 23 banners; runtime is typically 10–30 minutes depending on retailer response times and rate-limit backoffs.
Accuracy & Quality Assurance
After every weekly scrape, an automated audit re-queries each retailer's live website for a stratified sample of stored prices and compares them to what we have on file. Audit verdicts are recorded in an internal scrape_audits table and form the basis of two quality controls:
- Cent-level accuracy — fraction of audited prices that match the live retailer site to the cent (within 1¢ tolerance). Strict measure of read correctness.
- Dollar-level accuracy — fraction of audited prices within $1.00 of the live retailer site. The gap vs cent-level is retailer-side price drift (sales rolling on or off between scrape and audit), not scraper error.
- Auto-deactivation — any product mapping whose last two consecutive audits both fail (mismatch or not-found) is automatically retired from the index. The two-strikes threshold tolerates single-week sale rolloff while catching genuine defects within ~2 weekly cycles.
- Mapping-defect bucket — audit verdicts with >30% delta between stored and live price are tagged as structural mapping defects (wrong product matched), not price mismatches, and feed the auto-deactivation pipeline.
| Retailer family | Cent (1¢) | Dollar ($1) | Audits (M / Mm / Inc) | Last audit |
|---|---|---|---|---|
| Save-On-Foods | 90.0% | 100.0% | 18 / 2 / 0 | 2026-06-04 |
| Giant Tiger | 90.0% | 100.0% | 18 / 2 / 0 | 2026-06-04 |
| Empire banners (Sobeys / FreshCo / IGA / Foodland / Farm Boy / Thrifty / Safeway) | 100.0% | 100.0% | 20 / 0 / 0 | 2026-06-04 |
| Loblaw banners (PC Express) | 73.3% | 73.3% | 11 / 4 / 5 | 2026-06-04 |
| Metro Inc. (Metro / Food Basics / Super C) | 57.9% | 63.2% | 11 / 8 / 0 | 2026-06-04 |
| Voilà | n/a | n/a | 0 / 0 / 20 | 2026-06-04 |
M / Mm / Inc = matches / mismatches / inconclusive. Both metrics use the same denominator (matches + mismatches), so retailer-side outages don't penalise either figure. The gap between cent and dollar columns is retailer-side price drift between scrape and audit (most pronounced on banners with high promo cycling like PC Express), not scraper inaccuracy.
Known auditability gap
One retailer family currently cannot be ground-truth audited via the automated pipeline:
- Voilà (and Farm Boy via Voilà delivery) — the consumer search interface requires an active postal-code session that the audit pipeline cannot replay. Voilà observations are still collected through the normal scrape; they just don't receive the live ground-truth check the other families do.
Closing this gap is on the engineering roadmap and will extend the audit feedback loop to the full 23-banner panel. Walmart and Costco are not in our index at all (see Limitations) so they don't enter the audit picture.
CGPI vs StatCan CPI
| Feature | CGPI | StatCan CPI (Food) |
|---|---|---|
| Update frequency | Weekly (Thursdays) | Monthly (3-week lag) |
| Formula | Weighted Jevons (geometric mean) | Modified Laspeyres (arithmetic mean) |
| Basket size | 50 representative items | ~250 representative items (food component); ~700 across the full CPI |
| Price source | Online listings (public) | In-store price collectors |
| Geographic scope | 13 cities across all 10 provinces | National + provincial |
| Banner coverage | 23 retailer banners (incl. all three parents: Loblaw, Metro, Empire) | Not disclosed at banner level |
| Transparency | Full basket & methodology published | Basket weights published, individual prices not |
| Substitution bias | Lower (geometric mean) | Higher (arithmetic mean) |
Limitations
- Online prices only — In-store prices may differ, especially for produce and meat.
- 13 cities — Coverage spans major cities across Canada, but rural areas are not tracked.
- No Costco or Walmart — Bot protection prevents automated price collection from these retailers.
- 50-item basket — StatCan's food component tracks roughly 250 representative items. Our tighter basket may not capture all price movements, especially in less-frequently-purchased categories.
- No quality adjustment — If a product is reformulated, we track the price change but not quality changes.
These limitations are openly disclosed in the spirit of transparency. The index is designed to complement, not replace, official statistics.
Commercial access
The full per-observation panel, weekly CSV pack, point-in-time Parquet dumps, and shrinkflation events are available via commercial license. See the CGPI whitepaper for the full data product specification or view pricing tiers.