Notion formulas to track "days until due" and "needs attention" — and the one thing they can't do

If you want a Notion formula that counts down to a due date, flags overdue tasks, and color-codes urgency, the three formulas below are copy-paste ready. But there is one limitation almost no tutorial states plainly, and it is the reason your "Overdue" column never actually pokes anyone: a Notion formula only computes and displays a value — it cannot send a notification. This guide gives you the working formulas first, then explains that wall and what to put on the other side of it.
TL;DR
- Days remaining:
dateBetween(prop("Due Date"), now(), "days")— a negative result means overdue.- Wrap it in
if()/ifs()to show labels like "Overdue" or "3 days left", and usestyle()for colored priority flags.- Always guard with
empty(prop("Due Date"))first, and exclude Done/Paid items so finished work never shows "Overdue".- A formula is a display property, not an event trigger — it can't email, ping, or alert anyone. For that you need automation or an external tool.
What a formula can and can't do (the conclusion, up front)
A formula property recalculates a value whenever you open or refresh the database, and shows that value in the cell. It is excellent at computing and displaying things: how many days are left, whether a date has passed, which color a row should be. That is genuinely useful — a well-built formula turns a plain date column into an at-a-glance status board.
What a formula does not do is fire an action. It has no concept of "when this becomes overdue, do X." It does not run on a schedule, it does not watch for the moment a threshold is crossed, and it has no way to send an email, a Slack message, or a Notion notification. The value simply updates silently and waits for a human to look at it. Keep that distinction in mind as you build the three formulas below — you are building a dashboard, not an alarm.
Prerequisites: the properties you need
These formulas assume a database with two properties. Set them up first:
| Property | Type | Purpose |
|---|---|---|
Due Date |
Date | The deadline the formula counts toward. |
Status |
Status (or Select) | So "Done"/"Paid" items can be excluded from overdue logic. |
To add the formula itself: open your database → + New property → choose Formula → click Edit formula and paste the code. Notion's formula editor (Formula 2.0) supports multi-line, indented formulas, so you can paste the blocks below as-is.
💡 If your completion property is a Status type,
prop("Status")returns the status name as text, soprop("Status") == "Done"works. Match the exact label you use ("Done", "Complete", "Paid", etc.).
Three copy-paste formulas
1. Days remaining
The base of every deadline formula is the gap between the due date and today:
dateBetween(prop("Due Date"), now(), "days")
This returns an integer: 5 means five days left, 0 means today, and -2 means the date passed two days ago. Benefit: one number tells you at a glance how much runway a task has, and it updates itself every day without you touching it.
To turn that integer into a readable label instead of a bare number — "3 days left" rather than 3 — wrap it in format() with a fallback for the overdue case:
if(dateBetween(prop("Due Date"), now(), "days") < 0, "Overdue",
format(dateBetween(prop("Due Date"), now(), "days")) + " days left")
That produces "3 days left" while the count is positive, and still falls back to "Overdue" once it crosses zero.
⚠️
now()includes the current time of day, which can make a same-day deadline read as0or-1depending on the hour. If you only care about the calendar date, compare againstdateStart(now())or accept the off-by-one near midnight — see the stumbling blocks section below.
2. Overdue flag (that excludes completed and paid items)
A naive overdue check — if(dateBetween(prop("Due Date"), now(), "days") < 0, "Overdue", "") — will happily stamp "Overdue" on a task you finished last week, because it never looks at the Status. Guard against that:
if(empty(prop("Due Date")), "",
if(prop("Status") == "Done", "✅ Done",
if(dateBetween(prop("Due Date"), now(), "days") < 0, "🚩 Overdue",
"On track")))
Read top to bottom: no due date → blank; already Done → show Done, never "Overdue"; past due → "Overdue"; otherwise "On track". Benefit: your overdue column stays trustworthy — the only rows flagged red are the ones that actually need chasing, not finished work cluttering the view.
💡 This exclusion logic mirrors a common real-world rule: never flag (or contact) something that's already complete or paid. It's the same guard you want anywhere a "still outstanding?" decision is automated.
3. Priority flag with color (ifs() + style())
To turn urgency into a colored label, switch from nested if() to ifs() (cleaner for multiple tiers) and wrap the output in style(), Notion's Formula 2.0 function for bold and colored text:
ifs(
empty(prop("Due Date")), "",
prop("Status") == "Done", style("✅ Done", "gray"),
dateBetween(prop("Due Date"), now(), "days") < 0, style("🚩 Overdue", "red", "b"),
dateBetween(prop("Due Date"), now(), "days") <= 3, style("🔴 Urgent", "red"),
dateBetween(prop("Due Date"), now(), "days") <= 7, style("🟡 Soon", "yellow"),
style("🟢 On track", "green")
)
style(value, ...) takes the text first, then any number of style tokens: colors like "red", "orange", "green", "gray", and weights like "b" (bold) or "i" (italic). Benefit: the column reads like a traffic light — red for urgent, yellow for soon, green for fine — so you triage a long list in one scan instead of reading every date.
| Days remaining | Label | Color |
|---|---|---|
| Done (any) | ✅ Done | gray |
| Below 0 (past due) | 🚩 Overdue | red, bold |
| 0–3 | 🔴 Urgent | red |
| 4–7 | 🟡 Soon | yellow |
| 8+ | 🟢 On track | green |
💡 The order of
ifs()branches matters. "Done" and "Overdue" are checked before the day-count tiers, so a finished or already-late task never falls through into "Urgent". Reorder and you'll get wrong labels.
Three things that trip people up
1. Timezone off-by-one. now() resolves to your account's timezone and includes the current time, so a task due "today" can show -1 or "Overdue" late in the evening, or 1 early in the morning. If exact calendar-day counting matters, compare date starts: dateBetween(dateStart(prop("Due Date")), dateStart(now()), "days"). This strips the time component so both sides are measured from midnight.
2. Empty due dates throw off the math. dateBetween on an empty date returns a misleading number (often a huge value counting from an epoch), which then paints every blank-date row as wildly overdue or on-track. The fix is the empty(prop("Due Date")) guard shown in formulas 2 and 3 — always test for empty before doing any date arithmetic.
3. Completed tasks showing "Overdue". This is the most common complaint and it's a logic gap, not a Notion bug: a bare dateBetween(...) < 0 check has no idea the task is finished. The prop("Status") == "Done" branch (placed first) is the guard. If you track payments, add a || prop("Status") == "Paid" style branch so settled invoices drop out too.
The wall: formulas display, they don't notify
Here is the limitation the formulas above cannot overcome, no matter how you write them. A formula is a reactive display property: it recomputes a value and shows it in a cell. It is not an event trigger: it has no hook that fires "the moment this row crosses zero days." So "🚩 Overdue" can sit in your database for a week and nothing happens — because nothing is watching that value except you, when you happen to open the page.
To actually get notified, you need something on the right side of that diagram: a trigger that runs on a schedule, reads the date, and sends a message. Notion offers a couple of partial tools for this inside the app, and there are external services for the rest. (For the full landscape of what native automation can and can't do, see Notion automation limits.)
Even Notion's native @remind only reaches the person looking at Notion
You might reach for Notion's @remind command or a person-property notification instead of a formula — and those can fire a Notion notification at a set time. But they have their own wall: the alert only ever reaches people who have a Notion account and open Notion. A @remind shows up in the recipient's Notion inbox; it never becomes an email to a client, a vendor, or anyone outside your workspace. If the person who needs to act doesn't live in Notion, the reminder effectively doesn't exist for them. (If your native reminders aren't landing at all, why Notion notifications aren't working covers the usual causes.)
The next step: send an email when a date arrives
Once you accept that a formula is a dashboard and @remind is an inbox ping for Notion users, the missing piece is clear: something that watches the date and sends an actual message — to people who may never log in to Notion. That is exactly the gap Kapsel fills.
Kapsel is a tool that watches your Notion database's due dates, assignees, and status, and automatically sends email reminders — including to external recipients who do not have a Notion account and never log in.
In practice it does the things a formula structurally cannot:
- Triggers on the date, not on you opening the page. You set the rule once (e.g. "email the assignee on the due date, then daily if overdue"), and it runs on schedule.
- Reaches people outside Notion. Recipients get a normal email — no account, no login. This is the bridge the native tools can't build.
- Writes back with one click. The recipient clicks a button in the email and the status updates in your Notion database — a two-way loop, not a one-way blast.
- Never sends to Completed or Paid. The same exclusion your overdue formula needs is built in, so finished work never gets chased.
That last point is the direct parallel to formula #2 above: just as your ifs() guards against flagging a Done task, Kapsel won't email someone about something they've already settled. Kapsel's paid tiers also add overdue chasing, audience filtering, recurring sends, send logs, and merge variables; Pro adds multiple Notion workspaces and sender branding (your company name, signature, and logo). For how this plugs into a wider reminder setup, see email reminders in Notion and notifying people who aren't in Notion.
Getting started is short: connect your Notion database, pick the date property to watch and who should receive the email, and set when to send. The Free plan is $0 so you can test the flow before committing; exact figures are on the official pricing page.
💡 Keep your formulas — they're still a useful dashboard. Use them to see status inside Notion, and add an outbound trigger only for the reminders that have to leave Notion and reach a real person.
Frequently Asked Questions
How do you calculate days until due date in Notion?
Create a Formula property and use dateBetween(prop("Due Date"), now(), "days"). It returns the number of days between today and the due date as an integer — positive for upcoming dates, negative once the date has passed. Wrap it in if() or ifs() if you want a label instead of a raw number.
What does a negative number mean in a Notion dateBetween formula?
A negative result means the due date is in the past. dateBetween(prop("Due Date"), now(), "days") measures from the due date to now, so once the deadline has passed the difference flips negative — -3 means the date was three days ago. That's the standard "overdue" signal to test with < 0.
How do I make a Notion formula show "Overdue" automatically?
Wrap the day count in a condition: if(dateBetween(prop("Due Date"), now(), "days") < 0, "Overdue", "On track"). Add an empty(prop("Due Date")) guard so blank dates don't register, and a prop("Status") == "Done" branch so finished tasks aren't labeled overdue. The label updates on its own, but it only displays — it doesn't alert anyone.
Can Notion formulas send a notification or alert?
No. A formula is a display property: it computes a value and shows it in the cell, with no ability to trigger an email, Slack message, or push notification. To send something when a date arrives you need an event trigger — Notion's database automations and @remind (limited to Notion users), or an external tool for reminders that reach people outside your workspace.
How do you color-code priority in Notion with a formula?
Use ifs() to set tiers and style() to color each label, e.g. style("🔴 Urgent", "red") for 3 days or fewer and style("🟢 On track", "green") otherwise. style(value, ...) accepts color tokens like "red"/"green" and weights like "b" for bold. Order the branches so Done and Overdue are checked before the day-count tiers.
Why isn't my Notion reminder or notification working?
The most common reasons are that a formula can't notify at all (it only displays), or that a native @remind only reaches people who use Notion and have notifications enabled. External recipients never get Notion alerts by design. See why Notion notifications aren't working for a full checklist.
Can Notion remind someone who doesn't have a Notion account?
Not with built-in features — Notion's reminders and mentions only notify people inside the workspace. To reach a client or vendor with no account, you need a tool that sends an email based on your Notion data. Kapsel does this and lets the recipient update the Notion status from the email with one click.
How do you exclude completed tasks from an overdue formula in Notion?
Add a Status check as the first branch, before the date math: if(prop("Status") == "Done", "✅ Done", if(dateBetween(prop("Due Date"), now(), "days") < 0, "Overdue", "On track")). Because the Done branch runs first, a finished task short-circuits and never reaches the overdue test. For payments, add a "Paid" branch the same way.
Does this work for recurring or repeating due dates?
Yes — the day-count and overdue logic are the same; what changes is how the date renews. If you use recurring templates or a dateAdd()-based next-date column, the formula still reads whichever due date is current and counts down to it. See recurring reminders in Notion for setting up the repeat itself.
Notes & sources
- Published 2026-10-23.
- Formula syntax (
dateBetween,now(),if/ifs,empty,style) reflects Notion's Formula 2.0 as documented in Notion's official help and formula reference; test any formula against your own property names and completion labels, which may differ. - Native reminder behavior (
@remind, person-property notifications reaching only logged-in Notion users) is based on Notion's official notification documentation. - Kapsel's features and pricing (Free $0, Standard $12, Pro $29) are current as of writing; see the official pricing page for exact, up-to-date figures.

