> For the complete documentation index, see [llms.txt](https://docs.coupler.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.coupler.io/sources/category/time-tracking/cal-com.md).

# Cal.com

Connect Cal.com to Coupler.io and pull booking data, event types, and availability into Google Sheets or BigQuery for scheduling analytics.

Cal.com is an open-source scheduling platform that lets you create booking pages, define your availability, and manage meetings across multiple calendar integrations. It's used by individuals and teams to automate appointment scheduling without the back-and-forth.

Connecting Cal.com to Coupler.io lets you pull your scheduling data into spreadsheets, dashboards, or AI tools — so you can analyze booking trends, audit your availability setup, or build reports around meeting activity.

## Why connect Cal.com to Coupler.io?

* **Centralize scheduling data** — combine bookings, event types, and availability into a single report
* **Track booking trends** — see which meeting types are most popular and when people book
* **Sync to your destination of choice** — send data to Google Sheets, BigQuery, Looker Studio, or AI tools like ChatGPT or Notion
* **Combine with other sources** — use Append or Join transformations to merge Cal.com data with CRM or project management data

## Prerequisites

* A Cal.com account (free or paid)
* A Cal.com API key (available in your Cal.com settings under **Developer** → **API Keys**)

## Quick start

{% hint style="success" %}
If you want a full picture of your scheduling activity, add both the **Bookings** and **Event types** entities in the same data flow and use a Join transformation to connect them by event type ID.
{% endhint %}

## How to connect

{% stepper %}
{% step %}
**Create a new data flow in Coupler.io.** Log in to Coupler.io, go to the Data flows section, and click **Add data flow**.
{% endstep %}

{% step %}
**Select Cal.com as your source.** Search for Cal.com in the source list and select it.
{% endstep %}

{% step %}
**Enter your API key.** In your Cal.com account, go to **Settings → Developer → API Keys**, generate a new key, and paste it into the API key field in Coupler.io.
{% endstep %}

{% step %}
**Choose an entity.** Select the data entity you want to import — for example, Bookings, Event types, or Schedules. You can add more entities to the same data flow later.
{% endstep %}

{% step %}
**Choose a destination.** Select where you want your data to go — Google Sheets, Excel, BigQuery, Looker Studio, or an AI destination like ChatGPT, Claude, or Gemini.
{% endstep %}

{% step %}
**Run the data flow.** Click **Run** to execute a manual run and confirm your data loads correctly.
{% endstep %}
{% endstepper %}

## Cal.com data overview

Cal.com gives you access to six entities through Coupler.io, covering everything from your personal profile and availability setup to individual bookings and conferencing integrations.

## Available entities

| Entity        | What it contains                                                     |
| ------------- | -------------------------------------------------------------------- |
| Bookings      | Scheduled meetings with attendee info, timing, and booking responses |
| Event types   | Meeting templates — duration, slug, location type, and visibility    |
| Schedules     | Weekly availability windows and time slot configurations             |
| Calendars     | Connected calendar accounts and their integration status             |
| My profiles   | User profile: name, username, email, timezone, and avatar            |
| Conferencings | Conferencing tools linked to the account (Zoom, Meet, etc.)          |

## Bookings

#### Fields

| Field           | Description                                        |
| --------------- | -------------------------------------------------- |
| `id`            | Unique booking identifier                          |
| `uid`           | Public-facing unique ID for the booking            |
| `title`         | Meeting title                                      |
| `start_time`    | Scheduled start date and time                      |
| `end_time`      | Scheduled end date and time                        |
| `status`        | Booking status: `accepted`, `cancelled`, `pending` |
| `attendees`     | Names and emails of attendees                      |
| `event_type_id` | ID of the event type used for this booking         |
| `location`      | Meeting location or conferencing link              |
| `description`   | Notes or custom questions answered at booking      |
| `created_at`    | When the booking was created                       |

## Event types

#### Fields

| Field                  | Description                                                    |
| ---------------------- | -------------------------------------------------------------- |
| `id`                   | Unique event type identifier                                   |
| `title`                | Display name of the event type                                 |
| `slug`                 | URL-friendly identifier used in booking links                  |
| `length`               | Duration in minutes                                            |
| `hidden`               | Whether the event type is publicly visible                     |
| `locations`            | Allowed meeting locations (Zoom, Google Meet, in-person, etc.) |
| `description`          | Event type description shown to bookers                        |
| `require_confirmation` | Whether bookings require manual approval                       |

## Schedules

#### Fields

| Field          | Description                                 |
| -------------- | ------------------------------------------- |
| `id`           | Schedule identifier                         |
| `name`         | Schedule name                               |
| `timezone`     | Timezone the schedule is set in             |
| `availability` | Day-by-day time slot configuration          |
| `is_default`   | Whether this is the user's default schedule |

## Calendars

#### Fields

| Field         | Description                                             |
| ------------- | ------------------------------------------------------- |
| `integration` | Calendar type (e.g., `google_calendar`, `office365`)    |
| `name`        | Calendar display name                                   |
| `external_id` | External calendar account identifier                    |
| `is_selected` | Whether this calendar is used for availability checking |

## My profiles

#### Fields

| Field      | Description                |
| ---------- | -------------------------- |
| `id`       | User ID                    |
| `name`     | Full name                  |
| `username` | Cal.com username           |
| `email`    | Account email              |
| `timezone` | User's configured timezone |
| `avatar`   | Profile image URL          |

## Conferencings

#### Fields

| Field      | Description                                          |
| ---------- | ---------------------------------------------------- |
| `type`     | Integration type (e.g., `zoom_video`, `google_meet`) |
| `app_data` | App-specific connection details                      |

## Common field combinations

* **Booking volume analysis** — use `start_time`, `status`, and `event_type_id` to see how many bookings each event type generates over time
* **Cancellation tracking** — filter `status = cancelled` and group by `event_type_id` or date to identify drop-off patterns
* **Availability auditing** — combine Schedules and Calendars to verify that availability is set correctly across time zones and integrations
* **Attendee reporting** — flatten `attendees` from Bookings to build a contact list of everyone who has booked with you

## Use cases by role

{% tabs %}
{% tab title="Sales teams" %}

* Pull Bookings data into Google Sheets or a CRM pipeline to track how many discovery calls are scheduled and completed each week
* Use the `status` field to monitor no-shows and follow up automatically
* Join Bookings with Event types to see which meeting format (demo, intro call, check-in) drives the most conversions
  {% endtab %}

{% tab title="Operations" %}

* Audit Schedules and Calendars to make sure team members have consistent availability windows and no misconfigured integrations
* Send data to BigQuery or Looker Studio for team-wide booking dashboards
* Use Append transformation to combine bookings from multiple Cal.com accounts into one unified report
  {% endtab %}

{% tab title="Consultants & freelancers" %}

* Track meeting volume and duration over time using Bookings + Event types in Google Sheets
* Export attendee data for invoicing or follow-up
* Send booking summaries to ChatGPT or Claude for AI-generated meeting prep notes or weekly recaps
  {% endtab %}
  {% endtabs %}

## Platform-specific notes

* The Cal.com API returns attendees as a nested array — Coupler.io will flatten this into individual rows or columns depending on your destination
* `status` values in Bookings are: `accepted`, `cancelled`, `pending`, and `awaiting_host` — filter accordingly in your destination
* Conferencings data reflects linked integrations at the account level, not per-booking conferencing links (those appear in Bookings under `location`)
* If you use Cal.com Teams, the API key must belong to the team member whose data you want — there is no org-wide API key for pulling all team members' bookings at once

## Cal.com common issues

### Connection issues

<details>

<summary>My API key is rejected when connecting</summary>

Double-check that you copied the full API key from Cal.com — they can be long and easy to truncate. Go to **Settings → Developer → API Keys** in Cal.com and regenerate a new key if needed. Also make sure the key hasn't been manually expired or deleted.

</details>

<details>

<summary>I can connect but get no data back</summary>

This usually means the API key belongs to a user account that has no data for the selected entity. For example, if you select **Bookings** but haven't received any bookings yet, the response will be empty. Try selecting **My profiles** first to confirm the connection is working and returning your user info.

</details>

### Missing data

<details>

<summary>Cancelled bookings are missing from my export</summary>

By default, some API responses filter by status. Coupler.io pulls all bookings regardless of status, so if cancelled bookings aren't appearing, check whether you've applied a filter in your destination (e.g., a Google Sheets filter view). The `status` field in the Bookings entity includes `cancelled` records — make sure you're not filtering them out.

</details>

<details>

<summary>I don't see bookings from my team members, only my own</summary>

Cal.com's API is scoped to the authenticated user. The API key you provide only returns data for that user's account. To pull data for multiple team members, you need to create separate data flows using each member's API key, then use the **Append** transformation in Coupler.io to combine them into one dataset.

</details>

<details>

<summary>Attendee fields are missing or appear as a single concatenated string</summary>

Attendees are returned as a nested array by the Cal.com API. Coupler.io flattens this automatically, but in some destinations the data may appear differently depending on how many attendees a booking has. If attendee emails or names look merged, check the column structure in your destination and consider splitting the field manually.

</details>

### Permission errors

<details>

<summary>I get a 401 Unauthorized error</summary>

This means your API key is invalid or has been revoked. Go to **Settings → Developer → API Keys** in Cal.com and confirm the key is still active. If you recently rotated your key, update it in Coupler.io under the source settings for your data flow.

</details>

<details>

<summary>I get a 403 Forbidden error on certain entities</summary>

Some entities may require specific account types or permissions. If you're on a free Cal.com plan, certain API endpoints may have restricted access. Check Cal.com's documentation for any plan-level API restrictions.

</details>

### Data discrepancies

<details>

<summary>The booking count in Coupler.io doesn't match what I see in Cal.com</summary>

Cal.com's dashboard may show bookings differently depending on whether it includes recurring instances, rescheduled bookings, or pending bookings. In Coupler.io, check the `status` field to make sure you're counting only `accepted` bookings if that's what the Cal.com dashboard is showing. Recurring bookings may also appear as multiple rows.

</details>

### Rate limits

<details>

<summary>My data flow fails with a rate limit error</summary>

Cal.com enforces API rate limits that vary by plan. If you're running large data flows frequently or have multiple data flows hitting the API at the same time, you may hit this limit. Try reducing the frequency of scheduled runs or staggering multiple data flows so they don't all run simultaneously.

</details>

## Cal.com FAQ

<details>

<summary>Where do I find my Cal.com API key?</summary>

Log in to Cal.com and go to **Settings → Developer → API Keys**. Click **Add** to generate a new key. Copy it immediately — Cal.com won't show it again after you navigate away. Paste it into the API key field when setting up your Cal.com source in Coupler.io.

</details>

<details>

<summary>Can I pull booking data for my entire team, not just myself?</summary>

Not with a single API key — Cal.com's API is scoped to individual users. To get data across your whole team, each team member needs to generate their own API key. Create a separate data flow in Coupler.io for each person, then use the **Append** transformation to merge all their booking data into one unified table.

</details>

<details>

<summary>Can I filter bookings by date range or status?</summary>

Coupler.io pulls all available bookings from the Cal.com API. You can then filter the data in your destination (for example, using Google Sheets filters or Looker Studio date controls). The `status` field lets you filter by `accepted`, `cancelled`, `pending`, or `awaiting_host`, and `start_time` lets you apply date-based filtering.

</details>

<details>

<summary>How do I combine bookings with event type details in one table?</summary>

Add both the **Bookings** and **Event types** entities to your data flow, then use the **Join** transformation in Coupler.io. Join them on `event_type_id` (from Bookings) and `id` (from Event types) to get a flat table that includes meeting metadata — like duration and title — alongside each booking record.

</details>

<details>

<summary>Will Coupler.io capture recurring bookings?</summary>

Yes — Cal.com returns each instance of a recurring booking as a separate record. This means a weekly recurring meeting will appear as multiple rows in your Bookings data, one per occurrence. Use the `uid` field to identify and group recurring instances if needed.

</details>

<details>

<summary>Can I send Cal.com booking data to an AI tool?</summary>

Yes. Coupler.io supports AI destinations including ChatGPT, Claude, Gemini, Perplexity, Cursor, and OpenClaw. You can route your Bookings data directly to any of these to generate summaries, identify patterns, or draft follow-ups based on attendee responses.

</details>

<details>

<summary>Why does the Conferencings entity return very little data?</summary>

The Conferencings entity reflects the conferencing integrations connected to your Cal.com account (like Zoom or Google Meet), not the individual meeting links for each booking. Actual meeting links per booking appear in the `location` field of the Bookings entity. If you haven't connected any conferencing integrations, this entity will be empty.

</details>

<details>

<summary>How often should I refresh my Cal.com data?</summary>

For most use cases, a daily refresh is sufficient. If you're tracking bookings in near real time (e.g., for a live dashboard), you can set a more frequent schedule — but be mindful of Cal.com's API rate limits, especially if you're running multiple data flows.

</details>

{% hint style="info" %}
For field-level details on each entity, see the [Data Overview](#cal-com-data-overview) article. For help with connection errors or missing data, check [Common Issues](#cal-com-common-issues).
{% endhint %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.coupler.io/sources/category/time-tracking/cal-com.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
