---
title: "Meetings"
description: "Calendly / Cal.com scheduling, booking links, and the meetings timeline."
---

Booked calls are a first-class part of your pipeline: they appear on the Meetings page and the contact's timeline live, and can trigger automations.

Meetings arrive two ways. **Auto**, when a prospect self-books through a connected Calendly or Cal.com link, captured over that provider's webhook. **Manual**, when you log a call yourself with **New meeting**, created instantly with no external redirect.

## The Meetings page

Live-updating, in the CRM section. Four counts sit on top, computed across all meetings rather than loaded rows: **Upcoming**, **Today**, **Total booked**, and **Canceled**. Timeframe tabs narrow to Upcoming, Past, or All, and search matches contact name, email, or event name.

Each row shows the time, who it is with, the meeting name and location, its source (`Manual`, `Calendly`, `Cal.com`), and a status:

| Status | Meaning |
| --- | --- |
| Booked | Scheduled |
| Rescheduled | The invitee moved it |
| Canceled | Called off |
| Completed | It happened |
| No-show | The invitee did not attend |

Row actions: **Add to your calendar** (a Google Calendar template or an `.ics` download, built locally with no calendar connection needed), **Join call**, **Reschedule** and **Cancel** for provider-booked calls, and **Delete** for manual ones.

<Callout type="info" title="Reschedule and cancel happen on the provider">
For auto-booked calls those buttons hand off to Calendly or Cal.com. Warmbly does not move the call itself; it reflects the change when the webhook returns.
</Callout>

## Logging a call manually

**New meeting** asks for a **title** (defaults to "Call"), **contact name** and **email** (at least one required), **when** (defaults to the next hour), **duration** (`5` to `480` minutes, default `30`), and optional **location** and **meeting link**.

The meeting links to a contact by matching the email. Opened from somewhere a contact is already in view, it locks to that contact so attribution is exact.

## Connecting Calendly or Cal.com

Connection is webhook-based, not OAuth. From **Integrations**:

1. Add the **Calendly** or **Cal.com** integration. Warmbly mints an inbound webhook URL.
2. Paste it into the provider's webhook settings and subscribe to the events:
   - **Calendly**: `invitee.created`, `invitee.canceled`
   - **Cal.com**: `BOOKING_CREATED`, `BOOKING_RESCHEDULED`, `BOOKING_CANCELLED`

The connection shows as connected as soon as the URL exists.

<Callout type="info" title="The inbound URL is a shared secret">
It contains a long random secret that authenticates incoming bookings, so treat it as a credential. Rotate it from the connection settings if exposed, then re-paste the fresh URL into the provider.
</Callout>

Bookings map to `booked`, `rescheduled`, and `canceled` states. Calendly models a reschedule as a cancel plus a new booking; Warmbly understands this and shows one **Rescheduled** event rather than a stray cancellation. Inbound bookings are idempotent, so a re-delivered event updates the existing meeting instead of duplicating it.

**Attribution** resolves in order: by the contact id carried in the booking link (confirmed to belong to your workspace), which survives the prospect booking under a different email; then by matching the invitee's email. If neither resolves, the meeting still appears, just untied to a contact.

## Booking links

Save your public scheduling URL (`https://calendly.com/you/intro`) under the connection's **Booking link** settings, and contextual buttons appear wherever a contact is in view:

- **Book a call** on contact detail and Unibox threads opens your page in a new tab, prefilled with the contact's email and name, offering a picker if several links are connected.
- **Booking link** in the [Unibox](/guides/unibox/) composer drops the prefilled link into your reply.

Booking from a contact-specific place embeds that contact's id as `utm_content`. Both providers echo it back in the webhook, which is what lets a self-booked call attribute correctly even under a different email.

<Callout type="info" title="No saved link, no button">
These buttons only render with a connected provider and a saved link, so they never appear dead.
</Callout>

## Automations

Meeting events drive [Automations](/guides/automations/): **booked**, **rescheduled**, and **canceled** are notification triggers (Slack, Discord, Zapier, Make, n8n), while **booked** and **canceled** are also CRM triggers (HubSpot, Salesforce, Pipedrive, Close). So one flow can post "Meeting booked" to Slack and upsert the contact into your CRM every time a prospect books.

## Related

<Cards>
  <Card title="Automations" href="/guides/automations/" />
  <Card title="Contacts and CRM" href="/guides/contacts-crm/" />
  <Card title="Unibox" href="/guides/unibox/" />
  <Card title="Notifications" href="/guides/notifications/" />
</Cards>
