A longitudinal analysis of how a regional grocery chain actually moves its prices.
Author: Frank Valdez · Data window: May 16 – July 12, 2026 · 9 weekly snapshots · 12,994 products tracked continuously
Read the complete visual case study
Grocery chains don't have one pricing strategy — they have a mix. Some items sit at a stable everyday price for months; others cycle on and off promotion every week. Aggregate inflation numbers hide this entirely. With nine consecutive weekly snapshots of King Kullen's full online catalog, I could ask a sharper, more operational question:
When King Kullen changes a price, what is actually happening — and where? How often do prices move, how big are the moves, are they temporary promotions or permanent resets, and which categories are the promotional "engines" versus the everyday-stable core?
This is a pricing-strategy question, not a toy dashboard. The answer describes how the retailer runs its business.
The data comes from my own automated pipeline (KingKullenResearch), which captures King Kullen's public storefront catalog once a week and commits each run as a dated JSONL snapshot. Every product record carries a UPC, product name, category, a current_price (the shelf/advertised price that week) and a regular_price (the non-promotional base price) — and that pair of fields is what makes promotion detection possible without guesswork.
| Property | Value |
|---|---|
| Snapshots analyzed | 9 weekly (2026-05-16 → 2026-07-12) |
| Records per week | ~21,500 |
| Unique products (UPCs) seen | 19,675 |
| Products present in all 9 weeks (analysis panel) | 12,994 |
| Fields used | upc, name, categories, current_price, regular_price |
Why only King Kullen. I also maintain a parallel Stop & Shop pipeline and considered a head-to-head competitor comparison. I ruled it out honestly: Stop & Shop had only 2 snapshots in this window (no real time series), and its records carry no UPC or GTIN — products are keyed by URL. Matching the two catalogs on the single shared week yielded only 51 exact product matches. A "who-moves-first / who-leads" story needs many overlapping weeks and a reliable join; neither existed. Rather than force a weak finding, I focused on the dataset whose depth could actually support a strong one. (Knowing what a dataset can't answer is part of the analysis.)
- Clean & de-duplicate. The raw catalog lists the same UPC under multiple category tags, inflating each week by ~21%. I kept one record per UPC per week. I also dropped a duplicate same-week capture (2026-05-17 mirrors 2026-05-16).
- Build a balanced panel. To measure change fairly, I restricted the core analysis to the 12,994 products present in every one of the nine weeks — so movement reflects real repricing, not products entering or leaving the catalog. (66% of all products seen were present every week; the rest reflect normal assortment rotation.)
- Detect and classify changes. For each product I counted week-over-week changes in
current_price(up to 8 transitions), measured the percentage size of each move, and classified every change as either a temporary promotion (baseregular_priceheld flat, shelf price dipped and returned) or a permanent reset (theregular_priceitself changed). - Profile by category to separate promotional aisles from stable ones.
- Validate against known retail behavior with concrete examples (below).
All code is in analysis/; the cleaned panel and category summary are in data/. The 124 MB of raw snapshots remains in the separate KingKullenResearch source repository rather than being duplicated here. build_panel.py accepts the path to a local checkout when the panel needs to be rebuilt from source.
1. Most prices don't move — and the ones that do, swing hard. Over nine weeks, 58.5% of products never changed price at all. This is King Kullen's everyday-price core. The other 41.5% moved, but when they did, the moves were large: a median week-over-week change of ±25%, roughly balanced between increases (52%) and decreases (48%). That balance is the fingerprint of a sawtooth — prices dropping onto promotion and snapping back — not gradual inflationary drift.
2. Price movement is almost entirely promotional, not structural. Of the 14,660 individual price-change events, 94% were temporary promotions (the regular price never moved) and only 6% were permanent price resets. In this window King Kullen's price activity is a promotions engine, not repricing. When a "sale" happens, the median discount is 20% off the regular price.
3. Promotion intensity is concentrated in specific aisles.
Some categories are relentless promo engines; others barely move:
| Promo engines (most active) | Everyday-stable (least active) |
|---|---|
| Frozen Dessert — 75% of items repriced | Party — 0% |
| Yogurt — 72% | Soups — 9% |
| Chips & Pretzels — 64% | Pet food (Dogs/Cats) — ~17–20% |
| Soda Pop — 57% (on sale ~44% of weeks) | Candy — 18% |
| Water — 53% (on sale ~52% of weeks) | Spices, Baking, Oral Care — <27% |
The pattern is textbook supermarket strategy: high-visibility, high-frequency-purchase categories (soda, water, salty snacks, dairy) are used as traffic-driving loss leaders, while destination and pantry-staple categories stay flat.
4. The engine is visible in single products — and it's coordinated. The clearest signature is in 2-liter soda: items like Diet Pepsi cycle between $2.00 on promo and $3.79 off almost every week — and the entire 2-liter set moves in lockstep, indicating a category-wide promotional calendar rather than product-by-product decisions. Fresh produce (bi-color corn swinging $0.33 ↔ $1.00) and dressings (Hidden Valley $3.00 ↔ $5.99) show the same on/off rhythm at different price points.
King Kullen runs a high-low promotional model, not an everyday-low-price model. A stable majority of the catalog anchors trust on price; a targeted, high-intensity promotional layer — concentrated in beverages, snacks, and dairy and driven by ~20%-deep, ~25%-swing temporary cuts on a weekly calendar — does the work of driving traffic. Aggregate "average price" reporting would completely miss this structure; you can only see it by tracking the same 13,000 products week over week and separating the regular price from the shelf price.
- Prices are from the public online catalog, not verified in-store shelf tags.
- Nine weeks is enough to characterize weekly promotional rhythm but not seasonal or annual cycles.
- "Permanent reset" is defined within the 9-week window; a longer horizon would reclassify some.
- Single banner (King Kullen); findings are not generalized to other retailers.
# from JulyDataProject/
python3 -m pip install -r requirements.txt
# Optional: rebuild the checked-in panel from a separate source checkout
python3 analysis/build_panel.py \
--snapshots-dir ../KingKullenResearch/data/snapshots
python3 analysis/category_behavior.py # category metrics + headline summary
python3 analysis/make_figures.py # regenerate both checked-in figuresData collected by an independent educational pipeline; not affiliated with or endorsed by King Kullen.

