1. Recurring Tasks

Setup
Create a Tasks database with properties:
Due Date (Date)
Status (Select)
Repeat Frequency (Select: Days, Weeks, Months)
Repeat Every (Number)

Automation
Trigger: When Task is set to Done and Repeat Frequency is not empty.

Action: Add page to Tasks.
Name = Trigger page.Name
Repeat Frequency = Trigger page.Repeat Frequency
Repeat Every = Trigger page.Repeat Every

Due Date formula:

context("Trigger page").prop("Due").dateAdd(context("Trigger page").prop("Repeat Every "),"days")context("Trigger page").prop("Due").dateAdd(context("Trigger page").prop("Repeat Every "),"days")context("Trigger page").prop("Due").dateAdd(context("Trigger page").prop("Repeat Every "),"days")context("Trigger page").prop("Due").dateAdd(context("Trigger page").prop("Repeat Every "),"days")2. Auto-Create Subtasks When Project Starts

Setup
Create two databases: Projects and Tasks.
Relate them.

Automation
Trigger: When Project Status = In Progress.

Action: Add multiple pages to Tasks.
Task Due = Trigger page.Start Date
Project relation = Trigger page.Project

Example subtasks for a Website Project:
Create visual style guide
Design wireframe layouts
Choose color palette
3. Sync Task Status With Project

Setup
Databases: Projects and Tasks.
Relation between them.
Automation
Trigger: When Task Status = In Progress.
Variable: Trigger page.Project.
Action: Edit variable → Project Status = In Progress.

4. Track Task Duration

Setup Add these properties in Tasks:
Due Date
Status
Completion Date
Task Duration (Formula)

Formula (Task Duration):
if(
dateBetween(prop("Completion Date"), prop("Due"), "days") > 0,
style(
if(
empty(prop("Completion Date")) or empty(prop("Due")),
"",
format(dateBetween(prop("Completion Date"), prop("Due"), "days")) +
if(dateBetween(prop("Completion Date"), prop("Due"), "days") == 1, " Day ", " Days ")
),
"white","gray_background"
),
""
) + style(
(((((if(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600) < 10, "0", "") +
format(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600))) + "h: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60) < 10, "0", "")) +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60))) + "m: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60) < 10, "0", "") +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60)),
"white","gray_background"
)if(
dateBetween(prop("Completion Date"), prop("Due"), "days") > 0,
style(
if(
empty(prop("Completion Date")) or empty(prop("Due")),
"",
format(dateBetween(prop("Completion Date"), prop("Due"), "days")) +
if(dateBetween(prop("Completion Date"), prop("Due"), "days") == 1, " Day ", " Days ")
),
"white","gray_background"
),
""
) + style(
(((((if(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600) < 10, "0", "") +
format(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600))) + "h: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60) < 10, "0", "")) +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60))) + "m: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60) < 10, "0", "") +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60)),
"white","gray_background"
)if(
dateBetween(prop("Completion Date"), prop("Due"), "days") > 0,
style(
if(
empty(prop("Completion Date")) or empty(prop("Due")),
"",
format(dateBetween(prop("Completion Date"), prop("Due"), "days")) +
if(dateBetween(prop("Completion Date"), prop("Due"), "days") == 1, " Day ", " Days ")
),
"white","gray_background"
),
""
) + style(
(((((if(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600) < 10, "0", "") +
format(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600))) + "h: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60) < 10, "0", "")) +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60))) + "m: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60) < 10, "0", "") +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60)),
"white","gray_background"
)if(
dateBetween(prop("Completion Date"), prop("Due"), "days") > 0,
style(
if(
empty(prop("Completion Date")) or empty(prop("Due")),
"",
format(dateBetween(prop("Completion Date"), prop("Due"), "days")) +
if(dateBetween(prop("Completion Date"), prop("Due"), "days") == 1, " Day ", " Days ")
),
"white","gray_background"
),
""
) + style(
(((((if(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600) < 10, "0", "") +
format(floor(dateBetween(prop("Completion Date"), prop("Due"), "seconds") / 3600))) + "h: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60) < 10, "0", "")) +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) / 60))) + "m: ") +
if(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60) < 10, "0", "") +
format(floor((dateBetween(prop("Completion Date"), prop("Due"), "seconds") % 3600) % 60)),
"white","gray_background"
)Automation
Trigger: When Task Status = Done.

Action: Set Completion Date = Triggered time.
5. Invoice → Income

Setup Databases: Accounts, Invoices, Income.
Automation
Trigger: When Invoice Status = Paid.
Action: Add page to Income.
Amount = Trigger page.Cost
Relate new Income to Invoice

6. Auto-Complete Subtasks When Parent is Done

Setup
Create a Tasks database with properties:
Name (Title)
Status (Select: Not Started, In Progress, Done)
Parent Item (Relation to same database)
Sub Items (Rollup from Parent Item relation)
Automation
Trigger: When Status = Done
Variable: Define subtasks using formula:
context("Trigger page").prop("Sub Items")context("Trigger page").prop("Sub Items")context("Trigger page").prop("Sub Items")context("Trigger page").prop("Sub Items")Action: Edit the variable (Sub Items)
This automation automatically marks all subtasks as complete when their parent task is marked as done, eliminating the need to manually update each subtask.
7. Auto-Complete Parent When All Subtasks Are Done

What it does: Automatically marks a parent task as "Done" only when ALL of its subtasks are completed, ensuring you never accidentally mark a project complete while subtasks remain unfinished.
Automatically marks a parent task as "Done" only when ALL of its subtasks are completed.
This ensures you never accidentally mark a project as finished while important subtasks still remain unfinished.
Setup
Same database structure as above
Add formula property "All Subtasks Complete" (Checkbox):

Formula (All Subtasks Complete):
ifs(!empty(prop("Sub-item")),map(prop("Sub-item"),current.prop("status")).length() ==
map(prop("Sub-item").filter(current.prop("status")== "Done"),current.prop("status")).length())ifs(!empty(prop("Sub-item")),map(prop("Sub-item"),current.prop("status")).length() ==
map(prop("Sub-item").filter(current.prop("status")== "Done"),current.prop("status")).length())ifs(!empty(prop("Sub-item")),map(prop("Sub-item"),current.prop("status")).length() ==
map(prop("Sub-item").filter(current.prop("status")== "Done"),current.prop("status")).length())ifs(!empty(prop("Sub-item")),map(prop("Sub-item"),current.prop("status")).length() ==
map(prop("Sub-item").filter(current.prop("status")== "Done"),current.prop("status")).length())
Automation 1 - Update the completion checker:
Trigger: When Status = Done (for subtasks)
Variable: Define parent using formula:
context("Trigger page").prop("Parent Item").first()context("Trigger page").prop("Parent Item").first()context("Trigger page").prop("Parent Item").first()context("Trigger page").prop("Parent Item").first()Variable 1: Define Completed Sub Tasks
map(context("Trigger page").prop("Parent item"),current.prop("Completed Sub Tasks")).first()map(context("Trigger page").prop("Parent item"),current.prop("Completed Sub Tasks")).first()map(context("Trigger page").prop("Parent item"),current.prop("Completed Sub Tasks")).first()map(context("Trigger page").prop("Parent item"),current.prop("Completed Sub Tasks")).first()Action: This triggers the formula recalculation
Automation 2 - Complete the parent:
Trigger: When "All Subtasks Complete" = Checked
Variable: Reference current page
Action: Edit variable
Set Status = Done (with conditional formula):
ifs(var("Variable 1")== true, "Done")ifs(var("Variable 1")== true, "Done")ifs(var("Variable 1")== true, "Done")ifs(var("Variable 1")== true, "Done")This sophisticated automation uses nested formulas to verify that all subtasks are complete before automatically marking the parent task as done.
It prevents premature completion and ensures task hierarchy integrity.
🎁 Get All Automations for Free
I've created pre-built databases with all these automations already set up and ready to use.
You can duplicate them directly into your workspace – perfect if you're on Notion's free plan since these automations don't count against any limits.
Let me know what automation you're using in your system ;)
Osama aka Ols