๐Ÿ“† Creating a Combined Calendar

David De Bels
Sep 18 '19 ยท 9 min read ยท 911 views
This page explores the different methods you can use to create a combined calendar with items of multiple types. Let's say you have a bunch of different items in your workspace that have a date and you want to show them all on one calendar. Unfortunately it's not as straight forward as you might think, Notion calendars can only show the date of a single property. That means if you want to create a calendar that contains dates from multiple types of items, you need to get them all into a single database property somehow. Luckily there are some ways you can do this but keep in mind that all of these methods are workarounds for something that may (or may not) be added to Notion in the future. Big thanks to Reddit user WellSpentTime1 who really got me thinking on this.
In each example we have tasks with a start & due date, appointments with an appointment date and deadlines with a deadline date.


1. Storing everything in a single database

1.1 Single database with 1 date property

By far the easiest way is to simply store every item that has a date into one single database with a single date property. To differentiate between different types of items you have you can use a Select property to indicate the type. Since you only have a single date property, the calendar shows every item like you'd expect and you can even show the type on the calendar.
However there are some serious disadvantages with this method, which are clear in the example below. Each record has properties that are only being used for one specific type of item. If you want to add a property or formula that is only relevant for tasks, you'll always have to take into account what needs to be shown for appointments and deadlines. And what if you have a separate database somewhere and you decide to add a date property there, you'd have to merge that entire database with this one. What if you already have multiple databases set up, you'd have to migrate everything to a single one. This method is easy to set up but it's not very expandable or future-proof.
  • Pros & cons
    โž• Very easy to implement
    โž– Skips the power of relational databases
    โž– Need to start from scratch (what if you already have multiple existing databases)
    โž– Not very future-proof

Single Calendar: Single Property

NameTypeDateTask StatusAppointment LocationDeadline Project
Task #1TaskDone  
Appointment #1Appointment 177a Bleecker St. New York, NY 10012 USA 
Deadline #1Deadline  Project #1
Task #2TaskOngoing  
Deadline #2Deadline  Project #2
Appointment #2Appointment 221B Baker St. Marylebone, London NW1 6XE United Kingdom 

1.2 Single database with multiple date properties

This method is very similar to the one above, but rather than setting everything in a single date property it uses multiple. Maybe you have your reasons why you need to store the dates in separate properties, maybe because you need to do some calculations with those dates separately. So how can you show these multiple dates on one calendar? Reddit user WellSpentTime1 pointed out that you can create a formula property to check which date property is filled in, set that and the result will still be a date. Then on your Calendar View, select this formula property as Calendar By.
Of course this still requires a single database for everything, so the disadvantages are the same as above.
  • Pros & cons
    โž• Very easy to implement
    โž– Skips the power of relational databases
    โž– Need to start from scratch (what if you already have multiple existing databases)
    โž– Can't have more than 1 date property filled in

Single Calendar: Multiple Properties

NameTypeDateTask StatusTask Due DateAppointment LocationAppointment TimeDeadline ProjectDeadline Date
Task #1Task Done    
Appointment #1Appointment   177a Bleecker St. New York, NY 10012 USA  
Deadline #1Deadline     Project #1
Deadline #2Deadline     Project #2
Appointment #2Appointment   221B Baker St. Marylebone, London NW1 6XE United Kingdom  
Task #2Task Ongoing    
  • Formulas used
    Date formula
    if(prop("Type") == "Task", prop("Task Due Date"), if(prop("Type") == "Appointment", prop("Appointment Time"), prop("Deadline Date")))

2. Creating a Master Calendar

2.1 Building a Calendar Entries database

This example skips having dates in all your databases but instead storing all dates in a single Calendar Entries database. In each database where you have a date that you want in your calendar, instead of adding a date property you add a relationship to the Calendar Entries database. In the Calendar Entries database you create a new entry, give it the name you want to appear in the calendar, a type to identify it and link it to the item with the date.
In the example below we have a Tasks, Appointments and Deadlines database. Each of these has a Calendar Entries property which is a relationship with the Calendar Entries database. Each entry in the Calendar Entries database has a Date property and represents an item you want to appear on your calendar. But of course you may want to show some additional information on your calendar, like what type of date it is, what the status of the task is, etc. You can easily do that by creating rollups to other databases and simply use Show Original, that way your calendar will always be in sync with your other databases. This may result in your Calendar Entries database having a lot of rollup properties (which you can hide) but the other databases remain very clean. The major downside of this approach is that you simply moved the date, meaning you no longer have the date field in the Tasks, Appointments or Deadlines databases.
  • Pros & cons
    โž• Still pretty easy to set up
    โž• Works with dates, times and date ranges
    โž• You can have multiple dates per item
    โž• Clean solution
    โž– You no longer have access to the date in your original database
    โž– Requires some additional manual work, instead of just entering a date you have to create a new entry, give it a name, type and link it
    โž– Your master calendar database may become cluttered with rollup properties over time (if you choose to use it)

Master Calendar: Calendar Entries

Calendar EntryTypeDateTasksAppointmentsDeadlinesTask StatusAppointment LocationDeadline Project
Task #1 Start DateTask Start      
Task #1 Due DateTask Due      
Appointment #1Appointment      
Deadline #1Deadline      
Task #2 Start DateTask Start      
Task #2 Due DateTask Due      
Deadline #2Deadline      
Appointment #2Appointment      

Master Calendar: Tasks

NameStatusCalendar Entries
Task #1Done  
Task #2Ongoing  

Master Calendar: Appointments

NameLocationCalendar Entries
Appointment #1177a Bleecker St. New York, NY 10012 USA 
Appointment #2221B Baker St. Marylebone, London NW1 6XE United Kingdom 

Master Calendar: Deadlines

NameProjectCalendar Entries
Deadline #1Project #1  
Deadline #2Project #2  

3. Creating an Aggregated Calendar

3.1 Transferring a date between related databases

So what if you want to have a calendar database to show all the dates on a single calendar, but you still want to store the dates in their own respective databases. In that case the calendar database would have to retrieve the date from its related databases. To get values from related database you can use rollups, however one huge limitation of rollup properties is that the resulting column is usually treated as text or a number. When you use a rollup on a date property and use Show Original, you'll see that the result may look identical as the original date property, but in fact the column is actually being treated as text. Meaning that you can't do any calculations with that date or use it in a calendar. So how do we get a date from one database into the other and still keep them in sync? Let's start with a simplified example.
Below we have two databases with a relationship to each other, Original & Related. The goal is to get the Date property of the Original database into the Related database and being able to use it there in a calendar. When the date changes in the Original database, it should change in the Related database (and on the calendar) as well. The Rollup #1 property is a rollup on the Date property and uses Show Original, the result of this rollup is text. Select the Calendar View of the Related database and you'll see that you can't select Calendar By on the Rollup #1 property. So how do we get that date in our Related database? The safest way to do this is by using unix timestamps. Unix timestamps indicate a specific point in time, it's the amount of milliseconds that have passed since January 1st 1970, 00:00:00 GMT. This means that every date can be converted into a unix timestamp and back and luckily Notion has functions to do just that.
First, the Date Timestamp property in the Original database is a formula that converts the Date property into a unix timestamp. The Rollup #2 property is a rollup on the Date Timestamp property and uses Show Original, the result of this rollup is again text. Since we know that this text contains a unix timestamp, we can easily convert it back into a number. The Original Date property is a formula that converts the result of Rollup #2 back into a number and then from that timestamp back into a date. You see that the formatting is slightly different, because you can't format a date which is the result of a formula.
Now in the Calendar View of the Related database, you'll see that you can select Calendar By on the Original Date property. Changing a date in the original database also changes it in the calendar instantly.

Aggregated Calendar: Transferring Original

NameRelatedDateDate Timestamp
Record #1   
Record #2   
Record #3   

Aggregated Calendar: Transferring Related

NameOriginalRollup #1Rollup #2Original Date
Related to Record #1    
Related to Record #2    
Related to Record #3    
  • Formulas used
    Date Timestamp formula
    timestamp(prop("Date"))
    Original Date formula
    fromTimestamp(toNumber(prop("Rollup #2")))

3.2 Building an Aggregated Calendar database

This example is a combination of all the techniques in section 1.2, 2.1 and 3.1. In each database where you want to have a date that you want in your calendar, you also add an additional formula property to convert it to a unix timestamp. In the Aggregated Calendar database you create a new entry, give it the name you want to appear in the calendar, a type to identify it and link it to the item with the date(s).
In the example below we again have a Tasks, Appointments and Deadlines database. Each of these has a Calendar Entries property which is a relationship with the Aggregated Calendar database (identical to 2.1). Each entry in the Aggregated Calendar database has multiple rollup properties, using Show Original, for each type of date that can be linked to it, in this case Task Start Date Timestamp, Task Due Date Timestamp, Appointment Time Timestamp and Deadline Date Timestamp. For each of these properties there is a formula property to convert the timestamps back into dates (using the method from 3.1). Then there is a Date property which is a formula that checks which date should be shown on the calendar based on the Type (using the formula from 1.2). You can add all of the rollups from 2.1 as well to get to the same result. The major downside here is that it is pretty complex to set up, you may need to change the logic of the formulas in your Aggregated Calendar database and it doesn't support date ranges.
  • Pros & cons
    โž• Once everything is set up, entering dates in a record automatically adds them to the calendar
    โž• Works with dates and times
    โž• You can have multiple dates per item
    โž– Complex database to set up
    โž– Doesn't work with date ranges
    โž– Requires 2 additional rollup properties for each date you want to transfer to the calendar
    โž– Requires some additional manual work, instead of just entering a date you have to create a new calendar entry, give it a name, type and link it
    โž– Your master calendar database may become cluttered with rollup properties over time (if you choose to use it)

Aggregated Calendar

NameTypeDateTaskAppointmentDeadlineTask StatusTask Start Date TimestampTask Start DateTask Due Date TimestampTask Due DateAppointment LocationAppointment Time TimestampAppointment TimeDeadline ProjectDeadline Date TimestampDeadline Date
Task #1 Start DateTask Start               
Task #1 Due DateTask Due               
Appointment #1Appointment                
Deadline #1Deadline                
Task #2 Start DateTask Start               
Task #2 Due DateTask Due               
Deadline #2Deadline                
Appointment #2Appointment                

Aggregated Calendar: Tasks

NameStatusCalendar EntriesStart DateStart Date TimestampDue DateDue Date Timestamp
Task #1Done   
Task #2Ongoing   

Aggregated Calendar: Appointments

NameLocationCalendar EntriesTimeTime Timestamp
Appointment #1177a Bleecker St. New York, NY 10012 USA  
Appointment #2221B Baker St. Marylebone, London NW1 6XE United Kingdom  

Aggregated Calendar: Deadlines

NameProjectCalendarDeadline DateDeadline Date Timestamp
Deadline #1Project #1  
Deadline #2Project #2  
Updating...

Share on