> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dmly.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Sync Google Calendar and Zoom

> Connect Google Calendar so bookings and external events keep each other honest, and Zoom so bookings get a join link automatically.

Appointments has two separate connections, and they do different jobs. **Google Calendar** keeps your DMLY diary and your real calendar in step, in both directions. **Zoom** puts a join link on bookings. You can connect either one on its own — Zoom works fine with no calendar connected at all.

Both live under **Appointments → Settings → Calendar** and **Integrations → Zoom**.

<Note>
  Zoom does not need Google Calendar. **Google Meet (auto link)** does — the Meet link is created on the calendar event, so with no calendar connected a Google Meet service produces no link.
</Note>

## What syncs, and which way

| Direction              | What moves                                                                                                  | Runs                                                 |
| ---------------------- | ----------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- |
| **Push DMLY → Google** | Your appointments, classes and blocked time become events on the chosen calendar                            | Right after each booking, reschedule or cancellation |
| **Pull Google → DMLY** | Events already in that Google calendar block availability for every staff member, so nobody books over them | Every 5 minutes                                      |
| **Calendar Feed**      | A read-only subscription other apps can follow                                                              | Whenever the subscriber refreshes                    |

Each direction has its own switch, so you can push without pulling or the reverse.

Free/busy from the connected calendar is one of the things DMLY subtracts when it works out open slots — alongside working hours, notice rules, buffers and existing bookings. See [Staff and availability](/appointments/staff-and-availability).

<Warning>
  Deleting a DMLY-created event from Google Calendar **cancels the appointment in DMLY, and the client is not told**. Cancel from DMLY instead, so the cancellation message actually goes out. Classes and blocked time are exempt — DMLY stays the source of truth for those.
</Warning>

## Connect Google Calendar

<Steps>
  <Step title="Open the Calendar tab">
    Go to **Appointments → Settings → Calendar** and select **Connect Google Calendar**.
  </Step>

  <Step title="Authorise the Google account">
    Sign in and grant the Calendar permission. Google treats this as a sensitive permission, so expect a consent screen.
  </Step>

  <Step title="Choose the calendar">
    Pick one under **Calendar to sync**. New bookings land here, and this calendar's free/busy is what closes bookable slots.

    A workspace has a single Google connection, and its events block **every** staff member's availability — not just the account owner's. Connect a calendar that represents the whole business's busy time, not one person's diary: a personal calendar full of dentist appointments will quietly close slots for the entire team.
  </Step>

  <Step title="Set the direction">
    **Push DMLY → Google** and **Pull Google → DMLY** are separate switches. Leave both on for true two-way sync.
  </Step>
</Steps>

**Last synced** and the sync status appear under the switches once the first sweep has run. **Disconnect** removes the connection.

## Connect Zoom

<Steps>
  <Step title="Connect the account">
    Go to **Integrations → Zoom** and select **Sign in with Zoom**. One Zoom account serves the whole workspace.
  </Step>

  <Step title="Set a service's location">
    In **Offerings → Services**, open a Service and set **Location** to **Zoom (auto link)**. This is the switch that matters — Zoom being connected does nothing on its own.
  </Step>
</Steps>

Bookings on those Services now get a Zoom meeting and join link automatically. The link travels in confirmations, reminders and the calendar event.

### What Zoom does over a booking's life

* **Booked** — a meeting is created and the join link is saved on the booking.
* **Rescheduled** — the same meeting moves. The join link does not change, so a client who already saved it is fine.
* **Cancelled** — the meeting is deleted from Zoom.
* **Deleted in your Zoom portal** — if you delete a meeting yourself and the booking is later rescheduled, DMLY notices the dead link and creates a replacement.

<Accordion title="Zoom links for classes">
  A class gets **one** Zoom meeting for the session, and every seat shares it. Seats never get their own personal meeting. See [Classes](/appointments/classes).
</Accordion>

## What breaks it

<Accordion title="Bookings aren't reaching Google Calendar">
  Check, in order: **Push DMLY → Google** is on; the connection still shows as connected. If nothing is connected, bookings still work perfectly — they just live only in DMLY. A calendar error never blocks or undoes a booking; the slot is held in DMLY first and the event is pushed afterwards.

  If the events exist but aren't where you expect them, confirm **Calendar to sync** points at the calendar you're watching — an unset or changed selection sends events to the Google account's primary calendar instead.

  If the Service is pointed at its own calendar rather than the workspace one, its bookings go there instead.
</Accordion>

<Accordion title="Bookings on a pay-before service never appear">
  A Service set to **Pay before booking** holds the slot for 15 minutes without pushing anything. No calendar event, no Zoom meeting, no confirmation — until the payment clears. If it never clears, the hold expires and nothing was ever pushed. This is working as intended. See [Appointment payments](/appointments/payments).
</Accordion>

<Accordion title="Sync stopped, then started again by itself">
  Google expires the token DMLY uses to track changes. When that happens DMLY clears it, flags the status, and does a full resync on the next sweep — within about five minutes. No action needed.

  A status of `error` is different: something went wrong and stayed wrong. Check the connection is still authorised, and see [Logs](/troubleshooting/logs).
</Accordion>

<Accordion title="A booking has no Zoom join link">
  Zoom wasn't connected when the booking was made, or the Service's **Location** isn't **Zoom (auto link)**. Without a link, `{{meeting.link}}` falls back to the location label — so the client gets a message that reads oddly rather than a broken link.

  Connecting Zoom afterwards doesn't backfill existing bookings, but rescheduling one will create its meeting.
</Accordion>

<Accordion title="Google events aren't blocking my slots">
  Check **Pull Google → DMLY** is on and that the events are on the calendar chosen in **Calendar to sync** — DMLY only reads the one calendar. The sweep runs every 5 minutes, so a just-added event isn't instant.
</Accordion>

## Calendar Feed

**Appointments → Settings → Calendar** also offers a **Calendar Feed** — a URL you can subscribe to from Google Calendar, Outlook or Apple Calendar to see appointments and classes. It is **read-only and one-way**: changes made where you subscribe never come back to DMLY.

<Warning>
  **Regenerate URL** invalidates the old link. Anyone already subscribed silently stops receiving updates until you send them the new URL.
</Warning>

<Columns cols={2}>
  <Card title="Services" icon="list-check" href="/appointments/services">
    Set duration, location and booking policy.
  </Card>

  <Card title="Staff and availability" icon="user-clock" href="/appointments/staff-and-availability">
    Working hours, time off and how slots are worked out.
  </Card>

  <Card title="Appointment payments" icon="credit-card" href="/appointments/payments">
    Pay before, pay after, and what holds a slot.
  </Card>

  <Card title="Integrations" icon="plug" href="/integrations/overview">
    Everything you can connect to your workspace.
  </Card>
</Columns>
