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

# Built-in calendar

> Famulor's built-in scheduling engine for booking appointments during calls — no external calendar account required

Famulor ships with a complete scheduling system of its own: event types with their own weekly availability, an embeddable public booking page, optional sync with a real calendar, and a signed webhook on every booking. Assistants book against it mid-call like any other provider. The external providers — Cal.com, Calendly, Acuity Scheduling, eTermin, HighLevel — are on [Calendar & booking](/assistants/calendar-booking).

## The native calendar

**Native** is Famulor's own booking engine — built directly into the platform rather than a third-party product you sign up for, and listed alongside the other calendar providers in [Providers at a glance](/assistants/calendar-booking#providers-at-a-glance). There's no external account, no API key, and no OAuth consent screen: define an [event type](#the-built-in-booking-engine) with its own weekly availability and it's immediately ready to assign to an assistant.

<Note>
  Native runs on the same **Calendar integrations** plan feature as every other provider listed under [Providers at a glance](/assistants/calendar-booking#providers-at-a-glance) — it is not a separate paid add-on on top of Cal.com or Calendly. Your plan still has to include that feature before you can create any event type or integration, native ones included. See [Plan gating](#plan-gating).
</Note>

An assigned native event type gets the same `check_availability` and `book_appointment` tools as any other integration, with no third-party API in between: slots come straight from the event type's own availability windows, buffers, and notice rules. Native is also one of only two providers — Acuity is the other — whose assistants can find, cancel, and reschedule an existing appointment, and the only one of the two that needs no external account for it. See [Assigning to an assistant](/assistants/calendar-booking#assigning-to-an-assistant) for the full tool list.

### Calendar connections

Native works standalone on just its own weekly-availability rules, or you can connect a real calendar so its busy times are respected and — for most connection types — confirmed bookings get written back to it. Connect Google Calendar and Outlook under **Booking → Integrations**; add CalDAV or an ICS feed under **Booking → Event types → Calendars**. Either way, pick the connection on the event type's own **Calendars** field to actually use it.

| Connection                  | What it does                                                                                                                                                                     | Setup                                                                                                                                                                                                                     |
| --------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Google Calendar**         | Free/busy, plus creates and deletes the booking as a calendar event with an attendee invite                                                                                      | OAuth connect (one time)                                                                                                                                                                                                  |
| **Outlook / Microsoft 365** | Free/busy, plus creates and deletes the booking as a calendar event with an attendee invite                                                                                      | OAuth connect (one time)                                                                                                                                                                                                  |
| **CalDAV**                  | Free/busy, plus creates and deletes the booking as a calendar event — no attendee invite from the server, so the guest relies on the booking engine's own ICS confirmation email | Server URL + username + app password — presets for **Apple iCloud**, **Fastmail**, and **Nextcloud**, plus **Custom** for Zimbra, Baïkal, or any other CalDAV server; the calendar collection is discovered automatically |
| **ICS feed**                | Free/busy only — read-only, nothing is ever written back                                                                                                                         | A secret ICS/iCal URL (`webcal://` accepted), e.g. Google Calendar's "Secret address" or Outlook's "Publish calendar"                                                                                                     |

## The built-in booking engine

Create event types under **Booking** in the dashboard (or via API/MCP):

* **Name, slug, duration** — the slug is unique within the workspace and becomes part of the public booking-page URL shown in the editor.
* **Weekly availability** — time windows per weekday in the event type's timezone, e.g. Mon–Fri 09:00–17:00.
* **Buffers & rules** — buffer before and after each booking, minimum notice, how far ahead customers may book, and slot increment.
* **Calendar sync** (optional) — link a [connected calendar](#calendar-connections). Google, Outlook, and CalDAV connections have their busy times subtracted from the offered slots and get confirmed bookings pushed back as calendar events; on Google and Outlook the guest is added as an attendee, so the provider sends its own invite as well. An ICS feed only contributes busy times.
* **Host confirmation** — the guest always gets a confirmation email with an ICS invite. A second copy goes to the host: the Add-to-calendar account, a custom organizer email, or the event-type owner if no calendar is selected.

### Public booking page & embed

Each active event type has a tenant-branded public page at `https://<your-domain>/book/{workspace}/{slug}` — no login required. Its **Public link & embed code** button in the event type list copies a ready-made iframe snippet for your own site, together with the small script that resizes the frame to fit its content. Embed it anywhere:

```html theme={null}
<iframe src="https://<your-domain>/book/acme/intro-call"
        style="width:100%;min-height:640px;border:0" loading="lazy"></iframe>
```

Visitors pick a slot in their own timezone, enter name and email, and receive a **confirmation email with an ICS calendar invitation** plus a cancellation link. The configured host receives a matching **New booking** email. If two people choose the same slot at once, only the first booking succeeds and the other visitor is asked to choose another time.

### Booking from calls

Connect the built-in booking engine to an assistant to place mid-call bookings in the same calendar and link them to the related call. You assign it exactly like an external provider — see [Assigning to an assistant](/assistants/calendar-booking#assigning-to-an-assistant).

### Webhooks

Give an event type a **Webhook URL** and Famulor notifies it whenever a booking on that event type is created, cancelled, or rescheduled. Saving the URL reveals a **Webhook signing secret** — shown once, so copy it before leaving the page.

Each delivery is a `POST` of `booking.created`, `booking.cancelled`, or `booking.rescheduled`, signed with an HMAC-SHA256 of the raw body in `X-Famulor-Signature: sha256=<hex digest>`. The `data` object carries `booking_id`, the event type's `event_type_id`/`event_type_slug`/`event_type_name`, `invitee` (`name`, `email`, `phone`, `timezone`), `start_time` and `end_time` (plus `previous_start_time` on a reschedule), `status`, `source` (`web`, `call`, or `api`), the originating `call_id` when the booking came from a call, and free-text `notes`.

See [Receive webhooks](/api-reference/integration-examples#receive-webhooks) for a full server example, including signature verification.

## Plan gating

Your plan must include **Calendar integrations** — the same plan feature that gates the external providers on [Calendar & booking](/assistants/calendar-booking). Without it, you cannot create event types, and public booking pages do not accept new bookings.

## API & MCP

Everything above is available in the [public REST API](/api-reference/introduction) and as MCP tools at `https://<your-domain>/mcp`. Provider integrations (Cal.com, Calendly, Acuity, eTermin, HighLevel) and assigning any calendar to an assistant are covered in [Calendar & booking](/assistants/calendar-booking).

`GET /api/v1/bookings` and `list_bookings` support event type, source and date filters. Use `view=upcoming|unconfirmed|recurring|past|cancelled` for the same booking views as the dashboard, or use an exact `status` filter; `view` and `status` are mutually exclusive.

| REST                                                                                        | MCP tool                                                                                                         | Scope                 |
| ------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | --------------------- |
| `GET/POST /api/v1/booking-event-types`, `GET/PATCH/DELETE /api/v1/booking-event-types/{id}` | `get_booking_event_types`, `create_booking_event_type`, `update_booking_event_type`, `delete_booking_event_type` | `bookings:read/write` |
| `GET /api/v1/bookings`, `GET /api/v1/bookings/{id}`, `POST /api/v1/bookings/{id}/cancel`    | `list_bookings`, `get_booking`, `cancel_booking`                                                                 | `bookings:read/write` |

Cancelling a booking sends a `METHOD:CANCEL` ICS update, so the appointment disappears from the invitee's calendar automatically.
