# Meetings

> The AY Inbox Meetings page: meetings with your contacts from Calendly, Cal.com or logged by hand, booking links in emails, and meetings booked from replies.

Source: https://docs.ayinbox.com/guides/meetings/

Browsing filters, searches and view choices are [remembered in your browser tab](/guides/browsing/) across refreshes and navigation, separately for each user and workspace.

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 [#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. AY Inbox does not move the call itself; it reflects the change when the webhook returns.
</Callout>

Logging a call manually [#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 [#connecting-calendly-or-calcom]

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

1. Add the **Calendly** or **Cal.com** integration. AY Inbox 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. If it is exposed, use **Rotate URL** in the connection's **Inbound URL** settings: the old URL stops working at once, and you paste the new one into the provider.
</Callout>

Signed deliveries [#signed-deliveries]

Both providers can sign each delivery, and AY Inbox checks the signature once you give it the key. In the connection's **Inbound URL** settings, paste:

* **Calendly**: the webhook subscription's signing key (the `signing_key` you set when creating it, or the one Calendly returned)
* **Cal.com**: the **Secret** set on the webhook

From then on a delivery without a valid signature is refused, so a leaked URL on its own is not enough to post a booking. Calendly signatures older than five minutes are refused too, which stops a captured delivery from being replayed. **Remove** goes back to the URL alone.

Bookings map to `booked`, `rescheduled`, and `canceled` states. Calendly models a reschedule as a cancel plus a new booking; AY Inbox 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 [#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>

Booked from replies [#booked-from-replies]

With [calendar booking](/guides/booking/) on, a meeting can also arrive because the booking agent offered times and a teammate (or an API caller) booked the prospect's pick. It lands here like any other booking, with its campaign set, and fires the same `meeting.booked` event. The **In progress** tab, shown to members with inbox access, lists the offers being arranged, with an **Offers open** count; a row opens its thread, and its menu stops the offer.

A Calendly or Cal.com connection can hold a booking key under **Booking access**, which is what lets the agent read open times and book. Without one, only the booking link works.

Campaign follow-ups [#campaign-follow-ups]

A booked meeting ends the contact's cold sequence in every campaign that has **Stop on meeting booked** on, which is the default. Someone who books a call from the first email gets no more follow-ups, even without replying. See [stop on meeting booked](/guides/sequences/#stop-on-meeting-booked).

Automations [#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. A workspace in [HubSpot mode](/guides/hubspot/) or [Pipedrive mode](/guides/pipedrive/) needs no automation for this: each booking is logged as a meeting on the contact and its open deals.

Related [#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/" />

  <Card title="Following up until a meeting is booked" href="/learn/follow-up-until-booked/" />
</Cards>
