Platform

Scheduling & booking

.md

Public booking pages, the embed script, booking events and integrations through automations.

Scheduling lets a workspace publish calendars (meeting types) that customers book from a public page or an embed on your own site. Each booking sends confirmation and reminder emails, creates or updates the contact, and can open a ticket in an inbox. Calendars, availability and questions are configured in the dashboard (Scheduling).

Availability by plan

PlanCalendarsGoogle Calendar sync
FreeNot includedNo
Starter1No
Pro10Yes
EnterpriseUnlimitedYes

Google Calendar sync checks the host's busy times when offering slots, creates an event for each booking and can generate a Google Meet link.

Public URLs

Booking pages live on the help center host (https://{slug}.tickos.dev, or your custom domain on Pro and Enterprise). {calendar} is the calendar slug.

URLContent
/bookList of active calendars. Only shown when "Book a meeting" is enabled in Help Center settings.
/book/{calendar}Booking page for one calendar. Works for any active calendar, even if /book is disabled.
/book/manage/{token}Link sent in the emails so the invitee can cancel or reschedule without logging in.
/book/manage/{token}/icsDownloads the booking as an .ics calendar file.
/embed/{calendar}Booking widget without the help center layout, meant for iframes.
/embed.jsEmbed script (inline, popup and booking event).

Embedding on your site

Load embed.js from your help center host and point it to the /embed/{calendar} URL. The iframe resizes itself to fit its content, and /embed/* pages can be framed from any origin.

Inline

index.html
HTML
01<div data-tickos-booking="https://acme.tickos.dev/embed/intro-call"></div>
02<script src="https://acme.tickos.dev/embed.js" async></script>
UTF-8 · LF · HTMLtickos.dev

Any clickable element with data-tickos-booking-popup opens the booking widget in a modal. Close it with the X button, Escape or a click outside.

index.html
HTML
01<button data-tickos-booking-popup="https://acme.tickos.dev/embed/intro-call">
02 Book a meeting
03</button>
04<script src="https://acme.tickos.dev/embed.js" async></script>
UTF-8 · LF · HTMLtickos.dev

Or open it from JavaScript:

example.js
JavaScript
01window.TickOS.openBooking('https://acme.tickos.dev/embed/intro-call')
02window.TickOS.closeBooking()
03// Re-scan the page after inserting data-tickos-booking elements dynamically
04window.TickOS.mount()
UTF-8 · LF · JavaScripttickos.dev

Theme

Add data-theme="light" or data-theme="dark" to the element to force a theme. Otherwise the widget follows the help center theme settings. When linking to /embed/{calendar} directly, use ?theme=light or ?theme=dark.

Booking event

When a booking is completed inside an embedded widget, embed.js dispatches a tickos:booked CustomEvent on the host page window. Use it for analytics or to continue your own flow:

example.js
JavaScript
01window.addEventListener('tickos:booked', (e) => {
02 // e.detail = {
03 // type: 'tickos:booked',
04 // calendar: 'intro-call',
05 // booking: { start_at: '2026-10-20T15:00:00.000Z', end_at: '2026-10-20T15:30:00.000Z' }
06 // }
07 analytics.track('meeting_booked', e.detail)
08})
UTF-8 · LF · JavaScripttickos.dev
The same embed.js also powers inbox form embeds (data-tickos-form attributes). A single script tag is enough for both.

What happens on a booking

  • The invitee is created or matched as a contact (source: scheduling).
  • Confirmation and host notification emails are sent from the calendar's verified sending domain (or a TickOS no-reply address if none is set); reminders are scheduled. These emails count toward the plan email quota and respect suppressed recipients.
  • If the calendar has a ticket inbox configured, a ticket is created there. It fires the usual ticket.created inbox webhooks; cancellations and reschedules are added to the same ticket as internal notes.
  • Two confirmed bookings can never overlap on the same calendar: if a slot is taken while the invitee is booking, the widget asks them to pick another time.
  • Automations with a booking trigger are started (see below).

Integrating bookings with your systems

There is no API-key endpoint for calendars or bookings. To push bookings into your CRM or backend, create an automation (Pro and Enterprise) with one of these triggers and add a Webhook step:

trigger_typeWebhook trigger_eventFired when
booking_scheduledbooking.scheduledA new booking is confirmed.
booking_rescheduledbooking.rescheduledThe invitee moves a booking to a new time.
booking_cancelledbooking.cancelledA booking is cancelled.

The Webhook step payload includes the contact plus the resolved booking and calendar:

response.json
JSON
01{
02 "event": "automation.step.webhook",
03 "trigger_event": "booking.scheduled",
04 "timestamp": "2026-10-13T09:12:00.000Z",
05 "automation": { "id": "…", "name": "New demo booked", "trigger_type": "booking_scheduled" },
06 "enrollment": { "id": "…", "enrolled_at": "…" },
07 "customer": { "id": "cst-…", "email": "jane@example.com", "name": "Jane Doe", … },
08 "trigger": {
09 "type": "booking_scheduled",
10 "event": "booking.scheduled",
11 "booking": {
12 "id": "bkg_…", "status": "confirmed",
13 "invitee_name": "Jane Doe", "invitee_email": "jane@example.com",
14 "invitee_timezone": "Europe/Madrid", "answers": { … },
15 "start_at": "…", "end_at": "…", "ticket_id": "tck-…",
16 "manage_url": "https://acme.tickos.dev/book/manage/…",
17 "meeting_url": "https://meet.google.com/…"
18 },
19 "calendar": { "id": "cal_…", "name": "Intro call", "slug": "intro-call", "duration_minutes": 30, … }
20 }
21}
UTF-8 · LF · JSONtickos.dev

Booking data is also available as {{booking_*}} variables (for example {{booking_start_date}}, {{booking_meeting_url}}, {{booking_manage_url}}) in automation emails. Sequences started by a booking exit automatically when it is cancelled, and the exit condition on_booking removes a contact from other automations once they book. See the Automations page (/docs/automations) for the step and trigger reference.