Proper Spreadsheets

Templates › Occasions

Meal Plan & Grocery Budget

Made for households planning meals and shopping.

Plan a meal for every day, turn it into a costed shopping list, and check each week's actual shop against the budget you set. The summary carries a chart that redraws itself as you type.

Of the 28 columns, you fill in 19 and the other 9 work themselves out, and all 13 figures on the summary do too. There is room for 2,310 rows of your own.

£4.99one payment, yours to keep

  • Opens in Excel, Google Sheets and Numbers
  • Delivered straight away
  • No macros, nothing to install
  • Change it free before you buy

Payment is handled by Stripe. Your card details go to them and never to us. Sales are final, which is why every tab, column and calculation is shown on this page first.

Already have a spreadsheet of your own? Check it for mistakes, free.

The workbook's summary and the table behind it
A row typed into the real file. Every figure that changes is the spreadsheet's own arithmetic. What the film shows, in order:
  1. A new row is typed into the Shopping List tab, one cell at a time, in the white cells a person fills in.
  2. The shaded cells in that row fill themselves in.
  3. The figures on the Summary tab change to include the new row.
  4. The chart, Planned shopping spend by category, redraws with it.
The chart, drawn from the totals in the table beside it. See it full size
Where you type, and the shaded columns that work themselves out. See it full size

Everything inside, before you pay

This is the whole design: every tab, every column and how each calculated one is worked out. White cells are yours to fill in; the shaded ones work themselves out and are locked so a formula cannot be overwritten by accident. There is room for 2,310 rows. Open any tab to see its columns.

Meal Plan

9 columns

One row per meal. Cost is pulled in from the shopping list items you tag to each dish. Ready for 750 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
DateType a date.
DayFills itself in.

Worked out from this row's Date.

The formulaIF(ISBLANK([date]), "", TEXT([date], "ddd"))
MealPick one: Breakfast, Lunch, Dinner or Snack.
DishType the dish name here. Shopping list items pick from this list.Type any text.
ServingsType a number.
Ingredient CostFills itself in.

The total of Line Cost on Shopping List where For Which Meal matches this row's Dish.

The formulaIF(ISBLANK([dish]), "", SUMIF([Shopping List!meal], [dish], [Shopping List!line_cost]))
Cost Per ServingFills itself in.

Worked out from this row's Dish and Servings, using For Which Meal and Line Cost on Shopping List.

The formulaIF(OR(ISBLANK([dish]), ISBLANK([servings])), "", IFERROR(SUMIF([Shopping List!meal], [dish], [Shopping List!line_cost]) / [servings], 0))
CookedTick it when it applies.
NotesType any text.

Shopping List

9 columns

Everything you need to buy, tagged to the meal it belongs to and to the week you are shopping for. Ready for 1,500 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
Week BeginningUse the Monday of the week you are shopping for, so it matches the Weekly Budget tab.Type a date.
ItemType any text.
CategoryPick one: Fruit and Veg, Meat and Fish, Dairy and Chilled, Bakery, Store Cupboard, Frozen, Drinks or Household.
For Which MealPick one of the Dish entries on Meal Plan.
QuantityType a number.
UnitPick one: each, g, kg, ml, litre, pack, tin, bunch or loaf.
Price Per UnitType an amount in £.
Line CostFills itself in.

The Quantity times the Price Per Unit.

The formulaIF(OR(ISBLANK([quantity]), ISBLANK([unit_price])), "", ROUND([quantity] * [unit_price], 2))
BoughtTick it when it applies.

Weekly Budget

10 columns

One row per week. Set the budget, enter what each shop actually came to, and see whether you kept inside it. Ready for 60 rows, every one with its formulas in place.

ColumnWhat goes in itWorked out as
Week BeginningUse the Monday of the week, matching the shopping list.Type a date.
BudgetType an amount in £.
Main ShopType an amount in £.
Top Up ShopType an amount in £.
Other Food SpendType an amount in £.
Total SpentFills itself in.

Worked out from this row's Week Beginning, Main Shop, Top Up Shop and Other Food Spend.

The formulaIF(ISBLANK([week_start]), "", ROUND([main_shop] + [top_up] + [other], 2))
Shopping List ValueFills itself in.

The total of Line Cost on Shopping List where Week Beginning matches this row's Week Beginning.

The formulaIF(ISBLANK([week_start]), "", SUMIF([Shopping List!week_start], [week_start], [Shopping List!line_cost]))
Under Or OverFills itself in.

Worked out from this row's Week Beginning, Budget, Main Shop, Top Up Shop and Other Food Spend.

The formulaIF(OR(ISBLANK([week_start]), ISBLANK([budget])), "", ROUND([budget] - ([main_shop] + [top_up] + [other]), 2))
Percent Of Budget UsedFills itself in.

Worked out from this row's Budget, Main Shop, Top Up Shop and Other Food Spend.

The formulaIF(ISBLANK([budget]), "", IFERROR(([main_shop] + [top_up] + [other]) / [budget], 0))
StatusFills itself in.

Worked out from this row's Week Beginning, Budget, Main Shop, Top Up Shop and Other Food Spend.

The formulaIF(ISBLANK([week_start]), "", IF(ISBLANK([budget]), "No budget set", IF(([main_shop] + [top_up] + [other]) > [budget], "Over budget", "Within budget")))

Summary

13 figures

The headline answers: what you budgeted, what you spent, and where the food money goes.

FigureWorked out as
Total budgeted so far

The total of Budget on Weekly Budget.

The formulaSUM([Weekly Budget!budget])
Total actually spent

The total of Total Spent on Weekly Budget.

The formulaSUM([Weekly Budget!total_spend])
Under or over budget overallA positive figure means you came in under budget.

Worked out from Budget and Total Spent on Weekly Budget.

The formulaSUM([Weekly Budget!budget]) - SUM([Weekly Budget!total_spend])
Average weekly shop

Worked out from Total Spent and Week Beginning on Weekly Budget.

The formulaIFERROR(SUM([Weekly Budget!total_spend]) / COUNT([Weekly Budget!week_start]), 0)
Weeks tracked

The number of rows on Weekly Budget with Week Beginning filled in.

The formulaCOUNT([Weekly Budget!week_start])
Weeks over budget

The number of rows on Weekly Budget where Status is “Over budget”.

The formulaCOUNTIF([Weekly Budget!status], "Over budget")
Spent this weekCounts the row whose week beginning is this Monday.

Worked out from Week Beginning and Total Spent on Weekly Budget.

The formulaSUMIF([Weekly Budget!week_start], TODAY() - WEEKDAY(TODAY(), 2) + 1, [Weekly Budget!total_spend])
Left to spend this week

Worked out from Week Beginning, Budget and Total Spent on Weekly Budget.

The formulaSUMIF([Weekly Budget!week_start], TODAY() - WEEKDAY(TODAY(), 2) + 1, [Weekly Budget!budget]) - SUMIF([Weekly Budget!week_start], TODAY() - WEEKDAY(TODAY(), 2) + 1, [Weekly Budget!total_spend])
Value of the whole shopping list

The total of Line Cost on Shopping List.

The formulaSUM([Shopping List!line_cost])
Items on the shopping list

The number of rows on Shopping List with Item filled in.

The formulaCOUNTA([Shopping List!item])
Meals planned

The number of rows on Meal Plan with Dish filled in.

The formulaCOUNTA([Meal Plan!dish])
Average cost per serving planned

Worked out from Line Cost on Shopping List and Servings on Meal Plan.

The formulaIFERROR(SUM([Shopping List!line_cost]) / SUM([Meal Plan!servings]), 0)
Dearest meal to make

The largest Ingredient Cost on Meal Plan.

The formulaMAX([Meal Plan!meal_cost])