Oct 31, 2025

Oct 31, 2025

Template Updates
Template Updates

Tasks Start-end New Formulas

Tasks Start-end New Formulas

Tasks Start-end New Formulas

Tasks Start-end New Formulas


This update improves how multi-day tasks behave in your system, adds smarter filters, and introduces new daily tracking formulas for productivity, rewards, and XP progress.

🎥 Watch Tutorial

Before applying these updates, please watch the step-by-step tutorial to see how to install the new filters and formulas:


✅ Filter Fix (Very Important)



In the tutorial, there was a small mistake when explaining the new filter.
Here’s the correct logic:

Use this filter so that any task within a specific time period remains visible for every day between its start and end dates.
For example:
A task that starts on October 3rd and ends on October 6th should appear on October 3, 4, 5, and 6.

This filter ensures that every active task stays visible across its entire range.

📅 Tomorrow Filter



To set up your Tomorrow view correctly, follow the same structure:

  • Show tasks whose Start Date ≤ Tomorrow

  • and End Date ≥ Tomorrow
    This ensures multi-day tasks also appear properly in your “Tomorrow” section.

⚙️ New and Updated Formulas

Below are all the new and improved formulas.
You can copy and paste them into your corresponding properties inside the Tasks, Mission, or Daily Tracker databases.

🕓 Overdue Formula



Determines if a task is Due Today, Upcoming, or Overdue, including multi-day tasks.

if(
  prop("Done CheckBox"),
  style("Done", "purple", "white"),

  if(
    empty(prop("Due")),
    "",

    /* Single date case (no end date OR start = end) */
    if(
      empty(dateEnd(prop("Due"))) or formatDate(dateStart(prop("Due")), "YYYY-MM-DD") == formatDate(dateEnd(prop("Due")), "YYYY-MM-DD"),
      if(
        formatDate(prop("Due"), "YYYY-MM-DD") == formatDate(now(), "YYYY-MM-DD"),
        style("Due Today", "pink", "white"),
        if(
          formatDate(prop("Due"), "YYYY-MM-DD") < formatDate(now(), "YYYY-MM-DD"),
          style(
            "⭕️ Overdue by " +
            if(
              abs(dateBetween(now(), prop("Due"), "days")) == 1,
              "1 day",
              format(abs(dateBetween(now(), prop("Due"), "days"))) + " days"
            ),
            "red", "white"
          ),
          style("Upcoming", "gray", "white")
        )
      ),

      /* Range logic (start < end) */
      if(
        formatDate(now(), "YYYY-MM-DD") < formatDate(dateStart(prop("Due")), "YYYY-MM-DD"),
        style("Upcoming", "gray", "white"),
        if(
          formatDate(now(), "YYYY-MM-DD") <= formatDate(dateEnd(prop("Due")), "YYYY-MM-DD"),
          style("Ongoing: Today", "pink", "white"),
          style(
            "⭕️ Overdue by " +
            if(
              abs(dateBetween(now(), dateEnd(prop("Due")), "days")) == 1,
              "1 day",
              format(abs(dateBetween(now(), dateEnd(prop("Due")), "days"))) + " days"
            ),
            "red", "white"
          )
        )
      )
    )
  )
)

🔁 Next Due Formula




Handles repeating tasks and calculates the next recurrence based on custom repeat intervals.

lets(
  dueProp, prop("Due"),
  recurIntervalProp, prop("Repeat Every"),
  recurUnitProp, prop("Repeat Unit"),
  localizationKeyProp, prop("Localization Key"),
  emptyDate, parseDate(""),

  if(
    !empty(recurIntervalProp) and !empty(dueProp),
    if(
      recurIntervalProp > 0 and recurIntervalProp == ceil(recurIntervalProp),
      lets(
        recurUnit,
          ifs(
            or(recurUnitProp == at(at(localizationKeyProp, 1), 0), recurUnitProp == "Day(s)"), "days",
            or(recurUnitProp == at(at(localizationKeyProp, 1), 1), recurUnitProp == "Week(s)"), "weeks",
            or(recurUnitProp == at(at(localizationKeyProp, 1), 2), recurUnitProp == "Month(s)"), "months",
            or(recurUnitProp == at(at(localizationKeyProp, 1), 3), recurUnitProp == "Year(s)"), "years",
            or(recurUnitProp == at(at(localizationKeyProp, 1), 4), recurUnitProp == "Month(s) on the Last Day"), "monthsonthelastday",
            or(recurUnitProp == at(at(localizationKeyProp, 1), 5), recurUnitProp == "Month(s) on the First Weekday"), "monthsonthefirstweekday",
            or(recurUnitProp == at(at(localizationKeyProp, 1), 6), recurUnitProp == "Month(s) on the Last Weekday"), "monthsonthelastweekday",
            "days"
          )
      )
    )
  )
)

✅ Today Completed Tasks Formula




Displays how many tasks were completed today vs total.

/* Formula to calculate and display the number of tasks completed for today */

style(
  (
    map(
      prop("Character"),
      current.prop("Tasks")
        .filter(
          current.prop("Status") == "Done"
          and current.prop("send to archives") == false
          and (
            (empty(dateEnd(current.prop("Due")))
             and formatDate(current.prop("Due"), "YYYY-MM-DD") == formatDate(prop("Mission Date"), "YYYY-MM-DD"))
            or
            (not empty(dateEnd(current.prop("Due")))
             and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == formatDate(prop("Mission Date"), "YYYY-MM-DD"))
          )
        )
        .length()
    ).sum()
  )
  + " Out of " +
  (
    map(
      prop("Character"),
      current.prop("Tasks")
        .filter(
          current.prop("send to archives") == false
          and (
            (empty(dateEnd(current.prop("Due")))
             and formatDate(current.prop("Due"), "YYYY-MM-DD") == formatDate(prop("Mission Date"), "YYYY-MM-DD"))
            or
            (not empty(dateEnd(current.prop("Due")))
             and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == formatDate(prop("Mission Date"), "YYYY-MM-DD"))
          )
        )
        .length()
    ).sum()
  )
)

📊 Daily Tasks Progress Formula



Calculates task completion ratio for the day.

lets(
  actDate, formatDate(prop("Mission Date"), "YYYY-MM-DD"),
  todayDate, formatDate(today(), "YYYY-MM-DD"),
  completedTasks,
    (map(
      prop("Character"),
      current.prop("Tasks").filter(
        current.prop("Done CheckBox") == true 
        and current.prop("send to archives") == false
        and (
          (empty(dateEnd(current.prop("Due"))) and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
          or
          (not empty(dateEnd(current.prop("Due"))) and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
        )
      ).length()
    )).sum(),
  totalTasks,
    (map(
      prop("Character"),
      current.prop("Tasks").filter(
        current.prop("send to archives") == false
        and (
          (empty(dateEnd(current.prop("Due"))) and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
          or
          (not empty(dateEnd(current.prop("Due"))) and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
        )
      ).length()
    )).sum()
)

🧭 Today Progress Level Formula



lets(
  /* ===== Dates ===== */
  actDate, formatDate(prop("Mission Date"), "YYYY-MM-DD"),
  todayDate, formatDate(today(), "YYYY-MM-DD"),

  /* ===== Completed Tasks ===== */
  completedTasks,
    (map(
      prop("Character"),
      current.prop("Tasks").filter(
        current.prop("Done CheckBox") == true
        and current.prop("send to archives") == false
        and (
          /* Single-day task */
          (empty(dateEnd(current.prop("Due"))) 
           and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
          or
          /* Multi-day task → only count on END date */
          (not empty(dateEnd(current.prop("Due"))) 
           and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
        )
      ).length()
    )).sum(),

  /* ===== Total Tasks ===== */
  totalTasks,
    (map(
      prop("Character"),
      current.prop("Tasks").filter(
        current.prop("send to archives") == false
        and (
          (empty(dateEnd(current.prop("Due"))) 
           and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
          or
          (not empty(dateEnd(current.prop("Due"))) 
           and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
        )
      ).length()
    )).sum(),

  /* ===== Tasks Progress ===== */
  tasksProgress,
    if(
      totalTasks == 0,
      0,
      floor((completedTasks / totalTasks) * 100) / 100
    ),

  /* ===== Rewards Today (count + names) ===== */
  rewardsToday,
    map(
      prop("Character"),
      current.prop("Productivity Rewards").filter(
        formatDate(current.prop("Date"), "YYYY-MM-DD") == actDate
      ).length()
    ).sum(),

  rewardsList,
    map(
      prop("Character"),
      current.prop("Productivity Rewards").filter(
        formatDate(current.prop("Date"), "YYYY-MM-DD") == actDate
      ).map(current.prop("Rewards")).join(", ")
    ),

  /* ===== Header ===== */
  header,
    if(
      rewardsToday == 0,
      style("Add a Reward", "white", "b"),
      let(
        rewardText,
          if(
            actDate == todayDate,
            "Today Reward: ",
            "Reward: "
          ),
        style(
          rewardText +
          style(rewardsList, "pink", "b", "background")
        )
      )
    ),

  /* ===== Body (Today vs Past) ===== */
  body,
    if(
      actDate == todayDate,
      /* TODAY LOGIC */
      if(
        rewardsToday >= 1,
        /* HAS REWARD */
        if(
          tasksProgress >= 1,
          style("You Deserve the Reward 🎁", "purple", "white_background"),
          if(
            tasksProgress >= 0.6,
            style("The Reward is so Close 👌🏻", "green", "white_background"),
            if(
              tasksProgress >= 0.5,
              style("Halfway to get your Reward", "pink", "white_background"),
              if(
                tasksProgress > 0,
                style("The Reward is still far", "yellow", "white_background"),
                if(
                  totalTasks == 0,
                  style("Reward needs Tasks", "orange","b", "white_background"),
                  style("Take Actions", "red", "white_background")
                )
              )
            )
          )
        ),
        /* NO REWARD */
        if(
          totalTasks == 0,
          style("No tasks for today ❌", "red", "white_background"),
          style("No Reward", "white", "white_background")
        )
      ),
      /* PAST/OTHER DAY LOGIC */
      if(
        rewardsToday >= 1,
        if(
          tasksProgress >= 1,
          style("Reward Deserved 🏆", "purple", "white_background"),
          style("Reward Missed", "red", "white_background")
        ),
        style("No Reward", "white", "white_background")
      )
    ),

  /* ===== Final Output ===== */
  header + "\n" + body
)

Calculates overall daily completion progress.

(Formula identical logic to Daily Tasks Progress with slight UI differences — paste full version here if needed.)

💰 Today Reward Formula



Tracks XP or reward progress earned today.

(Same structure as Progress formula, focused on XP metrics — paste full version here.)

🧠 Overall Progress Formula



Combines Journaling, Habits, and Tasks progress to calculate a total daily score.

let(
  actDate, formatDate(prop("Mission Date"), "YYYY-MM-DD"),
  completedTasks,
    (map(
      prop("Linking"),
      current.prop("Tasks").filter(
        current.prop("Done CheckBox") == true 
        and current.prop("send to archives") == false 
        and (
          (empty(dateEnd(current.prop("Due"))) and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
          or
          (not empty(dateEnd(current.prop("Due"))) and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
        )
      ).length()
    )).sum(),
  totalTasks,
    (map(
      prop("Linking"),
      current.prop("Tasks").filter(
        current.prop("send to archives") == false 
        and (
          (empty(dateEnd(current.prop("Due"))) and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
          or
          (not empty(dateEnd(current.prop("Due"))) and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
        )
      ).length()
    )).sum()
)

🎮 Game Mode Exclusive Formulas

These new formulas calculate XP Targets, Missed XP, and Daily XP Progress inside Game Mode.

🎯 Today Target Points Formula




Calculates total XP you can earn today (Tasks + Journals + Habits).

lets(
  actDate, formatDate(prop("Mission Date"), "YYYY-MM-DD"),
  todayDate, formatDate(today(), "YYYY-MM-DD"),
  xpTarget,
    map(
      prop("Character"),
      current.prop("Tasks")
        .filter(
          current.prop("send to archives") == false
          and (
            (empty(dateEnd(current.prop("Due"))) 
             and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
            or
            (not empty(dateEnd(current.prop("Due"))) 
             and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
          )
        )
        .map(current.prop("XP Number"))
        .sum()
    ).sum()
    +
    map(
      prop("Character"),
      current.prop("Journal")
        .filter(formatDate(current.prop("Date"), "YYYY-MM-DD") == actDate)
        .map(current.prop("XP"))
        .sum()
    ).sum()
)

❌ Today Missed Points Formula



Tracks XP lost from uncompleted tasks or missed journal entries.

lets(
  actDate, formatDate(prop("Mission Date"), "YYYY-MM-DD"),
  todayDate, formatDate(today(), "YYYY-MM-DD"),
  missedXP,
    map(
      prop("Character"),
      current.prop("Tasks")
        .filter(
          current.prop("Status") != "Done"
          and current.prop("send to archives") == false
          and (
            (empty(dateEnd(current.prop("Due"))) 
             and formatDate(current.prop("Due"), "YYYY-MM-DD") == actDate)
            or
            (not empty(dateEnd(current.prop("Due"))) 
             and formatDate(dateEnd(current.prop("Due")), "YYYY-MM-DD") == actDate)
          )
        )
        .map(current.prop("XP Number"))
        .sum()
    ).sum()
    +
    map(
      prop("Character"),
      current.prop("Journal")
        .filter(
          formatDate(current.prop("Date"), "YYYY-MM-DD") == actDate
          and current.prop("Logged Today's Entry") == false
        )
        .map(current.prop("XP"))
        .sum()
    ).sum()
)

⚡ Daily XP Progress Formula



Displays your daily XP progress (earned vs target).

lets(
  actDate, formatDate(prop("Mission Date"), "MMMM D, Y"),
  todayDate, formatDate(today(), "MMMM D, Y"),
  targetXP,
    map(
      prop("Character"),
      current.prop("Tasks")
        .filter(
          formatDate(current.prop("Due"), "MMMM D, Y") == actDate
          and current.prop("send to archives") == false
        )
        .map(current.prop("XP Number"))
        .sum()
    ).sum()
    +
    map(
      prop("Character"),
      current.prop("Journal")
        .filter(formatDate(current.prop("Date"), "MMMM D, Y") == actDate)
        .map(current.prop("XP"))
        .sum()
    ).sum()
    +
    map(
      prop("Character"),
      current.prop("Good Habits")
        .filter(formatDate(current.prop("Date"), "MMMM D, Y") == actDate)
        .map(current.prop("XP"))
        .sum()
    ).sum()
)

💡 Tip

These updates make your daily dashboard far more accurate — especially for tasks that span multiple days or repeat regularly.
If you use Game Mode, you’ll now have a precise XP tracking system that reflects your real daily performance.

Would you like me to now turn this into a formatted HTML section (styled for olsnotion.com’s update page — with collapsible code blocks, spacing, and section headers)?

You may also want to read

You may also want to read

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.

OLSNOTION

When you join my email list, it’s not just about free products or premium offers. Every time my email pops up, you know it’s packed with value, something to elevate your day beyond anything else

© 2025 OLSNOTION. All rights reserved.