How to Make a Meal Planner in Notion

Short answer

Keep meals, days and ingredients in three linked databases. A This week formula counts how often each meal is planned, Buy multiplies each ingredient by that count, and a view filtered to Buy above 0 and grouped by aisle is your shopping list.

Rather skip the setup? Our Weekly Meal Planner is ready to use, $5 once.
A Notion meal planner: a week of meals with calories for each day, a meal page with its ingredients and a grocery list by aisle

Try it: plan a week

Click a meal to put it on a day, and click it again to take it off. Each day’s calories and the shopping list change as you go, the same way the formulas below work in Notion. The week starts with the days we planned in our test.

This week

6 meals planned, 9 things to buy

  • Mon 870 kcal
  • Tue 990 kcal
  • Wed 520 kcal
  • Thu 0 kcal
  • Fri 0 kcal
  • Sat 640 kcal
  • Sun 0 kcal

Shopping list

Dairy

  • Milk 400 ml Overnight oats
  • Parmesan 40 g Tomato pasta

Meat

  • Chicken breast 300 g Chicken salad

Pantry

  • Rolled oats 100 g Overnight oats
  • Pasta 200 g Tomato pasta
  • Tomato sauce 2 jars Tomato pasta

Produce

  • Banana 2 Overnight oats
  • Lettuce 2 heads Chicken salad
  • Cherry tomatoes 200 g Chicken salad

1. Meals and their ingredients

The trick is to give ingredients a database of their own, one row each, linked to the meal they belong to. That’s what lets Notion add them up for you later.

  1. Make a new page called Meal planner. On it, type /table, pick the table option and call the database Meals. Add a Number property called Calories.
  2. Add a second database called Ingredients with the properties below.
PropertyTypeWhat it’s for
ItemTitleWhat to buy, like Pasta
QtyNumberHow much one meal needs
UnitTextg, ml, can, jar
AisleSelectProduce, Meat, Dairy, Pantry
MealRelationThe meal it’s for

When you add the Meal relation, pick the Meals database, turn on Show on Meals and name it Ingredients. Now every meal page shows what goes into it.

Type Qty for the amount you cook at once. If you cook for four, type amounts for four.

A Chicken Burrito Bowls meal page in Notion with its calories, the days it’s planned and a list of ingredients with Qty, Unit and Aisle
A meal page in our Meal Planner: the ingredients sit right under the meal.

2. Plan the days

  1. Add a third database called Days with a Date property.
  2. Add a Relation called Meals. Pick the Meals database, turn on Show on Meals and name it Days.
  3. Add a page for each day you plan, set its Date and pick its meals. Sort the table by Date so the week reads top to bottom.

To see each day’s calories, add a Rollup property to Days called Calories. Set Relation to Meals, Property to Calories and Calculate to Sum. In our test, a Monday with Overnight oats at 350 and Chicken salad at 520 showed 870.

3. Count this week’s meals

On Meals, add a Formula property called This week. It counts the days from this Monday to this Sunday that the meal is planned for:

This week
let(
  monday, dateSubtract(today(), day(today()) - 1, "days"),
  prop("Days").filter(
    dateBetween(current.prop("Date"), monday, "days") >= 0 and
    dateBetween(current.prop("Date"), monday, "days") <= 6
  ).length()
)

On Saturday, October 31, Tomato pasta was planned for Tuesday, Saturday and the next Monday. This week showed 2, since that Monday belongs to next week.

4. A grocery list that adds itself up

On Ingredients, add a formula called Buy. It multiplies what one meal needs by the number of times the meal is planned:

Buy
prop("Qty") * prop("Meal").first().prop("This week")

Pasta at 100 g, for a meal planned twice, showed 200. Coconut milk, for a curry we didn’t plan, showed 0. Now turn it into a list:

  1. Click + next to the view name, add a Table view and call it Shopping list.
  2. Click Filter and choose Buy. Change = to > and type 0. Items for meals you didn’t plan drop off.
  3. Open the view’s settings, choose Group and pick Aisle, so the list follows the store.
A Notion shopping list filtered to Buy above 0 and grouped by aisle: milk 400 ml, chicken 300 g, pasta 200 g, oats 100 g, sauce 2, lettuce 2
Our test list. The curry wasn’t planned, so coconut milk isn’t on it.

Want to tick things off at the store? Add a Checkbox called Got it and filter the view to Got it is unchecked too. Our guide to resetting checkboxes has a button that unticks them all for the next shop.

Questions

How do I make a grocery list from recipes in Notion?

Keep ingredients in their own database, each linked to its meal, with a Qty. A This week formula on the meal counts how often it’s planned, a Buy formula on the ingredient multiplies Qty by that, and a view filtered to Buy above 0 is your list.

Can I track protein or macros too?

Yes. Add a Protein number to Meals and a second rollup on Days that sums it, set up the same way as Calories. Carbs and fat work the same.

What if two meals use the same ingredient?

Each meal keeps its own rows, so milk for oats and milk for a curry show up as two lines. Sort the list by Item so they sit next to each other, and add them up as you shop.

When does the shopping list start fresh?

Every Monday. This week only counts Monday to Sunday of the current week, so last week’s days stop counting on their own. It also means next week’s days don’t count until Monday, so plan the week by then and shop from the list early in the week.

Does this work on the free Notion plan?

Yes. Databases, relations, rollups and formulas are all on the free plan.