> ## 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.

# Zoom Webhook Setup Guide

> Configure Zoom 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/zoom/guides/connector-profile/oauth-2-0" icon="https://stackone-logos.com/api/zoom/filled/png" horizontal>
        Zoom - OAuth 2.0
      </Card>

      <Card title="Connector Profile" href="/connectors/zoom/guides/connector-profile/server-to-server-oauth" icon="https://stackone-logos.com/api/zoom/filled/png" horizontal>
        Zoom - Server-to-Server OAuth
      </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/zoom/guides/link-account/oauth-2-0" icon="https://stackone-logos.com/api/zoom/filled/png" horizontal>
        Zoom - OAuth 2.0
      </Card>

      <Card title="Link Account" href="/connectors/zoom/guides/link-account/server-to-server-oauth" icon="https://stackone-logos.com/api/zoom/filled/png" horizontal>
        Zoom - Server-to-Server OAuth
      </Card>
    </Columns>
  </Step>
</Steps>

<section data-guide-section data-guide-scopes="">
  <h2>Copy your Native Webhook URL</h2>

  <p>The Native Webhook URL is the endpoint Zoom sends events to. It is generated per connection and shown on the connected account.</p>

  <ul>
    <li>Open the connected Zoom account in StackOne Hub.</li>
    <li>Copy the read-only <strong>Native Webhook URL</strong> value.</li>
    <li>Note: This URL is only available after the account has been connected.</li>
  </ul>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Open Event Subscriptions in Zoom</h2>

  <p>Turn on Event Subscriptions for the same Zoom app used to connect the account, and copy its Secret Token into StackOne.</p>

  <Steps>
    <Step title="Sign in to Zoom App Marketplace">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Sign in to the <a href="https://marketplace.zoom.us" target="_blank" rel="noopener noreferrer">Zoom App Marketplace</a>.</p>

        <ul>
          <li>Click <strong>Develop</strong>, open <strong>Created apps</strong>, and select the app you used to connect (OAuth or Server-to-Server OAuth).</li>
          <li>In the left sidebar, under <strong>Features</strong>, open <strong>Access</strong>.</li>
        </ul>
      </div>
    </Step>

    <Step title="Copy the Secret Token into StackOne">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the <strong>Token</strong> section, find the <strong>Secret Token</strong>. Zoom uses this token to verify the event notifications it sends to your app.</p>

        <ul>
          <li>Click <strong>Copy</strong> next to the <strong>Secret Token</strong>.</li>
          <li>Paste it into the <strong>Webhook Secret Token</strong> field on the connected Zoom account in StackOne Hub and save.</li>
          <li>Note: The Secret Token must be saved in StackOne before validation, otherwise endpoint validation fails.</li>
        </ul>

        <img src="https://mintlify.s3.us-west-1.amazonaws.com/stackone-60/connectors/images/events-secret-token.png" alt="The Access page showing the Secret Token with Copy and the Event Subscription toggle." />
      </div>
    </Step>

    <Step title="Turn on Event Subscription">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Under <strong>General Features</strong>, make sure <strong>Event Subscription</strong> is enabled, then expand it to manage subscriptions.</p>

        <ul>
          <li>Toggle <strong>Event Subscription</strong> on if it is not already enabled.</li>
        </ul>

        <img src="https://mintlify.s3.us-west-1.amazonaws.com/stackone-60/connectors/images/events-add-subscription.png" alt="The Event Subscription feature expanded with the Add New Event Subscription button." />
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Add and configure the endpoint</h2>

  <p>Register the Native Webhook URL as an event subscription and choose the events to receive.</p>

  <Steps>
    <Step title="Add a new event subscription">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>+ Add New Event Subscription</strong> and give it a <strong>Subscription name</strong> (for example, `StackOne`).</p>

        <ul>
          <li>Under <strong>Choose a Method</strong>, keep <strong>Webhook</strong> selected.</li>
        </ul>

        <img src="https://mintlify.s3.us-west-1.amazonaws.com/stackone-60/connectors/images/events-add-subscription.png" alt="The Add New Event Subscription button under the Event Subscription feature." />
      </div>
    </Step>

    <Step title="Paste the Native Webhook URL">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>In the <strong>Event notification endpoint URL</strong> field, paste the <strong>Native Webhook URL</strong> you copied from StackOne.</p>

        <img src="https://mintlify.s3.us-west-1.amazonaws.com/stackone-60/connectors/images/events-endpoint-url.png" alt="The subscription form with the Event notification endpoint URL field." />
      </div>
    </Step>

    <Step title="Select events and save">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Click <strong>+ Add Events</strong> to open the <strong>Event Types</strong> picker, choose the events to receive, then save the subscription.</p>

        <ul>
          <li>Select events from the <strong>Meeting</strong>, <strong>Webinar</strong>, <strong>Recording</strong>, and <strong>User</strong> categories as needed.</li>
          <li>Click <strong>Done</strong> to confirm your selection.</li>
          <li>Click <strong>Save</strong>. The subscription appears in the list once Zoom validates the endpoint.</li>
        </ul>

        <img src="https://mintlify.s3.us-west-1.amazonaws.com/stackone-60/connectors/images/events-event-types.png" alt="The Event Types picker showing event categories and selectable events." />
      </div>
    </Step>
  </Steps>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Available webhook events</h2>

  <p>The following Zoom events can be enabled. Only events selected in StackOne are delivered — Zoom will not send events that are not subscribed.</p>

  <Steps>
    <Step title="Meeting events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to meetings and their participants.</p>

        <ul>
          <li><strong>Meeting has been created</strong> (`meeting.created`) — Fired when a meeting is scheduled or created</li>
          <li><strong>Meeting has been updated</strong> (`meeting.updated`) — Fired when a meeting's settings or details change</li>
          <li><strong>Meeting has been deleted</strong> (`meeting.deleted`) — Fired when a meeting is deleted</li>
          <li><strong>Start Meeting</strong> (`meeting.started`) — Fired when a meeting starts</li>
          <li><strong>End Meeting</strong> (`meeting.ended`) — Fired when a meeting ends</li>
          <li><strong>Participant/Host joined meeting</strong> (`meeting.participant_joined`) — Fired when a participant joins a meeting</li>
          <li><strong>Participant/Host left meeting</strong> (`meeting.participant_left`) — Fired when a participant leaves a meeting</li>
          <li><strong>Participant was admitted into a meeting</strong> (`meeting.participant_admitted`) — Fired when a participant is admitted from the waiting room</li>
          <li><strong>Meeting Registration has been created</strong> (`meeting.registration_created`) — Fired when a registrant registers for a meeting (requires a paid plan)</li>
          <li><strong>Meeting Registration has been approved</strong> (`meeting.registration_approved`) — Fired when a meeting registrant is approved (requires a paid plan)</li>
          <li><strong>Meeting Sharing Started</strong> (`meeting.sharing_started`) — Fired when screen sharing starts in a meeting</li>
          <li><strong>Meeting summary has been completed</strong> (`meeting.summary_completed`) — Fired when the AI Companion meeting summary is ready (requires a Pro plan with AI Companion)</li>
        </ul>
      </div>
    </Step>

    <Step title="Webinar events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to webinars. All webinar events require a Webinar license.</p>

        <ul>
          <li><strong>Webinar has been created</strong> (`webinar.created`) — Fired when a webinar is scheduled or created</li>
          <li><strong>Webinar has been updated</strong> (`webinar.updated`) — Fired when a webinar's settings or details change</li>
          <li><strong>Webinar has been deleted</strong> (`webinar.deleted`) — Fired when a webinar is deleted</li>
          <li><strong>Start Webinar</strong> (`webinar.started`) — Fired when a webinar starts</li>
          <li><strong>End Webinar</strong> (`webinar.ended`) — Fired when a webinar ends</li>
          <li><strong>Participant/Host joined webinar</strong> (`webinar.participant_joined`) — Fired when a participant joins a webinar</li>
          <li><strong>Participant/Host left webinar</strong> (`webinar.participant_left`) — Fired when a participant leaves a webinar</li>
          <li><strong>Webinar Registration has been created</strong> (`webinar.registration_created`) — Fired when a registrant registers for a webinar</li>
          <li><strong>Webinar Registration has been approved</strong> (`webinar.registration_approved`) — Fired when a webinar registrant is approved</li>
          <li><strong>Webinar Sharing Started</strong> (`webinar.sharing_started`) — Fired when screen sharing starts in a webinar</li>
        </ul>
      </div>
    </Step>

    <Step title="Cloud recording events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to cloud recordings. Cloud recording requires a Pro plan.</p>

        <ul>
          <li><strong>Recording Started</strong> (`recording.started`) — Fired when cloud recording starts</li>
          <li><strong>Recording Stopped</strong> (`recording.stopped`) — Fired when cloud recording stops</li>
          <li><strong>All Recordings have completed</strong> (`recording.completed`) — Fired when all cloud recordings finish processing</li>
          <li><strong>Recording Transcript files have completed</strong> (`recording.transcript_completed`) — Fired when an audio transcript is ready</li>
          <li><strong>Recording Renamed</strong> (`recording.renamed`) — Fired when a cloud recording is renamed</li>
          <li><strong>Recording files have been permanently deleted</strong> (`recording.deleted`) — Fired when a cloud recording is permanently deleted</li>
          <li><strong>Recording files have been deleted to Trash</strong> (`recording.trashed`) — Fired when a cloud recording is moved to the trash</li>
          <li><strong>Recording files have been recovered from Trash</strong> (`recording.recovered`) — Fired when a cloud recording is recovered from the trash</li>
        </ul>
      </div>
    </Step>

    <Step title="User events">
      <div data-guide-step data-guide-scopes="" data-guide-display-scopes-list="">
        <p>Events related to users on the account.</p>

        <ul>
          <li><strong>User has been created</strong> (`user.created`) — Fired when a user is added to the account</li>
          <li><strong>User's profile info has been updated</strong> (`user.updated`) — Fired when a user's profile information changes</li>
          <li><strong>User's settings have been updated</strong> (`user.settings_updated`) — Fired when a user's settings change</li>
          <li><strong>User has been deleted</strong> (`user.deleted`) — Fired when a user is removed from the account</li>
          <li><strong>User has been activated</strong> (`user.activated`) — Fired when a user is activated</li>
          <li><strong>User has been deactivated</strong> (`user.deactivated`) — Fired when a user is deactivated</li>
          <li><strong>User has signed in</strong> (`user.signed_in`) — Fired when a user signs in to Zoom</li>
          <li><strong>User has signed out</strong> (`user.signed_out`) — Fired when a user signs out of Zoom</li>
        </ul>
      </div>
    </Step>
  </Steps>
</section>

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

  <p>How Zoom delivers events to the Native Webhook URL.</p>

  <ul>
    <li>Zoom sends one event per request as a JSON payload, with the event type in `event` and the data in `payload`.</li>
    <li>Each delivery includes an `x-zm-signature` header, computed from the app's Secret Token, that can be used to verify the request came from Zoom.</li>
    <li>Endpoint validation is automatic: Zoom periodically sends an `endpoint.url_validation` challenge (about every 72 hours), and StackOne answers it using the saved Secret Token — keep the token in place.</li>
    <li>Zoom retries failed deliveries; repeated failures can cause Zoom to disable the subscription.</li>
  </ul>
</section>

<section data-guide-section data-guide-scopes="">
  <h2>Stop receiving events</h2>

  <p>To stop receiving events, remove or disable the subscription in Zoom, or disable individual event types in StackOne.</p>

  <ul>
    <li>In the Zoom app's <strong>Event Subscription</strong>, delete the subscription or remove specific events, then save.</li>
    <li>Alternatively, disable individual events in StackOne — unmatched events are silently acknowledged.</li>
  </ul>
</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.
