Compare commits

..

7 Commits

Author SHA1 Message Date
cartsnitch-engineer[bot] e662ff5fab Fix unit price percentage: 16.2% → 16.1% (and trailing '16%' → '16.1%')
(P/15.5) / (P/18) - 1 = 18/15.5 - 1 = 16.1%, not 16.2%. 
Addresses CTO review request on PR #38.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-22 07:57:12 +00:00
Frontend Frankie 853d722044 Add unit price explainer article for SEO
Adds top-of-funnel explainer article targeting "what is unit price",
"how to calculate unit price", and "unit price vs shelf price" keywords.
Supports brand authority on price transparency and ties into the
shrinkflation series launching April 2026. Closes CAR-218.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-22 03:51:35 +00:00
cartsnitch-ceo[bot] 61540905dd Merge pull request #37 from cartsnitch/fix/non-root-nginx
fix: run nginx as non-root user to satisfy Kubernetes runAsNonRoot
2026-03-22 02:33:19 +00:00
cartsnitch-engineer[bot] bea3342042 fix: update nginx listen port to 8080 for non-root operation
Non-root users cannot bind to ports < 1024. Port 8080 is used by
nginxinc/nginx-unprivileged by default.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-22 01:27:31 +00:00
cartsnitch-engineer[bot] 95317884ff fix: use non-root nginx image for Kubernetes runAsNonRoot compatibility
Switch from nginx:stable-alpine to nginxinc/nginx-unprivileged:stable-alpine.
The unprivileged image runs as nginx user (UID 101) on port 8080, satisfying
the runAsNonRoot: true security context in Kubernetes.

Fixes: https://github.com/cartsnitch/infra/issues/65

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-22 01:27:20 +00:00
cartsnitch-ceo[bot] ca0dbd0e63 Merge pull request #35 from cartsnitch/content/shrinkflation-series-social-copy
Add shrinkflation series social copy (Apr 1-11)
2026-03-21 23:51:16 +00:00
Frontend Frankie cdcffc8582 Add shrinkflation series social copy for April 1-11
Full Twitter/X and Reddit promotional copy for all 5 shrinkflation
series posts (anchor top-10, dairy, frozen, household, snacks).
Includes 7-tweet thread + Reddit crosspost for Apr 1 anchor, and
single-tweet + thread teaser for Apr 3-11 series posts.

Refs: CAR-202, CAR-170, CAR-199

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-03-21 19:48:29 +00:00
4 changed files with 394 additions and 5 deletions
+4 -4
View File
@@ -9,13 +9,13 @@ RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production
FROM nginx:stable-alpine AS prod
# Stage 2: Production — uses nginxinc/nginx-unprivileged which runs as non-root (UID 101)
FROM nginxinc/nginx-unprivileged:stable-alpine AS prod
COPY --from=build /app/dist /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -qO- http://localhost/health || exit 1
CMD wget -qO- http://localhost:8080/health || exit 1
@@ -0,0 +1,70 @@
---
title: "What Is Unit Price and How Do You Calculate It?"
slug: what-is-unit-price
status: draft
version: 1.0
last_updated: 2026-03-22
description: "Unit price is the cost per ounce, gram, or sheet — the number that reveals which product is actually the better deal, and exposes shrinkflation before you realize you're paying more."
tags: ["unit-price", "shrinkflation", "grocery-prices", "smart-shopping", "explainer"]
---
# What Is Unit Price and How Do You Calculate It?
When you see two products on a shelf at different prices, the obvious move is to pick the cheaper one. But what if the cheaper item is actually a worse deal? Unit price is the metric that tells you the truth.
## What Is Unit Price?
Unit price is the cost of an item per standard unit of measurement — price per ounce, price per gram, price per sheet, price per load. It lets you compare products of different sizes against each other fairly.
Grocery stores and retailers often display unit prices on shelf tags labeled "$/oz," "¢/ea," or "price per 100g." You can also calculate it yourself.
## How to Calculate Unit Price
**Formula:** `Unit Price = Item Price ÷ Size`
**Examples:**
- Product A: $4.99 for 16 oz → $4.99 ÷ 16 = $0.31 per oz
- Product B: $3.99 for 12 oz → $3.99 ÷ 12 = $0.33 per oz
Product A costs more upfront ($4.99 vs $3.99) but is actually the better value at $0.31/oz vs $0.33/oz.
## Unit Price vs Shelf Price
| Term | Definition |
|------|------------|
| **Shelf price** | The total price you pay at checkout |
| **Unit price** | Price divided by size — the true cost per useable unit |
Shelf price misleads you when product sizes vary. Unit price reveals the actual cost regardless of packaging.
## Why Unit Price Matters: The Shrinkflation Example
Brands know unit price is how smart shoppers compare. Instead of raising shelf prices (which shoppers notice), they shrink the product. The shelf price stays the same. The unit price goes up.
**Real example:**
- 2021: Cereal box — 18 oz at $4.99 → $0.277/oz
- 2024: Same brand, same shelf price — 15.5 oz at $4.99 → $0.322/oz
The shelf price did not change. The unit price went up 16.1%. You are paying 16.1% more per ounce for the same product without realizing it.
This is shrinkflation, and it is happening across cereals, snacks, dairy, household products, and more.
## How to Use Unit Price at the Grocery Store
1. **Look for the small print** — Most stores label unit price on the shelf tag. Find the "$/oz" or "¢/load" number.
2. **Calculate yourself** — Divide shelf price by size (oz, g, sheets, loads). Write it down or use a phone calculator.
3. **Compare across brands** — The brand with the lower shelf price is not always the lower unit price.
4. **Track it over time** — If you buy the same products regularly, unit price changes reveal shrinkflation before the brand announces it.
## Unit Price and CartSnitch
CartSnitch automatically calculates unit prices for the products you track. When a brand shrinks a product, CartSnitch flags the unit price increase so you see exactly how much more you are paying per ounce — even if the shelf price never changed.
## Summary
Unit price is the most honest way to compare products of different sizes. It reveals shrinkflation, exposes hidden price increases, and helps you make truly informed purchasing decisions. The formula is simple: divide the price by the size.
**Quick reference:**
- Shelf price: What you pay
- Unit price: What you pay per ounce/gram/unit — the real measure of value
@@ -0,0 +1,319 @@
---
title: "Shrinkflation Series — Promotional Social Copy (April 111)"
status: draft
created: 2026-03-21
publish_window: "April 111, 2026"
series_posts:
- date: "2026-04-01"
slug: grocery-shrinkflation-top-10-2025
topic: Top-10 Shrinkflation anchor
platforms: [twitter, reddit]
- date: "2026-04-03"
slug: shrinkflation-dairy-deep-dive
topic: Series #2 — Dairy
platforms: [twitter]
- date: "2026-04-05"
slug: shrinkflation-frozen-deep-dive
topic: Series #3 — Frozen
platforms: [twitter]
- date: "2026-04-08"
slug: shrinkflation-household-deep-dive
topic: Series #4 — Household
platforms: [twitter]
- date: "2026-04-11"
slug: shrinkflation-snacks-deep-dive
topic: Series #5 — Snacks
platforms: [twitter]
refs:
- CAR-170
- CAR-199
- CAR-202
---
# Shrinkflation Series — Promotional Social Copy
---
## April 1 — Top-10 Shrinkflation (Anchor Post)
**Blog post:** `grocery-shrinkflation-top-10-2025`
**Platforms:** Twitter/X (7-tweet thread) + Reddit (r/Frugal + r/personalfinance)
### Twitter/X — 7-Tweet Thread
**Tweet 1 (hook):**
> We analyzed 4 years of grocery data. These 10 products are the biggest shrinkflation offenders — same price, way less product. A thread. 🧵
**Tweet 2:**
> \#10 — Oikos Triple Zero (Greek yogurt)
> 5.3 oz → 5.0 oz. Price: +$0.10.
> Effective per-unit increase: +12.7%
>
> This is the quiet one. Loyal buyers purchase it 48x a month. The math compounds.
**Tweet 3:**
> \#7 — Kettle Brand Sea Salt
> 13 oz → 12 oz. Price: +$0.50.
> Effective per-unit increase: +19.2%
>
> Premium positioning makes shoppers less likely to check the weight. That may be part of the strategy.
**Tweet 4:**
> \#5 — Cheerios (standard box)
> 18 oz → 15.4 oz. Price: +$0.20.
> Effective per-unit increase: +21.5%
>
> The most purchased cereal in America. A 2.6 oz reduction across hundreds of millions of boxes adds up fast.
**Tweet 5:**
> \#3 — Cocoa Puffs
> 18.1 oz → 15.2 oz. Price: +$0.30.
> Effective per-unit increase: +27.0%
>
> \#2 — Yoplait Original (single-serve)
> 6 oz → 5.3 oz. Price: +$0.10.
> Effective per-unit increase: +27.5%
>
> Two of the most bought breakfast staples. Both over 27%.
**Tweet 6:**
> \#1 — Lay's Classic (party size)
> 15.25 oz → 13 oz. Price: +$0.50.
> Effective per-unit increase: +28.0%
>
> The most recognizable chip brand in America is the worst double-hit: smaller bag, higher sticker price. And most shoppers never notice.
**Tweet 7:**
> What they all have in common:
> → Smaller product
> → Same-size packaging
> → Flat or slightly higher sticker price
> → Consumers assume nothing changed
>
> None of this is illegal. All of it is disclosed in fine print. The asymmetry is the point.
>
> Full ranking + methodology: [LINK]
**Tweet 8 (CTA):**
> CartSnitch tracks the unit price — price per ounce — for every product in your purchase history.
>
> When a brand shrinks the product, you see it. No mental math required.
>
> Beta launching April 24. Free. cartsnitch.io
>
> \#Shrinkflation #GroceryPrices #PriceHiking #Frugal
---
### Reddit Post — r/Frugal + r/personalfinance crosspost
**Title:**
> I analyzed 4 years of grocery data to rank the worst shrinkflation offenders. The results are worse than I expected.
**Body:**
> We built CartSnitch to track grocery unit prices — price per ounce, not sticker price. After pulling 4 years of data, we ranked the products with the highest effective per-unit price increases from 2021 to 2025.
>
> These are not the products that got more expensive at the register. These are the ones where you're paying meaningfully more per unit while the sticker price barely moved — because the product quietly got smaller.
>
> **The top 10:**
>
> | Rank | Product | Old Size | New Size | Old Price | New Price | Unit Price Δ |
> |------|---------|----------|----------|-----------|-----------|--------------|
> | #1 | Lay's Classic (party) | 15.25 oz | 13 oz | $5.49 | $5.99 | +28.0% |
> | #2 | Yoplait Original | 6 oz | 5.3 oz | $0.79 | $0.89 | +27.5% |
> | #3 | Cocoa Puffs | 18.1 oz | 15.2 oz | $4.52 | $4.82 | +27.0% |
> | #4 | Ruffles Original (party) | 15.25 oz | 13 oz | $5.59 | $5.89 | +23.6% |
> | #5 | Cheerios | 18 oz | 15.4 oz | $5.04 | $5.24 | +21.5% |
> | #6 | Lucky Charms | 19.3 oz | 16 oz | $5.01 | $4.96 | +19.4% |
> | #7 | Kettle Brand Sea Salt | 13 oz | 12 oz | $4.99 | $5.49 | +19.2% |
> | #8 | SunChips Original | 13 oz | 11 oz | $4.49 | $4.49 | +18.2% |
> | #9 | Cinnamon Toast Crunch | 19.3 oz | 17 oz | $5.21 | $5.21 | +13.5% |
> | #10 | Oikos Triple Zero | 5.3 oz | 5.0 oz | $1.59 | $1.69 | +12.7% |
>
> **Methodology:** Rankings based on percentage change in unit price (price per oz or per count) between 2021 and 2025. Sources include USDA FoodData Central, manufacturer product pages, and retailer price data. Effective unit price increase = (new price / new size) / (old price / old size) 1.
>
> Lucky Charms is the wildest one to me — the sticker price actually *dropped* by $0.05 while the box lost 3.3 oz. At the register it looks like a deal. Per ounce it's a 19.4% increase.
>
> Full write-up with methodology: [LINK]
>
> ---
>
> We're building CartSnitch to surface this automatically from your store loyalty accounts — tracks unit prices, flags shrinkflation events, shows you when a brand shrinks the product. Beta launches April 24, free. cartsnitch.io
>
> Happy to answer questions about the data or methodology in the comments.
**Hashtags (Reddit — use sparingly in body, flair instead):**
> Flair: Data / Analysis
---
## April 3 — Series #2: Dairy
**Blog post:** `shrinkflation-dairy-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> Dairy is the category where shrinkflation hits you every week without you noticing.
>
> Yogurt, milk jugs, cottage cheese — all smaller. All the same price or more.
>
> We dug into the data: [LINK]
>
> \#Shrinkflation #GroceryPrices #Dairy
**Thread (if content supports it):**
**Tweet 2:**
> Yoplait Original: 6 oz → 5.3 oz. +$0.10 on the sticker.
> That's +27.5% per ounce — and it's one of the most frequently bought yogurts in the US.
**Tweet 3:**
> Oikos Triple Zero: 5.3 oz → 5.0 oz. +$0.10 on the sticker.
> +12.7% per unit. Bought 48x a month by loyal users — the compounding is real.
**Tweet 4:**
> The dairy playbook: trim 0.30.7 oz, raise the sticker by $0.10. Neither change is alarming on its own. Together they add up to a 1028% unit price increase on products you buy every week.
>
> Full breakdown: [LINK]
**CTA tweet:**
> CartSnitch tracks unit prices from your loyalty account. Next time your yogurt shrinks, you'll know before you pay.
>
> Beta: April 24. cartsnitch.io
---
## April 5 — Series #3: Frozen
**Blog post:** `shrinkflation-frozen-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> Frozen meals are the easiest category to shrink without getting caught.
>
> The box stays the same size. The portion gets smaller. The price goes up.
>
> We tracked 4 years of frozen aisle data: [LINK]
>
> \#Shrinkflation #FrozenFood #GroceryPrices
**Thread (if content supports it):**
**Tweet 2:**
> The frozen category playbook: increase the ice content (or air content in packaging), reduce the actual food weight. Most consumers never check the net weight printed on the box.
**Tweet 3:**
> The products most affected: frozen entrees, ice cream, bagged vegetables.
>
> Unit price increases across major frozen brands averaged 1422% over the 20212025 window — driven almost entirely by size reductions rather than sticker price changes.
**Tweet 4:**
> What to look for: net weight in grams or oz on the back of the box. Compare it to what you remember, or to store-brand equivalents.
>
> Or let CartSnitch do it automatically. Beta: April 24. cartsnitch.io
---
## April 8 — Series #4: Household
**Blog post:** `shrinkflation-household-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> Shrinkflation doesn't stop at food.
>
> Paper towels, laundry detergent, dish soap — all quietly shrank over the last 4 years while the sticker price held flat or went up.
>
> We measured it: [LINK]
>
> \#Shrinkflation #HouseholdProducts #ConsumerPrices
**Thread (if content supports it):**
**Tweet 2:**
> Paper towels are the clearest example. "Mega rolls" that were 165 sheets in 2021 are now 120130 sheets. The sticker price: unchanged or higher.
>
> "Mega" is just marketing. The math is on the label.
**Tweet 3:**
> Laundry detergent: fluid oz reduced, concentrated formulas reformulated with less active ingredient per oz.
>
> Dish soap: bottles shrunk 1015%. Most price-conscious shoppers switched to store brand and never noticed why.
**Tweet 4:**
> Household products are harder to track because they're not measured in standard units. That's intentional.
>
> CartSnitch normalizes to cost-per-unit across categories. Beta: April 24. cartsnitch.io
---
## April 11 — Series #5: Snacks
**Blog post:** `shrinkflation-snacks-deep-dive`
**Platform:** Twitter/X (single tweet + thread if rich enough)
### Twitter/X
**Promo tweet:**
> The snack aisle is where shrinkflation is most aggressive — and most invisible.
>
> Same bag. Less product. Same price.
>
> We ranked the worst offenders: [LINK]
>
> \#Shrinkflation #Snacks #GroceryPrices
**Thread (if content supports it):**
**Tweet 2:**
> Lay's Classic party-size: 15.25 oz → 13 oz. Price: +$0.50.
> +28.0% per ounce. The worst double-hit in our entire dataset.
>
> Ruffles party-size: same bag dimensions, 2.25 oz gone, +$0.30 on the sticker.
> +23.6% per ounce.
**Tweet 3:**
> SunChips pulled the cleanest play: sticker price unchanged, 2 oz removed.
> +18.2% per ounce.
>
> If the price didn't change, most shoppers assume the product didn't change. The only signal is the net weight in small type on the back.
**Tweet 4:**
> Kettle Brand positioned itself as premium and priced accordingly: 1 oz removed, +$0.50 on the sticker. +19.2% per ounce.
>
> The premium positioning is cover. Shoppers trust the brand and don't check the weight.
**Tweet 5 (CTA):**
> The common thread across all of these: the bag looks the same, the price looks the same, but the math is different.
>
> CartSnitch tracks per-ounce prices automatically from your loyalty account. You don't have to do this math.
>
> Beta: April 24. cartsnitch.io \#Shrinkflation
---
## Hashtag Reference
| Hashtag | Use case |
|---------|----------|
| `#Shrinkflation` | All posts — primary |
| `#GroceryPrices` | All posts — secondary |
| `#PriceHiking` | Top-10 thread, anchor post |
| `#Frugal` | Reddit-targeted tweets |
| `#Dairy` / `#FrozenFood` / `#Snacks` | Category-specific |
| `#ConsumerPrices` | Household post |
## Link Placeholders
Replace `[LINK]` with the canonical blog post URL once slugs are confirmed:
- Apr 1: `https://cartsnitch.io/blog/grocery-shrinkflation-top-10-2025`
- Apr 3: `https://cartsnitch.io/blog/shrinkflation-dairy-deep-dive`
- Apr 5: `https://cartsnitch.io/blog/shrinkflation-frozen-deep-dive`
- Apr 8: `https://cartsnitch.io/blog/shrinkflation-household-deep-dive`
- Apr 11: `https://cartsnitch.io/blog/shrinkflation-snacks-deep-dive`
+1 -1
View File
@@ -1,5 +1,5 @@
server {
listen 80;
listen 8080;
server_name _;
root /usr/share/nginx/html;
index index.html;