Tasks

This database is only found in the Creator’s Companion: Ultimate Tasks Edition.

The Tasks database contains all of the tasks you create in Ultimate Tasks. Nearly every page/database view you work with in the template is simply a “window” into this central database, which has its own settings design to pull a subset of the task pages, sort them in a particular way, etc.

Tasks is the primary database in Ultimate Tasks; all other databases in the template support it.

Below you’ll find a reference guide for all properties in the Tasks database. Properties are in alphabetical order.

Type: People

Use this property to set assignees for each task.

Note that Ultimate Tasks is set up for individual use by default; to make this property useful, you’ll want to create filtered views that only show tasks assigned to specific people.

Type: Relation

This Relation connects to the Content database, allowing you to associate a content project with your tasks.

Type: Created Time

The creation time of the task.

Type: Multi_select

Allows you to pick specific days of the week for a task to recur – e.g. Mon/Wed/Fri.

As noted by the property name, this property only take effect if Recur Interval is 1 and Recur Unit is set to Day(s) (or is blank).

If you’d like to translate these options, you’ll need to change them in the Localization Key formula property in this database as well.

NameDescription
MondayMonday
TuesdayTuesday
WednesdayWednesday
ThursdayThursday
FridayFriday
SaturdaySaturday
SundaySunday

Type: Rich_text

A simple text property for adding a note about this task.

If you’ve added the Notion AI add-on to your workspace, you can turn AI Autofill on to generate a summary of the task’s details (provided there’s a full description in the task’s page body).

Type: Date

The due date for the task.

Type: Formula

If a task is sub-task, this returns the Due Timestamp value of its parent task. Otherwise, it simply returns this task’s own Due Timestamp value.

This property is the highest-priority sorting criteria for Task views within Projects. It keeps sub-tasks beneath their parent tasks.

!prop("Parent Task")
	? prop("Due Timestamp")
	: prop("Parent Task").first().prop("Due Timestamp")
Code language: JavaScript (javascript)

Type: Formula

Used to aid in correctly sorting tasks and sub-tasks within Projects.

If the task doesn’t have a Due date set, this timestamp will be 100 years in the future. This simply keeps tasks/sub-tasks without a due date below tasks that have one.

!prop("Due")
	? now().dateAdd(100, "years").timestamp()
	: prop("Due").timestamp()
Code language: JavaScript (javascript)

Type: Last_edited_time

The last edited time of the task.

Type: Formula

This property allows you to localize your template. If you want to translate the option names in the Days, Recur Unit, and Status properties, you can do so and then change the arrays in this formula to the same values.

This will allow formulas to keep working.

[
/* Rewrite these weekday and recur unit options in your own language, so your second brain can work even better with your first. Make sure to set up the same options in the "Recur Unit" and "Days (Only If Set to 1 Day(s))" properties afterward, so you can select them. Feel free to remove the original names afterward! */

/* ["lunes", "3ª", "mercredi", "木曜日", "piątek", "lørdag", "Double Sunday"] */
["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],

/* ["Day(s)", "Week(s)", "Month(s)", "Year(s)", "Month(s) on the Last Day", "Month(s) on the First Weekday", "Month(s) on the Last Weekday"] */
["Day(s)", "Week(s)", "Month(s)", "Year(s)", "Month(s) on the Last Day", "Month(s) on the First Weekday", "Month(s) on the Last Weekday"],

/* This final list is for Status option names. */
["To Do", "Doing", "Done"]
]
Code language: JavaScript (javascript)

Type: Formula

Used in List views to show if a task is recurring, and/or if it has unfinished sub-tasks.

lets(
	recurring,
	if(
		not empty(prop("Next Due")),
		"🔁",
		""
	),
	hasSubtask,
	if(
		prop("Sub-Tasks").filter(current.prop("Status") != "Done").length() > 0,
		"↳",
		""
	),
	[recurring, hasSubtask].join(" ").replace("^\s","").replace("\s$","")
)
Code language: JavaScript (javascript)

Type: Title

The name of the task.

Type: Formula

The “next due” date for the task if it is recurring. A date will show here once you have values set in the Due and Recur Interval properties.

The date is calculated the Due date, today’s date, and the values in Recur Interval, Recur Unit, and Days (Only if Set to 1 Day(s)).

if(
    !empty(prop("Due"))
    and prop("Recur Interval") > 0,
    if(
        prop("Recur Interval") == ceil(prop("Recur Interval")),
        lets(   
            recurUnit, ifs(
                or(prop("Recur Unit") == at(at(prop("Localization Key"), 1), 0), prop("Recur Unit") == "Day(s)"), "days",
                or(prop("Recur Unit") == at(at(prop("Localization Key"), 1), 1), prop("Recur Unit") == "Week(s)"), "weeks",
                or(prop("Recur Unit") == at(at(prop("Localization Key"), 1), 2), prop("Recur Unit") == "Month(s)"), "months",
                or(prop("Recur Unit") == at(at(prop("Localization Key"), 1), 3), prop("Recur Unit") == "Year(s)"), "years",
                or(prop("Recur Unit") == at(at(prop("Localization Key"), 1), 4), prop("Recur Unit") == "Month(s) on the Last Day"), "monthsonthelastday",
                or(prop("Recur Unit") == at(at(prop("Localization Key"), 1), 5), prop("Recur Unit") == "Month(s) on the First Weekday"), "monthsonthefirstweekday",
                or(prop("Recur Unit") == at(at(prop("Localization Key"), 1), 6), prop("Recur Unit") == "Month(s) on the Last Weekday"), "monthsonthelastweekday",
                "days"
            ),
            
            weekdays, match([
                if(
                    or(includes(prop("Days (Only if Set to 1 Day(s))"), at(at(prop("Localization Key"), 0), 1 - 1)), includes(prop("Days (Only if Set to 1 Day(s))"), "Monday")), 1, false
                ),
                
                if(
                    or(includes(prop("Days (Only if Set to 1 Day(s))"), at(at(prop("Localization Key"), 0), 2 - 1)), includes(prop("Days (Only if Set to 1 Day(s))"), "Tuesday")), 2, false
                ),
                
                if(
                    or(includes(prop("Days (Only if Set to 1 Day(s))"), at(at(prop("Localization Key"), 0), 3 - 1)), includes(prop("Days (Only if Set to 1 Day(s))"), "Wednesday")), 3, false
                ),
                
                if(
                    or(includes(prop("Days (Only if Set to 1 Day(s))"), at(at(prop("Localization Key"), 0), 4 - 1)), includes(prop("Days (Only if Set to 1 Day(s))"), "Thursday")), 4, false
                ),
                
                if(
                    or(includes(prop("Days (Only if Set to 1 Day(s))"), at(at(prop("Localization Key"), 0), 5 - 1)), includes(prop("Days (Only if Set to 1 Day(s))"), "Friday")), 5, false
                ),
                
                if(
                    or(includes(prop("Days (Only if Set to 1 Day(s))"), at(at(prop("Localization Key"), 0), 6 - 1)), includes(prop("Days (Only if Set to 1 Day(s))"), "Saturday")), 6, false
                ),
                
                if(
                    or(includes(prop("Days (Only if Set to 1 Day(s))"), at(at(prop("Localization Key"), 0), 7 - 1)), includes(prop("Days (Only if Set to 1 Day(s))"), "Sunday")), 7, false
                )
            ], "[1-7]"),
            
            dateDue, parseDate(formatDate(prop("Due"), "YYYY-MM-DD")),
            
            dateDueEnd, parseDate(formatDate(dateEnd(prop("Due")), "YYYY-MM-DD")),
            
            timeNow, now(),
            
            offsetTimeNow, dateAdd(timeNow, prop("UTC Offset"), "hours"),

            inUTC, if(formatDate(now(), "ZZ") == "+0000", true, false),
            
            hasValidOffset, if(!empty(prop("UTC Offset")) and prop("UTC Offset") >= -12 and prop("UTC Offset") <= 14, true, false),
            
            hasRange, dateEnd(dateDueEnd) > dateStart(dateDue),
            
            dueRange, dateBetween(dateDueEnd, dateDue, "days"),
            
            conditionalTimeNow, if(inUTC and hasValidOffset, offsetTimeNow, timeNow),
            
            conditionalDateNow, parseDate(formatDate(conditionalTimeNow, "YYYY-MM-DD")),
            
            recurUnitLapseLength, if(includes(["days", "weeks", "months", "years"], recurUnit), dateBetween(conditionalDateNow, dateDue, recurUnit) / prop("Recur Interval"), false),
            
            lastDayBaseDate, if(
                includes(["monthsonthelastday", "monthsonthefirstweekday", "monthsonthelastweekday"], recurUnit),
                if(year(conditionalDateNow) * 12 + month(conditionalDateNow) - (year(dateDue) * 12 + month(dateDue)) > 0,
                    dateSubtract(dateAdd(dateSubtract(dateAdd(dateDue, ceil((year(conditionalDateNow) * 12 + month(conditionalDateNow) - (year(dateDue) * 12 + month(dateDue))) / prop("Recur Interval")) * prop("Recur Interval"), "months"), date(dateAdd(dateDue, ceil((year(conditionalDateNow) * 12 + month(conditionalDateNow) - (year(dateDue) * 12 + month(dateDue))) / prop("Recur Interval")) * prop("Recur Interval"), "months")) - 1, "days"), 1, "months"), 1, "days"),
                    dateSubtract(dateAdd(dateSubtract(dateAdd(dateDue, prop("Recur Interval"), "months"), date(dateAdd(dateDue, prop("Recur Interval"), "months")) - 1, "days"), 1, "months"), 1, "days")),
                "".parseDate()
            ),
            
            firstDayBaseDate, if(lastDayBaseDate.empty() != true, dateSubtract(lastDayBaseDate, date(lastDayBaseDate) - 1, "days"), "".parseDate()),
            
            firstWeekdayBaseDate, if(lastDayBaseDate.empty() != true,
                if(
                    test(day(firstDayBaseDate), "6|7"), 
                    dateAdd(firstDayBaseDate, 8 - day(firstDayBaseDate), "days"),
                    firstDayBaseDate
                ),
                "".parseDate()
            ),
            
            lastWeekdayBaseDate, if(lastDayBaseDate.empty() != true,
                if(
                    test(day(lastDayBaseDate), "6|7"), 
                    dateSubtract(lastDayBaseDate, day(lastDayBaseDate) - 5, "days"),
                    lastDayBaseDate
                ),
                "".parseDate()
            ),
            
            nextLastBaseDate, if(lastDayBaseDate.empty() != true,
                dateSubtract(dateAdd(dateSubtract(dateAdd(lastDayBaseDate, prop("Recur Interval"), "months"), date(dateAdd(lastDayBaseDate, prop("Recur Interval"), "months")) - 1, "days"), 1, "months"), 1, "days"),
                "".parseDate() 
            ),
            
            nextFirstBaseDate, if(lastDayBaseDate.empty() != true, dateSubtract(nextLastBaseDate, date(nextLastBaseDate) - 1, "days"), "".parseDate()),
            
            nextFirstWeekday, if(lastDayBaseDate.empty() != true,
                if(
                    test(day(nextFirstBaseDate), "6|7"), 
                    dateAdd(nextFirstBaseDate, 8 - day(nextFirstBaseDate), "days"),
                    nextFirstBaseDate
                ),
                "".parseDate()
            ),
            
            nextLastWeekday, if(lastDayBaseDate.empty() != true,
                if(
                    test(day(nextLastBaseDate), "6|7"), 
                    dateSubtract(nextLastBaseDate, day(nextLastBaseDate) - 5, "days"),
                    nextLastBaseDate
                ),
                "".parseDate()
            ),
            
            nextDueStart, ifs(
                recurUnit == "days" and length(weekdays) > 0 and prop("Recur Interval") == 1, 
                    if(conditionalDateNow >= dateDue,
                        ifs(
                            includes(weekdays, format(day(dateAdd(conditionalDateNow, 1, "days")))), dateAdd(conditionalDateNow, 1, "days"),
                            includes(weekdays, format(day(dateAdd(conditionalDateNow, 2, "days")))), dateAdd(conditionalDateNow, 2, "days"),
                            includes(weekdays, format(day(dateAdd(conditionalDateNow, 3, "days")))), dateAdd(conditionalDateNow, 3, "days"),
                            includes(weekdays, format(day(dateAdd(conditionalDateNow, 4, "days")))), dateAdd(conditionalDateNow, 4, "days"),
                            includes(weekdays, format(day(dateAdd(conditionalDateNow, 5, "days")))), dateAdd(conditionalDateNow, 5, "days"),
                            includes(weekdays, format(day(dateAdd(conditionalDateNow, 6, "days")))), dateAdd(conditionalDateNow, 6, "days"),
                            includes(weekdays, format(day(dateAdd(conditionalDateNow, 7, "days")))), dateAdd(conditionalDateNow, 7, "days"),
                            "".parseDate()
                        ),
                        ifs(
                            includes(weekdays, format(day(dateAdd(dateDue, 1, "days")))), dateAdd(dateDue, 1, "days"),
                            includes(weekdays, format(day(dateAdd(dateDue, 2, "days")))), dateAdd(dateDue, 2, "days"),
                            includes(weekdays, format(day(dateAdd(dateDue, 3, "days")))), dateAdd(dateDue, 3, "days"),
                            includes(weekdays, format(day(dateAdd(dateDue, 4, "days")))), dateAdd(dateDue, 4, "days"),
                            includes(weekdays, format(day(dateAdd(dateDue, 5, "days")))), dateAdd(dateDue, 5, "days"),
                            includes(weekdays, format(day(dateAdd(dateDue, 6, "days")))), dateAdd(dateDue, 6, "days"),
                            includes(weekdays, format(day(dateAdd(dateDue, 7, "days")))), dateAdd(dateDue, 7, "days"),
                            "".parseDate()
                        )
                    ),
                
                recurUnit == "monthsonthelastday", if(conditionalDateNow >= lastDayBaseDate, nextLastBaseDate, lastDayBaseDate),
                
                recurUnit == "monthsonthefirstweekday", if(conditionalDateNow >= firstWeekdayBaseDate, nextFirstWeekday, firstWeekdayBaseDate),
                
                recurUnit == "monthsonthelastweekday", if(conditionalDateNow >= lastWeekdayBaseDate, nextLastWeekday, lastWeekdayBaseDate),
                
                includes(["days", "weeks", "months", "years"], recurUnit), 
                    if(dateBetween(conditionalDateNow, dateDue, "days") >= 1,
                        if(recurUnitLapseLength == ceil(recurUnitLapseLength),
                            dateAdd(dateDue, (recurUnitLapseLength + 1) * prop("Recur Interval"), recurUnit),
                            dateAdd(dateDue, ceil(recurUnitLapseLength) * prop("Recur Interval"), recurUnit)
                        ),
                        dateAdd(dateDue, prop("Recur Interval"), recurUnit)
                    ),
                "".parseDate()
            ),
            
            nextDueEnd, if(hasRange and nextDueStart.empty() != true, 
                dateAdd(nextDueStart, dueRange, "days"),
                "".parseDate()
            ),
            
            nextDue, if(hasRange and nextDueEnd.empty() != true, dateRange(nextDueStart, nextDueEnd), nextDueStart),

            nextDue
        ),
        "".parseDate()
    ),
    "".parseDate()
)
Code language: JavaScript (javascript)

Type: Formula

This formula takes the Date value from the Next Due property, separates the start and end dates (if an end date is present), and formats the output as a JSON string. Used exclusively by Pipedream for automated recurring tasks (you shouldn’t edit it).

if(test(prop("Next Due"), "Error") or empty(prop("Next Due")) or prop("Next Due") == false, "∅", "{\"start\":\"" + formatDate(dateStart(prop("Next Due")), "YYYY-MM-DD") + "\",\"end\":\"" + formatDate(dateEnd(prop("Next Due")), "YYYY-MM-DD") + "\"}")
Code language: JavaScript (javascript)

Type: Rollup

If this page’s task is a sub-task, this Rollup property shows the Content project of the Parent Task (if one is set).

Primarily useful for making the Task With Sub-Tasks database template work as expected.

Type: Rollup

If this page’s task is a sub-task, this Rollup property shows the Project of the Parent Task (if one is set).

Primarily useful for making the Task With Sub-Tasks database template work as expected.

Type: Relation

If the current page is a sub-task, its parent task page will be shown here.

This property is a Relation which connects to another property inside this same Tasks database.

Type: Status

Priority level for your task. By default, this value only matters in the special Priority View. Priority doesn’t affect task sorting or visibility in other views – but you can add Priority filters or grouping to them if you want.

NameDescription
Group: To-do
Group: In progress
LowFor low-priority tasks.
MediumFor medium-priority tasks.
HighFor high-priority tasks.
Group: Complete

Type: Relation

This Relation connects to the Projects database, allowing you to associate a project with your tasks.

Type: Formula

This property shows whether this task’s project is active (either Doing or Ongoing). Used for views that only show tasks within projects that are active – helpful for filtering out tasks in projects that are planned, but not yet in progress.

lets(
	project,
	if(
		prop("Parent Task"),
		prop("Parent Task").first().prop("Project").first(),
		prop("Project").first()
	),
	projectStatus,
	project.prop("Status"),
	projectLocalizationKey,
	project.prop("Localization Key"),
	if(
		projectStatus == "Doing" 
		or projectStatus == "Ongoing"
		or projectLocalizationKey.at(1).includes(projectStatus),
		true,
		false
	)
)
Code language: JavaScript (javascript)

Type: Number

How often to make a recurring task recur. By default, this interval is a number of days -e.g an interval of 2 make Next Due two days from Due (or today’s date). You can set a Recur Unit to adjust this.

Type: Select

Sets the unit of time that will be used by Recur Interval to set Next Due. E.g. if you set Week(s) here, then a Recur Interval of 2 will set a task to recur every 2 weeks.

NameDescription
Day(s)Recur Interval counts days.
Week(s)Recur Interval counts weeks.
Month(s)Recur Interval counts months.
Month(s) on the First WeekdayRecur Interval counts months, from the first weekday.
Month(s) on the Last WeekdayRecur Interval counts months, from the last weekday.
Month(s) on the Last DayRecur Interval counts months, from the last day.
Year(s)Recur Interval counts years.

Type: Formula

This formula property just helps to visually separate the recurring tasks helper properties below (which should not be edited) from the rest above.

repeat("■", 3).style("red") + " Recurring Tasks helper properties".style("b")
Code language: JavaScript (javascript)

Type: Select

Allows you to apply special “tags” to a task. By default, the only value is “Someday”.

Tasks marked as Someday will show in the Someday View, and they will be hidden from the Inbox even if they don’t have a Project assigned.

NameDescription
SomedayTasks you’d like to do someday, but that arent important right now.

Type: Status

Tracks the status of the task. Most views in Ultimate Tasks show this property as a checkbox.

Checking the checkbox will alternate Status between “To Do” and “Done”. ⌥/Alt + Click the checkbox in order to access all options, including “Doing”.

NameDescription
Group: To-do
To DoTasks that you need to do.
Group: In progress
DoingTasks you’re currently doing.
Group: Complete
DoneTasks that are done.

Type: Formula

Indents sub-tasks in List views. This template does not use Notion’s native sub-items feature, as it can cause unexpected results and user confusion in this template’s Projects database template.

ifs(
	prop("Parent Task"), 
	"→"
)
Code language: JavaScript (javascript)

Type: Formula

Used in Projects, alongside Due Stamp (Parent), to ensure that sub-tasks are sorted correctly beneath their parent tasks.

lets(
	subSeedName,
	if(
		!prop("Parent Task"),
		prop("Name").lower(),
		prop("Parent Task").first().format().lower()
	),
	subSeed,
	if(
		!prop("Parent Task"),
		1,
		2
	),
	taskStatus,
	if(
		prop("Status") == "Done" or prop("Status") == prop("Localization Key").at(2).last(),
		2,
		1
	),
	taskStatus + " - " + subSeedName + " - " + subSeed
)
Code language: JavaScript (javascript)

Type: Relation

If the current task page is a Parent Task, all of its sub-tasks will be shown here.

This is a Relation property, which is connected to the Parent Task Relation property in this same Tasks database.

Type: Formula

Your UTC offset, based on your location (e.g. -6 for Denver during DST time, -7 at other times).

This property is set automatically by Thomas’ automated recurring tasks Pipedream workflow, so you don’t need to edit it. By default, it starts at 0.

0
Code language: JavaScript (javascript)

🤔 Have an UB Question?

Fill out the form below and I’ll answer as soon as I can! ~Thomas

🤔 Have a Question?

Fill out the form below and I’ll answer as soon as I can! ~Thomas