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.
- A new row is typed into the Shopping List tab, one cell at a time, in the white cells a person fills in.
- The shaded cells in that row fill themselves in.
- The figures on the Summary tab change to include the new row.
- The chart, Planned shopping spend by category, redraws with it.
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
| Column | What goes in it | Worked out as |
|---|---|---|
| Date | Type a date. | |
| Day | Fills itself in. | Worked out from this row's Date. The formulaIF(ISBLANK([date]), "", TEXT([date], "ddd")) |
| Meal | Pick one: Breakfast, Lunch, Dinner or Snack. | |
| Dish | Type the dish name here. Shopping list items pick from this list.Type any text. | |
| Servings | Type a number. | |
| Ingredient Cost | Fills 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 Serving | Fills 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)) |
| Cooked | Tick it when it applies. | |
| Notes | Type any text. |
Shopping List
9 columns
| Column | What goes in it | Worked out as |
|---|---|---|
| Week Beginning | Use the Monday of the week you are shopping for, so it matches the Weekly Budget tab.Type a date. | |
| Item | Type any text. | |
| Category | Pick one: Fruit and Veg, Meat and Fish, Dairy and Chilled, Bakery, Store Cupboard, Frozen, Drinks or Household. | |
| For Which Meal | Pick one of the Dish entries on Meal Plan. | |
| Quantity | Type a number. | |
| Unit | Pick one: each, g, kg, ml, litre, pack, tin, bunch or loaf. | |
| Price Per Unit | Type an amount in £. | |
| Line Cost | Fills itself in. | The Quantity times the Price Per Unit. The formulaIF(OR(ISBLANK([quantity]), ISBLANK([unit_price])), "", ROUND([quantity] * [unit_price], 2)) |
| Bought | Tick it when it applies. |
Weekly Budget
10 columns
| Column | What goes in it | Worked out as |
|---|---|---|
| Week Beginning | Use the Monday of the week, matching the shopping list.Type a date. | |
| Budget | Type an amount in £. | |
| Main Shop | Type an amount in £. | |
| Top Up Shop | Type an amount in £. | |
| Other Food Spend | Type an amount in £. | |
| Total Spent | Fills 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 Value | Fills 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 Over | Fills 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 Used | Fills 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)) |
| Status | Fills 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
| Figure | Worked 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 overall | A 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 week | Counts 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]) |