Skip to main content
SoloPrompt AI
All posts
Automation·June 6, 2026·9 min read

Stop Dumping Milk: A Low-Code AI Forecast Stack for Independent Coffee Shops

How indie cafes are using spreadsheet-native AI tools to predict weekly milk demand within 5% — without hiring a data scientist or replacing their POS.

I've spent the last two years helping small roasters and single-location cafes tighten their cost of goods. The number that always wakes owners up at 3am is the same: milk waste. A shop pulling 300 drinks a day will quietly pour $900–$1,400 of dairy down the drain every month — and most of them have no idea, because it shows up as 'shrink' on the P&L instead of a line item.

The good news: you don't need a data team. You need a CSV, a weather feed, and about 90 minutes on a Tuesday morning. Here's the exact stack I deploy.

Why your current ordering is wrong (and it's not your fault)

Most baristas-turned-managers order milk the way their first boss taught them: count what's in the walk-in, eyeball next week, round up. That method has a built-in flaw — it treats Monday and Saturday as the same kind of day. They aren't even close.

A typical urban cafe sees a 2.4x swing between its slowest weekday and its busiest weekend morning. If you order on a flat weekly average, you're guaranteed to be short on Saturday and swimming in milk on Tuesday. The milk you bought Tuesday morning expires Friday. You do the math.

The three signals that actually predict demand

  • Daypart-level drink counts from your POS (not daily totals — hourly buckets matter).
  • Local weather: temperature, precipitation, and 'feels like' for the morning rush window.
  • Calendar context: paydays, school schedules, local events within a 1km radius.

Notice what's not on that list: foot traffic data, Instagram engagement, loyalty app opens. I've tested all of them. They add noise, not signal, at small-shop volumes.

Barista pouring steamed milk into espresso to create latte art in a ceramic cup.
Daypart curves — not weekly totals — are where milk waste hides at most independent cafes.

The stack — and what each piece actually does

I'm a low-code purist for shops under $1M in revenue. The moment you introduce a Python pipeline, you've created a single point of failure that depends on one person staying interested. Use tools your manager can still operate when you're on vacation.

ToolRoleMonthly CostNuance / Best For
Square or Toast POS exportSource of truth for drink-by-drink salesIncludedExport weekly to CSV. Toast's API is friendlier; Square requires a manual download unless you're on Plus.
Google Sheets + GeminiCleaning, daypart bucketing, baseline forecast$0–$22Best for owners who already live in Sheets. The =AI() function is surprisingly competent at categorizing drinks into milk-volume tiers.
Open-Meteo API7-day weather forecast feedFreeNo API key, no rate limits for small use. More reliable than OpenWeather for hyperlocal forecasts in North America.
Claude or ChatGPT (Projects)Pattern explanation, anomaly callouts, order recommendations$20Use Projects/GPTs to keep your shop context loaded. Don't re-paste your menu every week.
Zapier or MakeGlue: trigger the weekly forecast email automatically$0–$29Skip this for the first 8 weeks. Run it manually until you trust the output, then automate.
Cafe owner reviewing sales data on a tablet behind the counter of a small specialty coffee shop.
Ninety minutes of setup beats a $400/month forecasting SaaS for shops under 600 drinks a day.

The 90-minute setup, step by step

Step 1: Pull 90 days of hourly sales

Sixty days is the floor. Ninety gives the model enough weekend-vs-weekday contrast to spot real patterns. Less than that and you're forecasting on noise.

Export every drink SKU with timestamp and quantity. Then add a column for ounces of milk per drink — a 12oz latte is roughly 8oz milk, a cortado is 4oz, a drip coffee is zero. Most shops have 6–10 SKUs that account for 85% of their dairy consumption. Tag those first.

Step 2: Bucket by daypart, not by day

The single biggest win in this whole process. Split your day into four buckets: 6–9am (commuter rush), 9am–noon (laptop crowd), noon–3pm (lunch + afternoon dip), 3pm–close (post-work and dessert drinks). Each bucket has a wildly different milk profile.

Commuter rush is all whole-milk lattes and cappuccinos. The laptop crowd skews oat and almond. Afternoon shifts toward iced and cold brew with cream. If you forecast these as one number, you'll get an answer that's wrong in three directions at once.

Step 3: Pull the weather forecast and layer it on

Open-Meteo gives you a 7-day forecast in a single URL call. No signup. Pull morning-window temperatures (6–10am) for the upcoming week and join them to your historical sales by date. You'll see the elasticity immediately: a drop from 70°F to 45°F in your morning rush typically lifts hot-drink milk demand by 9–14% and cuts iced by 30%.

The prompt that does the heavy lifting

Once your cleaned data is in a sheet, this is the prompt I use weekly. It assumes you've already loaded your menu and milk-per-drink ratios into a Claude Project or Custom GPT. Paste your data, get a per-day, per-milk-type order recommendation back.

text
You are a senior inventory analyst for a single-location specialty coffee shop. You have full context on our menu, milk-per-drink ratios, and supplier minimums (already loaded in this project).

INPUT DATA (pasted below):
- 90 days of hourly sales by SKU
- Next 7 days of weather forecast (morning temp 6-10am, precipitation probability)
- Calendar notes: {{LOCAL_EVENTS_OR_HOLIDAYS}}
- Current walk-in inventory by milk type: {{CURRENT_INVENTORY}}
- Supplier delivery days: {{DELIVERY_SCHEDULE}}
- Shelf life from delivery: whole 10 days, oat 14 days, almond 21 days

TASK:
1. Calculate baseline daily milk demand by type (whole, 2%, oat, almond, half-and-half) for each of the next 7 days, broken into the 4 dayparts.
2. Apply weather adjustments: cold mornings (<55F) lift hot-drink milk 8-15%, warm mornings (>75F) lift iced/cold drinks 20-35%.
3. Apply event lift for any items in {{LOCAL_EVENTS_OR_HOLIDAYS}} based on similar past events in the data.
4. Subtract current inventory from total need.
5. Recommend an order for each delivery day this week, rounded UP to the nearest case/half-gallon depending on supplier unit.
6. Flag any line where confidence is low (e.g., a new event with no historical analog) and explain why.

OUTPUT FORMAT:
- A table: Delivery Day | Milk Type | Recommended Order | Confidence (H/M/L) | Reasoning (1 sentence)
- A short "watch list" of 1-3 things to monitor mid-week (e.g., "If Wednesday morning drops below 50F, add 2 gallons whole milk to Thursday's order").

Rules:
- Never recommend ordering more than 4 days of oat milk at once unless turnover justifies it.
- Round whole milk to half-gallons, oat to full cases of 6.
- If predicted waste exceeds 8% on any line, flag it and suggest a daypart-level promo instead of cutting the order.

How to tweak it for your shop

The variables in double braces are where 80% of your customization lives. {{DELIVERY_SCHEDULE}} matters more than people realize — a shop that gets dairy three times a week can run 40% leaner inventory than one on a two-delivery schedule. If you only get Monday and Thursday drops, your model needs to plan for Sunday demand on Thursday's order, which is a much harder forecast.

The rule about oat milk is non-negotiable. I've watched too many shops order a full week of oat upfront and then watch demand soft-pivot to almond after a TikTok trend. Oat has long shelf life but volatile demand. Treat it like a dry good — order smaller and more often.

What to expect in the first month

Week one, the model will be confidently wrong about something. Usually it's a Saturday it didn't see coming because of a farmers market two blocks away that doesn't show up in any data. That's fine. You're building a feedback loop, not a crystal ball.

By week four, expect whole-milk waste to drop 30–50%. Oat takes longer because the demand signal is noisier. Don't chase perfection on the plant milks until your dairy numbers are stable. One thing at a time.

If you're looking for more low-overhead automations like this, our writeups on small-business automation and admin workflows cover adjacent ground — same philosophy, different problem.

Frequently asked questions

Less than you'd think. The LLM will handle modifier explosion (a 'large oat latte, extra shot, no foam' parses fine). What you DO need to fix: filter out voids and employee comps before exporting, otherwise your baseline gets inflated by 4–7%. Add a single filter column in your export step. Don't try to normalize SKU names by hand — that's a rabbit hole and the model doesn't need it.

Found this useful?

Browse more free workflows — no signup, no paywall.

Dani

Written by

Dani

AI Workflow Explorer

Dani writes SoloPrompt AI — a working notebook of copy-paste prompts, low-code automations, and field-tested workflows for solo operators. Equal parts skeptic and tinkerer, Dani road-tests every prompt against real micro-business problems before it ships.