Guides

Why Google Calendar Iframes Don’t Work for Real Booking

The Google Calendar iframe is the first thing most people try when they want to add calendar booking to their website. It looks like it should work. It doesn't. Here's why.

22 January 2026  ·  6 min read
Why Google Calendar Iframes Don’t Work for Real Booking

If you search for how to add Google Calendar to a WordPress site, the iframe embed is usually the first result. Google provides it directly from your calendar settings — you copy a snippet of HTML, paste it into your page, and your calendar appears on your website. It is free, official, and takes about two minutes.

It is also completely useless for accepting bookings.

This is not an edge case or a missing feature that might be added later. The Google Calendar iframe is a display tool. It was never designed to accept appointments, and no amount of configuration will make it do so. Understanding why it falls short is the fastest way to avoid wasting time on it and find something that actually works.

What the Google Calendar iframe actually does

The iframe embed renders a read-only view of your Google Calendar inside an HTML frame on your page. It shows the same calendar grid you see when you log into calendar.google.com — events, colours, and all — but visitors can only look at it. They cannot interact with it in any meaningful way beyond scrolling between months.

That is the entirety of what it does: display your calendar to visitors. Nothing more.

What it cannot do

The list of things the iframe cannot do is the list of things you need for a booking system to function:

  • Accept a booking. There is no button, no form, no way for a visitor to select a time slot and confirm an appointment. Visitors can see when you are busy. They cannot book anything.
  • Collect client details. There is no name field, no email field, no phone number. You have no way of knowing who wants to book or how to reach them.
  • Send a confirmation email. Because no booking is made, no email is sent. The client has no record. You have no record.
  • Create a new event in your calendar. The iframe is read-only. It cannot write anything back to your calendar. Even if a visitor decided they wanted to book a slot, clicking on it just shows the event details — it does not create a booking.
  • Show only available slots. The iframe shows every event on your calendar — including ones that have nothing to do with bookings. Your lunch breaks, personal appointments, internal meetings all appear. Visitors cannot tell which times are open for booking and which are not.
  • Respect your availability rules. There is no concept of working hours, slot duration, buffer time, or minimum notice in the iframe. It simply reflects whatever is on your calendar.

The privacy problem

To embed your calendar publicly, you need to make it accessible to anyone with the embed link. Depending on your privacy settings, this can expose the titles and descriptions of your events to the public.

If your calendar includes personal appointments, client names in event titles, or anything you would not want a stranger to read, the iframe creates a real privacy risk. You can set events to “private” individually, but relying on that discipline across every calendar entry is error-prone.

A proper booking plugin never exposes your calendar events to visitors. It only queries whether a time slot is free or busy — not what the event is called or who it is with.

Why it looks like it should work

The iframe is convincing because it shows the right information. Visitors can see your schedule. You can see it working on the page. It looks like the foundation of a booking system.

The confusion comes from conflating two different things: displaying a calendar and accepting bookings from one. Displaying a calendar requires only that visitors can see your events. Accepting bookings requires a completely different set of capabilities — a form, a booking flow, calendar write access, email sending, and conflict checking.

The iframe handles the first. It does not touch the second.

What happens when people try to use it anyway

The typical outcome when someone embeds the Google Calendar iframe hoping it will serve as a booking tool:

Visitors see the calendar, find a time that looks free, and then have no idea what to do next. There is no book button. Some will email or call — which defeats the purpose of having an online booking system. Most will leave.

The site owner either adds a separate contact form alongside the calendar (now you have two unconnected systems), or eventually replaces the iframe with an actual booking tool after enough visitors complain or disappear.

The iframe is occasionally useful in one specific scenario: when you want to show people a shared team calendar for reference — for example, a community event calendar that visitors check but never interact with. For anything involving actual appointments, it is the wrong tool.

What you actually need

A functioning booking system on a WordPress site needs to do at minimum:

  • Read your Google Calendar’s free/busy data to know which slots are available
  • Present those slots to visitors as a bookable date and time picker
  • Collect the client’s details — name, email, phone, any notes
  • Create a real Google Calendar event when the booking is confirmed
  • Send a confirmation email to the client with the appointment details
  • Notify you that a new booking has arrived

None of these are things the iframe can do. All of them require either a dedicated WordPress booking plugin or a third-party scheduling service.

The alternative: a plugin that uses the Google Calendar API directly

CalNative Booking connects to the Google Calendar API using a service account — a server-to-server credential that gives the plugin permission to read your calendar’s availability and create events when bookings are confirmed.

Visitors see a clean booking widget on your page — date picker, time slot grid, booking form. The available slots are pulled from your Google Calendar in real time. When they confirm, a Google Calendar event is created instantly, a confirmation email with an ICS attachment is sent to them, and a notification is sent to you.

Your calendar events are never exposed to visitors. The plugin only checks free/busy status — it never reads event titles, descriptions, or attendees. There is no privacy risk.

The setup takes about 30 minutes the first time: creating a Google Cloud project, enabling the Calendar API, creating a service account, and uploading the JSON key to the plugin settings. After that it runs without any maintenance.

Summary

The Google Calendar iframe is a display tool, not a booking tool. It shows your calendar to visitors but cannot accept appointments, collect client details, send emails, or create calendar events. For reference calendars it has a use. For booking appointments on a WordPress site, it does not.

If you want clients to be able to book appointments through your website, you need a plugin or service that connects to the Google Calendar API with write access — not an iframe that renders a read-only view of your schedule.

Back to Blog