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

# Calendly Webhook Setup Guide

> Configure Calendly to deliver events to StackOne.

## Prerequisites

Before continuing, you should have already completed the following for this connector:

<Steps>
  <Step title="Configure the Connector">
    Enable the connector and set up its connector profile in your project. See <a href="/guides/explore-connectors">Managing Connectors</a>.

    <Columns cols={2}>
      <Card title="Connector Profile" href="/connectors/calendly/guides/connector-profile/oauth-2-0" icon="https://stackone-logos.com/api/calendly/filled/png" horizontal>
        Calendly - OAuth 2.0
      </Card>

      <Card title="Connector Profile" href="/connectors/calendly/guides/connector-profile/personal-access-token" icon="https://stackone-logos.com/api/calendly/filled/png" horizontal>
        Calendly - Personal Access Token
      </Card>
    </Columns>
  </Step>

  <Step title="Link an Account">
    Connect an account using <a href="/guides/embedding-stackone-hub">StackOne Hub</a> or <a href="/guides/auth-link">Auth Link</a>.

    <Columns cols={2}>
      <Card title="Link Account" href="/connectors/calendly/guides/link-account/oauth-2-0" icon="https://stackone-logos.com/api/calendly/filled/png" horizontal>
        Calendly - OAuth 2.0
      </Card>

      <Card title="Link Account" href="/connectors/calendly/guides/link-account/personal-access-token" icon="https://stackone-logos.com/api/calendly/filled/png" horizontal>
        Calendly - Personal Access Token
      </Card>
    </Columns>
  </Step>
</Steps>

<section data-guide-section data-guide-scopes="">
  <h2>Subscribe via the StackOne dashboard</h2>

  <p>This connector uses <strong>Programmatic Webhooks</strong>. When you enable webhook events for a connected Calendly account, StackOne automatically creates a single organization-scoped webhook subscription (via `POST /webhook_subscriptions`) covering the event types you enable, pointing at your StackOne callback URL. The organization is resolved automatically from the connected user.</p>

  <Steps>
    <Step title="Check plan and permissions">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Webhook subscriptions are available on paid Calendly plans (Standard or above). The connected user must be an owner or admin of the organization — Calendly rejects organization-scoped subscriptions from regular members with a permission error.</p>
      </div>
    </Step>

    <Step title="Select event subscriptions in the dashboard">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the StackOne dashboard, open the Calendly connector profile and enable the webhook events you want delivered downstream. See the <strong>Available Webhook Events</strong> section below for the full list.</p>
      </div>
    </Step>

    <Step title="Registration on subscribe">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>When webhook events are enabled (or the event selection changes), StackOne creates the webhook subscription on your behalf using the connected account's credentials, registered for exactly the event types you enabled. You can inspect it with the connector's `list_webhooks` action.</p>

        <ul>
          <li>For OAuth 2.0 connections, if the optional <strong>Webhook Signing Key</strong> setup field is filled in, StackOne registers it as the subscription's signing key and Calendly signs each delivery with the `Calendly-Webhook-Signature` header (HMAC-SHA256).</li>
        </ul>
      </div>
    </Step>

    <Step title="Verify delivery">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Trigger a matching change in Calendly (for example, book a test meeting on one of your event types) and confirm the event reaches your downstream consumer.</p>

        <ul>
          <li>Calendly posts each event as a JSON payload; StackOne responds with `200 OK` automatically.</li>
          <li>Calendly retries failed deliveries with exponential backoff and may disable subscriptions that keep failing.</li>
        </ul>
      </div>
    </Step>

    <Step title="Unsubscribe">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Changing your event selection re-registers the StackOne-managed subscription. Disconnecting the account deletes it, stopping deliveries.</p>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Available Webhook Events</h2>

  <p>The following Calendly events can be enabled. The StackOne-managed subscription is registered in Calendly for exactly the events you enable, and re-registered when the selection changes.</p>

  <Steps>
    <Step title="Invitee events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events fired when invitees book, cancel, or are marked as no-shows on scheduled events.</p>

        <ul>
          <li><strong>Invitee Created</strong> (`invitee.created`) — Fired when an invitee books a meeting</li>
          <li><strong>Invitee Canceled</strong> (`invitee.canceled`) — Fired when an invitee cancels a booked meeting</li>
          <li><strong>Invitee No Show Created</strong> (`invitee_no_show.created`) — Fired when an invitee is marked as a no-show</li>
          <li><strong>Invitee No Show Deleted</strong> (`invitee_no_show.deleted`) — Fired when a no-show mark is removed</li>
        </ul>
      </div>
    </Step>

    <Step title="Event type events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events fired when meeting types are managed.</p>

        <ul>
          <li><strong>Event Type Created</strong> (`event_type.created`) — Fired when a new event type is created</li>
          <li><strong>Event Type Updated</strong> (`event_type.updated`) — Fired when an event type is modified</li>
          <li><strong>Event Type Deleted</strong> (`event_type.deleted`) — Fired when an event type is deleted</li>
        </ul>
      </div>
    </Step>

    <Step title="Contact events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events on organization contacts. Requires a Calendly plan that includes contacts.</p>

        <ul>
          <li><strong>Contact Created</strong> (`contact.created`) — Fired when a contact is created</li>
          <li><strong>Contact Updated</strong> (`contact.updated`) — Fired when a contact is updated</li>
          <li><strong>Contact Deleted</strong> (`contact.deleted`) — Fired when a contact is deleted</li>
        </ul>
      </div>
    </Step>

    <Step title="Routing form events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events on routing form submissions. Only delivered on organization-scoped subscriptions (which is how StackOne subscribes).</p>

        <ul>
          <li><strong>Routing Form Submission Created</strong> (`routing_form_submission.created`) — Fired when a routing form is submitted</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Delivery format</h2>

  <p>Details of how Calendly delivers events to StackOne.</p>

  <Steps>
    <Step title="JSON payloads">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Calendly delivers each event as an HTTP POST with a JSON body containing the event type in `event` (for example `invitee.created`), the delivery time in `created_at`, and the full resource under `payload` (the resource's `uri` is used as the event ID).</p>
      </div>
    </Step>

    <Step title="Signature verification">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>When a signing key is registered, Calendly includes a `Calendly-Webhook-Signature` header in the form `t=<timestamp>,v1=<HMAC-SHA256 signature>` computed over the timestamp and raw body.</p>
      </div>
    </Step>
  </Steps>
</section>

## Verify

Your Connector should now be able to receive and process events. Try triggering an event and you should see an Event appear in the Connector logs.
