Advanced Notion Formulas 202: Powerful Examples to Boost Your Productivity in 2025

Advanced Notion Formulas 202: Powerful Examples to Boost Your Productivity in 2025

In this post:

In this post:

In this post:

Section

Section

Section

You've mastered the basics of Notion formulas—now it's time to unleash their full potential. If you're new to Notion formulas, we recommend starting with our Notion Formulas 101: Beginner's Blueprint before diving into these advanced techniques.

In this advanced guide, we're diving deep into the world of Notion Formulas 2.0, exploring powerful techniques that can transform your databases from simple tables into dynamic, intelligent systems that practically run themselves.

Whether you're managing projects, tracking finances, or organizing your personal life, the advanced formula examples in this guide will help you automate tedious tasks, visualize information more effectively, and create custom solutions tailored to your specific workflow.

Ready to become a Notion formula power user? Let's get started.

What's New in Notion Formulas 2.0?

Before we dive into examples, let's explore the latest features that make Notion Formulas 2.0 more powerful than ever:

1. Multi-line Formulas

Notion now supports multi-line formula editing, making complex formulas much easier to read and maintain. Press Shift + Enter to break your formula into multiple lines:

if(prop("Status") == "Completed",
   "✅ Done",
   if(prop("Status") == "In Progress",
      "🔄 Working on it",
      "⏱️ Not started"
   )
)

2. Rich Data Outputs

Formulas can now reference and display pages, dates, people, and lists directly—not just text, numbers, and checkboxes.

3. Variables with "LET"

Create local variables within your formulas using the let() function to make complex formulas more readable and efficient:

let(
   x, prop("Price") * prop("Quantity"),
   y, x * prop("Tax Rate"),
   x + y
)

4. Direct Access to Workspace Information

Access workspace-level information like user names and emails directly using properties like "Created By":

prop("Created By").name()
prop("Created By").email()

5. Cross-Database References

Reference properties from related databases without creating rollups:

prop("Related Tasks").prop("Status")

10 Advanced Formula Examples You Can Use Today

Now let's explore 10 powerful formula examples that leverage these advanced features to solve real-world problems.

1. Dynamic Progress Bars with Unicode Characters

Create visually appealing progress bars that automatically update based on completion percentage:

/* Define variables for readability */
let(
   progress, prop("Current Progress") / prop("Total Goal"),
   filled, round(progress * 10),
   empty, 10 - filled,

   /* Create the progress bar */
   substring("★★★★★★★★★★", 0, filled) +
   substring("☆☆☆☆☆☆☆☆☆☆", 0, empty) +
   " " + format(round(progress * 100)) + "%"
)

Pro Tip: You can customize the characters used in the progress bar to match your aesthetic preferences. Try using and for a block-style progress bar, or and for a circular style.

2. Auto-Generating Invoice Numbers

Generate professional, sequential invoice numbers that incorporate client initials and date information:

/* Extract client initials and format date */
"INV-" +
substring(prop("Client First Name"), 0, 1) +
substring(prop("Client Last Name"), 0, 1) +
"-" +
formatDate(prop("Invoice Date"), "YYYYMMdd") +
"-" +
format(prop("Invoice Number"))

This creates invoice numbers like "INV-JD-20250115-042" which include client initials (JD), date (20250115), and a sequential number (042).

3. Dynamic Priority Labels Based on Deadlines

Create color-coded priority labels that automatically adjust based on approaching deadlines:

let(
   daysLeft, if(empty(prop("Due Date")), 999, dateBetween(prop("Due Date"), now(), "days")),
   
   ifs(
      daysLeft <= 3, style("HIGH PRIORITY", "b", "red", "red_background"),
      daysLeft <= 7, style("Medium Priority", "b", "orange", "orange_background"),
      daysLeft <= 14, style("Low Priority", "b", "green", "green_background"),
      style("Planned", "b", "blue", "blue_background")
   )
)

4. Daily Affirmations or Instructions by Day of Week

Display different messages based on the day of the week:

let(
   day, formatDate(if(empty(prop("Date")), now(), prop("Date")), "dddd"),
   
   ifs(
      day == "Monday", "Start the week strong! Focus on planning your week.",
      day == "Tuesday", "Time to execute! Focus on your most important tasks.",
      day == "Wednesday", "Mid-week check-in: Are you on track with your goals?",
      day == "Thursday", "Push through! Wrap up ongoing tasks before Friday.",
      day == "Friday", "Finish strong! Prepare for a restful weekend.",
      day == "Saturday", "Time to recharge. Do something you enjoy!",
      "Weekly reset: Plan for the week ahead."
   )
)

5. Extract Website Domain from Email Address

Use regular expressions to transform email addresses into website URLs:

/* Extract domain from email and create URL */
let(
   domain, match(prop("Email Address"), "(?<=@)(.*\\w)"),
   "https://www." + domain
)

This formula takes an email like "contact@example.com" and turns it into "https://www.example.com".

6. Color-Coded Financial Transactions

Visually distinguish between income and expenses with color-coded formatting:

/* Format currency values with color coding */
let(
   amount, prop("Amount"),

   if(amount > 0,
      /* Income: green, positive */
      style("+" + format(amount) + " USD", "b", "green"),

      /* Expense: red, negative, parentheses */
      style("(" + format(abs(amount)) + " USD)", "b", "red")
   )
)

7. Subscription Renewal Tracker

Calculate and display the next renewal date based on subscription frequency:

let(
   lastRenewal, if(empty(prop("Last Renewal Date")), now(), prop("Last Renewal Date")),
   frequency, prop("Renewal Frequency"),
   
   ifs(
      empty(frequency), "No frequency set",
      frequency == "Monthly", dateAdd(lastRenewal, 1, "months"),
      frequency == "Quarterly", dateAdd(lastRenewal, 3, "months"),
      frequency == "Annual", dateAdd(lastRenewal, 1, "years"),
      frequency == "Weekly", dateAdd(lastRenewal, 7, "days"),
      "Invalid frequency"
   )
)

8. Smart Task Status with Missing Information Alerts

Create a formula that not only displays the current status but also alerts you about missing critical information:

/* Check for missing information and show appropriate status */
let(
   hasDeadline, !empty(prop("Due Date")),
   hasAssignee, !empty(prop("Assigned To")),
   isComplete, prop("Status") == "Complete",

   if(isComplete,
      " Complete",
      if(!hasDeadline && !hasAssignee,
         "⚠️ Missing deadline and assignee",
         if(!hasDeadline,
            "⚠️ Missing deadline",
            if(!hasAssignee,
               "⚠️ Missing assignee",
               "🔄 In progress"
            )
         )
      )
   )
)

9. Advanced Date Range Calculator for Projects

Calculate and format complex date ranges with working days estimation:

/* Calculate project timeline with working days */
let(
   startDate, prop("Start Date"),
   endDate, prop("End Date"),
   totalDays, dateBetween(endDate, startDate, "days"),
   weekends, round(totalDays / 7 * 2),
   workingDays, totalDays - weekends,

   formatDate(startDate, "MMM D") +
   " → " +
   formatDate(endDate, "MMM D, YYYY") +
   " (" + format(workingDays) + " working days)"
)

10. Comprehensive Project Status Dashboard

Create an all-in-one status view that combines progress, deadline, and resource allocation:

/* Create comprehensive project status display */
let(
   /* Variables for readability */
   progress, prop("Progress Percentage"),
   daysLeft, dateBetween(prop("Deadline"), now(), "days"),
   budget, prop("Budget Used") / prop("Total Budget"),
   team, prop("Team Members").length(),

   /* Progress bar */
   substring("■■■■■■■■■■", 0, round(progress / 10)) +
   substring("□□□□□□□□□□", 0, 10 - round(progress / 10)) +
   " " + format(round(progress)) + "% complete\n" +

   /* Deadline indicator */
   if(daysLeft < 0,
      "⚠️ OVERDUE by " + format(abs(daysLeft)) + " days",
      "⏱️ " + format(daysLeft) + " days remaining\n"
   ) +

   /* Budget status */
   "💰 Budget: " + format(round(budget * 100)) + "% used\n" +

   /* Team allocation */
   "👥 Team: " + format(team) + " members assigned"
)

Advanced Formula Techniques

Now that you've seen some powerful examples, let's explore advanced techniques that can take your formula skills even further.

Working with Nested Formulas

Complex operations often require nested formulas. Break them down into smaller parts for better readability:

/* Calculate shipping cost based on weight and destination */
let(
   baseRate, 5,
   weightRate, prop("Weight") * 0.5,
   distanceFactor, if(prop("Destination") == "International",
                      3,
                      if(prop("Destination") == "Continental",
                         1.5,
                         1)
                     ),

   /* Final calculation */
   (baseRate + weightRate) * distanceFactor
)

Using Variables to Simplify Complex Formulas

The let() function creates local variables that make complex formulas more readable:

/* Calculate compound interest */
let(
   principal, prop("Initial Investment"),
   rate, prop("Annual Interest Rate"),
   time, prop("Investment Years"),
   compoundingPeriods, prop("Compounding Periods per Year"),

   /* Formula: P(1 + r/n)^(nt) */
   principal * pow(1 + (rate / compoundingPeriods), compoundingPeriods * time)
)

Working with Related Databases

Notion Formulas 2.0 allows you to reference related databases directly:

/* Count incomplete tasks in a related project */
let(
   relatedTasks, prop("Tasks"),
   incompleteTasks, relatedTasks.filter(current.prop("Status") != "Complete"),

   incompleteTasks.length()
)

Using Regular Expressions for Advanced Pattern Matching

Regular expressions (regex) can handle complex text pattern matching:

/* Extract hashtags from notes */
let(
   notes, prop("Meeting Notes"),
   hashtags, match(notes, "#\\w+"),

   if(empty(hashtags),
      "No tags found",
      join(hashtags, ", ")
   )
)

Formula Templates for Different Use Cases

Let's explore how these advanced formula techniques can be applied to specific use cases.

Project Management

Task Priority Matrix:

/* Eisenhower Matrix for task prioritization */
let(
   urgent, prop("Urgent"),
   important, prop("Important"),

   if(urgent && important,
      style("DO NOW", "b", "red"),
      if(important && !urgent,
         style("SCHEDULE", "b", "orange"),
         if(urgent && !important,
            style("DELEGATE", "b", "blue"),
            style("ELIMINATE", "b", "gray")
         )
      )
   )
)

Personal Finance

Budget Health Indicator:

/* Budget health with warning indicators */
let(
   spent, prop("Amount Spent"),
   budget, prop("Monthly Budget"),
   percentUsed, spent / budget,
   daysInMonth, date(dateAdd(dateAdd(now(), 1, "months"), -1, "days")),
   currentDay, date(now()),
   expectedPercent, currentDay / daysInMonth,

   if(percentUsed > expectedPercent + 0.1,
      style("OVERSPENDING", "b", "red"),
      if(percentUsed < expectedPercent - 0.1,
         style("UNDER BUDGET", "b", "green"),
         style("ON TRACK", "b", "blue")
      )
   )
)

Content Calendar

Content Status with Countdown:

/* Content publishing countdown */
let(
   status, prop("Status"),
   publishDate, prop("Publish Date"),
   daysToPublish, dateBetween(publishDate, now(), "days"),

   if(status == "Published",
      "✅ Published on " + formatDate(publishDate, "MMMM D"),
      if(status == "Scheduled",
         "🗓️ Publishing in " + format(daysToPublish) + " days",
         if(status == "In Review",
            "👀 In review (Target: " + formatDate(publishDate, "MMMM D") + ")",
            "📝 Drafting (Target: " + formatDate(publishDate, "MMMM D") + ")"
         )
      )
   )
)

Habit Tracking

Streak Calculator:

/* Calculate current streak */
let(
   completionDates, prop("Completion Dates"),
   sortedDates, sort(completionDates),
   lastDate, last(sortedDates),
   yesterday, dateSubtract(now(), 1, "days"),

   if(formatDate(lastDate, "YYYY-MM-DD") == formatDate(yesterday, "YYYY-MM-DD") ||
      formatDate(lastDate, "YYYY-MM-DD") == formatDate(now(), "YYYY-MM-DD"),
      /* Count consecutive days */
      /* Complex streak counting logic would go here */
      "🔥 Current streak: 5 days",
      "⚠️ Streak broken. Last completed: " + formatDate(lastDate, "MMMM D")
   )
)

Troubleshooting & Optimization

As your formulas become more complex, you may encounter performance issues or bugs. Here are some advanced troubleshooting techniques:

Performance Optimization

Simplify Where Possible:

  • Use built-in functions instead of recreating logic

  • Avoid unnecessary calculations

  • Break complex formulas into multiple properties

Avoid Recursive References: Formula properties that reference each other in a circular way can cause issues.

For an in-depth look at performance optimization, check out our dedicated guide on Notion Formula Optimization: The Key to Fast Databases, which covers even more techniques to keep your workspace running smoothly.

Debugging Complex Formulas

  1. Build incrementally: Start with small parts and verify they work before combining

  2. Use comments: Document what each section does

  3. Test with edge cases: Check how your formula handles empty properties or extreme values

Common Advanced Formula Errors

Inconsistent Types:

/* Problem: Trying to add a number and text */
prop("Price") + prop("Product Name")

/* Solution: Convert types explicitly */
prop("Price") + toNumber(prop("Product ID"))

Scope Issues in Variables:

/* Problem: Variable x only exists within the let function */
let(x, 10, x * 2) + x  /* Error: x is undefined outside let */

/* Solution: Include all operations that use x within the let function */
let(x, 10, x * 2 + x)

Formula 2.0 Cheat Sheet for Advanced Users

Here's a quick reference for advanced formula techniques:

Multi-line Formatting

if(condition,
   value_if_true,
   value_if_false
)

Variable Creation

let(
   variableName, value,
   expression_using_variable
)

/* Multiple variables */
lets(
   var1, value1,
   var2, value2,
   expression_using_var1_and_var2
)

Advanced Text Formatting

/* Style text with color */
style("Text", "b", "red", "yellow_background")

/* Available colors */
/* gray, brown, orange, yellow, green, blue, purple, pink, red */

Regular Expressions

/* Match pattern */
match(text, pattern)

/* Test if pattern exists */
test(text, pattern)

/* Replace pattern */
replace(text, pattern, replacement)

List Operations

/* Filter list */
filter(list, condition)

/* Map values */
map(list, transformation)

/* Join items */
join(list, separator)

Conclusion

Congratulations! You've now explored some of the most powerful formula techniques available in Notion. These advanced examples and techniques will help you create more dynamic, intelligent databases that automate your workflow and provide valuable insights at a glance.

Remember, mastering Notion formulas is an ongoing journey. Start by implementing a few of these examples in your own databases, then gradually experiment with more complex techniques as your comfort level grows.

The real power of Notion formulas comes when you combine them with your unique workflow needs to create custom solutions that work exactly the way you want them to.

Streamline Your Advanced Formula Creation

Creating these advanced formulas from scratch requires significant expertise and troubleshooting. To save time and avoid frustration, many Notion power users leverage our Notion Formula AI Assistant.

This specialized AI tool is trained on comprehensive Notion formula documentation and can:

  • Generate complex formulas tailored to your specific requirements

  • Optimize existing formulas for better performance

  • Provide step-by-step explanations of how formulas work

  • Help troubleshoot errors in your most challenging formulas

Whether you're building sophisticated project trackers, financial calculators, or custom dashboards, the Formula AI Assistant can help you implement these advanced concepts more efficiently.

You've mastered the basics of Notion formulas—now it's time to unleash their full potential. If you're new to Notion formulas, we recommend starting with our Notion Formulas 101: Beginner's Blueprint before diving into these advanced techniques.

In this advanced guide, we're diving deep into the world of Notion Formulas 2.0, exploring powerful techniques that can transform your databases from simple tables into dynamic, intelligent systems that practically run themselves.

Whether you're managing projects, tracking finances, or organizing your personal life, the advanced formula examples in this guide will help you automate tedious tasks, visualize information more effectively, and create custom solutions tailored to your specific workflow.

Ready to become a Notion formula power user? Let's get started.

What's New in Notion Formulas 2.0?

Before we dive into examples, let's explore the latest features that make Notion Formulas 2.0 more powerful than ever:

1. Multi-line Formulas

Notion now supports multi-line formula editing, making complex formulas much easier to read and maintain. Press Shift + Enter to break your formula into multiple lines:

if(prop("Status") == "Completed",
   "✅ Done",
   if(prop("Status") == "In Progress",
      "🔄 Working on it",
      "⏱️ Not started"
   )
)

2. Rich Data Outputs

Formulas can now reference and display pages, dates, people, and lists directly—not just text, numbers, and checkboxes.

3. Variables with "LET"

Create local variables within your formulas using the let() function to make complex formulas more readable and efficient:

let(
   x, prop("Price") * prop("Quantity"),
   y, x * prop("Tax Rate"),
   x + y
)

4. Direct Access to Workspace Information

Access workspace-level information like user names and emails directly using properties like "Created By":

prop("Created By").name()
prop("Created By").email()

5. Cross-Database References

Reference properties from related databases without creating rollups:

prop("Related Tasks").prop("Status")

10 Advanced Formula Examples You Can Use Today

Now let's explore 10 powerful formula examples that leverage these advanced features to solve real-world problems.

1. Dynamic Progress Bars with Unicode Characters

Create visually appealing progress bars that automatically update based on completion percentage:

/* Define variables for readability */
let(
   progress, prop("Current Progress") / prop("Total Goal"),
   filled, round(progress * 10),
   empty, 10 - filled,

   /* Create the progress bar */
   substring("★★★★★★★★★★", 0, filled) +
   substring("☆☆☆☆☆☆☆☆☆☆", 0, empty) +
   " " + format(round(progress * 100)) + "%"
)

Pro Tip: You can customize the characters used in the progress bar to match your aesthetic preferences. Try using and for a block-style progress bar, or and for a circular style.

2. Auto-Generating Invoice Numbers

Generate professional, sequential invoice numbers that incorporate client initials and date information:

/* Extract client initials and format date */
"INV-" +
substring(prop("Client First Name"), 0, 1) +
substring(prop("Client Last Name"), 0, 1) +
"-" +
formatDate(prop("Invoice Date"), "YYYYMMdd") +
"-" +
format(prop("Invoice Number"))

This creates invoice numbers like "INV-JD-20250115-042" which include client initials (JD), date (20250115), and a sequential number (042).

3. Dynamic Priority Labels Based on Deadlines

Create color-coded priority labels that automatically adjust based on approaching deadlines:

let(
   daysLeft, if(empty(prop("Due Date")), 999, dateBetween(prop("Due Date"), now(), "days")),
   
   ifs(
      daysLeft <= 3, style("HIGH PRIORITY", "b", "red", "red_background"),
      daysLeft <= 7, style("Medium Priority", "b", "orange", "orange_background"),
      daysLeft <= 14, style("Low Priority", "b", "green", "green_background"),
      style("Planned", "b", "blue", "blue_background")
   )
)

4. Daily Affirmations or Instructions by Day of Week

Display different messages based on the day of the week:

let(
   day, formatDate(if(empty(prop("Date")), now(), prop("Date")), "dddd"),
   
   ifs(
      day == "Monday", "Start the week strong! Focus on planning your week.",
      day == "Tuesday", "Time to execute! Focus on your most important tasks.",
      day == "Wednesday", "Mid-week check-in: Are you on track with your goals?",
      day == "Thursday", "Push through! Wrap up ongoing tasks before Friday.",
      day == "Friday", "Finish strong! Prepare for a restful weekend.",
      day == "Saturday", "Time to recharge. Do something you enjoy!",
      "Weekly reset: Plan for the week ahead."
   )
)

5. Extract Website Domain from Email Address

Use regular expressions to transform email addresses into website URLs:

/* Extract domain from email and create URL */
let(
   domain, match(prop("Email Address"), "(?<=@)(.*\\w)"),
   "https://www." + domain
)

This formula takes an email like "contact@example.com" and turns it into "https://www.example.com".

6. Color-Coded Financial Transactions

Visually distinguish between income and expenses with color-coded formatting:

/* Format currency values with color coding */
let(
   amount, prop("Amount"),

   if(amount > 0,
      /* Income: green, positive */
      style("+" + format(amount) + " USD", "b", "green"),

      /* Expense: red, negative, parentheses */
      style("(" + format(abs(amount)) + " USD)", "b", "red")
   )
)

7. Subscription Renewal Tracker

Calculate and display the next renewal date based on subscription frequency:

let(
   lastRenewal, if(empty(prop("Last Renewal Date")), now(), prop("Last Renewal Date")),
   frequency, prop("Renewal Frequency"),
   
   ifs(
      empty(frequency), "No frequency set",
      frequency == "Monthly", dateAdd(lastRenewal, 1, "months"),
      frequency == "Quarterly", dateAdd(lastRenewal, 3, "months"),
      frequency == "Annual", dateAdd(lastRenewal, 1, "years"),
      frequency == "Weekly", dateAdd(lastRenewal, 7, "days"),
      "Invalid frequency"
   )
)

8. Smart Task Status with Missing Information Alerts

Create a formula that not only displays the current status but also alerts you about missing critical information:

/* Check for missing information and show appropriate status */
let(
   hasDeadline, !empty(prop("Due Date")),
   hasAssignee, !empty(prop("Assigned To")),
   isComplete, prop("Status") == "Complete",

   if(isComplete,
      " Complete",
      if(!hasDeadline && !hasAssignee,
         "⚠️ Missing deadline and assignee",
         if(!hasDeadline,
            "⚠️ Missing deadline",
            if(!hasAssignee,
               "⚠️ Missing assignee",
               "🔄 In progress"
            )
         )
      )
   )
)

9. Advanced Date Range Calculator for Projects

Calculate and format complex date ranges with working days estimation:

/* Calculate project timeline with working days */
let(
   startDate, prop("Start Date"),
   endDate, prop("End Date"),
   totalDays, dateBetween(endDate, startDate, "days"),
   weekends, round(totalDays / 7 * 2),
   workingDays, totalDays - weekends,

   formatDate(startDate, "MMM D") +
   " → " +
   formatDate(endDate, "MMM D, YYYY") +
   " (" + format(workingDays) + " working days)"
)

10. Comprehensive Project Status Dashboard

Create an all-in-one status view that combines progress, deadline, and resource allocation:

/* Create comprehensive project status display */
let(
   /* Variables for readability */
   progress, prop("Progress Percentage"),
   daysLeft, dateBetween(prop("Deadline"), now(), "days"),
   budget, prop("Budget Used") / prop("Total Budget"),
   team, prop("Team Members").length(),

   /* Progress bar */
   substring("■■■■■■■■■■", 0, round(progress / 10)) +
   substring("□□□□□□□□□□", 0, 10 - round(progress / 10)) +
   " " + format(round(progress)) + "% complete\n" +

   /* Deadline indicator */
   if(daysLeft < 0,
      "⚠️ OVERDUE by " + format(abs(daysLeft)) + " days",
      "⏱️ " + format(daysLeft) + " days remaining\n"
   ) +

   /* Budget status */
   "💰 Budget: " + format(round(budget * 100)) + "% used\n" +

   /* Team allocation */
   "👥 Team: " + format(team) + " members assigned"
)

Advanced Formula Techniques

Now that you've seen some powerful examples, let's explore advanced techniques that can take your formula skills even further.

Working with Nested Formulas

Complex operations often require nested formulas. Break them down into smaller parts for better readability:

/* Calculate shipping cost based on weight and destination */
let(
   baseRate, 5,
   weightRate, prop("Weight") * 0.5,
   distanceFactor, if(prop("Destination") == "International",
                      3,
                      if(prop("Destination") == "Continental",
                         1.5,
                         1)
                     ),

   /* Final calculation */
   (baseRate + weightRate) * distanceFactor
)

Using Variables to Simplify Complex Formulas

The let() function creates local variables that make complex formulas more readable:

/* Calculate compound interest */
let(
   principal, prop("Initial Investment"),
   rate, prop("Annual Interest Rate"),
   time, prop("Investment Years"),
   compoundingPeriods, prop("Compounding Periods per Year"),

   /* Formula: P(1 + r/n)^(nt) */
   principal * pow(1 + (rate / compoundingPeriods), compoundingPeriods * time)
)

Working with Related Databases

Notion Formulas 2.0 allows you to reference related databases directly:

/* Count incomplete tasks in a related project */
let(
   relatedTasks, prop("Tasks"),
   incompleteTasks, relatedTasks.filter(current.prop("Status") != "Complete"),

   incompleteTasks.length()
)

Using Regular Expressions for Advanced Pattern Matching

Regular expressions (regex) can handle complex text pattern matching:

/* Extract hashtags from notes */
let(
   notes, prop("Meeting Notes"),
   hashtags, match(notes, "#\\w+"),

   if(empty(hashtags),
      "No tags found",
      join(hashtags, ", ")
   )
)

Formula Templates for Different Use Cases

Let's explore how these advanced formula techniques can be applied to specific use cases.

Project Management

Task Priority Matrix:

/* Eisenhower Matrix for task prioritization */
let(
   urgent, prop("Urgent"),
   important, prop("Important"),

   if(urgent && important,
      style("DO NOW", "b", "red"),
      if(important && !urgent,
         style("SCHEDULE", "b", "orange"),
         if(urgent && !important,
            style("DELEGATE", "b", "blue"),
            style("ELIMINATE", "b", "gray")
         )
      )
   )
)

Personal Finance

Budget Health Indicator:

/* Budget health with warning indicators */
let(
   spent, prop("Amount Spent"),
   budget, prop("Monthly Budget"),
   percentUsed, spent / budget,
   daysInMonth, date(dateAdd(dateAdd(now(), 1, "months"), -1, "days")),
   currentDay, date(now()),
   expectedPercent, currentDay / daysInMonth,

   if(percentUsed > expectedPercent + 0.1,
      style("OVERSPENDING", "b", "red"),
      if(percentUsed < expectedPercent - 0.1,
         style("UNDER BUDGET", "b", "green"),
         style("ON TRACK", "b", "blue")
      )
   )
)

Content Calendar

Content Status with Countdown:

/* Content publishing countdown */
let(
   status, prop("Status"),
   publishDate, prop("Publish Date"),
   daysToPublish, dateBetween(publishDate, now(), "days"),

   if(status == "Published",
      "✅ Published on " + formatDate(publishDate, "MMMM D"),
      if(status == "Scheduled",
         "🗓️ Publishing in " + format(daysToPublish) + " days",
         if(status == "In Review",
            "👀 In review (Target: " + formatDate(publishDate, "MMMM D") + ")",
            "📝 Drafting (Target: " + formatDate(publishDate, "MMMM D") + ")"
         )
      )
   )
)

Habit Tracking

Streak Calculator:

/* Calculate current streak */
let(
   completionDates, prop("Completion Dates"),
   sortedDates, sort(completionDates),
   lastDate, last(sortedDates),
   yesterday, dateSubtract(now(), 1, "days"),

   if(formatDate(lastDate, "YYYY-MM-DD") == formatDate(yesterday, "YYYY-MM-DD") ||
      formatDate(lastDate, "YYYY-MM-DD") == formatDate(now(), "YYYY-MM-DD"),
      /* Count consecutive days */
      /* Complex streak counting logic would go here */
      "🔥 Current streak: 5 days",
      "⚠️ Streak broken. Last completed: " + formatDate(lastDate, "MMMM D")
   )
)

Troubleshooting & Optimization

As your formulas become more complex, you may encounter performance issues or bugs. Here are some advanced troubleshooting techniques:

Performance Optimization

Simplify Where Possible:

  • Use built-in functions instead of recreating logic

  • Avoid unnecessary calculations

  • Break complex formulas into multiple properties

Avoid Recursive References: Formula properties that reference each other in a circular way can cause issues.

For an in-depth look at performance optimization, check out our dedicated guide on Notion Formula Optimization: The Key to Fast Databases, which covers even more techniques to keep your workspace running smoothly.

Debugging Complex Formulas

  1. Build incrementally: Start with small parts and verify they work before combining

  2. Use comments: Document what each section does

  3. Test with edge cases: Check how your formula handles empty properties or extreme values

Common Advanced Formula Errors

Inconsistent Types:

/* Problem: Trying to add a number and text */
prop("Price") + prop("Product Name")

/* Solution: Convert types explicitly */
prop("Price") + toNumber(prop("Product ID"))

Scope Issues in Variables:

/* Problem: Variable x only exists within the let function */
let(x, 10, x * 2) + x  /* Error: x is undefined outside let */

/* Solution: Include all operations that use x within the let function */
let(x, 10, x * 2 + x)

Formula 2.0 Cheat Sheet for Advanced Users

Here's a quick reference for advanced formula techniques:

Multi-line Formatting

if(condition,
   value_if_true,
   value_if_false
)

Variable Creation

let(
   variableName, value,
   expression_using_variable
)

/* Multiple variables */
lets(
   var1, value1,
   var2, value2,
   expression_using_var1_and_var2
)

Advanced Text Formatting

/* Style text with color */
style("Text", "b", "red", "yellow_background")

/* Available colors */
/* gray, brown, orange, yellow, green, blue, purple, pink, red */

Regular Expressions

/* Match pattern */
match(text, pattern)

/* Test if pattern exists */
test(text, pattern)

/* Replace pattern */
replace(text, pattern, replacement)

List Operations

/* Filter list */
filter(list, condition)

/* Map values */
map(list, transformation)

/* Join items */
join(list, separator)

Conclusion

Congratulations! You've now explored some of the most powerful formula techniques available in Notion. These advanced examples and techniques will help you create more dynamic, intelligent databases that automate your workflow and provide valuable insights at a glance.

Remember, mastering Notion formulas is an ongoing journey. Start by implementing a few of these examples in your own databases, then gradually experiment with more complex techniques as your comfort level grows.

The real power of Notion formulas comes when you combine them with your unique workflow needs to create custom solutions that work exactly the way you want them to.

Streamline Your Advanced Formula Creation

Creating these advanced formulas from scratch requires significant expertise and troubleshooting. To save time and avoid frustration, many Notion power users leverage our Notion Formula AI Assistant.

This specialized AI tool is trained on comprehensive Notion formula documentation and can:

  • Generate complex formulas tailored to your specific requirements

  • Optimize existing formulas for better performance

  • Provide step-by-step explanations of how formulas work

  • Help troubleshoot errors in your most challenging formulas

Whether you're building sophisticated project trackers, financial calculators, or custom dashboards, the Formula AI Assistant can help you implement these advanced concepts more efficiently.

You've mastered the basics of Notion formulas—now it's time to unleash their full potential. If you're new to Notion formulas, we recommend starting with our Notion Formulas 101: Beginner's Blueprint before diving into these advanced techniques.

In this advanced guide, we're diving deep into the world of Notion Formulas 2.0, exploring powerful techniques that can transform your databases from simple tables into dynamic, intelligent systems that practically run themselves.

Whether you're managing projects, tracking finances, or organizing your personal life, the advanced formula examples in this guide will help you automate tedious tasks, visualize information more effectively, and create custom solutions tailored to your specific workflow.

Ready to become a Notion formula power user? Let's get started.

What's New in Notion Formulas 2.0?

Before we dive into examples, let's explore the latest features that make Notion Formulas 2.0 more powerful than ever:

1. Multi-line Formulas

Notion now supports multi-line formula editing, making complex formulas much easier to read and maintain. Press Shift + Enter to break your formula into multiple lines:

if(prop("Status") == "Completed",
   "✅ Done",
   if(prop("Status") == "In Progress",
      "🔄 Working on it",
      "⏱️ Not started"
   )
)

2. Rich Data Outputs

Formulas can now reference and display pages, dates, people, and lists directly—not just text, numbers, and checkboxes.

3. Variables with "LET"

Create local variables within your formulas using the let() function to make complex formulas more readable and efficient:

let(
   x, prop("Price") * prop("Quantity"),
   y, x * prop("Tax Rate"),
   x + y
)

4. Direct Access to Workspace Information

Access workspace-level information like user names and emails directly using properties like "Created By":

prop("Created By").name()
prop("Created By").email()

5. Cross-Database References

Reference properties from related databases without creating rollups:

prop("Related Tasks").prop("Status")

10 Advanced Formula Examples You Can Use Today

Now let's explore 10 powerful formula examples that leverage these advanced features to solve real-world problems.

1. Dynamic Progress Bars with Unicode Characters

Create visually appealing progress bars that automatically update based on completion percentage:

/* Define variables for readability */
let(
   progress, prop("Current Progress") / prop("Total Goal"),
   filled, round(progress * 10),
   empty, 10 - filled,

   /* Create the progress bar */
   substring("★★★★★★★★★★", 0, filled) +
   substring("☆☆☆☆☆☆☆☆☆☆", 0, empty) +
   " " + format(round(progress * 100)) + "%"
)

Pro Tip: You can customize the characters used in the progress bar to match your aesthetic preferences. Try using and for a block-style progress bar, or and for a circular style.

2. Auto-Generating Invoice Numbers

Generate professional, sequential invoice numbers that incorporate client initials and date information:

/* Extract client initials and format date */
"INV-" +
substring(prop("Client First Name"), 0, 1) +
substring(prop("Client Last Name"), 0, 1) +
"-" +
formatDate(prop("Invoice Date"), "YYYYMMdd") +
"-" +
format(prop("Invoice Number"))

This creates invoice numbers like "INV-JD-20250115-042" which include client initials (JD), date (20250115), and a sequential number (042).

3. Dynamic Priority Labels Based on Deadlines

Create color-coded priority labels that automatically adjust based on approaching deadlines:

let(
   daysLeft, if(empty(prop("Due Date")), 999, dateBetween(prop("Due Date"), now(), "days")),
   
   ifs(
      daysLeft <= 3, style("HIGH PRIORITY", "b", "red", "red_background"),
      daysLeft <= 7, style("Medium Priority", "b", "orange", "orange_background"),
      daysLeft <= 14, style("Low Priority", "b", "green", "green_background"),
      style("Planned", "b", "blue", "blue_background")
   )
)

4. Daily Affirmations or Instructions by Day of Week

Display different messages based on the day of the week:

let(
   day, formatDate(if(empty(prop("Date")), now(), prop("Date")), "dddd"),
   
   ifs(
      day == "Monday", "Start the week strong! Focus on planning your week.",
      day == "Tuesday", "Time to execute! Focus on your most important tasks.",
      day == "Wednesday", "Mid-week check-in: Are you on track with your goals?",
      day == "Thursday", "Push through! Wrap up ongoing tasks before Friday.",
      day == "Friday", "Finish strong! Prepare for a restful weekend.",
      day == "Saturday", "Time to recharge. Do something you enjoy!",
      "Weekly reset: Plan for the week ahead."
   )
)

5. Extract Website Domain from Email Address

Use regular expressions to transform email addresses into website URLs:

/* Extract domain from email and create URL */
let(
   domain, match(prop("Email Address"), "(?<=@)(.*\\w)"),
   "https://www." + domain
)

This formula takes an email like "contact@example.com" and turns it into "https://www.example.com".

6. Color-Coded Financial Transactions

Visually distinguish between income and expenses with color-coded formatting:

/* Format currency values with color coding */
let(
   amount, prop("Amount"),

   if(amount > 0,
      /* Income: green, positive */
      style("+" + format(amount) + " USD", "b", "green"),

      /* Expense: red, negative, parentheses */
      style("(" + format(abs(amount)) + " USD)", "b", "red")
   )
)

7. Subscription Renewal Tracker

Calculate and display the next renewal date based on subscription frequency:

let(
   lastRenewal, if(empty(prop("Last Renewal Date")), now(), prop("Last Renewal Date")),
   frequency, prop("Renewal Frequency"),
   
   ifs(
      empty(frequency), "No frequency set",
      frequency == "Monthly", dateAdd(lastRenewal, 1, "months"),
      frequency == "Quarterly", dateAdd(lastRenewal, 3, "months"),
      frequency == "Annual", dateAdd(lastRenewal, 1, "years"),
      frequency == "Weekly", dateAdd(lastRenewal, 7, "days"),
      "Invalid frequency"
   )
)

8. Smart Task Status with Missing Information Alerts

Create a formula that not only displays the current status but also alerts you about missing critical information:

/* Check for missing information and show appropriate status */
let(
   hasDeadline, !empty(prop("Due Date")),
   hasAssignee, !empty(prop("Assigned To")),
   isComplete, prop("Status") == "Complete",

   if(isComplete,
      " Complete",
      if(!hasDeadline && !hasAssignee,
         "⚠️ Missing deadline and assignee",
         if(!hasDeadline,
            "⚠️ Missing deadline",
            if(!hasAssignee,
               "⚠️ Missing assignee",
               "🔄 In progress"
            )
         )
      )
   )
)

9. Advanced Date Range Calculator for Projects

Calculate and format complex date ranges with working days estimation:

/* Calculate project timeline with working days */
let(
   startDate, prop("Start Date"),
   endDate, prop("End Date"),
   totalDays, dateBetween(endDate, startDate, "days"),
   weekends, round(totalDays / 7 * 2),
   workingDays, totalDays - weekends,

   formatDate(startDate, "MMM D") +
   " → " +
   formatDate(endDate, "MMM D, YYYY") +
   " (" + format(workingDays) + " working days)"
)

10. Comprehensive Project Status Dashboard

Create an all-in-one status view that combines progress, deadline, and resource allocation:

/* Create comprehensive project status display */
let(
   /* Variables for readability */
   progress, prop("Progress Percentage"),
   daysLeft, dateBetween(prop("Deadline"), now(), "days"),
   budget, prop("Budget Used") / prop("Total Budget"),
   team, prop("Team Members").length(),

   /* Progress bar */
   substring("■■■■■■■■■■", 0, round(progress / 10)) +
   substring("□□□□□□□□□□", 0, 10 - round(progress / 10)) +
   " " + format(round(progress)) + "% complete\n" +

   /* Deadline indicator */
   if(daysLeft < 0,
      "⚠️ OVERDUE by " + format(abs(daysLeft)) + " days",
      "⏱️ " + format(daysLeft) + " days remaining\n"
   ) +

   /* Budget status */
   "💰 Budget: " + format(round(budget * 100)) + "% used\n" +

   /* Team allocation */
   "👥 Team: " + format(team) + " members assigned"
)

Advanced Formula Techniques

Now that you've seen some powerful examples, let's explore advanced techniques that can take your formula skills even further.

Working with Nested Formulas

Complex operations often require nested formulas. Break them down into smaller parts for better readability:

/* Calculate shipping cost based on weight and destination */
let(
   baseRate, 5,
   weightRate, prop("Weight") * 0.5,
   distanceFactor, if(prop("Destination") == "International",
                      3,
                      if(prop("Destination") == "Continental",
                         1.5,
                         1)
                     ),

   /* Final calculation */
   (baseRate + weightRate) * distanceFactor
)

Using Variables to Simplify Complex Formulas

The let() function creates local variables that make complex formulas more readable:

/* Calculate compound interest */
let(
   principal, prop("Initial Investment"),
   rate, prop("Annual Interest Rate"),
   time, prop("Investment Years"),
   compoundingPeriods, prop("Compounding Periods per Year"),

   /* Formula: P(1 + r/n)^(nt) */
   principal * pow(1 + (rate / compoundingPeriods), compoundingPeriods * time)
)

Working with Related Databases

Notion Formulas 2.0 allows you to reference related databases directly:

/* Count incomplete tasks in a related project */
let(
   relatedTasks, prop("Tasks"),
   incompleteTasks, relatedTasks.filter(current.prop("Status") != "Complete"),

   incompleteTasks.length()
)

Using Regular Expressions for Advanced Pattern Matching

Regular expressions (regex) can handle complex text pattern matching:

/* Extract hashtags from notes */
let(
   notes, prop("Meeting Notes"),
   hashtags, match(notes, "#\\w+"),

   if(empty(hashtags),
      "No tags found",
      join(hashtags, ", ")
   )
)

Formula Templates for Different Use Cases

Let's explore how these advanced formula techniques can be applied to specific use cases.

Project Management

Task Priority Matrix:

/* Eisenhower Matrix for task prioritization */
let(
   urgent, prop("Urgent"),
   important, prop("Important"),

   if(urgent && important,
      style("DO NOW", "b", "red"),
      if(important && !urgent,
         style("SCHEDULE", "b", "orange"),
         if(urgent && !important,
            style("DELEGATE", "b", "blue"),
            style("ELIMINATE", "b", "gray")
         )
      )
   )
)

Personal Finance

Budget Health Indicator:

/* Budget health with warning indicators */
let(
   spent, prop("Amount Spent"),
   budget, prop("Monthly Budget"),
   percentUsed, spent / budget,
   daysInMonth, date(dateAdd(dateAdd(now(), 1, "months"), -1, "days")),
   currentDay, date(now()),
   expectedPercent, currentDay / daysInMonth,

   if(percentUsed > expectedPercent + 0.1,
      style("OVERSPENDING", "b", "red"),
      if(percentUsed < expectedPercent - 0.1,
         style("UNDER BUDGET", "b", "green"),
         style("ON TRACK", "b", "blue")
      )
   )
)

Content Calendar

Content Status with Countdown:

/* Content publishing countdown */
let(
   status, prop("Status"),
   publishDate, prop("Publish Date"),
   daysToPublish, dateBetween(publishDate, now(), "days"),

   if(status == "Published",
      "✅ Published on " + formatDate(publishDate, "MMMM D"),
      if(status == "Scheduled",
         "🗓️ Publishing in " + format(daysToPublish) + " days",
         if(status == "In Review",
            "👀 In review (Target: " + formatDate(publishDate, "MMMM D") + ")",
            "📝 Drafting (Target: " + formatDate(publishDate, "MMMM D") + ")"
         )
      )
   )
)

Habit Tracking

Streak Calculator:

/* Calculate current streak */
let(
   completionDates, prop("Completion Dates"),
   sortedDates, sort(completionDates),
   lastDate, last(sortedDates),
   yesterday, dateSubtract(now(), 1, "days"),

   if(formatDate(lastDate, "YYYY-MM-DD") == formatDate(yesterday, "YYYY-MM-DD") ||
      formatDate(lastDate, "YYYY-MM-DD") == formatDate(now(), "YYYY-MM-DD"),
      /* Count consecutive days */
      /* Complex streak counting logic would go here */
      "🔥 Current streak: 5 days",
      "⚠️ Streak broken. Last completed: " + formatDate(lastDate, "MMMM D")
   )
)

Troubleshooting & Optimization

As your formulas become more complex, you may encounter performance issues or bugs. Here are some advanced troubleshooting techniques:

Performance Optimization

Simplify Where Possible:

  • Use built-in functions instead of recreating logic

  • Avoid unnecessary calculations

  • Break complex formulas into multiple properties

Avoid Recursive References: Formula properties that reference each other in a circular way can cause issues.

For an in-depth look at performance optimization, check out our dedicated guide on Notion Formula Optimization: The Key to Fast Databases, which covers even more techniques to keep your workspace running smoothly.

Debugging Complex Formulas

  1. Build incrementally: Start with small parts and verify they work before combining

  2. Use comments: Document what each section does

  3. Test with edge cases: Check how your formula handles empty properties or extreme values

Common Advanced Formula Errors

Inconsistent Types:

/* Problem: Trying to add a number and text */
prop("Price") + prop("Product Name")

/* Solution: Convert types explicitly */
prop("Price") + toNumber(prop("Product ID"))

Scope Issues in Variables:

/* Problem: Variable x only exists within the let function */
let(x, 10, x * 2) + x  /* Error: x is undefined outside let */

/* Solution: Include all operations that use x within the let function */
let(x, 10, x * 2 + x)

Formula 2.0 Cheat Sheet for Advanced Users

Here's a quick reference for advanced formula techniques:

Multi-line Formatting

if(condition,
   value_if_true,
   value_if_false
)

Variable Creation

let(
   variableName, value,
   expression_using_variable
)

/* Multiple variables */
lets(
   var1, value1,
   var2, value2,
   expression_using_var1_and_var2
)

Advanced Text Formatting

/* Style text with color */
style("Text", "b", "red", "yellow_background")

/* Available colors */
/* gray, brown, orange, yellow, green, blue, purple, pink, red */

Regular Expressions

/* Match pattern */
match(text, pattern)

/* Test if pattern exists */
test(text, pattern)

/* Replace pattern */
replace(text, pattern, replacement)

List Operations

/* Filter list */
filter(list, condition)

/* Map values */
map(list, transformation)

/* Join items */
join(list, separator)

Conclusion

Congratulations! You've now explored some of the most powerful formula techniques available in Notion. These advanced examples and techniques will help you create more dynamic, intelligent databases that automate your workflow and provide valuable insights at a glance.

Remember, mastering Notion formulas is an ongoing journey. Start by implementing a few of these examples in your own databases, then gradually experiment with more complex techniques as your comfort level grows.

The real power of Notion formulas comes when you combine them with your unique workflow needs to create custom solutions that work exactly the way you want them to.

Streamline Your Advanced Formula Creation

Creating these advanced formulas from scratch requires significant expertise and troubleshooting. To save time and avoid frustration, many Notion power users leverage our Notion Formula AI Assistant.

This specialized AI tool is trained on comprehensive Notion formula documentation and can:

  • Generate complex formulas tailored to your specific requirements

  • Optimize existing formulas for better performance

  • Provide step-by-step explanations of how formulas work

  • Help troubleshoot errors in your most challenging formulas

Whether you're building sophisticated project trackers, financial calculators, or custom dashboards, the Formula AI Assistant can help you implement these advanced concepts more efficiently.

In this post:

Section

Get your software working for you!

Experience digital chaos transformed into powerful automations & flawless workflows.

Get your software working for you!

Experience digital chaos transformed into powerful automations & flawless workflows.

Get your software working for you!

Experience digital chaos transformed into powerful automations & flawless workflows.

Notionise Logo
Notionise

Join our Newsletter!

Notion updates & insights delivered straight to your Inbox.
Don't worry, We hate spam too.

Notionise Logo
Notionise

Join our Newsletter!

Notion updates & insights delivered straight to your Inbox. Don't worry, We hate spam too.

Notionise Logo
Notionise

Join our Newsletter!

Notion updates & insights delivered straight to your Inbox.
Don't worry, We hate spam too.