You want to track goal progress in Notion using a formula that automatically calculates completion based on milestones. Notion formulas can sum checkbox values, count completed dates, or evaluate status properties to produce a percentage. This article explains how to build a Notion formula that converts milestone completion into a visual progress bar or percentage. You will learn the exact property setup, the formula syntax, and how to handle partial progress.
Key Takeaways: Building a Goal Progress Formula in Notion
- Checkbox property for each milestone: The simplest input type for a formula that counts completed milestones.
- Formula with prop() and format(): Use
prop("Milestone 1")to read each checkbox andformat()to display the percentage. - Rollup from a linked database: When milestones live in a separate table, use a Rollup property to aggregate progress.
Understanding the Goal Progress Formula Structure
A goal progress formula in Notion calculates what fraction of milestones are completed and displays that ratio as a percentage. The formula reads boolean values from checkbox properties, date properties, or select properties. The most reliable approach uses checkboxes because they return true or false, which the formula can sum and divide by the total number of milestones. If you store milestones in a separate database, you must use a Rollup property to bring the completion data into the goal database. The prerequisite is that every milestone must have a property that indicates completion, such as a checkbox labeled “Done” or a date property named “Completed On.”
Steps to Build a Milestone Progress Formula in Notion
Method 1: Milestones as Checkbox Properties in the Same Database
This method works when you have a fixed number of milestones and you store them as separate properties inside the same goal row. For example, a goal row might have checkboxes named “Milestone 1,” “Milestone 2,” and “Milestone 3.”
- Create checkbox properties for each milestone
Open your goal database. Add a new property, select the Checkbox type, and name it after the first milestone, for example “Milestone 1.” Repeat for each milestone. Each checkbox is either checked (true) or unchecked (false). - Add a Formula property to calculate progress
Add a new property, select Formula, and name it “Progress.” This property will display the percentage. - Enter the formula
Click inside the formula editor and paste the following:format(round((prop("Milestone 1").toNumber() + prop("Milestone 2").toNumber() + prop("Milestone 3").toNumber()) / 3 100) / 100 100) + "%"This formula converts each checkbox from true/false to 1 or 0 using
toNumber(), sums them, divides by the total number of milestones (3), multiplies by 100, rounds to two decimal places, and appends a percent sign. - Adjust the formula for your number of milestones
If you have 5 milestones, change the denominator from 3 to 5 and add each checkbox property inside the sum. Example for 5 milestones:format(round((prop("Milestone 1").toNumber() + prop("Milestone 2").toNumber() + prop("Milestone 3").toNumber() + prop("Milestone 4").toNumber() + prop("Milestone 5").toNumber()) / 5 100) / 100 100) + "%" - Test the formula
Check one or more milestones in a goal row. The Progress property should update immediately to show the correct percentage, such as 33.33% for one of three milestones checked.
Method 2: Milestones in a Separate Linked Database
When milestones are individual rows in a separate database, you need a Relation property to link milestones to a goal and a Rollup property to calculate the completion rate.
- Create a Milestones database
Create a new database called “Milestones.” Add a property named “Done” of type Checkbox. Optionally add a property named “Goal” of type Relation that links back to your Goals database. - Link milestones to a goal
In your Goals database, add a Relation property named “Milestones” that links to the Milestones database. In each goal row, click the Relation cell and select the milestones that belong to that goal. - Add a Rollup property
In the Goals database, add a new property, select Rollup, and name it “Milestones Done.” Configure it to roll up the “Done” checkbox from the linked Milestones. Set the calculation to “Count per group.” This gives you the total number of linked milestones. - Add a second Rollup for completed count
Add another Rollup property named “Completed Milestones.” Configure it to roll up the “Done” checkbox. Set the calculation to “Count values.” This counts only the checked milestones. - Create the progress formula
Add a Formula property named “Progress.” Enter this formula:if(prop("Milestones Done") > 0, format(round(prop("Completed Milestones") / prop("Milestones Done") 100) / 100 100) + "%", "0%")This formula divides completed milestones by total milestones, multiplies by 100, and formats as a percentage. The
if()statement prevents division by zero when no milestones are linked. - Test the setup
Create a goal, link two milestones, and check one of them. The Progress property should show 50%.
Common Issues and Limitations
Formula Shows 0% Even When Milestones Are Checked
This usually happens when the formula references a property name that does not match exactly. Notion property names are case-sensitive. For example, if you named the checkbox “milestone 1” but the formula uses “Milestone 1,” the formula returns 0. Double-check every property name in the formula matches the property name in the database.
Rollup Shows Incorrect Count
If the Rollup property returns a number that does not match the actual linked milestones, the Relation may have duplicate or missing links. Open the goal row and inspect the Relation cell to verify which milestones are connected. Remove any duplicate links by clicking the X next to the milestone name.
Progress Bar Does Not Display as a Visual Bar
Notion formulas cannot render a visual progress bar directly. The formula output is text. To get a visual bar, use Notion’s built-in Progress property type instead of a formula. The Progress property automatically shows a bar based on the value of a number property. You can use a formula to calculate the percentage as a number (without the percent sign) and then reference that formula property in a Progress property. For example, create a formula named “Progress Number” that outputs a decimal between 0 and 1, then add a Progress property that reads “Progress Number.”
Formula Returns an Error When Milestones Are Empty
The formula in Method 2 includes an if() statement to handle zero milestones. If you omit that check, the formula divides by zero and shows an error. Always include the if() condition when using Rollup counts.
Notion Progress Formula Methods Compared
| Feature | Checkboxes in Same Database | Rollup from Linked Database |
|---|---|---|
| Setup complexity | Low — one database, direct formula | Medium — two databases, Relation, Rollup |
| Scalability | Fixed number of milestones; adding a milestone requires editing the formula | Unlimited milestones; adding a milestone does not require formula changes |
| Requires | Checkbox property per milestone | Relation property and two Rollup properties |
| Best for | Goals with 3–10 predefined milestones | Goals with many milestones or milestones that change over time |
You can now build a Notion formula that calculates goal progress based on milestone completion. Start with the checkbox method for simple goals with a fixed number of steps. Use the Rollup method when milestones live in a separate database and you need flexibility. For a visual progress bar, combine a formula that outputs a decimal with Notion’s Progress property type. Test your formula with sample data before using it in a live dashboard.