Get AI summaries of any video or article — Sign up free
How To Build A Progress Bar In Notion: Project Manager (Part 2) thumbnail

How To Build A Progress Bar In Notion: Project Manager (Part 2)

Red Gregory·
4 min read

Based on Red Gregory's video on YouTube. If you like this content, support the original creators by watching, liking and subscribing to their content.

TL;DR

Connect Projects to Tasks using a Relation property so each project can reference its subordinate tasks.

Briefing

A Notion project progress bar can be built by linking each project to its tasks, rolling up a “done” checkbox into a percent, and then turning that percent into a string of filled and empty squares using formula functions. The payoff is practical: checking off tasks automatically updates each project’s progress from 0% to 100% without manual editing.

The setup starts in the Projects database. A relation property named (or effectively used as) “tasks” connects each project to rows in a separate Tasks database via Notion’s Relation property. Inside Tasks, each task includes a “done” checkbox and a link back to its project through the relation. With that relationship in place, progress becomes a data problem: how many related tasks are checked?

To convert checkbox completion into a percentage, a new rollup property (named “percent done”) is added to Projects. The rollup uses the relation to Tasks, then targets the “done” checkbox field, calculating “percent checked.” That rollup value becomes the numeric input for the progress bar.

The visual bar itself is a formula property that outputs text. Using the slice function, the formula builds a fixed-length string of 10 characters: filled-square symbols for completed portions and empty-square symbols for the remainder. The filled portion count is derived by multiplying the percent done (0–1 range) by 10, then flooring the result so the bar advances in whole-square steps. The empty portion is generated with a second slice that takes the complement of the filled count.

A key edge case is handled with an if statement: percentages below 10% would otherwise produce zero filled squares, leaving the bar visually empty when it shouldn’t be. The formula forces at least one filled block when percent done is under the threshold, then falls back to the slice-based logic for the rest.

Finally, the progress bar formula appends the numeric percentage to the end of the squares. Because the slice outputs text, the percent value is converted to text using format, then multiplied by 100, floored, and concatenated with a “%” sign.

To make the system usable day-to-day, the workflow recommends a simple dashboard-like page. It embeds linked database views: a checklist-style linked view of Tasks where users tick off “done,” and a gallery-style linked view of Projects where each project’s progress bar updates live. Linked views don’t alter the original databases; they only reflect changes back to the source. The result is a clean project manager interface where task completion automatically drives project-level progress visualization.

Cornell Notes

The progress bar is built by connecting Projects to Tasks with a Relation property, then using a rollup to compute “percent done” from each task’s “done” checkbox. A formula property turns that percent into a fixed 10-character string: filled squares for completed work and empty squares for the remainder, using the slice function. Flooring ensures the bar moves in whole-square increments. An if statement prevents the bar from showing zero filled blocks for small completion levels (below the threshold). The percentage is appended to the bar by converting the numeric rollup into text with format and concatenating it with a “%” sign. Linked database views provide a dashboard where ticking tasks updates project progress automatically.

How does the Projects database learn which tasks belong to each project?

Projects uses a Relation property that points to the Tasks database. In each relation cell, a project is linked to its subordinate tasks. Inside Tasks, there’s also a relation back to the project, so each task “knows” which project it contributes to.

What property turns task checkboxes into a usable percent for the progress bar?

A rollup property on Projects calculates “percent checked” from the related Tasks’ “done” checkbox. The rollup is configured by selecting the relation to Tasks, choosing the “done” checkbox property, and using the calculate option “percent checked,” producing a numeric percent value.

How does the formula create a progress bar made of filled and empty squares?

The formula uses the slice function to output a string of exactly 10 characters. One slice produces the filled-square portion based on floor(10 * percent done). A second slice produces the empty-square portion by slicing the complementary end of the 10-character template. The two string slices are concatenated with “+” to form the full bar.

Why is an if statement needed in the progress bar formula?

Without it, completion below a threshold (described as under 10%) can yield zero filled squares, making early progress look like nothing happened. The if statement checks whether percent done is less than 0.1 (10%) and, if so, forces at least one filled block; otherwise it uses the normal slice logic.

How is the numeric percentage appended to the bar without type errors?

Because slice outputs text, the percent value must be converted to text before concatenation. The formula wraps the rollup in format (format with lowercase f) and then computes floor(100 * percent done) before adding the “%” sign. This avoids a type mismatch between text and number.

How do linked database views make the progress bar practical to use?

A separate dashboard page embeds linked views: a checklist-style linked view of Tasks (so users tick “done”), and a gallery linked view of Projects (so each project’s progress bar updates). Linked views reflect changes back to the original databases; they don’t modify the source unless new items are created through the linked view.

Review Questions

  1. What rollup calculation is used to derive “percent done” from related tasks, and which task property does it target?
  2. How do slice, floor, and concatenation work together to ensure the progress bar always has exactly 10 characters?
  3. What problem does the if statement solve for progress values below the 10% threshold?

Key Points

  1. 1

    Connect Projects to Tasks using a Relation property so each project can reference its subordinate tasks.

  2. 2

    Add a rollup on Projects that calculates “percent checked” from the Tasks “done” checkbox to produce percent done.

  3. 3

    Build the progress bar as a formula that outputs text using slice to generate a fixed-length (10-character) filled/empty square string.

  4. 4

    Use floor(10 * percent done) so the bar advances in whole-square steps rather than fractional characters.

  5. 5

    Add an if condition so early progress (below 10%) still shows at least one filled square instead of appearing empty.

  6. 6

    Append the percentage to the bar by converting the numeric rollup to text with format and concatenating a “%” sign.

  7. 7

    Create a dashboard page with linked database views so checking tasks in the Tasks view automatically updates project progress in the Projects view.

Highlights

The progress bar is a text formula built from two slice outputs—one for filled squares and one for empty squares—concatenated into a 10-character bar.
A rollup property on Projects calculates “percent checked” from the related Tasks “done” checkbox, turning task completion into a numeric progress input.
An if statement prevents the bar from showing zero filled blocks for completion under 10%, ensuring early progress is visible.
Linked database views let users tick off tasks in a checklist view while project progress bars update instantly in a gallery view.

Topics