A daily mood tracker is a simple way to understand how you feel over time. In the first part of this tutorial, we created a basic Notion mood tracker that lets you log your mood every day in one click and view your entries in a calendar.
Now, we’re going to take that system one step further by adding an automatic monthly recap. By the end of this tutorial, your mood tracker will let you:
😀 Log your mood every day in one click
🗓️ See your daily entries in a calendar
🔄 Generate a new monthly recap automatically
📋 Display your recaps in a clean gallery view
If you haven’t created the original mood tracker yet, follow the first tutorial before continuing: build your Notion mood tracker.
📹 And if you prefer watching the process step by step, the video version of this tutorial is available at the end of the article.
Open the mood tracker you created in the previous tutorial and go to the table view. Click the Settings icon in the top-right corner of the database. Select More settings, then open Sub-items and turn them on.
Make sure the sub-item settings are configured as follows:
👉 Display: Nested in toggle
👉 Filter: Parents and sub-items
This structure will allow one main page to contain all your daily entries and monthly recaps.

Click the small arrow next to the blue New button, then select Empty.
A new page will be created in your database. Rename it All, and don’t change anything else.
From now on, this page will contain every other page in your mood tracker. It won’t change the way you use the tracker, but this parent-and-sub-item structure is required for the monthly recap to work.
If your database already contains daily entries, drag and drop each one inside the All page so that they become sub-items.

Once all your existing entries are nested inside All, add a new Select property and name it Type.
Create two options: Day and Month.
If your database already contains daily entries, assign the Day option to all of them. Leave the All page unchanged.
You won’t need to interact with this property during your daily use of the tracker. It simply helps the monthly recap identify which pages are daily entries and which ones are monthly summaries.

Click the small arrow next to the blue New button again. Find your @Today template, click the three dots next to it, and select Edit.
Update the template so that:
👉 Parent item is set to All
👉 Type is set to Day
The changes will be saved automatically. Once you’re done, click outside the pop-up to return to the database.
Every new daily entry created from this template will now be correctly nested inside All and labeled as a Day.

Click the arrow next to New one more time, then select New template. Rename the template Recap and configure its properties as follows:
👉 Date: Today — date when duplicated
👉 Parent item: All
👉 Type: Month
Then, click Duplicate every in the yellow bar at the top of the page. Select Month, keep the default settings, and save the automation. Once everything is set, click outside the pop-up.
From now on, a new monthly recap will be created automatically on the first day of every month. It will appear inside the All page, just like your daily entries.
Again, this won’t change the way you use your mood tracker day to day. The recap will simply be generated in the background.

Next, add a new Formula property to your database. Copy and paste the formula below into the formula editor:
if(prop("Type") != "Month" or empty(prop("Date")) or empty(prop("Parent item")), "", lets(monthStart, dateSubtract(prop("Date"), date(prop("Date")) - 1, "days"), daysInMonth, dateBetween(dateAdd(monthStart, 1, "month"), monthStart, "days"), monthEntries, prop("Parent item").first().prop("Sub-item").filter(current.prop("Type") == "Day" and not empty(current.prop("Date")) and year(current.prop("Date")) == year(monthStart) and month(current.prop("Date")) == month(monthStart)), weeks, [0, 1, 2, 3, 4, 5].map(lets(weekIndex, index, [" Mo ", " Tu ", " We ", " Th ", " Fr ", " Sa ", " Su "].map(lets(dayNumber, weekIndex * 7 + index + 2 - day(monthStart), dayLabel, if(dayNumber < 10, "0" + format(dayNumber), format(dayNumber)), moodForDay, monthEntries.filter(date(current.prop("Date")) == dayNumber).map(current.prop("Mood")).first(), ifs(dayNumber < 1 or dayNumber > daysInMonth, style(" ", "c"), moodForDay == "🤩 Excited", style("▲ " + dayLabel, "c", "b", "green", "green_background"), moodForDay == "😀 Happy", style("▲ " + dayLabel, "c", "b", "yellow", "yellow_background"), moodForDay == "😒 Bored", style("▼ " + dayLabel, "c", "b", "orange", "orange_background"), moodForDay == "😪 Tired", style("▼ " + dayLabel, "c", "b", "blue", "blue_background"), moodForDay == "😬 Anxious", style("▼ " + dayLabel, "c", "b", "pink", "pink_background"), moodForDay == "😡 Angry", style("▼ " + dayLabel, "c", "b", "red", "red_background"), moodForDay == "😢 Sad", style("▼ " + dayLabel, "c", "b", "purple", "purple_background"), style(" " + dayLabel, "c", "gray", "gray_background")))).join(" "))).join("\n"), style("🗓️ " + formatDate(monthStart, "MMMM YYYY"), "b") + "\n\n" + [" Mo ", " Tu ", " We ", " Th ", " Fr ", " Sa ", " Su "].map(style(current, "c", "b", "gray", "gray_background")).join(" ") + "\n" + weeks))
⚠️ For the formula to work correctly, all your properties and Select options (inside Mood and Type) must use exactly the same names as the ones in this tutorial.
If you used different names, update the corresponding references in the formula to match your own setup.
Your automatic monthly recap is now ready.
Now, let’s create a dedicated view where you can easily browse all your monthly summaries.
Click the + icon next to your last database view to add a new one, then select Gallery as the layout. Configure the gallery as follows:
👉 Turn off Show page icon
👉 Turn on Wrap all content
👉 Set Card preview to None
👉 Rename the view Monthly Recaps
Click Done.

Stay in the view settings and open Property visibility.
Hide every property except the Formula property. This keeps each gallery card clean and ensures that the monthly mood calendar remains the focus.

Return to the main settings menu, open Sub-items, and set the display option to Disabled.
The database still uses the parent-and-sub-item structure in the background, but it won’t be displayed in this gallery view.
Ps: you can do the same for your Untracked view.

Go back to the main settings menu once more and open Filter. Choose the Name property and configure the filter as follows: Name contains Recap.
This ensures that the gallery displays only your monthly recap pages.

Finally, click the Sort icon at the top of the view and sort the cards by Date.
Your monthly recaps will now appear in chronological order.

That’s it! 🥳 Your mood tracker is now complete.
You can log your mood every day in one click, review your entries in a calendar, and get an automatic visual recap at the beginning of every month. The system works quietly in the background while keeping your daily workflow simple.

notion by moona
High-quality Notion workspaces for entrepreneurs with high standards.