Welcome to Rebuilt in Notion, a series where we try to replicate specific workflows or complete apps inside of Notion. To kick things off, we’re tackling Calendly. Calendly is a powerful meeting scheduling platform that takes the hassle out of arranging meetings. You set up your availability, sync it with your calendar and share your Calendly link with others. They can then view your availability, book a meeting, and Calendly creates and shares the meeting link with both parties. Pretty cool, right? Well, it would be even cooler if we could do all of this in Notion. So in this blog post, you’ll learn how to build a fully automated booking system in Notion.
Keep reading for step-by-step instructions, watch the video if you want to build along or scroll to the bottom of this post to download this free Notion template.
Building an automated meeting booking tool in Notion
Before diving into the nitty-gritty of the setup, let’s get a clear picture of the overall system and what you’re trying to achieve.
People will see a booking page where they can view your availability and book a meeting. They’ll fill out a form with their name, email, and desired meeting time. This information will automatically create an entry in your Booking Database and share a Google Meet link with both parties.
Notion will of course be the backbone of our tool, but we need to enlist the help of a few additional tools to help us get there. We need a form builder to take the input, a meeting tool for the video conferencing and an automation tool to tie everything together.
Tally will be used to create the forms and embed them in Notion.
Google Meet or Zoom are the easiest pick for conferencing.
And when it comes to building the automations, you’ll leverage the power of Make to integrate everything with Notion.
First, Make will automatically set up your weekly availability. When someone submits a Tally form selecting a time slot, Make will create an entry in your Booking Database and generate and send the meeting link to you and the attendee.
Additionally, Make will hide that particular time slot from your weekly availability so others don’t select a booked time. You’ll even customise the Make integration to ensure that if someone accidentally selects an already booked slot, it won’t create or share the meeting link.
In case you don’t know, Make is a powerful automation platform that lets you create complex workflows across multiple apps. For instance, you can connect Notion with apps like Airtable, Gmail, Slack, and Stripe, enabling advanced tasks and workflows that would be a nightmare to handle manually. There’s a ton of fun stuff you can do with it – for example Notion Push Notifications on your phone.
So, let’s start building a Calendly-like booking system inside your Notion workspace. First, it’s time to create the Notion pages and databases.
Step 1: The Basic Setup for a Booking System in Notion
To make sure everything runs smoothly, you’ll need two databases: The Availability database, where people can see open slots, and the Bookings database, where all your meetings will be logged.
In your Availability database, here’s what you’ll need:
- Name (Default Text property)
- TimeSlot (Date property)
- Blocked? (Checkbox property)
- Bookings (Relation property linked to Bookings database)
- Display: Time (Formula property)
- Clean Date (Formula property)
Now, let’s fill in those formula properties that you’re going to need later! First, for Display: Time, here’s the Notion formula:
dateStart(Timeslot).formatDate(“HH:mm”)+ “ – ” + dateEnd(Timeslot).formatDate(“HH:mm”)
This formula ensures your meeting times look neat in a 24-hour format. And, for the Clean Date, use this formula:
Timeslot.formatDate(“DD-MM-YYYY”)
With these tweaks, your Availability database is all set up and ready to go!
Now, onto the Bookings database. Here, you’ll need the following properties:
- Name (Default Text property)
- Email (Email property)
- Availability (Relation property linked to Availability database)
- Chosen Date (Date property)
- Chosen Time (Text property)
- Error? (Checkbox property)
- Clean Date (Formula property)
For the Clean Date property, use this formula:
Chosen Date.formatDate(“DD-MM-YYYY”)
With these databases and Notion Formulas in place, your Bookings and Availability database are all set for the next step!
You will get the purpose of each property, once you start to build the system. Things will definitely make sense then. So, bear with me in this journey and let’s create something amazing together.
Step 2: How to set your Availability
To automate the process, you’ll need a Make account. Luckily, you can build this whole automation for free since Make offers a generous free plan. So, head over to Make.com and create a free account.
Once you have a Make account, go to the Scenarios tab and click on ‘+ Create a new scenario’. You’ll see the basic interface where you can build any kind of workflow and automation.
Now, let’s tackle each step of the automation one by one.
Remember how I mentioned that visitors will see your weekly availability on the Booking page? You’re going to set that up using Make.
To automatically create the availability slots, click on the big purple plus icon and select Tools, then choose Set Multiple Variables.
For this scenario, you’ll be creating 4 variables:
- Duration of each meeting slot (30 Minutes)
- Time available for the day (2:00 PM to 6:00 PM)
- Total number of slots that can be fitted in the available time frame (8)
- Minutes (Set 0)
Now, let’s set these variables one by one.
Under Variables, click on Add item. First, define the duration of each slot as 30 minutes. So, under Variable name, type Duration, and under Variable value, type 30.
Typically in the Calendly app, you can set the time of the day you’ll be available for the meeting. That’s why in this setup, you need to specify the start time of the availability. In this case, it will be 2:00 PM. So, click on Add item again to create another variable: Start with a value of 14 (indicating 2:00 PM).
Now, set the total number of slots available. Since you have two 30-minute slots each hour and for four hours, it’ll be a total of 8 slots. Create a variable named Slots and set the value to 8. For the Minutes variable, just set it as 0.
With your meeting parameters set, let’s move on to the next step. But before that, add a dummy entry (The First available date) to your Notion page with the availability database. This will help us test the automation in Make.
Next, go back to Make and click on the plus icon next to the Tools module. Select Notion from the list of modules. Then, under Database/Page, choose Search Objects.
If you’re new to Make, you’ll need to connect your Notion workspace. Click on Add under Connections and follow the steps. It’s straightforward. Just make sure to select the pages containing the Booking page, Availability, and Bookings database.
If you connected Make to Notion previously, then make sure to share these specific databases with the integration.
To do that, go to the Booking page and click on the 3-dot menu in the top-right area. From the panel, under connections, you should see Make. If not, click on Connect to and select Make. Now you should be good to go.
(remember to keep the authorised pages to a minimum to stick to the best practices for security in Notion)
Back in Make, select the correct workspace under Connections. Then, under Database ID, type Availability. If your Notion workspace is already connected, it should automatically fetch the Availability database.
With the Search Objects module, you’ll find the latest item in the Availability database using the Sort option. Under Sorts, set it up to find the latest item:
- Select a field to sort: Property Field
- Property Field: Timeslot (Date)
- Direction: Descending
- Limit: 1
You can test this by saving the scenario and clicking on Run Once. If everything is set up correctly, it should work smoothly.
Now, you’ll use a repeater to repeat the process. Add another module — Flow Control > Repeater. Set it up with:
- Initial value: 1
- Repeats (Number of repeats): Choose Slots from the Tools module (multiple variables)
This tells Make to repeat the process based on the number of slots. So, if you have 8 slots, Make will repeat the process 8 times.
See the image below to have a better understanding.
After that, add another Tools module and choose Get Multiple Variables. Set up the following variables:
- Variable name 1: Start
- Variable name 2: Minutes
Make sure the variable names (Start and Minutes) match exactly with the first Tools module.
I know, it’s quite a complex system, but things should get clearer as you build it out. If you have any doubts, please refer to the video tutorial – sometimes it helps seeing things in action!
Now, add another module. This time, it’ll be Notion > Create a database item. Search for Availability as the database, and it should fetch all the properties.
Once you see all the properties, it’s time to add some values to each property.
For the Name property, type Slot (to have Slot 1, Slot 2, Slot 3, and so on), then from the left items panel, select the green-boxed 1 under Flow Control Repeater.
Next, you need to add the Start and End Time. The goal is to find the date of the most recent database entry and create a new entry with the following date and duration (based on your pre-fixed criteria).
For the start time, go to the Date and Time tab and click on addDays. Put your cursor before the semicolon (;) and go to the first tab of the panel. Look for Properties Value and inside, select Time Slot > Start. After that, put your cursor after the semicolon and put 1.
Now, cut (Ctrl/Cmd + X) the whole value, go to the Date and Time tab again, and click on setHour. Paste the previously copied value before the semicolon, and after the semicolon, select Start (from the first tab) from the latest Tools variable (Not the first one).
Repeat this process again for the Minutes (from the latest Tools module). Cut the entire value again and choose setMinute (From the Date and time tab), paste the copied value before the semicolon, and after the semicolon, select Minutes (Latest tools module).
The value for the start date should look something like this:
setMinute( setHour( addDays( 2. Properties Value: Timeslot: Start; 1); 4. Start); 4. Minutes)
Now you need to set the End Time. This time, you’re not only adding the next available date and time but also the duration of the time slot.
First, copy the entire value from the Start Time. Then, put your cursor in the End Time field, and select addMinutes from the Date and Time tab. Before the semicolon, paste the copied value (From the Start Date). After the semicolon, you’ll add the Duration variable of the meeting. So, go to the first tab, and under the first Tools module (look at the end of the list), click on Duration variable. So, the value for the end date should be something like this:
addMinutes( setMinute( setHour( addDays( 2. Properties Value: Timeslot: Start; 1); 4. Start); 4. Minutes); 1. Duration)
Now, select Yes for the Include Time option, and you’re good to go.
Before you test your automation, add another module — Tools > Set Multiple Variables. Here you need to set 2 Variables — Start and Minutes.
For the first variable, set the Variable name as Start and add the following formula for the Variable value:
formatDate( 7. Properties Value: Timeslot: End; HH)
Make sure to use two uppercase ‘HH’ at the end instead of lowercase ‘hh’. Lowercase ‘hh’ will set the value from 1 to 12 (12 Hours system), whereas HH will set the value from 1 to 23 (24 Hours system). This will avoid setting the meeting time super early in the morning.
Now for the second variable, set the Variable name as Minutes and add the following formula for the Variable value (like the previous step):
formatDate( 7. Properties Value: Timeslot: End; mm)
To test this core automation, press the save icon below or press (Ctrl/Cmd + S) and click on Run Once. Now go back to Notion, and if you set everything up the right way, you should see all the time slots for a day in your availability database (a total of 8 meeting slots).
So far, the core automation is ready. However, you don’t want to have a meeting every single day, right? You need some off days when people can’t book any meetings.
To do so, you’re going to use the Router module to set some logic — depending on the days of the week, it will either create the available slots for the day or create an entry labeled as Booked.
To add a router, click between the Notion (Search object module) and the Repeater and select + add a router. It will click logic paths — one for creating the meeting slots (the core automation) and the other one is to block the off days.
For blocking off days, click on the plus icon and select Notion > Create a Database item. Set the parameters as follows:
- Database ID: Availability database
- Name: BLOCKED
- Start Time: addDays( 2. Properties Value: Timeslot: Start ; 1)
- Blocked? (Checkbox property): Yes
This will create a database entry named BLOCKED, with the next day’s date, and mark the Blocked? checkbox property.
That way, Make knows which entry to create for the Blocked days. Now, you need to set when to add the blocked days. Let’s say you only want to have meetings on weekdays (Monday to Friday), not weekends (Saturday and Sunday).
To set that, click on the gear icon of the blocked days logic. Set the label as Blocked Day. Now, add the condition for this logic:
- Condition: formatDate( addDays( 2. Properties Value: Timeslot: Start; 1); d)
This formula will look at the most recent entry of the Availability database and get the next date in days (Sunday, Monday, etc.). But instead of getting the value as text, the lowercase ‘d’ will output the day as a numeric value where 0 is Sunday and 6 is Saturday.
Now, click on Text operators: Equal to and select the Numeric operators: Equal to logic option. For the value, type 0 (Numeric Zero means Sunday).
Next, click on Add OR rule and add the following values (similar to the previous step):
- Condition: formatDate( addDays( 2. Properties Value: Timeslot: Start; 1); d)
For the value, instead of using zero this time, put 6 (Saturday) here.
With this setup, Make will automatically add blocked days for weekends, ensuring no meetings are scheduled on Saturdays and Sundays.
For the other route option, label it Call Days or Active Days and select Yes as the fallback route. This ensures that if the conditions for blocked days are not met (i.e., it’s not a Saturday or Sunday), it will proceed with creating availability slots for active days.
This way, the router will first look at the next day. If the next day is Saturday or Sunday, it will create a BLOCKED entry in the Availability database. Otherwise, the fallback route (the Call Days) will be activated and create the timeslots for the day.
Till now, you’ve built the automation to create timeslots for the weekdays or create a Blocked entry for the blocked days. However, you don’t want to click on Run once every single day to create the timeslots for the call days or blocked entries for the weekends, right?
To automate this part, add another Repeater module to the flow. This time, it will be at the beginning of the flow. Right-click on the empty canvas and select Repeater. Set 1 as the initial value and for the number of repeats, use any number you like.
I recommend using 30 or 31 for this. So the scenario will be repeated for 30/31 days, creating the time slots and the blocked days for the entire month. Of course, you can use the Schedule Settings to repeat this indefinitely.
So, here you go. You now have the Availability database containing all the available time slots for the entire month. You can further customise the parameters of those, like the time of the day, number of slots, duration, and also how many days you’ll accept bookings.
In the next part, you’ll be creating your Booking page visible to clients or anyone you intend.
Step 3: How To Create A Booking Page For Clients in Notion
Start by creating a new page and naming it Booking Page. Inside this page, create two columns. One is for the Booking form (Tally), and the other column is for showing the Availability for the week.
In the availability column, create a linked view of the Availability database. Set the following options for the layout:
- View: Calendar view
- Show calendar as: Week
Also, from the properties option, turn on the Display Time (formula) property to show the time of the meeting slots.
One more thing before we proceed to the next step — you need to add a filter to your Availability database to show only the time slots that are not booked. To do this, add the filter: Where Bookings (relation property) is Empty. This will remove the slots that are already booked.
Now, let’s create a form for the booking page where anyone can book a meeting with you.
This time, you’ll be using another tool — Tally. Tally is an online form builder where you can create beautiful forms and collect responses quickly and easily. It’s quite similar to Notion, so easy to learn and use. And the best part? They have an awesome free plan.
So, create a free account on Tally and start a new form. For the form title, you can name it “Book a call with me”. To insert a block, type “/” (Like Notion) and select Questions + Short Answer.
In the Type a question field, you can add your question. In this case, it can be “What’s your name?”. Similarly, add another block and choose Question + Email. For the question here, you can add “What’s your email?”
You need to add two more blocks here — Which day? and What timeslot?
For the “Which day?” question, choose Question + Date block, and for the “What timeslot?” question, choose Question + Multiple Choices. For the options, you need to add your available time slots for the days. The overall page should look something like this:
Now, click on the Publish button, and from there, click on Copy to copy the Share Link. Go back to the Notion Booking page and paste (as embed) under the booking column.
You now have a beautifully created Booking form where anyone can book a meeting with you (Left Side) based on your weekly availability (Right Side).
However, it’s not functional yet. Although anyone can submit the responses, it won’t be carried over to Notion yet. So, you need to use Make again to fetch responses from Tally to Notion.
Excited? Let’s proceed.
Step 4: How To Connect Tally And Notion Using Make
So far, you have automated the creation of your weekly availability and created the Tally forms to submit booking requests.
Now, in this step, you’ll be using the Make app again to:
- Create a database item based on the form submission
- Connect the submitted bookings to the available time slots in Notion
Open the Make app and create a New Scenario. Name it Tally x Notion. Now, click on the big purple plus icon and search for Tally. From there, select the Watch New Responses option.
After that, click on the Create a Webhook button, and in the popup window, add the following parameters:
- Webhook name: New Booking Request Calendly (or anything you want)
- Connection: Connect your Tally account here (like you’ve done for Notion previously)
- Form ID: Book a call with me (Select the Tally form created for this tutorial)
Click on the Save button and you’re good to go. Before going to the next step, it’s a good idea to test the webhook. Just save the scenario, click on Run once, and submit a response on the Booking page. You should be able to inspect the values on the magnifying icon of the Tally module.
It’s time to create database items based on the Tally responses. Click on the plus icon to add another module — Notion > Create a Database Item.
As your Notion is already connected to Make, just search for Bookings in the Database ID, and it’ll fetch all the properties of the database.
Now, it’s time to map the Tally responses to your Booking database. To map the responses, go to the side panel, and under Fields by ID, select the one based on your database properties:
- Name: Fields by ID: What’s your name?
- Start Time: Fields by ID: Which day?
- Email: Fields by ID: What’s your email?
- Chosen Time: Fields by ID: What Timeslot?
With this module, whenever someone submits a response, it will create a database entry in the Bookings Database based on the form responses.
However, you still need to connect the Bookings database entry to the relevant time slots of the Availability database.
Now, add another module. This time it will be Notion > Search objects. Search for the Availability database and add a filter like the following:
Clean Date (Formula) Formula: String – Equals 2. Properties Value: Clean Date: String
After that, click on Add AND Rule to add another filter:
Display: Time (Formula) Formula: String – Equals 2. Properties Value: Chosen Time: Plain Text
Click OK to save it. With this, Make will look at the Availability database and search for the entry where the Clean date and Display: Time match exactly with the Clean Date and Chosen Time of the newly created Bookings entry (from the Tally response).
Now, you need to add another module — Notion > Update a Database item. Search for the Availability database in the Database ID. In the Bookings field, toggle on Map and select Database ID (from the Create a Database item Notion module).
So, whenever Make finds the date and time similarities, it will connect the entry from the Bookings database with the relevant time slot from the Availability database (using Notion relation).
It’s really amazing how much we can do with the help of Make and Notion API, right?
Step 5: How To Handle Duplicate Bookings
The system is nearly set up. Now anyone can book a meeting within your specified time slots. But what if two individuals book meetings for the same time? Even though the Availability database filters out unavailable slots, mistakes can happen resulting in double bookings. How can this be managed?
To prevent accidental double bookings, add an extra filter in the Notion Search Object module. Click on Add AND Rule and apply the condition: Bookings (Relation) Relation: is empty (Boolean) is set to True. You’ll find the True option under the General Functions tab. This adjustment ensures that a new Tally response only creates a booking if the corresponding Booking relation property is empty.
Next, use a router to handle duplicate bookings without issue. After the Notion Search Object module, insert a router by clicking the large plus icon and selecting Notion > Update a Database Item. Here, set the Database ID to the Bookings database and configure the following:
- Database Item ID: Retrieve the Database Item ID from the Notion Create a Database Item module.
- Error?: Mark as Yes
Additionally, set a filter for the Error route by clicking the Wrench (????) icon and labeling it Already Booked?. Define the condition as Page ID Basic operators: Does not exist. Utilize the other route as a fallback option, labeled as Booking Worked.
Step 6: Automatically Create and Share a Meeting
With your booking automation set up flawlessly, it’s time to tackle the final step of this system—automatically creating a Google Meet meeting and sharing the link with all parties involved. Let’s dive in!
Within the Tally and Notion integration scenario, after the Booking Worked route, add another module by clicking the plus icon and selecting Google Meet > Create a Meeting. If not already connected, link your Google Meet account and choose your preferred calendar from the Calendar dropdown. Then, populate the required fields as follows:
- Event Name: Meeting
- Start Date: Properties Value: Timeslot: Start
- End Date: Properties Value: Timeslot: End
- Send notification about the event creation: None
Click Ok to save the settings. Following this, add another module—Email > Send an Email. Opt for the built-in email option as it’s simpler to set up compared to Gmail.
Now, connect your email by clicking on Add and follow the instructions to connect your Email. Or, if already connected, select from the connected options. Under To, click on Add a recipient and input the email address from the Tally response or the Notion Bookings database. You may also include your email address as recipient 2 if you wish to receive the link as well.
For the other fields, feel free to customise them as desired. However, for the Email content, select HTML as Content Type and insert the following HTML text in the content box:
<p>Booking confirmed!</p>
<p>Here is your meeting link: 9. HTML Link</p>
<p>Date: Properties value: Clean Date: String</p>
<p>Properties value: Chosen Time: Plain Text</p>
<p>See you there!</p>
Of course, you can tailor the message to your preference. Ensure that you’re using the HTML Link (Google Meet Link) from the Google Meet Module.
And there you have it! You’ve replaced Calendly with a fully automated booking system integrated seamlessly into your Notion workspace. Simply share the link to your Booking page, and others can effortlessly schedule meetings with you at your predefined available time slots. Isn’t it remarkable?
Grab Your Free Notion Template
Here you have it! You just rebuilt a $3B App inside Notion. Quite amazing, right?
Sure, you could just use Calendly and have something that works out of the box – but where’s the fun in that? Not only do you have the joy of building things yourself but also you get to tailor it based on your own needs. Besides, having everything in Notion keeps everything seamlessly connected in one place.
And now that you’re done with this, why not check out my other advanced Notion tutorials? You could start adding advanced Project Management Insights in Notion for example.
You can download this Notion Template plus another 21+ other free templates here: