Find sections across all documentation pages
Configure your booking widget to match your brand and business requirements. All settings can be updated at any time.
The main brand color used for buttons, CTAs, and interactive elements. If your brand color is blue (#0066CC), set this as your primary color so all booking buttons match your website.
The color of text displayed on primary buttons. Use white (#FFFFFF) for dark primary colors, or dark text for light primary colors.
Controls the roundness of buttons and input fields (0-32px): 0px = sharp corners, 8px = slightly rounded, 16px = rounded, 32px = pill-shaped.
The call-to-action text displayed on the main booking button. Defaults to "Book Appointment" if not set. Also used as the default button text in the Button Trigger embed mode.
Tip: The widget settings page includes a live preview that updates in real-time as you adjust colors and border radius.
Dollar amount charged if customer cancels within the notice period (e.g., $25). Requires "Require Payment Method" to be enabled — otherwise the field is disabled, the fee is cleared to $0 on save, and no fee line is shown to guests in the booking widget.
Minimum hours of advance notice required to cancel without penalty. Typical values: 24-48 hours.
Maximum minutes late before appointment may be cancelled. Common value: 15 minutes.
How many days in advance customers can book. Set to 90 for 3 months advance booking.
When enabled, customers must provide a phone number during booking. Recommended for appointment confirmations and reminders.
Sends an SMS code to verify the customer's phone number before allowing booking. Helps prevent spam and no-shows. Requires "Require Phone Number" to be enabled.
Collects credit card information to hold the appointment (no charge until service). Reduces no-shows significantly. Also gates the Advanced Deposit and Cancellation Fee settings — disabling it disables those fields and auto-disables an enabled deposit.
Displays service prices in the widget. Disable if you prefer to discuss pricing during the appointment.
Filters services to show only consultation-type appointments. Useful if you want to limit online booking to initial consultations.
Displays service subcategories in the service selection step for better organization.
When enabled, adds a provider/therapist selection step to the booking flow. Customers can choose a specific provider or select "Any Available" for the next opening.
Allows customers to add additional services or enhancements during the booking process.
Adds a checkbox for customers to opt-in to marketing emails. Helps build your email list compliantly. You can customize the consent text using the "Marketing Consent Text" field.
Two exceptions. First, on a data-form-onlylead-capture embed the checkbox is still shown but does not block submission — there is nothing being purchased in that mode, so agreeing to marketing texts is not made the price of getting in touch. The guest's answer is still recorded if they tick it.
Second, consent is recorded per location. A guest who stays signed in while switching to another of your locations is asked once more there, on a step already filled in with their details. That prompt does not hold them up either — they have already verified — but their answer is recorded if they tick it. A guest going through the booking steps from the start still has to tick it.
Custom text shown next to the marketing consent checkbox. Use this to describe what customers are opting into.
Choose between SMS or email verification for new guests. SMS sends a code to the guest's phone via Twilio. Email sends a code to the guest's email via Resend. Existing guests are verified based on which contact info matches their Zenoti record.
Guests only enter a code once per visit. If your locations are grouped together in one organization, a guest who verified at one of them stays signed in when they move to another — whether they switch in the location picker, or open a different location's widget on another page of the same site, in the same browser tab. They may be asked for a new code again if they move to a location outside your organization, open a new browser tab, visit a different website, switch device, come back after about 30 minutes, or if the new location's system cannot match their record.
When enabled, displays an optional text field on the booking confirmation screen where guests can enter a promo or referral code. The entered code is included in webhook payloads as offerCode.
Custom legal language displayed during the booking confirmation step. Use this for terms the customer must agree to when completing a booking.
When enabled, collects a deposit amount at the time of booking. The deposit is charged immediately and applied toward the final service cost. Requires "Require Payment Method" to be enabled; turning payment collection off automatically disables this too.
The dollar amount to collect as a deposit (e.g., $50). Only applies when Advanced Deposit is enabled, which in turn requires "Require Payment Method".
Link to your gift card purchase page. When set, a gift card link is displayed in the widget for cross-promotion.
Displays a promotional banner at the top of the widget. Use this to highlight special offers or seasonal promotions.
A list of promotional messages to rotate in the promo banner. Add multiple promos to cycle through different offers.
The promotion a guest picks from this list becomes the Promo: line on the Zenoti appointment note and on the guest's Zenoti profile note, copied exactly as you typed it here — see what BookerKit writes to your Zenoti appointments.
Name the offer, not the treatment
Because the title is copied exactly, a promotion you call “Semaglutide Special” or “HRT Consult” puts that treatment name onto the appointment note and onto the guest's profile note, where it sits alongside their clinical record and is visible to anyone who can open the profile. “Spring Refresh” or “New Guest Offer” attributes the booking just as well without naming what the guest is being treated for.
Available on the Growth and Enterprise plans for Zapier, CRM, and other integrations.
Webhooks send HTTP POST requests to your specified URL when booking events occur. Use this to integrate with your own systems.
The endpoint where webhook events will be sent. Must be a valid HTTPS URL.
Triggered when a customer completes Step 1 (personal information). Useful for tracking booking intent and capturing leads early in the funnel.
Triggered when a booking is successfully completed. Use this to update your CRM, send confirmation emails, or trigger other automations.
booking_started Payload
Sent when a guest submits their personal info and begins the booking flow.
{
"event": "booking_started",
"timestamp": "2025-01-15T14:25:00.000Z",
"data": {
"sessionId": "abc123...",
"email": "customer@example.com",
"firstName": "Jane",
"lastName": "Doe",
"phone": "(555) 123-4567",
"accountName": "your-salon",
"serviceCategory": "Hair Services",
"mode": "booking",
"tracking": { ... }
}
}mode is always present. On booking_started it is either booking or form_only; on booking_completed it is always booking, since a lead-capture embed never reaches a confirmed booking. A form_only payload came from a data-form-only lead-capture embed — the guest gave their details but is not booking an appointment, so branch on this before any appointment-related automation. Note that mode reflects which embed the visitor loaded; it is not an authenticated claim, so treat it as routing context and never gate payment, deposit, or record-changing automations on it alone.
Re-capture your webhook trigger before you deploy this
mode is new. A GoHighLevel inbound-webhook trigger locks its field list to the first payload it received, so on any workflow that was already live mode arrives on the wire but will not appear in your field picker — you cannot select it in a condition or a filter until you delete the trigger and re-capture a sample. Do that before deploying a data-form-only embed on the same widget.
booking_completed Payload
Sent when a booking is fully confirmed in Zenoti.
{
"event": "booking_completed",
"timestamp": "2025-01-15T14:30:00.000Z",
"data": {
"sessionId": "abc123...",
"bookingId": "zenoti-booking-id",
"reservationId": "zenoti-reservation-id",
"value": 85.00,
"serviceId": "service-123",
"serviceName": "Haircut",
"serviceCategory": "Hair Services",
"date": "2025-01-15",
"startTime": "14:30",
"firstName": "Jane",
"lastName": "Doe",
"email": "customer@example.com",
"phone": "(555) 123-4567",
"accountName": "your-salon",
"offerCode": "SUMMER2025",
"mode": "booking",
"addOns": [
{ "id": "addon-1", "name": "Deep Conditioning", "price": 25.00 }
],
"tracking": {
"utm": {
"source": "google",
"medium": "cpc",
"campaign": "summer-promo",
"term": "haircut near me",
"content": null
},
"click_ids": {
"gclid": "abc123...",
"fbclid": null,
"fbc": null,
"fbp": null,
"msclkid": null
},
"referral": {
"source": "google",
"referrer": "https://www.google.com",
"landing_page": "https://yoursalon.com/book"
}
}
}
}The tracking object is automatically included when session tracking data is available. It contains UTM parameters, ad platform click IDs (Google, Facebook, Microsoft), and referral information captured when the customer first loaded the widget. The offerCode and addOns fields are included only when applicable.
Email address where booking notifications and system alerts will be sent.
When enabled, sends an email notification when a customer begins the booking process (completes Step 1).
When enabled, sends an email notification when a booking is successfully completed.
Displayed in the widget for customer support questions. Also used for error notifications.
Phone number shown in the widget for customer support.
Link to your privacy policy. Displayed in the widget to ensure compliance with data protection regulations.
Link to your terms of service. Shown during the booking process.