Methodology
Full transparency on how the Canadian Grocery Price Index is constructed.
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 daily 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 daily price tracking with same-day 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 | Tortillas, Large, 10-pack | Bread & Bakery | 1.4% |
| 18 | Bananas, per kg | Produce — Fruits | 2.5% |
| 19 | Apples, 3lb Bag | Produce — Fruits | 2.0% |
| 20 | Strawberries, 454g | Produce — Fruits | 2.0% |
| 21 | Oranges, per kg | Produce — Fruits | 1.8% |
| 22 | Blueberries, 1 Pint (312g) | 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, 1.5L | 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
- Loblaws — Canada's largest grocery retailer
- No Frills — Discount banner (Loblaw subsidiary)
- Real Canadian Superstore — Large-format banner (Loblaw subsidiary)
- Metro — Major Quebec/Ontario retailer
- Food Basics — Discount banner (Metro subsidiary)
- Sobeys — National full-service retailer (Empire Company)
- FreshCo — Discount banner (Sobeys subsidiary)
- Farm Boy — Specialty/local retailer (via Voilà delivery)
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 daily at 6:00 AM ET via an automated pipeline. The index is recomputed after each collection run.
CGPI vs StatCan CPI
| Feature | CGPI | StatCan CPI (Food) |
|---|---|---|
| Update frequency | Daily | Monthly (3-week lag) |
| Formula | Weighted Jevons (geometric mean) | Modified Laspeyres (arithmetic mean) |
| Basket size | 50 items | ~700 items (food component) |
| Price source | Online listings (public) | In-store price collectors |
| Geographic scope | Ottawa (expanding) | National + provincial |
| 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 tracks ~700 food items. Our basket may not capture all price movements.
- 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.