Sub-Tasks in Notion: The Ultimate Guide
Based on Thomas Frank Explains's video on YouTube. If you like this content, support the original creators by watching, liking and subscribing to their content.
Create a self-referential relation in the task database and split it into “parent task” and “subtasks” roles so each row can point to its parent within the same database.
Briefing
Notion task lists can support true subtasks—complete with nested display, default subtask creation, and reliable sorting—by combining a self-referential relation, a template-driven linked database, and a set of formula/rollup properties that enforce parent-child ordering. The payoff is practical: subtasks can be checked off, assigned due dates, and shown directly under their parent task even when those subtasks are due earlier than the parent.
The setup starts with a self-relation inside a task database. A new relation property (e.g., “subtasks”) is created that links the database to itself, then split into two roles: “parent task” for the parent reference and “subtasks” for the child reference. Once that relationship exists, creating a task and then setting its “parent task” field automatically makes it behave like a subtask. A small formula tweak to the task’s “state” display adds a right-arrow indicator when “parent task” is not empty, visually distinguishing subtasks from top-level tasks.
Next comes the template that lets users add subtasks from within a specific task page. A template (e.g., “task with subtasks”) inserts a linked database filtered to show only rows where “parent task contains” the template instance’s name. This relies on self-referential filters: when the template is instantiated, the filter updates to the new task’s name, so the linked list automatically becomes the correct subtask list. With that in place, subtasks appear under the parent task and inherit the parent context without manual re-linking.
Default subtasks are trickier. Notion templates can’t spawn brand-new database rows that are independent of the template page, so adding “default subtasks” directly inside the template results in the same rows being reused and marked done in both places. The workaround is to store default subtasks as a synced checklist (outside the template), then copy them into the database when creating a new instance—using an option/alt-drag copy so the subtasks become unique rows with their own parent relations.
The hardest part is sorting. Simple sorting by due date fails because subtasks can share the same due date as other tasks, and subtasks often have due dates earlier than their parent. The solution uses multiple computed fields: a checkbox-like “subseat” flag to identify non-subtasks, a “subseat name” formula that resolves to the parent’s name (or the task’s own name if it’s top-level), a due-date-to-timestamp conversion, and rollups that fetch the parent’s due timestamp for subtasks. Sorting criteria are then layered: first by the parent-based timestamp, then by the parent-resolved name, then by whether a row is a subtask, and finally by the task’s own due date—producing a stable nested order.
To show subtasks inside projects, an additional rollup (“parent project”) pulls the project from the parent task through the parent-task relation. Filters in the project view then use this rollup so subtasks appear under the correct parent task even though they don’t have a direct project relation. The approach is limited to one level of nesting: rollups make deeper sub-subtasks brittle and prone to breakage, so the recommended design is a single subtask layer.
Cornell Notes
Subtasks in Notion can be implemented by adding a self-referential relation in a task database and using a template that inserts a linked database filtered to the current task instance. A formula-based arrow indicator can mark rows as subtasks when the “parent task” field is filled. Default subtasks require a workaround because templates can’t reliably create independent new database rows; a synced checklist can be copied into the database so each subtask becomes a unique row. Reliable nesting order needs formula + rollup properties that compare parent and child due dates using timestamps, then apply multi-criteria sorting. To display subtasks inside projects, a rollup can inherit the parent’s project so project views include subtasks even without a direct project relation.
How does a Notion task database represent parent/child subtasks without creating a separate database?
What makes a “task with subtasks” template automatically show the right subtasks for each parent task?
Why can’t default subtasks be added directly inside a template the way users expect?
Why does sorting by due date alone fail for subtasks?
What formula/rollup strategy enforces correct nesting order beneath the parent task?
How can subtasks appear inside a project view when subtasks don’t have a direct project relation?
Review Questions
- What specific relation setup is required to make a task row behave as a subtask of another row in the same database?
- Which computed fields (formula vs rollup) are necessary to sort subtasks beneath their parent task even when due dates don’t match?
- What limitation of Notion templates forces the synced-checklist workaround for default subtasks?
Key Points
- 1
Create a self-referential relation in the task database and split it into “parent task” and “subtasks” roles so each row can point to its parent within the same database.
- 2
Use a template that inserts a linked database filtered by “parent task contains” the template instance name to automatically display the correct subtasks per parent task.
- 3
Add a small state/display formula that appends an arrow (or similar marker) when “parent task” is not empty to visually distinguish subtasks.
- 4
Handle default subtasks with a synced checklist + copy workaround, because template-created rows can’t reliably generate independent new database entries.
- 5
Enforce nested sorting with multi-step formula/rollup logic: convert due dates to timestamps, fetch parent due timestamps via rollups, and sort using parent-resolved keys rather than raw due dates alone.
- 6
To show subtasks inside project views, add a “parent project” rollup that inherits the parent task’s project so subtasks appear without a direct project relation.
- 7
Limit nesting depth to one subtask level, since rollup-based inheritance becomes fragile for deeper sub-subtask structures.