> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dmly.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Booking page

> Your public booking page: its address, what a contact sees and does, and how to share it on WhatsApp.

Your booking page is a public web page where anyone can pick a service, choose a time and book
it — no login, no app. It is the page you send when a contact asks "can I get in on Thursday?".
Everything on it comes from your Services and your staff's availability, so there is nothing
separate to build.

## Its address

Every workspace has a booking page at:

* `https://dash.dmly.io/book/<your workspace id>` — the landing page, listing your bookable
  services grouped by category.
* `https://dash.dmly.io/book/<your workspace id>/<service slug>` — a single service, so a
  contact lands straight on that service's times.

To find your own, go to **Business → Appointments → Settings → Branding** and select
**Preview booking page**. That opens the live page; copy the address from your browser.

<Note>
  You can serve the page on your own domain instead (`book.yoursalon.com`) — see
  [Custom domain](/appointments/custom-domain). That's a paid add-on: if your plan doesn't
  include it, you'll see **Custom domains aren't included in your current plan.** and every
  link keeps using the `dash.dmly.io` address above. Links only switch to your domain once it
  is verified and its SSL certificate is live, so a link you shared is never broken.
</Note>

## What's on the page

The landing page lists only services that are **active** and **publicly visible**, and only
Services of type appointment or class. Add-ons never appear — they're order extras, not
something a contact books.

If a service is missing from the page, it is almost always one of those two switches. See
[Services](/appointments/services).

The page shows a **Booking page title**, a **Booking page description**, your logo and your
brand colour — all set under **Settings → Branding**. Leave the logo empty and it uses your
business logo from **Settings → Business details**.

## What a contact does

<Steps>
  <Step title="Picks a service">
    From the landing page, or straight from a link to one service.
  </Step>

  <Step title="Picks a staff member — sometimes">
    If the service offers a choice, they pick a person. If you turned on **Hide staff
    selection** under **Settings → Appointment → Booking flow** — it applies to every
    appointment service — they don't: *Clients won't choose a staff member; one is
    assigned automatically.*
  </Step>

  <Step title="Picks a time">
    Only genuinely open slots are offered. DMLY subtracts your staff's booked time, buffers,
    time off, blocked time and their connected calendar's busy time — and applies your minimum
    notice and booking horizon. See [Staff and availability](/appointments/staff-and-availability).
  </Step>

  <Step title="Fills in the form">
    A new visitor must give at least a first name and an email address. The rest of the fields
    are up to you — configure them under **Settings → Booking Fields**. It's one shared list
    for appointments and classes; only **Additional Notes** is appointment-only.
  </Step>

  <Step title="Books">
    They land on a confirmation page and get a confirmation message on their channel.
  </Step>
</Steps>

If a contact reaches the page from a link DMLY sent them (from a Flow, for example), the page
already knows who they are and skips the name/email fields entirely — and the booking is
attributed to their existing Contact rather than creating a new one.

<Note>
  When an unknown visitor books, DMLY creates a lightweight Contact from the name and email
  they typed. That's a real Contact in your CRM, but it has no WhatsApp identity attached yet —
  so the confirmation and reminders go to whatever channel it does have. This is exactly why
  sharing the link *on WhatsApp* is worth the extra second.
</Note>

## Times are shown in one of two ways

Under **Settings → Appointment**, **Timezone mode** is either **Detect automatically** or
**Fixed timezone**. The public page has no browser timezone detection: **Detect automatically**
uses the contact's stored timezone when DMLY already knows them, and otherwise falls back to the
service's own timezone. A stranger opening a shared link therefore sees your clock in both modes.

Pick **Fixed timezone** if you're a single-location business and "3:00 PM" should always mean
*your* 3 PM.

## If the service is paid

* **Pay after the appointment** — they book normally, the slot is confirmed straight away, and
  DMLY messages them a payment link.
* **Pay before booking** — the slot is held for 15 minutes while they pay, and only becomes a
  real booking once the payment clears. If the hold runs out, the slot goes back on sale.

If no payment gateway is connected, a pay-before service can't be booked at all — the page
tells the contact *Online payment isn't available right now. Please contact us to book this
service.* Connect a gateway first. Full detail in [Appointment payments](/appointments/payments).

## After they book: the manage link

Every booking gets its own private page at `https://dash.dmly.io/booking/<booking id>`. From
it, while the booking is still confirmed and still in the future, a contact can:

* **Cancel** — if you're inside the **Cancellation deadline (hours)** set under
  **Settings → Appointment → Booking policy**.
* **Reschedule** — same, against the **Reschedule deadline (hours)** in that same panel. Both
  are workspace-wide, not per-service. Set either to `0` to allow it right up to the start time.
* **Add to calendar** — links for the usual calendars, plus a downloadable calendar file.

Class seats can be cancelled but never rescheduled to another time — a class runs when it runs,
and they use their own **Cancellation deadline (hours)** on the **Settings → Class** tab.
A cancelled seat automatically goes to the next person on the waitlist. See
[Classes](/appointments/classes).

## Sharing it

<Steps>
  <Step title="Send it on WhatsApp">
    Copy the link and send it in the [Inbox](/inbox/overview). One line does the job:
    `Here's my calendar — grab any slot that suits: <link>`. Link to the *service* page, not
    the landing page, when you already know what they want — one fewer decision.
  </Step>

  <Step title="Let a Flow send it">
    A **Book Meeting** node in a [Flow](/automation/flow-builder), with **How to book** set to
    **Send hosted booking link**, sends the link for you with the contact already identified —
    so they skip the form, and the booking lands on the right Contact. The flow then waits:
    whatever you put after the booked path only fires once they actually book, not the moment
    the link goes out. This is the best way to send it at scale.

    Leave **How to book** on its default and the node shows tappable times in the chat instead
    of sending the link — the hint reads *In-chat shows tappable times on
    WhatsApp/Messenger/Instagram and automatically sends a booking link on SMS.* A paid service
    always uses the hosted page, whatever you pick. There's also a separate **Send Booking
    Link** node, which sends the attributed link but doesn't wait for the booking.
  </Step>

  <Step title="Put it on your website and your profiles">
    It's an ordinary public URL. Use it as your Instagram bio link, your Google Business
    Profile booking link, or the button on your site. Set a **Redirect URL** under
    **Settings → Appointment → Branding** and the confirmation page carries a **← Back to
    website** link back to you.
  </Step>
</Steps>

<Tip>
  Book a slot on your own page once, from your phone, before you share it. It takes a minute
  and it's the fastest way to catch a service with no staff attached, a missing price, or hours
  you never set.
</Tip>

## When something looks wrong

<Accordion title="The page shows nothing / won't load at all">
  The page only fails outright when the workspace has no publicly visible, active services at
  all. Publish one service and it comes back. If it loads but looks empty, you're probably
  looking at a filtered view — a category with nothing in it, for example.
</Accordion>

<Accordion title="A contact sees no available times">
  Nothing is wrong with the page — the availability rules are eliminating every slot. The usual
  causes: the staff member has no working hours set, no staff is attached to the service, your
  minimum notice rules out today, or your booking horizon rules out the date they're looking at.
  Work through [Staff and availability](/appointments/staff-and-availability).
</Accordion>

<Accordion title="&#x22;Sorry, that time was just taken — please choose another.&#x22;">
  Two people picked the same slot seconds apart and the other one landed first. DMLY refuses
  the second rather than double-booking your staff. The contact just picks another time — no
  action needed from you.
</Accordion>

<Accordion title="Bookings arrive on the wrong Contact">
  A link without contact identification matches on the email typed in: an existing contact with
  that exact email is reused, otherwise a fresh Contact is created. So a WhatsApp contact with
  no email on file, or a client who types a different address, gets a duplicate. Send it from a
  Flow's **Book Meeting** node (in **Send hosted booking link** mode) or a **Send Booking Link**
  node instead — both attribute the link to the contact.
</Accordion>

<Columns cols={2}>
  <Card title="Services" icon="list-check" href="/appointments/services">
    What appears on the page, and the booking rules behind each one.
  </Card>

  <Card title="Staff and availability" icon="clock" href="/appointments/staff-and-availability">
    Working hours, time off and buffers — where the open slots come from.
  </Card>

  <Card title="Appointment payments" icon="credit-card" href="/appointments/payments">
    Pay before, pay after, and holds.
  </Card>

  <Card title="Custom domain" icon="globe" href="/appointments/custom-domain">
    Serve the page on your own branded address.
  </Card>
</Columns>
