Back to Overview

Zoom Integration

Create a Zoom meeting for every booked appointment, on the Zoom account you connect. A paid Zoom plan (Pro, Business or Enterprise) is recommended.

Luka Breitig, Software Engineer & AI Developer
Luka Breitig

Atualizado em 23 de setembro de 2026

What You Will Achieve

By the end of this guide, every confirmed booking will get its own Zoom meeting on your account, and the join link will appear in the confirmation emails sent to you and your guest. Rescheduling a booking moves the meeting, and cancelling it deletes the meeting.

Cloud vs self-hosted

On tymeslot.app, the Zoom app is already set up. Connect Zoom from the Video tab of your dashboard's Integrations page, approve Zoom's consent screen, and skip to Step 5.

Self-hosters need to create their own Zoom Marketplace app and set four environment variables. The rest of this guide walks through that process.

Prerequisites (self-hosters)

  • A Zoom account, ideally on a paid plan (Pro, Business or Enterprise). Free accounts are subject to Zoom's own limits, including on meeting length.
  • Access to the Zoom App Marketplace with developer permissions on your account.
  • Your Tymeslot deployment running over HTTPS with a public hostname (Zoom does not allow plain-HTTP redirect URLs except http://localhost for local development).

1 Create the Zoom Marketplace app

  1. Go to marketplace.zoom.us/develop/create and sign in with your Zoom account.
  2. Click Build App → choose General App (not "Server-to-Server OAuth", and not the deprecated "JWT").
  3. Set the app type to User-managed. Each Tymeslot user will authorise their own Zoom account.
  4. Name your app, for example Tymeslot Self-Hosted . Users see this name on Zoom's consent screen.

2 Configure OAuth redirect and scopes

On the Marketplace app's Basic Information page, enter your callback URL as the OAuth redirect URL. Replace your-domain.com with your Tymeslot host:

https://your-domain.com/auth/zoom/video/callback

Zoom adds the redirect URL to the OAuth Allow List for you. Add any further URLs, such as a staging host, in the same Allow List section.

On the same page, scroll down to Deauthorization Notification and paste your deauthorization endpoint:

https://your-domain.com/auth/zoom/deauthorize

Zoom signs every deauthorization request with HMAC-SHA256 against the Secret Token shown in that same section. Copy it; you will set it as ZOOM_DEAUTH_SECRET in the next step. Zoom requires the deauthorization endpoint before you can submit the app for production review.

Then in the Scopes tab, add:

  • meeting:write:meeting : create meetings on the user's behalf
  • meeting:update:meeting : move the meeting when a booking is rescheduled
  • meeting:read:meeting : verify meeting status
  • meeting:delete:meeting : remove the meeting when a booking is cancelled
  • user:read:user : fetch the connected user's profile for display

Classic and granular scopes

The scopes above are Zoom's granular scopes, which new apps use. An older app with classic scopes works too: classic meeting:write covers creating, moving and deleting meetings on its own.

Already connected?

Adding a scope does not widen an existing authorisation. Anyone who connected Zoom before you added meeting:update:meeting or meeting:delete:meeting has to reconnect their account before reschedules and cancellations will reach Zoom. Tymeslot asks them to on the dashboard and by email.

3 Set environment variables

From the Basic Information tab, copy your Client ID and Client Secret, and the Secret Token from the Deauthorization Notification section. Generate a random 32-byte state secret, which protects the sign-in flow against forged requests. Then add all four to your Tymeslot environment:

export ZOOM_CLIENT_ID="<your client id>"
export ZOOM_CLIENT_SECRET="<your client secret>"
export ZOOM_STATE_SECRET="$(openssl rand -hex 32)"
export ZOOM_DEAUTH_SECRET="<marketplace secret token>"

For Docker Compose deployments, add these to your .env file. For Cloudron, set them in the App Configure dialog. Restart Tymeslot after setting them.

App without the update scope?

Tymeslot asks Zoom for meeting:update:meeting by default. If you cannot add it to your Zoom app, set ZOOM_UPDATE_SCOPE_ENABLED=false so users are not asked to reconnect for a permission the app cannot grant. Rescheduled bookings then keep their Zoom meeting at the original time.

Keep ZOOM_CLIENT_SECRET out of version control

Never commit your client secret. Keep it in environment variables, a secrets manager or your platform's secret store.

4 Connect from the dashboard

  1. Restart Tymeslot so it picks up the new env vars.
  2. Go to Dashboard → Integrations → Video.
  3. Click Connect a video provider and choose Zoom under Hosted services.
  4. Approve Zoom's consent screen.
  5. Zoom sends you back to Tymeslot, which shows a success notice.
The Connect a video provider dialog, listing Google Meet, Microsoft Teams, Zoom and kMeet under Hosted services, MiroTalk P2P, Jitsi Meet and Nextcloud Talk under Self-hosted, and Custom Video Link under Other
The provider picker. Choose Zoom under Hosted services to start the OAuth flow.

5 Enable Zoom on a meeting type

Each meeting type chooses its own video providers. To use Zoom for a specific meeting type:

  1. Go to Dashboard → Meeting Types and pick a meeting type.
  2. On the Location & Calendar tab, click Add location, or Edit on an existing one, and set Type to Video call.
  3. Under Video providers, tick your Zoom integration.
  4. Click Save location. The next confirmed booking that uses this location will create a Zoom meeting and email the join link.

You can tick several providers on the same location, for example Zoom alongside Google Meet or Microsoft Teams. The person booking then chooses which one the room is created on. See Meeting Locations for everything a meeting type's locations can do.

Publishing the Marketplace app (optional)

While your Zoom app is in Development mode, only your own Zoom account can install it. That is fine when you are the only person on your Tymeslot instance who connects Zoom.

To let other users (for example team members or your customers) connect their own Zoom accounts to your Tymeslot deployment, submit the Marketplace app for publication via App Submission in the portal. Zoom's review typically takes one to three weeks. Meanwhile, you can allow individual Zoom accounts through the Marketplace's Beta Test → Add User form.

Zoom's review requires:

  • A step-by-step test plan document (Google Doc, Confluence, or similar) covering app authorisation, each scope used, and the full booking flow. Add the link in the release notes at submission time.
  • Test account credentials your reviewer can use to log in and walk through the integration. Include these in the release notes.
  • A Zoom account with at least a paid plan (Pro or above) associated with the developer account. Free accounts need a credit card on file or a completed US compliance form before review can go ahead.

Production Client ID during review

Zoom's reviewers require your test environment to use the Production Client ID, not the Development one. Configure the instance you give them accordingly.

❓ Frequently Asked Questions

Do free Zoom accounts work?

Not reliably. Zoom applies its free-plan limits to meetings created through its API, including the cap on meeting length, and may refuse some API requests from free accounts. Use a paid plan (Pro or above) for meetings your guests depend on.

Why does my access token expire after an hour?

That is how Zoom's OAuth works. Tymeslot uses the refresh token to get a new access token whenever the stored one has expired. Refresh tokens last 90 days; if a refresh fails, Tymeslot asks you to reconnect on the dashboard and by email.

Can I revoke access?

Yes. Either disconnect from the Tymeslot dashboard, or revoke at zoom.us/profile → Apps → Tymeslot → Remove.

Can multiple users on the same deployment each connect their own Zoom account?

Yes. Tymeslot's Zoom integration is User-managed: each user authorises their own Zoom account independently, and their OAuth tokens are stored separately. As long as your Marketplace app is either published or has the user's Zoom account added via Beta Test, each user can connect their own Zoom account and book meetings from it.

What about webhooks?

The deauthorization webhook is required: Zoom POSTs to /auth/zoom/deauthorize whenever a user removes your app, and Tymeslot then deletes that user's Zoom integration and its stored tokens. It works as soon as ZOOM_DEAUTH_SECRET is set (see Step 3). Tymeslot does not use any other Zoom event subscriptions, so you do not need to set any up.

Verification Checklist

Once your Zoom Marketplace app is configured and Tymeslot is restarted with the four environment variables set, confirm each of the following:
  • Choosing Zoom under Connect a video provider, on the Video tab of Dashboard → Integrations, opens Zoom's consent screen.
  • Authorising there brings you back to Tymeslot without errors.
  • The connected integration shows your Zoom email address.
  • Booking a test meeting on a Zoom-enabled meeting type creates a Zoom meeting, visible at zoom.us/meeting/scheduled .
  • The confirmation email contains a Zoom join URL of the form https://zoom.us/j/... .
  • Removing the app from zoom.us/profile → Apps → Tymeslot → Remove makes the integration disappear from the Tymeslot Video tab (Dashboard → Integrations) within seconds.

🔗 Related Articles

Read Google Meet Integration

Google Meet Integration

Auto-create Google Meet rooms for every confirmed booking via the Calendar API. Attendees receive the link by email and can join without a Google account.

Read Microsoft Teams Integration

Microsoft Teams Integration

Auto-create Microsoft Teams meetings for every confirmed booking. Covers the Graph permissions Tymeslot asks for, when a tenant admin has to consent, and what happens when an account cannot host meetings.

Read MiroTalk Self-Hosted Video

MiroTalk Self-Hosted Video

Host video meetings on your own MiroTalk P2P server, with no subscription and peer-to-peer video between participants. Covers Docker setup, reverse proxy, and TURN server config.