Skip to content

EP Booking Zoom

EP Booking Zoom is an add-on for EP Booking. When a booking is confirmed, this plugin creates a Zoom meeting and puts the join link into the confirmation email. When the booking is cancelled, the Zoom meeting is deleted.

Published by ElmsPark Studio.

Zero customer friction. Your customer books as normal, gets the confirmation email, and finds a Zoom link embedded. Your staff member gets the host link. Neither side has to create or join anything manually.

Works across all confirmation paths:

  • Free bookings confirmed on submission.
  • Paid bookings confirmed after Stripe webhook settles the payment.
  • Manual confirmations from the admin when a booking starts as Pending.

And on the other side:

  • Cancellations from the admin dashboard.
  • Self-service cancellations via the tokenised link in the confirmation email.
  • PageMotor 0.8.2b or later
  • EP Suite base class
  • EP Booking (this plugin is driven by EP Booking’s confirmation and cancellation events)
  • A Zoom account with a Server-to-Server OAuth app configured in the Zoom App Marketplace

Zoom requires a one-time setup in their Marketplace to generate API credentials.

  1. Sign in to the Zoom App Marketplace with the Zoom account that owns the host user.
  2. Go to Develop → Build App and pick Server-to-Server OAuth.
  3. Name it (e.g. “PageMotor bookings”), click Create.
  4. From the App Credentials page, copy:
    • Account ID
    • Client ID
    • Client Secret
  5. Under Scopes, add:
    • meeting:write:admin — create and delete meetings
    • meeting:read:admin — read meeting details
  6. Under Activation, click Activate your app.

Keep these credentials handy for the next step.

  1. ep-booking-zoom.zip comes with an EP Suite licence — ElmsPark supplies it directly (see EP Suite plugins); after install it updates through your site’s Updates screen.
  2. Upload via Plugins → Manage Plugins. Activate.
  3. Open Plugin Settings → EP Booking Zoom.
  • Enable Zoom integration. Toggle off if you want to temporarily disable without uninstalling.
  • Account ID, Client ID, Client Secret. Paste from the Zoom Marketplace.
  • Test Connection button. Verifies credentials are valid and your scopes are right. Do this before relying on it in production.

The settings page also embeds a step-by-step setup guide for the Marketplace steps above, in case you need a reminder.

  • Timezone for meeting creation. Defaults to your server timezone. Pick from the dropdown.
  • Placeholder reference. A list of the email placeholders this plugin adds to EP Booking’s notification templates. Covered below.

This plugin adds two new placeholders to EP Booking’s notification templates:

  • {zoom_url} — the customer’s join link.
  • {zoom_host_url} — the host/staff’s start link.

Edit your EP Booking notification templates to include these. A simple addition to the confirmation template:

Hi {customer_name},
Your {service_name} with {staff_name} is confirmed for {booking_date} at {booking_time}.
Join on Zoom: {zoom_url}
Need to cancel? {cancel_link}

Send the host URL in a separate admin-alert template so customers don’t accidentally start the meeting for the host.

  1. EP Booking confirms a booking (free flow, Stripe webhook, or admin manual confirm).
  2. EP Booking Zoom receives the confirmation event.
  3. Calls the Zoom API with service name, booking date/time, duration.
  4. Zoom returns a meeting ID, join URL, and start URL.
  5. EP Booking Zoom stores these in its own database table, keyed to the booking ID.
  6. The confirmation email template substitutes {zoom_url} and {zoom_host_url} with the stored values.

On cancellation:

  1. EP Booking fires the cancellation event.
  2. EP Booking Zoom calls Zoom’s delete-meeting API.
  3. The stored row is marked as cancelled.

If for any reason EP Booking fires a confirmation event twice for the same booking (rare but possible), EP Booking Zoom checks its own table first and does NOT create a second meeting. The existing meeting is reused.

Section titled ““Test Connection succeeds but bookings still don’t get Zoom links””

The scope you added is read-only. Go back to Zoom Marketplace → Scopes and add meeting:write:admin specifically. Read-only scopes are not enough to create meetings.

“Test Connection fails with invalid_client”

Section titled ““Test Connection fails with invalid_client””

Client ID or Client Secret is wrong. Regenerate the secret in Zoom Marketplace and paste again carefully. Secrets can have leading/trailing whitespace that breaks them.

Section titled ““Meeting is created but the link is blank in the email””

The placeholder {zoom_url} must be inside the EP Booking template for the relevant notification (confirmation / reminder). Edit the template from EP Booking’s settings. Re-sending the email (via EP Email’s delivery log) after fixing the template does NOT retroactively fill it — the substitution happens at send time.

“Cancellation deletes the booking but the Zoom meeting is still active”

Section titled ““Cancellation deletes the booking but the Zoom meeting is still active””

Check the Zoom Marketplace app is still activated. If the app was deactivated after the meeting was created, the delete API call will fail silently. Re-activate the app.

“Customers complain the start time in Zoom doesn’t match my site”

Section titled ““Customers complain the start time in Zoom doesn’t match my site””

The timezone setting in this plugin must match your EP Booking timezone. They are separate settings because Zoom requires its own timezone on the meeting object.

For a quick question about this plugin, EP Support inside your admin is the fastest option. The chat widget sits on every EP plugin settings page and knows which one you’re on, with starter questions and links preloaded for that exact screen.

For anything bigger — a bug report, a feature request, or a “how do I…” that needs a real reply — open a ticket at help.elmspark.com. A real person, helped by AI, writes the reply. Usually within a few hours. Tickets don’t disappear into the void.

  • Settings language menu. The language menu in this plugin’s settings now lists only the languages it is actually translated into, plus English, so you can no longer pick a language that changes nothing.
  • Danish. Adds a Danish translation.
  • Meetings created before 1.0.20 are moved to the right time. 1.0.20 fixed the start time of new Zoom meetings only, so a meeting made earlier for an appointment still to come could still be an hour out. Each of those meetings is now moved to the exact time the customer booked, once, a few at a time in the background. The join link does not change, so nothing needs to be sent to customers again.
  • Past and cancelled appointments are left alone, and so are appointments booked before EP Booking 2.0, whose exact time is not known. A meeting Zoom will not move (one deleted in Zoom, for example) is noted in your site’s error log after three tries.
  • Fixes Zoom meetings being created at the wrong time. The meeting was scheduled from the booked time read in this plugin’s own Timezone setting, which defaults to your server’s timezone rather than the timezone your bookings are taken in. A Europe/London business on a server set to UTC got every summer meeting an hour early. Meetings now start at the exact moment the customer booked, taken from EP Booking, whatever either timezone setting says. Rescheduled bookings get their new meeting at the right time too.
  • The Timezone setting now only chooses which timezone Zoom shows the meeting in. Left blank, it follows EP Booking’s business timezone, and the dropdown says so.
  • Meetings already created are not changed. If a customer has a meeting at the wrong time, cancel and recreate it (or reschedule the booking).
  • Fixes Zoom meetings sometimes not being created for a paid, confirmed booking. When EP Booking confirmed a booking from inside its own Stripe webhook, this plugin’s settings could still be holding the pre-decryption copy of your Client Secret at that exact moment, so the integration looked unconfigured and no meeting was created, even though the customer paid and the booking was confirmed. It now also checks the securely stored value directly, so the meeting is created reliably.
  • Fixes stored keys and passwords reading as empty after a PageMotor 0.11.3 or 0.11.4 update. After the core update, every secret this plugin had encrypted at rest came back blank, so anything that needed it failed with an authentication error until the value was typed in again. Nothing was deleted: the encrypted value was still in the settings row, but PageMotor 0.11.3 moved the site secret that opens it, and this plugin was still looking in the old place. It now finds the secret in both places, so an existing value opens again without re-entry, and a value that was re-entered in the meantime keeps working and is moved back under the site secret.
  • If you updated PageMotor and then re-entered a key or password, there is nothing to do. If you updated and have not re-entered it, this release restores it on the next page load.
  • Your Zoom client secret is now stored encrypted. Until this release it sat in plain text in the plugin’s settings, where anyone holding an API or MCP connection to your site with permission to configure plugins could read it straight back out. Your site’s visitors were never able to see it.
  • Existing sites convert themselves the next time the plugin loads, once. There is nothing to re-enter and no key to replace.
  • Reading your settings over the API now returns a placeholder rather than the value, and writing that placeholder back leaves the stored secret untouched. Clearing it by submitting an empty value still works as before.
  • On hosting without encryption support the previous behaviour is kept and the reason is written to the log, because quietly discarding a working key would be worse than the exposure this closes.