Event types & booking pages
Event types are the bookable meeting templates behind your /book pages and website embeds — each one defines what gets booked, where it happens, who hosts it, and what the client receives.
Quick links
Booking
Create and edit event types, view bookings.
Settings > Integrations
Connect the calendar and Zoom accounts event types rely on.
What an event type controls
Each event type is one kind of meeting clients can book — an initial consultation, a case review, a signing appointment. The editor groups everything into a few cards:
- Basics — the name clients see, the URL slug that becomes the booking page path (
/book/your-firm/initial-consultation— auto-generated from the name, editable any time), a short description, and the duration. Pick a preset (15/30/45/60/90 minutes) or enter any custom length from 5 minutes to 8 hours. - Scheduling guardrails — minimum notice (in minutes, hours, or days), how far ahead clients can book, buffers before and after each meeting, and the time-slot interval shown on the booking page.
- Require host confirmation — when on, new bookings stay pending until the host approves them; the calendar invite and confirmation go out on approval.
- Appearance — the accent color and light/dark theme of the public booking page, so it matches your site.
Location options
The Location setting decides where the meeting happens. The link or address lands on the calendar invite, confirmation email, and reminders automatically.
- Calendar default — follows the host calendar's meeting-room setting.
- Google Meet / Teams — always creates a meeting room. The provider follows the host's connected calendar: Google calendars create Meet rooms, Outlook creates Teams meetings.
- Zoom — creates a unique Zoom meeting on the host's account for every booking, and the Meeting Agent joins to write the post-call report. See the Zoom guide for setup.
- In person — enter your street, city, state, and ZIP; the address becomes the meeting location on the invite. Optional arrival info (parking, check-in) rides along in the invite description and under the location line in confirmation and reminder emails.
- Phone call — choose who places the call. We call the client: attendees see "Phone call — we'll call you at the number you provided." Client calls us: the number you enter becomes the meeting location.
- Custom link — one static URL (a personal meeting room) used for every booking of this event type.
- No video link — a clean invite with no meeting link at all.
Team scheduling
- Single host — one person hosts every booking of this event type.
- Round robin — bookings rotate across a host pool. The rotation picks the host the moment a slot is booked. Distribution can be equal split (everyone gets the same share) or maximize availability (clients see the most open slots).
- Collective — all selected hosts attend every booking; the primary host's calendar and Zoom account are used for the invite and meeting link.
Hosts need a connected calendar to receive bookings — and, for Zoom event types, a connected Zoom account. The editor shows each host's connection status as you assign them.
Custom availability
By default, booking pages offer times when the host's calendar is free. Custom Availability adds this event type's own weekly hours on top — for example, keeping consultations to Monday–Friday mornings even when the calendar is otherwise open. Set per-day time ranges in the timezone of your choice; days toggled off are never offered.
Notifications
Each event type controls what the client receives, per channel:
- Booking confirmation — sent the moment the booking is made, with the calendar invite attached.
- Reminders — add as many as you need, each with its own timing (minutes, hours, or days before) and its own email and SMS toggles.
- Cancellation notice — sent if the meeting is cancelled by either side.
SMS goes only to clients who gave consent when booking, and every message includes opt-out language automatically. Message templates are shared firm-wide and editable under Settings.
Share & embed
Every event type has a Share & Embed tab with:
- The booking link — share it in email signatures, ads, or anywhere else.
- Embed code — drop the booking widget into your website as an inline section, a popup button, a floating badge, or a plain iframe, with a configurable widget background.
- A live preview — exactly how the widget renders for visitors, including the widget background color you set for embeds.
After booking
- Active — whether this event type accepts new bookings. Turning it off hides the booking page immediately; bookings that already exist are unaffected and keep their invites, reminders, and links.
- Auto-accept the calendar invite for the host — when on, the event shows as accepted on the host's calendar the moment it's booked, so the slot reads as busy without the host clicking anything.
- Redirect to your own page — send clients to your own confirmation page instead of the standard screen. Covered in depth in the next section.
Redirect to your own confirmation page
In the After booking card, turn on Redirect to your own page after booking and enter a URL. Instead of the standard confirmation screen, clients land on your page — with the full booking context appended as query parameters so you can build a personalized confirmation: greet the client by name, show their time and meeting details, and offer reschedule links.
Always included:
| Field | Required | Notes |
|---|---|---|
bookingId | Always | Unique ID of the booking. |
eventName | Always | The event type name, e.g. Initial Consultation. |
startTime | Always | ISO 8601 timestamp in UTC, e.g. 2026-08-04T15:30:00.000Z. Convert for display using timezone. |
endTime | Always | ISO 8601 timestamp in UTC. |
timezone | Always | The client's IANA timezone chosen at booking, e.g. America/Chicago. |
duration | Always | Meeting length in minutes. |
inviteeName | Always | The client's full name as entered. |
inviteeFirstName | Always | First name — ideal for greetings. |
inviteeLastName | Always | Last name. |
inviteeEmail | Always | The client's email address. |
Included when the booking has them — treat these as optional:
| Field | Required | Notes |
|---|---|---|
inviteePhone | Conditional | Only if the client entered a phone number. |
meetingLink | Conditional | Video meetings only — the Meet, Teams, Zoom, or custom join URL. |
location | Conditional | The meeting's "where", ready to display: in-person meetings send the address; phone meetings send the call details ("Phone call — we'll call you at the number you provided" or "Phone call — call (555) 123-4567"); video meetings send the platform name (e.g. "Zoom", "Google Meet") alongside meetingLink. Only absent when the event type has no video link. Matches the calendar invite exactly. |
locationNotes | Conditional | In-person meetings with arrival info — parking, suite, check-in instructions. |
hostName | Conditional | The host actually assigned to this booking — the single host, the round-robin winner for rotating teams, or the primary host for collective events. |
hostEmail | Conditional | The assigned host's email. |
hostNames | Conditional | Collective events with two or more hosts — the full comma-joined roster. |
organizationName | Conditional | Your firm's display name. |
cancelUrl | Conditional | Link the client can use to cancel. |
rescheduleUrl | Conditional | Link the client can use to reschedule. |
Example — Zoom event type with round-robin hosts. The client booked with a rotating team; hostName is the host the rotation picked for this booking:
https://meridianlaw.com/thank-you
?bookingId=b7e9a2c4-5f31-4d8e-9a06-1c2d3e4f5a6b
&eventName=Initial%20Consultation
&startTime=2026-08-04T15%3A30%3A00.000Z
&endTime=2026-08-04T16%3A00%3A00.000Z
&timezone=America%2FChicago
&duration=30
&inviteeName=Maria%20Alvarez
&inviteeFirstName=Maria
&inviteeLastName=Alvarez
&inviteeEmail=maria.alvarez%40example.com
&meetingLink=https%3A%2F%2Fzoom.us%2Fj%2F85512345678%3Fpwd%3Dabc123
&hostName=Sarah%20Calloway
&hostEmail=s.calloway%40meridianlaw.com
&organizationName=Meridian%20Law
&cancelUrl=https%3A%2F%2Fapp.superpractice.com%2Fbook%2Fcancel%3Ftoken%3D...
&rescheduleUrl=https%3A%2F%2Fapp.superpractice.com%2Fbook%2Freschedule%3Ftoken%3D...Example — in-person meeting. No meetingLink; instead the address and arrival info arrive as location and locationNotes:
https://meridianlaw.com/thank-you
?bookingId=c8f0b3d5-6a42-4e9f-8b17-2d3e4f5a6b7c
&eventName=Estate%20Planning%20Session
&startTime=2026-08-06T19%3A00%3A00.000Z
&endTime=2026-08-06T20%3A00%3A00.000Z
&timezone=America%2FChicago
&duration=60
&inviteeName=James%20Porter
&inviteeFirstName=James
&inviteeLastName=Porter
&inviteeEmail=james.porter%40example.com
&location=500%20Main%20St%2C%20Suite%20210%2C%20Austin%2C%20TX%2078701
&locationNotes=Free%20parking%20in%20the%20rear%20lot.%20Check%20in%20with%20reception%20on%20the%202nd%20floor.
&hostName=Daniel%20Reyes
&organizationName=Meridian%20LawExample — phone call, "we call the client." The client provided a number; location carries the same message shown on the calendar invite:
https://meridianlaw.com/thank-you
?bookingId=d9a1c4e6-7b53-4f0a-9c28-3e4f5a6b7c8d
&eventName=Free%20Case%20Review
&startTime=2026-08-07T14%3A00%3A00.000Z
&endTime=2026-08-07T14%3A30%3A00.000Z
&timezone=America%2FNew_York
&duration=30
&inviteeName=Dana%20Whitfield
&inviteeFirstName=Dana
&inviteeLastName=Whitfield
&inviteeEmail=dana.whitfield%40example.com
&inviteePhone=%2B15125550142
&location=Phone%20call%20%E2%80%94%20we%27ll%20call%20you%20at%20the%20number%20you%20provided
&hostName=Sarah%20Calloway
&organizationName=Meridian%20LawBuilding your page. Read the parameters client-side or server-side. Values are URL-encoded — your framework's query parser decodes them for you. Times are UTC; convert using the timezone parameter. Treat every conditional parameter as optional:
const params = new URLSearchParams(window.location.search)
const firstName = params.get("inviteeFirstName") ?? "there"
const startTime = params.get("startTime") // ISO 8601, UTC
const timezone = params.get("timezone") ?? "America/Chicago"
document.querySelector("#greeting").textContent = `You're confirmed, ${firstName}!`
if (startTime) {
document.querySelector("#when").textContent = new Date(startTime).toLocaleString("en-US", {
dateStyle: "full",
timeStyle: "short",
timeZone: timezone,
})
}
// Optional details — only render what arrived
const location = params.get("location")
if (location) document.querySelector("#where").textContent = location
const hostName = params.get("hostName")
if (hostName) document.querySelector("#host").textContent = `Meeting with ${hostName}`Every value is computed on our servers at the moment the booking is made — the same source that writes the calendar invite and emails — so your confirmation page can never disagree with what the client sees elsewhere.