By the end of this you will have a webinar, workshop or class on your site, with bookable dates, taking real money, and you will know what lands in the attendee's inbox.
An event is a blueprint, a date is an occurrence
The event is the reusable thing — name, type, duration, price, access rules, public page — and has no date. A scheduled date is one occurrence. All dates share one public page, which offers them under a "Choose your date" step. "Tuesday Baby Signs Webinar" is one event with twelve dates, not twelve events.
The tabs in Admin → Events read the opposite way round from what you would guess: Scheduled lists the dated occurrences, Events the blueprints, Event Pages is the page builder.
Create the event
Admin → Events → Events tab → New Event. The dialog is titled New Event Template, with four tabs — General, Pricing, Cost & Profit, Permissions. (Attach a linked product and the two money tabs disappear; the product carries both.)
General holds Name, Category, Image, Public Event and switches for the rating and testimonials blocks, plus these, which decide behaviour:
- Type — Webinar, Lesson, Workshop, Meetup, Conference, Other. It picks the URL prefix:
/webinars/,/lessons/,/workshops/,/meetups/,/conferences/,/events/for Other. Nothing else resolves. - Duration (min) — an integer, and the meeting length Zoom books if you connect it.
- Default Time — pre-fills the whole Date & Time field on a new date with the next occurrence of that clock time (today, or tomorrow if today's has gone), in your business timezone.
- Meeting Link — the join link you paste yourself; it disappears once Zoom is connected and generating meetings.
- Show on events page — off makes the event unlisted: bookable by direct link, absent from the listing.
- Feature on home page — surfaces upcoming dates in the homepage's upcoming-events section, and hides itself when no future dates remain.
Pricing — Payment Types: Free, Voluntary, One-time, Subscription, Installments. Tick several and the visitor picks; the price, currency, interval and installment fields appear as they become relevant.
Permissions — Permission / Required Permission, Grant Permission, Linked product, and Confirm Email Subscription, which when on resubscribes a contact who previously unsubscribed from you and marks brand-new contacts subscribed.
The URL comes from the name, and renaming changes it. There is no separate address field, so renaming a live event breaks every link you gave out or printed — and changing Type moves the page too. Decide both before you promote. If the address is taken, a timestamp is appended, giving a long, ugly URL.
Add at least one date — before you promote anything
Dates are added from the event, not the Scheduled list: on the Events tab find the event's card and press Create Event. The Schedule Event dialog's only required field is Date & Time. The Scheduled tab only searches and filters dates; it has no create button.
A public event page with no dates returns 404 — not an empty page. Create the event, add a date, then hand the link out.
On a new date you can change Duration, Meeting Link, the Zoom toggles (if connected) and Currency — pre-filled from the blueprint, not locked to it. Everything else is inherited. Open an existing date and four more appear: Status, Public Event, Permission, Grant Permission, plus the TEST/LIVE switch below.
- Event Name is read-only on a date. It was copied when the date was created; rename the blueprint later and existing dates keep the old text.
- Status — Draft, Scheduled, Live, Completed, Cancelled; new dates are Scheduled. Only Scheduled and Live are publicly visible and open for registration. Anything else is invisible and refuses with "Event not available for registration".
There is no recurring-date generator. A weekly webinar means adding each date by hand.
Every new date is created in TEST mode
This is the step that quietly costs you money. Each date carries a payment mode, and new ones are always TEST, routing checkout through your Stripe or PayPal test keys — no real charge. The Schedule Event dialog never shows this, because the switch appears only once the date exists.
Flip it with the TEST / LIVE button on the event's card in the Events tab, which switches every date of that event at once (shown only when the event is not Free), or with the same switch at the bottom of an individual date.
Getting it wrong looks like a "successful" purchase that never reaches your live Stripe dashboard — or, if you only configured live keys, checkout failing with Stripe is not configured. Put one real card through before advertising.
The booking page
Admin → Events → Event Pages lists one card per event with Published and Unpublished changes badges; click through to the builder. Edits autosave into a draft, and the live page does not change until you press Publish (Republish once live). So a page you fixed this morning still serves the old version until you press it — the badge on the list is how you spot that.
Untouched, the page renders a built-in default: navigation, the booking band with three bullets, an empty "What you'll get" block, testimonials, a two-question FAQ, footer. Two shipped lines make promises the software will not keep:
- The band's bullet "Limited seats so everyone gets answers". There is no capacity limit anywhere in the platform — no seat count, no sold-out state, no waitlist. Edit it under Benefit checks in the booking section's settings.
- The FAQ answers "What if I can't make the date?" with "…register anyway and we'll keep you posted." Nothing keeps anyone posted; there are no reminders. Rewrite it.
An event appears in a listing only if it is public, Show on events page is on, and it has a
Scheduled or Live date today or later; /events is the combined listing across types. The detail
page shows the first upcoming date, or the last past one if none remain — a finished event does
not take itself down.
Gating access
- Link the event to a product (Permissions tab). The product's permission becomes the gate and a visitor without it lands on that product's sales page, where they can buy access.
- Turn off Public Event and set a Required Permission. A visitor without it gets
/forbidden; signed-out visitors go to login first; admins always pass. Note it spans two tabs — Public Event is on General.
Grant Permission is a two-option select, not an attendance-only setting: Grant on signup is the default, Grant on attendance the alternative, so a permission set without opening it is on "signup". What each does today: a paid event grants on payment whichever is chosen; a free registration grants nothing at signup; ticking attendance grants only under Grant on attendance. So if a free event is meant to hand out access, choose Grant on attendance and tick it.
What happens when someone registers
The forms differ, and not only between surfaces. Inside the booking panel on the event page the free registration form asks Email, First Name, Last Name and Phone Number, while the paid and voluntary-payment forms ask Email Address, First Name and Last Name with no phone field at all. The modal from the homepage upcoming-events card (also used by event blocks on product pages) asks First name, Last name, Email — no phone. Only the email is required anywhere.
- The address is normalised (lower-cased, trimmed,
@googlemail.comfolded to@gmail.com) and a contact is found or created with role Lead. A missing first name is stored as the wordGuest. - Registration only fills blanks on an existing contact — first name only when empty or
Guest, last name and phone only when empty. A nickname will not overwrite the real name. - One registration per person per date, enforced in the database.
The phone field is labelled "Phone Number (for reminders)" and the panel prints "Access link by email · SMS reminders" once a number is typed. There is no reminder capability and no SMS anywhere in the platform. You are collecting numbers against a promise nothing keeps.
A cancelled registration still blocks re-registration. The duplicate check ignores whether the earlier one was cancelled, so someone who changes their mind gets "You're already registered for this event". There is one way back in and it is not obvious: rescheduling from another still- active date of the same event onto the cancelled one reactivates that booking. What you cannot do is reschedule out of a cancelled registration — that is refused with "Registration is already cancelled" — and no admin control re-opens one directly.
For paid events the registration row is created only after payment succeeds, so an abandoned checkout leaves nothing — the attendee list is not where you find people who started and stopped.
What the attendee actually receives
The confirmation email is not sent by the registration code. Registering records an
event-registration action on the contact; a system automation named "Event Registration
Confirmation" picks it up and sends the event-registration template. Three ship: registration,
cancellation, reschedule.
You cannot break this by switching it off — system automations refuse to be edited, paused, archived or deleted. The real failure is quieter: the send is fire-and-forget. If the automation or the mail fails, that goes to the server log while the registration still reports success — the booking looks perfect and nothing arrived. If an attendee reports silence, check your mail configuration and the server log, not the registration.
Event templates accept these placeholders:
{{eventName}} {{eventDate}} {{eventTime}} {{eventLocation}} {{eventType}}
{{joinUrl}} {{meetingId}} {{meetingPasscode}}
{{recordingUrl}} {{recordingPasscode}}
{{cancelUrl}} {{confirmationUrl}}
{{oldEventDate}} {{newEventDate}} {{newEventTime}}
{{joinUrl}}is not in the shipped registration template — but the personal join URL still reaches the attendee, because the shipped body renders{{eventLocation}}behind a "Location:" line and the registration trigger fills that with the Zoom join URL when there is one. So it arrives as bare text on a Location line, not as a labelled link anyone will read as "join here". Add{{joinUrl}}— plus{{meetingId}}and{{meetingPasscode}}if useful — to the Event Registration and Event Reschedule templates to make it a proper link. Second trap: if the meeting is not created yet, or adding the attendee fails, the system queues a retry and falls back to the event's shared link. The mail goes immediately with whatever it got, so{{joinUrl}}can silently be the generic link, not the personal one.{{confirmationUrl}}resolves only for events of type Other — a 404 for every other type. No shipped template uses it, so it bites only if you add it yourself. Don't:{{cancelUrl}}works for every type, and is what the shipped "Manage your booking" link already uses.{{eventLocation}}falls back to the literal "Online" for webinars, or "TBA" otherwise, when there is no Zoom link and no manual meeting link. Attendees read "TBA" literally.
There is no calendar attachment and no "add to calendar" button — no .ics file is generated
anywhere, so state the date and time plainly in the body.
The manage link, cancelling and rescheduling
{{cancelUrl}} produces /events/manage/r/<registrationId> — the only manage URL anything in the
platform generates. A second form at /events/manage/<slug>?email=<address> exists but nothing
links to it, and without the email in the address it reports missing information.
That registration id is the only credential. No login, no confirmation step: anyone holding the URL can see the booker's name and email and cancel or move the booking. Nor is the id a strong secret — a timestamp plus a short suffix from an ordinary, non-cryptographic random number generator — so treat it as guessable, not merely leakable. Never paste one into a public page, a shared thread or a screenshot.
Rescheduling is limited to another future date of the same event. Nothing caps how often someone reschedules and there is no cancellation deadline — a booking can be cancelled minutes before the session.
Cancelling does not refund and does not stop a subscription. Both cancel paths only mark the registration cancelled, remove the Zoom registrant and send the cancellation email. Refunds are a separate manual admin action, and a subscription or installment plan bills on until you cancel it at the gateway. If paid attendees can cancel themselves, you need a routine for checking what needs refunding.
One rough edge on the email-based page: it loads on a normalised address but cancels on the
address exactly as typed, so different capitalisation — or @googlemail.com where @gmail.com
was stored — loads fine and then fails with "Contact not found". Cancel it from the admin.
Attendance
The attendance checkbox is dead until the date has ended. It is disabled and greyed while
dateTime + duration is still in the future, with the tooltip "Attendance can only be marked
after the event ends". Testing a booking before the session and finding an unclickable box is the
expected behaviour, not a fault.
Ticking attendance in the event's attendee panel sets the attended flag, tags the contact (the
event name lowercased and hyphenated, plus -attended) and grants the event's permission if it is
set to grant on attendance. Un-ticking reverts the flag and tag but leaves the recorded join time
and watch duration.
Manual ticking does not fire the attendance automations. The event-attended, event-joined
and event-no-show triggers come only from Zoom's webhooks. Build a follow-up on "Event Attended",
mark attendance by hand, and it silently never runs — the symptom is an automation with zero
enrolments and no error anywhere. That needs Zoom connected and delivering.
Times and timezones
Times are stored without a timezone; one business-wide timezone in general settings drives how they display, shipped default Europe/London. There are no per-event or per-attendee timezones, and the "upcoming" cutoff for listings uses the server's own calendar date. Before scheduling across a daylight-saving change, or for another continent, check on your install that a date you enter shows the time you meant on the public page.
Things that do not exist, so you do not go looking
Attendee capacity, seat counts, sold-out states, waitlists, recurring dates, reminder emails, SMS, reschedule limits, cancellation cut-offs. Nor anything calendar-related: the admin integrations screen advertises "calendar sync for scheduled events" and lists a Google Meet integration, and neither is implemented.
Comments