I recently (finally) started using online appointment scheduling software.

There are many players in this space, but Calendly is the most popular and featureful. It’s awesome—but in order to use it, you have to give it direct access to whichever calendars you want it to check for conflicts.

That means access to all sensitive details like online meeting URLs, attendee information, etc.—and it gives me the creeps. This isn’t unique to Calendly as most booking software works exactly this way. Additionally, Calendly’s free tier is limited in that:

  • You can only connect a single calendar. Connect your work calendar, or home calendar, but not both.
  • You can only have one active “event type”—i.e., a duration that a guest can book with you. For example, a guest could choose to book either 30 min, or 60 min, but not both.

Their cheapest paid plan is $10/mo and relieves those limitations, but I’m still stuck with the core security concern of not wanting to grant Calendly direct access to sensitive details on my calendars. So, I hacked together a scheduler that’s:

  • Zero-knowledge: booking software can’t see sensitive details of events on your connected calendars.
  • Minimally permissive: doesn’t require your IT team at work to grant permission for booking software to access your work calendar.
  • Fast: new bookings immediately show up as time blocks on your work calendar, etc.
  • Free: it’s free.

In total, the setup process probably takes ~30 min. You might not implement this the same way I did (or perhaps even at all), but hopefully this guide will inspire you to be a bit more creative when it comes to securing your sensitive calendar data.

How it works


  1. Home and work calendars share their availability (“busy/free”) status with the central scheduler. The scheduler, in turn, exposes that availability to the booking software so it can check those calendars for scheduling conflicts.
  2. Someone books an appointment in the booking software, which adds an event to the scheduler calendar.
  3. The new booking on the scheduler calendar immediately triggers an automated synchronization script.
  4. The automation adds you as an attendee on the home calendar.
  5. The automation creates a time block on the work calendar.

Booking view

Here’s what a guest sees when booking an appointment with you: scheduler

Scheduler view

After the appointment is booked, here’s what you see in the scheduler:

  • Scheduler is the calendar that the booking software uses to create new bookings.
  • Blocker is a calendar that simply mirrors the Scheduler.
  • Work and Home calendars represent “busy/free” availability windows that the booking software checks for scheduling conflicts.

Blocker view

On the scheduler above, there’s a booking titled “Call with doctor” from 2:15–2:45 PM on Wed 23 Nov. Here’s what that booking looks like when mirrored as a time block on your work calendar. Note that the actual title of the booking is redacted, along with any event details—it simply serves as a time block so your coworkers don’t schedule meetings with you during your booked appointments.

How to set it up

Scheduler: Google Calendar

Create a single-purpose Google account for your scheduler (I’m referring to this account as (scheduler account)@gmail.com below), and create two calendars called Scheduler and Blocker .

Home: Google Calendar

In your home Google account (i.e., not the scheduler Google account you just created above), share your home calendar with the scheduler email address under Settings and sharing > Share with specific people or groups. Your scheduler Google account will get an email with subject “(home email) has shared a calendar with you”; click the “Add this calendar” link in that email. This will show up as the Home calendar in the scheduler view above.

Work: Outlook Calendar

In your work Outlook account, share your work calendar with the scheduler email address under Settings > View all Outlook settings > Calendar > Shared calendars > Share a calendar. Your scheduler Google account will get an email with subject “You’re invited to share this calendar”; click the “Add this calendar” button in that email (you can also try grabbing the URL from “Try adding an Internet calendar and providing this URL,” and add it in Google Calendar in Other calendars > Add > From URL). This will show up as the Work calendar in the scheduler view above.

Booking: Koalendar

Koalendar is a service comparable to Calendly, but it’s free tier doesn’t have limits on calendars and active event types. Calendly also doesn’t let you choose calendars in the “Other calendars” section of Google Calendar, which is necessary for this configuration (it seems they’ve fixed this). Create a new booking page, connect it to your scheduler Google account, and set it up as follows. Now, when guests book an appointment with you, that’ll show up on the Scheduler calendar.

Sync: Google Apps Script

Finally, to synchronize your bookings with your home and work calendars, visit https://script.google.com/home/start, create a new project, and follow these steps. I tested out several different services in an attempt to synchronize calendars, like IFTTT and Zapier—but they either lacked important features, or were too slow and expensive. Apps Script is flexible, fast, free, and fits the bill perfectly.


Paste the following code into the editor:


Click Add Trigger, and make it look like this:

Project Settings

Under Script Properties, set the following properties:

Property Value
schedulerCal Calendar ID of Scheduler .
homeEmail Email that should be added as an attendee on Scheduler events.
blockerCal Calendar ID of Blocker .
workEmail Email that should be added as an attendee on Blocker events.

Calendar IDs can be found by hovering over the calendar name, clicking the kebab menu icon, and looking for Calendar ID under Integrate calendar. Now, when guests book an appointment with you, this Apps Script will automatically:

  • Add your homeEmail as an attendee on the Scheduler event.
  • Create a corresponding time block event on the Blocker calendar, and invite your workEmail as an attendee.