Grocery Spending Tracker Google Sheets Template (Free 2026)
A free Google Sheets grocery spending tracker with per-store analysis, unit-price tracking, a shrinkflation detector, $/meal calc, and an India mode toggle for Zepto and Blinkit
A grocery spending tracker in Google Sheets works best when it does four things a bank statement will not: split spending by store, watch the unit price of a few staples, calculate cost per meal, and toggle between USD and INR so the same sheet works for a Whole Foods run and a Zepto order. The template below does all four with no add-ons.
I built the first version of this grocery spending tracker on June 3, 2026, sitting in my sister's kitchen in San Francisco during a two-week trip. I had been in the US for four days, run to Trader Joe's twice and Whole Foods once, and I could not tell you where the $214 on my card had actually gone. The bank app said 'GROCERY'. That was it.
Back in Bangalore I have the same problem in a different currency. Zepto ping, BigBasket ping, DMart on Sunday, Blinkit for the coffee I ran out of at 11pm. The UPI history is a wall of merchant names. Nothing tells me that Zepto is 22% more expensive on the same brand of dal than DMart was three weeks ago.
So I sat down and built the boring version of a tool I had been looking for. One Google Sheet, five tabs, no add-ons, and one toggle that flips the whole thing between US and India mode. This post walks you through the tabs and the formulas. You can copy the sheet at the top and edit it, or rebuild it from scratch — either works.
Copy the grocery spending tracker
The live template is preloaded with 50 seed transactions across 3 months so the dashboards render immediately. Includes per-transaction log, per-store rollup, staple unit-price tracker with a shrinkflation flag, $/meal and $/person fields, monthly budget bar, and an India mode toggle.
The Layout: Five Tabs, Nothing Clever
Before the formulas, the tabs. A grocery spending tracker fails when you have to think about where to type something. So the sheet is built around one input tab and four read-only dashboards.
Tab 1 is Log. This is the only tab you ever type into. Every trip, every delivery, every one-item run to the corner shop goes here as a row. Six columns: Date, Store, Category, Item, Qty, Unit Price. Total is a formula (Qty × Unit Price) so you never fight arithmetic at the checkout line.
Tab 2 is By Store. It rolls up the Log by store name and shows total spend, number of visits, average per visit, and a 4-week trend. Tab 3 is Staples. It pulls unit prices for four items — eggs, milk, bread, coffee — and flags anything that has risen more than 10% versus its 90-day average. Tab 4 is Budget. Monthly cap, actual, remaining, and a REPT progress bar. Tab 5 is Settings. One cell controls currency and the store dropdown list.
That is it. No pivot tables, no scripts, no add-ons. If your sheet requires an add-on to work you will stop using it in three weeks. I have watched myself abandon four spreadsheets that were too smart. This one is deliberately dumb.
The seed sheet has 50 transactions across April, May, and June 2026 so every dashboard has something to render on day one. Delete the seed rows once you have entered your first week of real data, or keep them and let your own runs push them out over time.
The Log Tab: Store and Category Dropdowns
The Log tab is the only place friction matters. If entering a row takes more than 15 seconds you will not do it after a Sunday trip when you are unpacking bags. So both Store and Category are Data Validation dropdowns, not free text.
The US Store list is Costco, Walmart, Whole Foods, Trader Joe's, Kroger, Aldi, Local. The India Store list is Zepto, BigBasket, DMart, Reliance Fresh, Blinkit, Local. Whichever list appears is driven by the currency toggle on Settings — more on that at the end.
Category is fixed across both modes: Produce, Dairy, Meat, Pantry, Snacks, Beverages, Household, Other. Eight buckets is enough to see patterns without turning every entry into a categorization exercise. I have run the sheet for seven weeks and the ratio has been remarkably stable — Produce is always my biggest bucket in the US, Pantry always wins in India.
Unit Price is the sneaky column. Most grocery trackers only ask for a total per receipt. That gets you category spend but nothing else. Per-item unit price is what unlocks the shrinkflation detector two tabs down. It also means you can enter one row per line item on your receipt, or one row per receipt with the total as unit price and Qty = 1 — the sheet works either way.
Total is a straight =E2*F2 with a check for blank rows: =IF(E2="", "", E2*F2). That empty-string guard keeps the column from showing zeros on the 300 empty rows below your data, which matters for the rollups.
The By Store Rollup: Where Your Money Actually Goes
The By Store tab is the first thing I look at every Sunday. It answers the question the bank app cannot: not 'how much did I spend on groceries' but 'which store took the biggest slice, and is that different from last month.'
The tab has one row per store from the active Settings list. The Total column is a plain SUMIF: =SUMIF(Log!B:B, A2, Log!G:G). Visits is a COUNTIF against the unique receipt dates — I use a helper column on the Log tab that flags the first row of each new store-visit as a 1, so a Costco run with 14 line items still counts as one visit. The formula in the helper is =IF(COUNTIFS($A$2:A2, A2, $B$2:B2, B2)=1, 1, 0).
Average per visit is Total / Visits, formatted to two decimals. That single number is more useful than I expected. My Whole Foods average visit is $84. My Trader Joe's average is $47. When Trader Joe's crept up to $58 in the third week of June I noticed immediately, because the number that had been stable for a month suddenly moved. Turned out I had started buying their frozen mandarin orange chicken twice a trip. Small thing. Would not have caught it from a category total.
The trend column is a SPARKLINE showing the last four weekly totals for that store: =SPARKLINE(FILTER(WeeklyByStore!B:B, WeeklyByStore!A:A=A2), {"charttype", "line"; "linewidth", 2}). It fits in one cell and tells you at a glance whether a store is climbing, flat, or drifting down. WeeklyByStore is a hidden helper tab that groups the Log by ISOWEEKNUM and store — 15 rows of QUERY that you copy once and forget.
The bank app tells you what you spent. The By Store tab tells you where the momentum is shifting. Those are different questions, and only one of them changes behavior.
The Shrinkflation Detector: Unit-Price Alarms on Staples
Shrinkflation is the polite term for the same product costing more, or the same price buying you less of it. Grocery prices in the US rose about 25% between 2020 and 2024 according to the USDA's Food Price Outlook, and India's CPI food inflation printed 8.7% year-on-year in October 2024 per MoSPI. Both numbers hide inside averages. What actually happens is the unit price of a handful of things you buy every week creeps up quietly.
The Staples tab watches four items: eggs, milk, bread, and coffee. You can add or swap items — the formulas key off item name. For each staple it pulls the most recent unit price, the 90-day trailing average, and the delta. If the delta is greater than 10%, the row lights up red. That is the shrinkflation flag.
The most recent price formula is =INDEX(Log!F:F, MATCH(2, 1/(Log!D:D="Eggs"))) entered as an array formula, or the friendlier XLOOKUP version if you are on the newer Sheets: =XLOOKUP("Eggs", Log!D:D, Log!F:F, "", 0, -1). The final -1 argument tells it to search from the bottom up, so you always get the latest entry.
The 90-day average is an AVERAGEIFS: =AVERAGEIFS(Log!F:F, Log!D:D, "Eggs", Log!A:A, ">="&TODAY()-90). The delta cell is =(Recent - Avg)/Avg formatted as a percentage. Then conditional formatting on the delta column: red fill if greater than 0.10, yellow if between 0.05 and 0.10, green if negative.
This is the only part of the sheet that has genuinely changed a buying decision for me. In week 5 the sheet flagged coffee at 14% above the 90-day average. I had switched from Trader Joe's beans to a specialty brand and kept buying it out of inertia. The red flag was enough of a nudge to switch back. That is one red cell paying for itself.
$/Meal, $/Person, and the Monthly Budget Bar
Two calculated fields sit at the top of the Budget tab. Cost per meal and cost per person. Both need one input from you: how many people the sheet is tracking, and roughly how many home-cooked meals you eat per week. Enter them once in Settings.
$/meal is =MonthlyTotal / (People × MealsPerWeek × 4.33). The 4.33 is weeks-per-month, which I prefer over the more elaborate calendar-day math because it is stable across months. $/person is =MonthlyTotal / People. Both round to two decimals and update every time you add a row to Log.
The monthly budget bar uses REPT, which is the simplest and most satisfying visual in the Google Sheets vocabulary. =REPT("█", (Actual/Budget)*20) & " " & TEXT(Actual/Budget, "0%"). Twenty solid blocks equal 100% of budget. When you hit 60% you have 12 blocks. When you overshoot you get a wall of blocks and the percentage on the right. I have tried gauge charts and stacked bars and gradient scales; the REPT bar is the one I actually glance at.
Conditional formatting on the Actual cell turns green under 80% of budget, yellow 80–100%, red above 100%. Same three-tier system as my google sheets habit tracker template. It works because it maps to how you actually feel about the number.
Once you have a real $/meal number, you can decide whether it is worth cooking versus ordering. If your home-cooked cost is $4.20 per person per meal and a delivery order is $18, the math answers itself. Without the number, the conversation is vibes.
India Mode: The Currency Toggle
The India toggle is the feature I built for myself. On the Settings tab there is one cell: Mode, with a dropdown that says US or India. Three things react to it.
First, the currency symbol on every total, average, and budget cell. Done with a conditional format rule: if Settings!Mode = "India" apply the format ₹#,##,###.00 (with the Indian lakh comma spacing), otherwise $#,##0.00. One rule, all cells.
Second, the Store dropdown on the Log tab swaps its source. The dropdown reads from a named range called ActiveStoreList, which is a one-line formula on Settings: =IF(Mode="India", IndiaStores, USStores). IndiaStores and USStores are just labeled lists of six items each: Zepto, BigBasket, DMart, Reliance Fresh, Blinkit, Local on one side; Costco, Walmart, Whole Foods, Trader Joe's, Kroger, Aldi, Local on the other.
Third, the Staples default items adjust — eggs, milk, bread, coffee still work for both, but the India seed data uses Amul milk, Modern bread, and Bru coffee unit prices so the shrinkflation flag has a baseline that matches Indian brand naming. You can edit these to whatever you actually buy — atta, dal, ghee, whatever the four things are that you would notice if they crept up 10%.
The seed sheet ships with both a US 3-month dataset and an India 3-month dataset on separate hidden tabs, so flipping the toggle immediately shows populated dashboards in whichever mode you pick. Delete the mode you do not need once you start entering your own data.
The same template running two currencies is a soft way to teach yourself that grocery inflation is not a headline number — it is four staples, four unit prices, and a delta column.
That is the whole sheet. Five tabs, one input, four dashboards, one toggle. If you want a related tool for the non-grocery side of your money, my google sheets budget tracker template covers the full monthly picture, and the google sheets expense tracker template handles per-category tracking for non-grocery spend. And if streaks are more your motivator than numbers, the google sheets habit tracker template uses the same conditional-formatting philosophy applied to daily behaviors.
Copy the sheet, delete the seed rows once you have a week of your own data, and see what your By Store rollup says on the following Sunday. My guess is you will find a store that is quietly climbing and one staple that has crept past the 10% flag. Both are useful things to know before the next trip.
Frequently Asked Questions
How do I track grocery spending in Google Sheets?
Create one Log tab with columns for Date, Store, Category, Item, Qty, and Unit Price. Use Data Validation dropdowns for Store and Category so entries stay consistent. Add SUMIF and COUNTIF-driven rollup tabs for per-store totals, and an AVERAGEIFS-driven Staples tab for unit-price tracking. The full walkthrough and formulas are in the sections above, and the seed template at the top of the post is preloaded with 50 sample rows.
What formula flags shrinkflation on grocery staples?
Compare the most recent unit price to a trailing 90-day average and flag anything above a 10% increase. Use XLOOKUP with a -1 search-mode argument to get the latest unit price for an item, and AVERAGEIFS filtered to Log!A:A >= TODAY()-90 for the baseline. Then apply conditional formatting to the delta column: red above 10%, yellow between 5-10%, green if negative.
How do I calculate cost per meal in the grocery tracker?
Divide monthly grocery total by (people × meals-per-week × 4.33). The 4.33 is the average weeks-per-month and keeps the number stable across months of different lengths. In the template, People and MealsPerWeek live on the Settings tab as two inputs you enter once, and the $/meal cell recalculates every time you add a row to the Log tab.
Can I use this grocery spending tracker for Zepto, Blinkit, and Indian stores?
Yes. The template has an India mode toggle on the Settings tab that switches the currency symbol to INR with lakh comma spacing and swaps the Store dropdown to Zepto, BigBasket, DMart, Reliance Fresh, Blinkit, and Local. The Staples tab works with any four items you edit into it, so you can swap eggs/milk/bread/coffee for atta, dal, ghee, or whatever you buy weekly. The seed sheet ships with both US and India datasets so both modes render immediately.
Does the grocery spending tracker work on mobile?
Yes, through the Google Sheets iOS and Android app. The Log tab is designed to be quick on mobile — Store and Category are dropdowns so you tap rather than type, and Total is a formula so you only need to enter Qty and Unit Price. Reviewing the By Store and Staples tabs on a phone is functional but less comfortable than on desktop, so most people enter rows on mobile and review dashboards on Sunday from a laptop.