The Cart Index · Folsom, CA Published weekly Data & code on GitHub ↗
A weekly grocery price index · Folsom, California

The Cart
Index

Every Monday morning, one economics student records what the same fixed basket costs at three Folsom grocery stores (Walmart, Target, and Safeway), item by item, straight from each retailer's own published store prices. National CPI tells you what food costs on average, months later. This tells you what it costs here, this week. Measured, not estimated.

—·—
— wk/wk Base week = 100
Pilot phase complete (Jul 6 – Aug 17). The official index publishes its first reading Monday, Aug 24, 2026.

01 · The number

Grocery inflation, measured on foot

The index is a weighted average of price changes across five food categories, benchmarked to the first week of the official series (= 100). Weights are fixed, BLS-style food-at-home category weights, published in the page source, so a move in this line means the same thing a CPI move does, just for Folsom, and weekly instead of monthly.

—weeks in official series
—observations in index
—items in basket
—stores, every week

The official series begins Aug 24, 2026 (= 100). The seven weeks of Jul 6 – Aug 17 were a pilot used to finalize the collection protocol; pilot observations are published in the raw CSV, flagged pilot, and excluded from the index. Details are in the revision log.

02 · The spread

The cheapest full cart

The exact same basket, rung up at each store this week. The gap between the cheapest and priciest cart is real money a family keeps by driving five extra minutes.

What the spread is worth to you

Based on this week's percentage gap between the priciest and cheapest cart, applied to your own grocery budget.

— back in your pocket per year
— per week, at this week's spread

03 · The shelf

On the shelf this week

Average listed price across all tracked stores for each basket item, with the week-over-week move. These are the prices each retailer publishes for its Folsom store.

04 · The method

How it's measured

1

Fixed basket

The same named products, at the same stores, every week. Each item is defined by a written specification (brand tier, cut, package size, and price type), so every observation is like-for-like. Out-of-stock items carry the prior week's price forward (standard index imputation) and are never substituted. Full specifications are in the README.

2

Collected consistently

Prices recorded every Monday morning from each retailer's own website, with the exact Folsom store location selected, exactly as displayed for that store. Free loyalty pricing counts where a retailer shows it by default (Safeway for U); Target displays its base price. Clip-to-activate coupons and paid memberships are never used.

3

Weighted like the CPI

Category price relatives are combined with BLS-style food-at-home weights (a Laspeyres index), so the composite behaves like a true price index rather than a raw price average. The weights sit in the site's configuration block, so anyone can inspect them or change them in a fork.

4

Published open

Every observation lives in a public CSV on GitHub. From Sept 28, 2026, a dated screen capture of each listing is published the same day in archive/listings/, so any price can be checked against the page it came from. Anyone can audit the math or rebuild the index.

Why these 14 items?

They cover all five food-at-home categories the index is weighted by (dairy and eggs, meat and poultry, produce, pantry, beverages) with everyday staples a typical household buys. Every item is stocked in a comparable form at all three stores and is listed online for the Folsom store, so it can be priced the same way every week. National brands are used where the exact product matters (Cheerios, Jif, Barilla, Tillamook, Coca-Cola, Starbucks); store brands where the commodity is the standard (milk, eggs, bread, carrots).

How are the data collected?

By hand, every Monday morning. On each retailer's own website, with the named Folsom store selected, I record the 42 prices (14 items × 3 stores) in the same fixed order every week, following the written item specifications in the README, and publish them the same day. No scraping and no estimates.

Limitations

  • Families switch stores. The index follows the same products at the same stores. When prices rise, real shoppers switch stores, brands, or items, so a fixed basket can overstate how much a household's grocery bill actually rises.
  • Package sizes change. Sizes are held fixed by rule. Safeway's store-brand loaf is 22 oz while the others are 20 oz, so its price is normalized to 20 oz (price ÷ 22 × 20). If a package shrinks, the new size is recorded and disclosed.
  • Online vs. shelf prices. Online prices can differ from shelf prices in the store and can change within a day, so each reading is a Monday-morning snapshot. That affects cart levels more than week-to-week change.
  • Member pricing. Retailers show different prices to loyalty members, and some offers are personalized. Which price is recorded is fixed by the price-type rule in the README and applied the same way every week.
  • Three stores. WinCo (no online prices) and the regional chains are not covered. See the README.

Archives

Since Monday, Sept 28, 2026, I save a dated screenshot of every listing, all 42 each week, in archive/listings/YYYY-MM-DD/, committed the same day as the prices. Any published price can be checked against the page it came from. The five official weeks before that (Aug 24 through Sept 21) have no captures.

How does this compare?

NPR has priced a shopping cart at one Walmart in Georgia every year since 2018. Its January 14, 2026 update checked 114 items once a year (NPR: "NPR shopped for 114 items at Walmart"). The Cart Index makes the opposite trade: fewer items (14), but three stores, priced every week, with every observation published.

REVISION LOG · 5 entries

2026-10-01 · Correction: Safeway cheddar, week of Sept 28, 2026, $4.19 → $4.99. The Safeway row had been entered with Target’s price for the same item ($4.19), and the capture file archive/listings/2026-09-28/safeway_cheddar.png held a copy of the Target listing instead of the Safeway one. The Safeway capture from Sept 28 had been saved under the wrong file. It replaced the incorrect file on Oct 1 and shows $4.99, the same price recorded in the two prior weeks. Effect: Safeway’s Sept 28 cart rises from $65.49 to $66.29, and the composite index for that week from 102.3 to 102.7. No other price changed.

2026-10-01 · Method questions answered on this page; no data or method change. Added short notes on why these 14 items, how prices are collected, limitations, the listing archive, and a comparison with NPR’s annual Walmart price check. No published price or index value changed.

2026-09-23 · Archival capture of source listings adopted, effective Mon, Sept 28, 2026; item_id added to the schema. Adopted today and taking effect with the collection of Monday, Sept 28, 2026: a dated screen capture of every price listing is published in archive/listings/, all 42 observations, on the same day as the prices they support, so any published figure can be checked against the page it was read from. Captures and prices are committed separately, minutes apart, and both timestamps are recorded by GitHub rather than by the author. Five official weeks already published (Aug 24 through Sept 21) precede the rule and have no captures; that boundary is separate from the pilot boundary below, and no published price changed when the rule was adopted. The CSV gains an item_id column, a short key matching the capture filenames (safeway_eggs, target_coke), appended last so existing columns are unchanged. Also recorded: online prices can change more than once within a day, so each Monday reading is a snapshot of that morning rather than the week’s price; and Target’s displayed price is its base price, with no Circle member offer applied.

2026-08-22 · Collection protocol adopted; official series defined. A written protocol now fixes every item specification: brand tier, cut, and package size for both meat items; per-banana pricing (the only unit all three stores display); normalization of Safeway’s 22 oz loaf to a 20 oz equivalent; and the price-type rule under which Safeway prices are its free-membership (for U) prices. Ground beef is priced from the store-brand 1 lb 80/20 tray; chicken breast from each store’s value-pack tier, the only tier stocked at all three, so part of any cross-store chicken gap reflects pack size rather than store pricing. This affects cart levels, not the index. The official series begins with the first collection under this protocol, Monday, Aug 24, 2026 = 100.

2026-08-21 · Jul 6 – Aug 17 designated the pilot phase; panel set at three stores. During those seven weeks the meat items were not selected under a written specification, so those observations are not like-for-like week to week. They remain published in the CSV, flagged pilot, and are excluded from the index; the index previously shown here, computed from all pilot data with base week Jul 6, is superseded and not comparable to the official series. Target banana rows were corrected from an inferred per-pound figure to the observed per-each price. The pilot panel also included Bel Air, removed to avoid a potential conflict of interest for the author (see the README); its 98 pilot observations remain published at archive/belair.csv.

This is an independent student research project. It is not affiliated with, endorsed by, or informed by any retailer's internal data. Every price is the retailer's own publicly listed price for its named Folsom store. Store names can be anonymized on request.