Skip to content

Zoom Meetings ​

A Zoom meeting for every confirmed online booking: the client gets the join link in the confirmation, the reminder, the calendar file and their account; the staff member gets the link to start it.

kitloom/booking-meetings · admins: kitloom/booking-meetings-filament, kitloom/booking-meetings-nova

Video lessons ​

Recorded in the Filament admin; the Nova admin works the same way.

A Zoom meeting for every confirmed online booking. The client gets the link to join in the confirmation email, the reminder, the calendar file, the text messages and on their account page; the staff member gets the link to start it. Moved with the booking, deleted in Zoom when the booking is cancelled. Nobody types a link by hand and nobody needs a Zoom account but the salon: the site makes the meetings with a Server-to-Server OAuth app of the salon's Zoom account. The admin is kitloom/booking-meetings-filament or kitloom/booking-meetings-nova.

Set up once at Zoom ​

Zoom meetings for bookings

One app for the site, made once by the owner or an admin of the Zoom account; it takes ten minutes and never expires.

  1. Sign in at marketplace.zoom.us with the salon's Zoom account, then Develop → Build App and choose Server-to-Server OAuth App. A name such as Bookings; Create. (No such choice? The Zoom account's owner gives your role the Server-to-Server OAuth app permission under User Management → Roles, or makes the app themselves.)

  2. App Credentials shows three values: Account ID, Client ID and Client Secret. Keep the page open.

  3. Information: the company name and a developer's name and email — Zoom asks for them before it activates the app.

  4. Scopes → Add Scopes → Meeting, and tick:

    • meeting:write:meeting:admin — make a meeting,
    • meeting:read:meeting:admin — read one,
    • meeting:update:meeting:admin — move one,
    • meeting:delete:meeting:admin — delete one.

    An app made a while ago shows the older names instead: meeting:write:admin (make, move and delete) and meeting:read:admin. Either set does.

  5. Activation → Activate your app.

  6. In the admin, Zoom Meetings → Settings: paste the Account ID, the Client ID and the Client Secret under Connect Zoom, save, then press Check access. Zoom takes the credentials means it is done; Zoom's own words otherwise, or the scopes the app still lacks.

The meetings are made on the Zoom user the app belongs to — the salon's account, not each staff member's. The staff start them with the link they are sent, as that user, without signing in to Zoom.

Switch it on ​

Still on the Settings page, under Video calls:

  • Make a Zoom meeting for every confirmed booking — on. Off, no new meetings are made; those already made stay, move with their bookings and are deleted with them.
  • Only for these services — the services held online. None chosen, every service gets a meeting; a salon that also sees clients in person chooses the online ones (Video consultation), and only their bookings get a meeting.
  • Waiting room (on) — the client waits until the staff member lets them in. Off, they join as soon as the staff member has started the meeting. Either way nobody gets in before the staff member.

What the client sees ​

A booking gets its meeting when it is confirmed — at once, when the salon confirms bookings at once, or when the staff member confirms it. From then on:

  • The confirmation email and the reminder have a Join the video call button above Manage booking, and the passcode in the details. The link carries the passcode already; Zoom asks for it only when the link is typed by hand.
  • The calendar file (.ics) carries the link as the event's link — the Join button of Google, Apple and Outlook calendars — and in the description with the passcode; without an address set for the salon, the link is the event's place too.
  • Text messages of the confirmation and the reminder end with the link (kitloom/text-messages).
  • The account page, Appointments: the link beside each upcoming confirmed booking (meeting in the section's data, for the theme).
  • The page the email's link opens shows the Join the video call button.

The meeting is named after the service and the staff member (Consultation with Mira), its description is the booking's code and the site's name: nothing of the client goes to Zoom.

What the staff member sees ​

  • The new-booking email has Start the video call when the booking is confirmed already.
  • The page of the email's Confirm button shows Start the video call once they confirm.
  • The account page, Schedule: the start link beside each confirmed booking of the day.

The start link opens the meeting as its host. It is the salon's key to the meeting: it is never shown to the client, nor to an agent or an admin without the permission to manage bookings.

When a booking changes ​

The bookingThe meeting
ConfirmedMade. If the confirmation email goes out before the queue got to it, the email makes it, and the queue finds it made: one meeting either way.
Moved to another time, service or staff memberMoved in Zoom; the link stays the same, so what the client was sent still works. Moved to a service not held online, it is deleted.
Cancelled, declined, or marked a no-showDeleted in Zoom, and Zoom sends nobody an email about it.
Marked doneKept, as history.

A meeting deleted in Zoom by hand is made anew on the booking's next move. A meeting the owner deletes from the admin is not made again on its own: Create again on its row makes a new one.

When something goes wrong ​

Zoom is called from the queue, three tries with a pause between; without a queue worker, at once and once. A call that still fails lands on the meeting's row (Zoom Meetings → Meetings) with Zoom's words, and the booking goes on without the link — a booking is never refused because Zoom did not answer. From the row: Create again after fixing the cause, Delete in Zoom for a meeting nobody needs. Create again on a meeting that works replaces it: the link the client was sent stops working, and they find the new one on their account page and in the reminder.

Site Health warns while the meetings are switched on without Zoom connected, and while meetings of bookings still to come are failing. The notification topic Zoom meeting failed (on by default) tells a channel which booking, what was asked and what Zoom said.

The application key changed? The saved Client Secret cannot be read any more and Zoom is not connected: paste it on the Settings page again.

Settings ​

Zoom Meetings → Settings:

  • Account ID, Client ID — from the app's App Credentials.
  • Client Secret — kept encrypted with the application key, never shown back; an empty field keeps the saved one.
  • Make a Zoom meeting for every confirmed booking (off).
  • Only for these services (none — every service).
  • Waiting room (on).
  • Check access — asks Zoom for a token with what is saved, and names the scopes the app lacks.

Beyond the screens ​

  • Site Health (kitloom/health): "Zoom meetings".
  • Notifications (kitloom/notifications): the topic Zoom meeting failed.
  • AI agents (kitloom/ai), for whoever has the permission: booking_meetings_list — the meetings and their links, by booking code or dates ("Send me the Zoom link of Ada's call on Tuesday"); booking_meetings_create — one booking's meeting made now or again; booking_meetings_check — does Zoom take the credentials. Connecting Zoom and choosing the services stay in the admin.
  • Erase Personal Data (kitloom/privacy): the bookings stay in the salon's books without the client's name, and their meetings are deleted in Zoom. Zoom keeps its own reports of past meetings by its own rules.

What is inside ​

WhatWhere
Meetingstable booking_meetings (the site's prefix in front), one row per booking — gone with it — model Kitloom\BookingMeetings\Models\BookingMeeting
Settingsoptions booking_meetings_*: the Account ID, the Client ID, the Client Secret (encrypted), on or off, the services, the waiting room
Permissionmanage_booking_meetings, given to the roles that manage bookings
Configurationconfig/kitloom-booking-meetings.php

Zoom is reached on Laravel's HTTP client — no SDK. The token is kept in the cache for most of its hour; a cache lock per booking keeps the queue's job and an email from making two meetings. The link reaches kitloom/bookings through its MeetingLink contract, so another video service — Google Meet, Microsoft Teams — can be a module of its own.

What the application overrides ​

  • The model: ModelRegistry::use(BookingMeeting::KEY, App\Models\BookingMeeting::class).
  • The queue, the timeout and the token's cache store, the admin sections and the tags for agents, notifications, health and privacy: php artisan vendor:publish --tag=kitloom-booking-meetings-config.

Tests ​

From the application that installs the package: php vendor/bin/phpunit --testsuite BookingMeetings. Kitloom\BookingMeetings\Testing\FakesZoom fakes Zoom on the HTTP client for the module's tests and its admins'.

kitloom — modules and themes for Laravel.
Contact · Pricing · Services · License · Refunds · Privacy · Community · YouTube · [email protected]