How to Make a Habit Tracker in Notion With Streaks

Short answer

Make a Days database with a checkbox for each habit and a template that adds a page every day. Link every day to one My streaks page, and give it a formula that counts back from yesterday until it finds a day you missed, then adds today once it’s ticked.

Rather skip the setup? Our Habit Tracker 2027 is ready to use, $9 once.
A Today card in a Notion habit tracker with eight habits, a 75% score ring and a 13 day streak, next to a month card with one colored square per day

Try the streak

Tick and untick the squares. The count works like the formula in step 4: it starts at yesterday and counts back until it finds a day you missed. Today only adds one once it’s ticked, so a day that isn’t over yet never breaks your streak.

Workout

The last two weeks. The outlined square is today.

Current streak

6 days

Today is still open, so your streak stays at 6. Tick it to make it 7.

1. Make a Days database

One page per day, with a checkbox for each habit. Ticking boxes is all you’ll do each day.

  1. Make a new page called Habit tracker. On it, type /table and pick the table option to add a database. Call it Days.
  2. Add the properties below. Our example tracks three habits: Workout, Read and Water.
PropertyTypeWhat it’s for
DateDateThe day the page is for
Workout, Read, WaterCheckbox, one per habitTick it when you’ve done it
ScoreFormulaHow much of the day you did

For Score, add up the habits and divide by how many there are:

Score
(
  toNumber(prop("Workout")) +
  toNumber(prop("Read")) +
  toNumber(prop("Water"))
) / 3

In the formula’s settings, set Number format to Percent and Show as to Ring. Two habits out of three shows as 67%.

Two day cards in a Notion habit tracker, Monday and Tuesday, each with eight habit checkboxes and a score ring of 88% and 75%
Two days in our Habit Tracker: a box for each habit and the day’s score as a ring.

2. Get a new page every day

Instead of adding a page each morning, let a template do it.

  1. Click the arrow next to the blue New button and choose New template.
  2. In the template, click Date and pick Today under Shortcuts. Next to it Notion says Date when duplicated, so every copy gets its own day.
  3. Click Duplicate every at the top of the template and choose Day. A fresh page now shows up each day, with every box empty.

To open today in one click, add a view just for it. Click + next to the view name, add a Gallery view and give it the filter Date is Today. In the view’s settings, set Card preview to None and turn on your habits and Score under Properties, so you can tick them right on the card.

3. Link every day to one page

A formula only sees the page it’s on. To count across days, it needs one page that’s linked to all of them.

  1. Add a second database called Streaks, with a single page in it: My streaks.
  2. In Days, add a Relation property called Streaks. Pick the Streaks database, turn on Show on Streaks and name the property it adds there Days.
  3. Open the Days template again and set Streaks to My streaks. Every new day now links itself.

Days you made before the template need the link too. Select them in the table and set Streaks for all of them at once.

4. The streak formula

Open My streaks and add a Formula property called Workout streak:

Workout streak
let(
  days, prop("Days"),
  past, days.filter(current.prop("Date") < today()),
  newest, past.sort(current.prop("Date")).reverse(),
  missed, newest.findIndex(
    not current.prop("Workout") or
    dateBetween(today(), current.prop("Date"), "days") != index + 1
  ),
  run, if(missed == -1, newest.length(), missed),
  doneToday, days.filter(current.prop("Date") == today()).some(current.prop("Workout")),
  run + if(doneToday, 1, 0)
)

What each part does:

Here’s what it showed in our test on October 31, with the page for October 23 left out on purpose:

HabitTickedStreak
WorkoutOctober 25 to 30, not yet today6
ReadEvery day since October 18, today too8
WaterToday and tomorrow, not yesterday1

Read stops at 8 because of the missing page. Without the date check, it showed 13, counting straight over October 23. And the tick on tomorrow’s page didn’t count for Water, because that day hasn’t happened yet.

For another habit, copy the property and change both "Workout" to that habit’s name.

Want one streak for the whole day instead? Count a day when its Score is 80% or more: change not current.prop("Workout") to current.prop("Score") < 0.8, and .some(current.prop("Workout")) to .some(current.prop("Score") >= 0.8). That’s the rule our Habit Tracker uses.

5. Count this month’s days

A streak rewards days in a row. A count for the month is kinder after a slip. Add one more formula to My streaks:

Workout this month
prop("Days").filter(
  formatDate(current.prop("Date"), "YYYY-MM") == formatDate(today(), "YYYY-MM") and
  current.prop("Workout")
).length()

In our test, the same formula for Water gave 5 for October. The tick on November 1 waited for its own month.

A month card in a Notion habit tracker with an 81% ring, 3 full days and one blue, yellow or gray square for each day
Our template goes a step further: one square for every day of the month, colored by that day’s score.

6. Show the streak on today’s card

Last, bring the number to where you tick. In Days, add a formula called Streak:

Streak
let(
  s, toNumber(prop("Streaks").first().prop("Workout streak")),
  "Workout streak: " + format(s) + if(s == 1, " day", " days")
)

Turn on Streak in the Today view’s Properties, and your streak sits right under your habits.

A Notion habit tracker card for Tuesday, October 20 with eight habits, a 75% ring and the line Streak: 13 days
The streak line on the Today card of our Habit Tracker 2027.

Questions

How do you count a streak in Notion?

Link all your day pages to one page with a relation, then give that page a formula. It sorts the days before today newest first, finds the first one you missed and counts the days before it. If today is ticked, it adds one.

Does my streak reset if I haven’t ticked today yet?

No. The formula counts up to yesterday and only adds today once it’s ticked, so an open day never breaks it. The streak ends only when a whole day goes by without a tick.

Can a Notion formula count a streak without a relation?

No. A formula only sees the page it’s on. To look at other days, it needs a relation that links them, which is why every day links to one My streaks page.

Can I make this habit tracker on the free plan?

Yes. Databases, relations, formulas and templates that repeat every day all work on Notion’s free plan.

Why does my streak show 0?

Usually a day isn’t linked to My streaks, or it has no Date. Check that the Days template sets Streaks to My streaks and Date to Today, and link the days you made before that by hand.