To build a Notion habit tracker with a progress bar, add a formula property to your daily habit database that counts the habits you ticked that day. Then set the formula to show as a bar, with the divide-by value set to your number of habits. Every day in the database now carries its own bar that fills as you tick boxes. This guide covers that setup and a weekly bar. After that come the limits plus a live version built with Notion Habit Heroes.

What you need before you start

This guide assumes the common daily layout: one database, one page per day, a Date property, one checkbox property per habit. If you do not have that yet, our Notion habit tracker guide walks through the setup. You can also duplicate our free Notion habit tracker template, which already has this shape. The examples below use three habits called Exercise, Read and Meditate. Swap in your own property names exactly as they are spelled in your database, capital letters included.

Step 1: Add a formula that counts today's habits

Open the database, add a new property, choose Formula and name it Done. Paste this into the formula editor:

toNumber(prop("Exercise")) + toNumber(prop("Read")) + toNumber(prop("Meditate"))

Inside a Notion formula a checkbox is a true or false value. toNumber() turns a ticked box into 1 and an empty one into 0, so the sum is the number of habits you finished on that day. One catch: every time you add a habit to the tracker, you also have to add it to this formula. That is easy to forget, so a note in the property's description helps you remember.

Step 2: Show the formula as a bar

Click the Done column header and open the property settings. Number properties and formulas that return a number have a "Show as" option with three choices: Number, Bar and Ring. Pick Bar. Two settings decide how it looks:

  • Divide by: the value that counts as a full bar. Set it to the number of habits in your formula, 3 in this example, so a day with all three ticked fills the bar completely. If this value is larger than your habit count, even a perfect day looks half empty.
  • Color: pick any color. It applies to the bar on every row.

You can also choose whether the number is shown next to the bar. Leaving it on helps: "2" next to a bar that is two thirds full reads faster than the bar alone.

If you would rather see a percentage, let the formula return a value from 0 to 100 and set Divide by to 100:

round((toNumber(prop("Exercise")) + toNumber(prop("Read")) + toNumber(prop("Meditate"))) / 3 * 100)

Step 3: Add a weekly progress bar

A bar per day tells you how today went. To see how the whole week is going, you need numbers from seven rows in one place. A Notion formula can only see the row it lives in, so the usual workaround is a second database:

  1. Create a database called Weeks with one page per week, for example "Week 43".
  2. In your daily database, add a Relation property that points to Weeks. Link each day's page to its week. This link has to be set on every day page, usually by hand.
  3. In Weeks, add a Rollup property. Choose the relation to your days, the Done property, then calculate Sum. Name it Done this week.
  4. Still in Weeks, add a formula such as round(prop("Done this week") / 21 * 100) (3 habits times 7 days) and show it as a bar with Divide by set to 100.

For a quick monthly view, filter a table view to the current month and set the footer calculation under each checkbox column to Percent checked. You get one percentage per habit, as text rather than a bar.

Where the formula approach stops

This setup works, with limits:

  • A bar per row is a bar per day. A month of tracking gives you thirty separate bars. There is no running trend unless you build one.
  • The weekly bar depends on links. If a day page is not linked to its week, that week quietly reads low. Nothing warns you.
  • Every new habit means edits. The daily formula, its divide-by value plus the 21 in the weekly formula all have to change together.
  • Not every habit is daily. A habit you plan three times a week drags the daily bar down on its rest days, which makes a good week look like a bad one.
  • Streaks are a different problem. A formula cannot look at yesterday's row. Streak setups in Notion rely on chains of relations or rollups that tend to break the first time a day is skipped or edited out of order. We cover this in more detail in our list of Notion habit tracker mistakes.

Step 4: Get live progress bars with Notion Habit Heroes

This gap is why I built Notion Habit Heroes. You connect your habit database once. From then on the app creates each day's journal page in your Notion database for you. It reads your checkboxes every time you open the widget, with a nightly pass as a safety net. The widget is a small page you embed in Notion with an embed block, so the numbers sit right next to your tracker. What it shows, with no formulas to maintain:

  • A bar for today: it fills with the share of today's habits you have ticked, labelled with the percentage, for example "22.0% Today". It turns from red to orange to green as the day fills up.
  • A bar per habit streak: each habit card shows your current streak with a bar that fills toward your longest streak so far. A full bar means you are at your personal best.
  • Completion rate: tap a habit card and it flips over to show that habit's completion rate as a percentage with a small ring, plus your total completions.
  • Weekly goals: for a habit you schedule a number of times per week, the card shows a line like "This week: 2/3" with a check mark once you reach the goal. The streak for such a habit counts in weeks, so rest days do not break it.
  • Insights: the Insights tab charts your completion rate per week, month or year, overall or for a single habit. While your first week is still running, it shows a bar for the week so far.
  • Competitions and duels: on a competition leaderboard each member's average completion percentage has a ring next to it. A duel puts your completion bar beside your opponent's.
Notion Habit Heroes widget with a streak card per habit, each with a bar toward the longest streak, one card flipped to show its completion rate, plus a 22.0% Today bar below

All of it is free. There is no paid tier and no trial. You can keep your Done bar in Notion as well; the widget adds the streaks plus the longer view.

💡

Want the bars without maintaining formulas? Start from our free Notion habit tracker template, then create a free account to connect it. Still choosing a layout? Our roundup of the best Notion habit tracker templates compares twelve free options side by side.

Frequently asked questions

Can Notion show a progress bar for habits?

Yes. A number property or a formula that returns a number can be shown as a bar or a ring instead of a plain number. For a daily habit database, a formula that adds up the ticked checkboxes, shown as a bar with Divide by set to your number of habits, gives every day its own progress bar.

How do I make a weekly habit progress bar in Notion?

A formula only sees its own row, so you need a second database with one page per week. Link each day page to its week with a relation. Then sum the daily count with a rollup on the week page. A formula that divides that sum by the maximum possible for the week can then be shown as a bar.

Can a Notion progress bar track habit streaks?

Not on its own. A formula cannot look at yesterday's row, so streaks in plain Notion need fragile chains of relations or rollups. Notion Habit Heroes reads your checkboxes through the Notion API, counts streaks from the actual history, then shows each streak as a bar toward your longest one.