Embedding the scheduler on your website
Settings → Integrations lets visitors book you directly from your own website, using an embedded scheduler instead of sending them here.
1. Allow your domain
Under Allowed domains, enter the exact address of the site that will host the scheduler: the protocol and the domain only (with the port, if it has one), no path and no trailing slash:
https://apply.acme.com ✓
https://acme.com:8443 ✓
acme.com ✗ missing protocol
https://acme.com/book ✗ has a path
https://acme.com/ ✗ trailing slashhttps://www.acme.com and https://acme.com are different addresses. If visitors can reach your site either way, add both.
This list is also the on/off switch: while it is empty, your scheduler cannot be embedded anywhere. You can add up to 50 domains, and removing one takes effect immediately.

2. Paste the snippet
Each approved listing has its own snippet. Copy it and paste it into your page where the scheduler should appear:
<div class="scheduling-embed" data-service="SERVICE_ID"></div>
<script src="https://embed.example.com/embed.js" async></script>The <div> marks the spot; the script tag can go anywhere on the page and only needs to appear once, even with several schedulers. If you see no approved listings to embed yet, the listing is still in review. Its snippet appears once it is approved.

3. Set the language
Scheduler language on this page controls what visitors see. Leave it on match the page language and the scheduler reads the lang attribute of your page's <html> tag, the same attribute search engines and screen readers use, so a properly localized site needs no extra configuration:

<!doctype html>
<html lang="es"> <!-- scheduler renders in Spanish -->
<head>…</head>
<body>…</body>
</html>Regional tags work: lang="pt-BR" is reduced to the closest language we support rather than rejected.
To override the page for one scheduler, add data-locale to the embed div. It beats both the page language and the setting on this page:
<div class="scheduling-embed" data-service="SERVICE_ID" data-locale="de"></div>If your page has its own language switcher, tell the scheduler to follow it. This swaps the language in place, so anything the visitor has already filled in is kept:
window.SchedulerEmbed.setLocale("sr");In short, the first of these that is set wins: data-locale, then your page's <html lang>, then Scheduler language, then the visitor's browser, then English.
Other options
Add these to the embed div:
data-mode="popup" shows a button that opens the scheduler in an overlay instead of placing it inline.
data-label="Book now" sets the button text in popup mode.
data-min-height="480" sets the height in pixels before the scheduler reports its real size. Raise it if you see a jump on load.
Two more calls are available if your site inserts content dynamically or tracks conversions:
// Re-scan the page after adding a scheduler div
window.SchedulerEmbed.refresh();
// Fires when a visitor completes a booking
window.SchedulerEmbed.onBooking(function (e) {
console.log(e.bookingId, e.serviceId);
});AI assistants
Through WebMCP, a proposed web standard, the scheduler also offers tools to AI assistants. With them, an assistant helping a visitor in their browser can read what you offer and at what price, find open times and select a time where the visitor can see it. It can book as well, but booking is marked as needing the visitor's consent, so the assistant asks them first. Signing in, creating an account and paying always stay with the visitor.
There is nothing to set up: the snippet already allows it. Only a scheduler you placed with your own <iframe> tag instead of the snippet needs allow="payment; tools" added to that tag.
Assistant support is still new. ChatGPT's desktop app already uses these tools in its built-in browser, on your listing's page on our site and on the link from Share booking link. It does not yet use tools inside a scheduler embedded in another site; the scheduler is ready for assistants that do. Either way, visitors can always book on their own.
If the scheduler does not load
The page's address is not on the allowed list, or does not match exactly. Using http instead of https, or a missing www, is enough to block it.
The snippet landed somewhere the script cannot run, such as a plain-text or restricted-HTML block in your site builder.
The data-service value was altered. Paste the snippet as-is rather than retyping the id.
The listing was unpublished or is no longer approved.