At some point every Notion user hits a wall. Their databases are set up. Their views are filtered. Their relations are connected. And then they realise there is something they want the database to calculate automatically — a progress percentage, the number of days until a deadline, a label that changes based on status — and they do not know how to do it.
That is where formulas come in. And that is also where most people stop and look for a workaround, because formulas look like code and nobody told them they are not.
This guide starts at zero and ends with the real formulas used inside professional Notion templates. No programming background required. By the end you will be able to write formulas that calculate progress, flag overdue items, format text automatically, and surface urgency — all without touching anything that looks remotely like a spreadsheet nightmare.
You will need a Notion workspace to follow along. Create your free account here if you do not have one yet.
Why Formulas Feel Scary at First
Formulas have a reputation problem. The word alone triggers memories of Excel, of nested functions, of trying to understand why a cell reference was broken and spending forty minutes fixing it. That association makes people avoid Notion formulas before they have even seen what one looks like.
The reality is significantly less intimidating. Notion formulas are shorter than spreadsheet formulas, they reference properties by name rather than by cell coordinates, and most useful formulas are five to fifteen words long. The ones that look complex are usually just three simple formulas nested inside each other — and once you understand the simple ones, the nested ones become readable immediately.
What a Formula Actually Is in Notion
A Formula is a property type — like Text, Number, or Date — that you add to any database. Instead of entering a value manually, you write an expression and Notion calculates the value automatically for every item in the database based on that expression.
The expression can reference other properties on the same item, perform arithmetic, manipulate text, compare values, and make decisions based on conditions. Whatever it calculates is displayed in the formula column for every row, updated automatically whenever the properties it references change.
One important limit: a formula can only reference properties on the same database item. It cannot reach into another database without a Rollup property acting as the bridge first. This is the boundary most people hit when formulas start feeling complex — and knowing the boundary upfront prevents a lot of confusion.
The Properties Formulas Can See
Inside a formula, you reference any property on the same item using prop("Property Name"). The property name must match exactly — spelling, capitalisation, and spacing all matter. If your status property is called “Status” then prop("Status") works and prop("status") does not.
Notion also provides a set of built-in values you can use without referencing a property. now() returns the current date and time. today() returns today’s date with no time component. These are particularly useful for date calculations — comparing a due date to today to find overdue items, or calculating how many days remain until a deadline.
Your First Formula: A Simple Completion Flag
Start with the simplest useful formula. You have a task database with a Status property (a Select with options: Not Started, In Progress, Done). You want a checkbox property that is automatically checked when Status equals Done, so you can filter or sort by it easily.
Add a Formula property. In the formula editor, type:
prop("Status") == "Done"
That is the entire formula. It compares the Status property to the text “Done” and returns true when they match, false when they do not. In Notion, true displays as a checked checkbox and false as an unchecked one. Every time Status changes to Done, the checkbox checks itself. Every time it changes to something else, it unchecks. No manual input required.
This is the pattern of almost every formula: reference a property, compare or transform it, return a result.
Working With Text in Formulas
The most useful text formula in any workspace is concatenation — joining multiple text values into one. The function is concat().
If you have a First Name property and a Last Name property and you want a Full Name formula that combines them:
concat(prop("First Name"), " ", prop("Last Name"))
The space in quotation marks between them adds a space character between the two names. You can concatenate as many values as you need, mixing property references with fixed text strings in quotation marks.
Another useful text function is contains() — it checks whether a text value includes a specific substring and returns true or false. To flag any item whose title contains the word “urgent”:
contains(prop("Name"), "urgent")
Note that contains() is case-sensitive. “urgent” and “Urgent” are different strings. To make it case-insensitive, convert the property to lowercase first using lower():
contains(lower(prop("Name")), "urgent")
Working With Dates in Formulas
Date formulas are where Notion formulas become genuinely powerful for task management. The most useful one: how many days until a deadline.
dateBetween(prop("Due Date"), now(), "days")
dateBetween() takes three arguments: the first date, the second date, and the unit of time to count in. It returns the number of days between Due Date and right now. A positive number means the deadline is in the future. A negative number means it has passed. Zero means it is today.
To make this more readable — showing “3 days left” instead of just “3” — wrap it in a concat:
concat(format(dateBetween(prop("Due Date"), now(), "days")), " days left")
The format() function converts a number to text so it can be used inside concat(). Without it, Notion would throw an error because you cannot directly concatenate a number with a string.
Working With Numbers in Formulas
Number formulas are straightforward — standard arithmetic operators work exactly as expected. Addition is +, subtraction is -, multiplication is *, division is /.
A common use case is calculating a profit margin. If you have a Revenue property and a Cost property:
round((prop("Revenue") - prop("Cost")) / prop("Revenue") * 100)
round() removes the decimal places to keep the number clean. The result is an automatic profit margin percentage that updates whenever Revenue or Cost changes.
Another common one: a progress percentage using a Rollup. If you have a Rollup called “Completed Tasks” (count of related tasks with Status = Done) and another called “Total Tasks” (count of all related tasks), the progress formula is:
if(prop("Total Tasks") > 0, round(prop("Completed Tasks") / prop("Total Tasks") * 100), 0)
The if() at the start prevents a division-by-zero error when an item has no tasks yet. We will look at if() in detail next.
Conditional Logic: The If Statement
The if() function is the most important formula function in Notion. It takes three arguments: a condition, a value to return if the condition is true, and a value to return if the condition is false.
if(condition, value_if_true, value_if_false)
A practical example: a priority label that appears automatically based on how close a deadline is. If the due date is within two days, show “Urgent.” If it is within a week, show “Soon.” Otherwise show “On track.”
if(dateBetween(prop("Due Date"), now(), "days") <= 2, "Urgent", if(dateBetween(prop("Due Date"), now(), "days") <= 7, "Soon", "On track"))
This is a nested if — an if inside an if. The outer if checks whether the deadline is within two days. If not, it falls into the inner if, which checks whether it is within seven days. If not that either, it returns “On track.” Three possible outcomes, two nested conditions, one formula property that updates itself every day automatically.
Combining Conditions: And, Or, Not
When you need a condition that checks multiple things at once, use and(), or(), and not().
and() returns true only if all conditions inside it are true. To flag items that are both high priority and overdue:
and(prop("Priority") == "High", dateBetween(prop("Due Date"), now(), "days") < 0)
or() returns true if any condition inside it is true. To flag items that are either high priority or overdue (either one is enough to flag):
or(prop("Priority") == "High", dateBetween(prop("Due Date"), now(), "days") < 0)
not() inverts a condition. To flag items that are not done:
not(prop("Status") == "Done")
Real Formulas From Real Templates
Here are four formulas used inside professional templates, shown as they actually appear in the database.
Project completion percentage — from the Project Management with AI template. Calculates automatically from Rollup properties counting completed and total tasks:
if(prop("Total Tasks") > 0, round(prop("Completed Tasks") / prop("Total Tasks") * 100), 0)
Deal profit margin — from the Ecommerce Business Management System. Calculates margin from purchase cost and sale price:
if(prop("Sale Price") > 0, round((prop("Sale Price") - prop("Purchase Cost")) / prop("Sale Price") * 100), 0)
Days until contract renewal — from the Construction Project Manager template. Surfaces upcoming contract renewals before they expire silently:
dateBetween(prop("Renewal Date"), now(), "days")
Urgency label — appears in multiple templates, surfaces in filtered views to show what needs immediate attention:
if(and(prop("Status") != "Done", dateBetween(prop("Due Date"), now(), "days") < 0), "Overdue", if(and(prop("Status") != "Done", dateBetween(prop("Due Date"), now(), "days") <= 2), "Due Soon", ""))
All of these formulas are already built into the Project Management with AI template — you do not need to write them yourself. If you want to see formulas working in a complete system before building your own, duplicating that template is the fastest way to study them in context.
The One Rule That Prevents Every Formula Mistake
Every formula error in Notion comes from the same source: a type mismatch. You are trying to use a number where Notion expects text, or a date where it expects a boolean, or a property name that does not exactly match what is in the database.
The rule: when a formula shows an error, check the types first. Is the value you are passing a number when the function expects text? Use format() to convert it. Is it text when the function expects a number? Use toNumber(). Is the property name slightly different from what you typed? Check the exact spelling in the database properties panel.
Notion shows a red underline under the part of the formula that has the type mismatch, and hovering over it shows the error message. Read the error literally — it almost always tells you exactly what type it received and what type it expected. Fix the mismatch and the formula works.
Formulas become intuitive with practice. The learning curve is not steep — it is just unfamiliar. Write a few, make a few errors, fix them, and within an hour the pattern becomes clear. After that, every database you build will benefit from calculations that would have taken manual effort before.
The Ecommerce Business Management System uses formulas throughout for profit margins, inventory value, return rates, and monthly revenue summaries — all updating automatically as order and inventory data changes. If you are running an online store and want a Notion system where the numbers handle themselves, this is worth a look.
Disclosure: This post contains affiliate links. If you sign up for Notion through the links in this post, we may earn a small commission at no extra cost to you. All opinions are our own.



0 Comments