41 min read

Calendar, New Appointment & My Day

Use the day calendar, create an appointment with the full form, inspect appointment details, and run a linked staff member's schedule.

Use Calendar to manage a store's scheduled appointments. A staff-only account sees My Day at the same route, limited to appointments assigned to its linked team-member resource.

Open the appointments workspace

Screen: In the classic admin sidebar, go to Sales & Orders → Appointments. In the new admin sidebar, go to sell. → Appointments. The workspace opens at /appointments and includes the Calendar, Offerings, Team & Resources, and Settings tabs for administrators.

Access and route behaviour

The full New appointment page at /appointments/new is available to store administrators, super administrators, and store staff, but it has no separate sidebar item. Settings is administrator-only. A staff-only account that opens /appointments sees My Day, not the multi-resource calendar.

Work with the day calendar

The header's Previous day, Next day, and Today controls change the selected date. Immediately after Today sits a Jump to now button (the pin icon) — shown only in Day and Week views; Month has no scroll-to-now concept, so it has no button there at all. On Day, selecting it while today is the selected date scrolls the timeline back to the current-time line; on Week, when today falls inside the displayed week, it scrolls the week grid to the current hour instead. If the calendar isn't showing today at all, selecting Jump to now navigates to today first — the scroll itself then happens automatically once today's date loads, the same effect that already centres a freshly-opened Day or Week view on the current time. This button is separate from the pinned Now chip described next, which only ever appears on Day, and only once the now-line has scrolled off the visible timeline — Jump to now is always present on Day and Week regardless of scroll position. The page refreshes its appointment data every 30 seconds. On the current date, the grid initially moves toward the current time; when the current-time line is beyond the horizontal viewport, select the Now chip to return to it. Changing the selected date this way also closes an open appointment detail panel, if one is open — the panel is scoped to whatever day you were looking at when you selected it.

Use the Day, Week, and Month buttons to switch how the calendar is laid out. Switching views keeps your current source filter and resource data in place — only the layout changes. Nothing changes about how the underlying appointment data is fetched from your point of view: the page automatically widens its request to cover whichever range the active view needs (a week, or the full visible month grid) instead of only ever loading a single day.

Day-money bento

Above the grid, a single card with six cells summarises the selected day for administrators — Day view only, it does not appear in Week or Month (this card also does not appear on My Day for a staff account — see below):

CellWhat it shows
booked todayCount of appointments starting that day, excluding Cancelled but including No-show.
collectedTotal payments actually captured today's orders, net of any refunds.
due at counterTotal still owed across today's non-cancelled, non-no-show bookings — each booking's total minus whatever has been collected on it.
unsold timeTotal unbooked availability across active resources for the day (e.g. 1h 35m), summed from each resource's open hours minus their booked minutes.
no-showCount of appointments marked No-show. Once there is at least one, the cell's label switches to show the computed no-show amount kept (for example "no-show · ₹150 kept") instead of the plain no-show label.
unassignedCount of bookings with no assigned resource, excluding Cancelled and No-show; only shown once that count is above zero.
deposit owedTotal still outstanding today across bookings with a deposit configured — a breakdown of due at counter, not an amount on top of it. Only appears on a day that has at least one deposit-configured booking; absent entirely otherwise.

Collected, due at counter, and unsold time are computed by the server from the day's real orders, payments, and resource availability — never guessed on the page. While that request is in flight, those three cells show a placeholder instead of a fabricated ₹0; if the request fails, they show unavailable. A background refresh (the same 30-second poll as the rest of the page) keeps showing the last good figures instead of flashing back to the placeholder. Booked, no-show, and unassigned are counted directly from the appointments already on the page, so they display immediately regardless of the money cells' state. Deposit owed is also server-derived from the same response as the money cells, but it has no loading or error state of its own — instead of showing a placeholder, the cell simply isn't there yet; once the figures are ready it appears already showing the real amount, and a genuine ₹0 (deposit configured, fully collected) still renders rather than the cell disappearing.

A quiet day is a real zero, not a placeholder

A day with no bookings shows real, computed zeros for collected and due at counter, and full open availability for unsold time — that's different from the /unavailable placeholders, which only appear while the figures haven't loaded yet or failed to load.

A day with no deposit-configured bookings never shows this cell

The server only includes a deposit total in the day summary when at least one of that day's non-cancelled, non-no-show bookings has a deposit configured. There's no admin setting that changes this — it's purely a function of whether any booking that day actually carries a deposit. A day that's otherwise busy but has no deposit-configured bookings simply has no deposit owed cell, same as an empty day.

A booking counts as deposit-configured when its order records a deposit above zero. That amount comes from the offering's effective Deposit policy: its saved policy, or the store's positive Default deposit (₹) when the offering's policy is unset.

Completing a booking never checks whether its balance was collected

Selecting Complete (see Inspect an appointment and update its status, below) runs immediately — there is no confirmation step and no check of whether a deposit-taking booking's balance has actually been collected. Nothing invoices the remaining balance and nothing warns you it's still owed; the appointment simply moves to Completed. Collect the balance first with Send payment link or Record payment (also below) if you don't want a completed booking left with money outstanding and no record of it anywhere.

The grid below has a lane for each resource and a final Unassigned lane. Select a booking capsule to open its details. For an appointment with multiple service lines, its capsule can show busy sections and labelled FREE [minutes] gaps between them. When two or more bookings in the same lane overlap in time, their capsules split into stacked rows inside that lane so each one stays visible and selectable; with three or more stacked, the busy and FREE sections are hidden to keep the names readable. If a booking starts or ends outside the store's usual hours (for example a 2:33am appointment), the hour axis automatically widens to include it instead of squeezing it into the edge of the normal range.

When the selected day has no appointments, use New appointment in the empty-state message. The fixed New booking and In person buttons also open the compact composer. In person opens it with Add contact details on; New booking opens it with the switch off. You can also double-click empty space in a lane to open the composer with that resource selected — the resource's lane becomes the composer's preselected Team member. The composer also preselects the time you clicked: once you choose a Service (times only exist as server-generated slots for a chosen service, so this cannot resolve before then), the returned Time button closest to where you double-clicked is selected automatically. Choosing a different time button afterward still works normally, and this preselection never runs a second time within the same dialog open.

On a narrow admin viewport (roughly a phone width, 600px and under), the calendar's resource-lane column collapses from a full name label to a round initials chip (for example Aisha Rao becomes AR) so the timeline itself keeps most of the screen width; hover or tap-and-hold the chip to see the full resource name in a tooltip.

Read appointment chips and capacity

Every appointment chip normally starts with its time and customer or walk-in name. In Day and Week, it also shows the service name — or, for example, 2 services for a two-service booking — and the amount. The number changes with the services in the booking. When same-slot bookings are stacked into separate rows in Day, each stacked chip shows only the customer or walk-in name and any capacity badge; it omits the time, service name, and amount. Month keeps the chip compact with time and customer only. Select any chip to open the same appointment detail panel.

For a capacity-backed service, the chip header also shows, for example, 3/10. The numbers show how many places are booked out of the service's capacity. When no place remains, it reads 10/10 · Full. The same capacity badge appears beside that service in the appointment detail panel, so opening the booking does not lose the occupancy context. An ordinary one-person appointment has no capacity badge.

Week strip

Below the grid, on Day only, seven day cards span the week containing the selected date — Sunday through Saturday, the same range Week view uses below, so the strip and Week view can never disagree about which seven days make up "this week." Selecting a card jumps the calendar to that date while staying on Day; the card for whichever date is currently selected is outlined and tinted, the same way today's column is highlighted elsewhere on this page.

Each card fetches and shows its own day independently of the day-money bento above:

  • Loading — a plain skeleton bar while that day's figures are still in flight.
  • Ready, with bookingsN booked · ₹amount, the day's booked count and collected amount (the same "collected" total as the bento's own cell, just scoped to that one day).
  • Ready, no bookingsNothing booked, the same honest zero-state wording the empty-day grid uses, never a blank card.
  • ErrorCouldn't load this day. with its own Retry link; retrying re-fetches only that one day, not the whole strip.

The seven requests only re-run when you move to a different week — navigating between days inside the same week with Previous day / Next day or by selecting another card does not refetch the strip. On a narrow viewport the cards wrap: one per row below ~600px, two across up to ~900px, four across up to ~1200px, and the full seven-across row above that.

The week strip is Day-view-only, like the bento

The strip does not appear on Week or Month — switch to Day to see it. It also does not appear on My Day for a staff account.

Week view

Select Week to see seven day columns side by side, covering Sunday through Saturday for the week containing the selected date. Each column has the same vertical time axis as Day (the store's active-hours window), and every booking appears as a card positioned by its own start time and duration, coloured the same way status is coloured on Day (for example, confirmed vs. checked-in vs. completed). Today's column shows the same live now-line as Day while the current time falls inside the active-hours window. As on Day, that window widens automatically whenever a booking falls outside the store's usual active hours, so early or late appointments never get clipped to the top or bottom edge of the grid.

  • Unassigned bookings — a booking with no team member assigned still appears in its correct day and time slot; it carries a small Unassigned label on the card itself, since Week's columns are organised by day rather than by team member (there is no separate Unassigned lane the way Day has one).
  • Selecting a booking opens the same appointment detail panel as Day — every status action and payment tool described earlier on this page works identically from Week.
  • Previous week / Next week move the selected date by seven days; the date label shows the visible date range (for example 30 Aug – 5 Sep 2026, or 1 – 7 Sep 2026 when the week falls inside one month).
  • If the week has no bookings at all, the grid is replaced by an empty-state message with a New appointment button, the same as Day's empty state.

Week view has no day-money bento

The revenue/no-show summary card above the Day grid is Day-view-only — it does not appear above the Week grid. Switch to Day on a specific date to see that day's money figures.

Month view

Select Month to see a fixed six-row calendar grid for the month containing the selected date — the grid always shows six weeks (42 days) so its height never changes from month to month, including a few leading days from the previous month and trailing days from the next month shown dimmed.

  • Each day cell shows a small count chip with that day's total number of bookings (only once there is at least one), followed by up to three compact booking pills naming the customer or walk-in customer, coloured the same way status is coloured on Day and Week. When a day has more than three bookings, the cell shows a +N more line below the three pills instead of listing every one.
  • Selecting a day cell (its background, not a pill) switches the calendar to Day view on that date — this is the fastest way to drill from a busy month into a single day's grid.
  • Selecting a booking pill directly opens that appointment's detail panel instead of switching views, so you can check in, collect payment, or cancel a booking without leaving Month.
  • Previous month / Next month move the selected date by one calendar month; the date label shows the month and year (for example September 2026).
  • If the entire visible grid has no bookings, it is replaced by an empty-state message with a New appointment button, the same as Day's and Week's empty states.

Month view has no day-money bento

Like Week, Month does not show the day-money bento above the grid — that summary only applies to a single selected day.

See scheduled delivery orders on the calendar

Administrators can keep appointments and delivery commitments in the same calendar. Show orders is on by default and remembers your choice in this browser. Turn it off when you need an appointments-only view. The order feed uses the same visible date range as Day, Week, or Month and refreshes every 30 seconds. It is not shown on a staff-only My Day calendar.

Only orders with a scheduled Delivery date appear. Pickup orders are not placed on this calendar. An order chip always uses the same dark-green treatment; its order status is not written on the chip and does not change that colour.

  • Day adds an Orders lane when the selected date has a scheduled delivery. Each chip shows its time, order number, customer, Delivery, and amount.
  • Week places the chip at its scheduled time and shows the time, order number, customer, Delivery, and amount.
  • Month uses a compact pill showing the time, customer, amount, and Delivery.

Select an order in any view to open its order page. If the order feed cannot load, the calendar keeps the appointment data visible and shows Couldn't load orders for this range. The next automatic refresh tries the order feed again.

Create a quick appointment with the compact composer

The compact composer books either an existing customer (default) or a walk-in with required contact name and phone details and an optional email address. Both paths are available without leaving the dialog for the full form.

Open the compact composer

On Sales & Orders → Appointments, select In person, New booking, or the empty-state New appointment. Each opens the same New appointment dialog. In person opens it with Add contact details on; New booking and the empty-state action open it with Add contact details off.

Find the customer, or switch to walk-in

With Add contact details off, use Search contacts by name, phone, or email; matching results appear below the field after a short pause. Select a result to attach that customer. The results are replaced by a chip showing the selected customer's name, which you can remove with its close icon to search again.

Turn on Add contact details when the person is a walk-in or is not in your contacts. Enter Contact name and Contact phone. Enter Contact email (optional) when you want to be able to send that booking's payment link by email later.

Choose the appointment slot

Select a Service; each menu option includes its duration. Optionally choose a Team member, or leave Anyone available selected. The picker contains active people only; Anyone available also resolves to an eligible person, not a space or equipment item. Returned Time buttons use the selected date; choose one, then add optional Internal notes.

Save or switch to the full form

Select Book appointment to create the appointment, refresh the calendar, and close the dialog. Select Cancel to close without creating one. Select Full form to close the dialog and open /appointments/new?date=[selected date], where you can also enter a brand-new customer's name/phone/email inline instead of only searching.

Compact composer validation and availability

The compact dialog requires a Service and a returned Time. With Add contact details on, it also requires Contact name and Contact phone. Contact email (optional) is trimmed before it is saved; leaving it blank sends no email address, while a malformed address blocks booking with Enter a valid email address. With the switch off, you must select a customer from the search results; typing a search term is not enough. Book appointment is disabled only while its save request is running. If a service has no returned choices, the dialog says No open slots for this selection. If you change Service or Team member after choosing a time, choose a current returned time before saving.

The compact dialog loads availability only after you choose a service and does not show a retry control for an availability-load failure. Cancel it and use Full form instead; its Time section shows Retry when its availability request fails.

Block time for a person, space, or equipment item

Use Block time in the compact composer when a resource must be unavailable without creating a customer appointment.

Open Block time

On Sales & Orders → Appointments, select New booking or In person, then switch the dialog from New booking to Block time.

Choose any resource

Select Resource. Unlike the booking Team member picker, this list includes Person, Space, and Equipment resources. Saving without one selected shows Choose a resource.

Set the interval

Choose Start time and End time for the selected calendar date. The end must be later than the start; otherwise the dialog shows End time must be after start time. Add Reason (optional) when the team needs context for the block.

Save the block

Select Block time to save, or Cancel to close without saving. If the interval overlaps an existing availability rule, the conflict appears inline and the dialog stays open so you can change the resource or time.

Create a new appointment with the full form

From the compact composer, click Full form to open /appointments/new?date=[selected date]. The full page preserves that calendar date. You may also open /appointments/new directly, which starts on today's date.

Choose the customer mode

Use an existing contact is on by default. Search Search contacts by name, phone, or email; after you stop typing, up to five matching customer buttons can appear. Select one to add its chip, or use the chip's remove control to choose another. Turn the switch off to enter Contact name, Contact phone, and Contact email (optional) for a new customer.

Set the booking type and date

Turn on Add contact details when appropriate; the saved appointment is recorded as a walk-in. Set Date for the day whose availability you need.

Choose service and team member

Select a Service; each option includes its duration. Select a Team member, or leave Anyone available selected so the available-time result can choose an eligible person. Space and Equipment resources are not offered as booking staff. Changing either selection clears a previously chosen time.

Choose an available time

Under Time, select one of the returned time buttons. The page does not show time choices until a service is selected. If none are returned, it says No open slots for this selection.

Add internal notes and save

Use Internal notes for the team's context, then select Book appointment. On success, the page returns to Calendar. Cancel returns to Calendar without creating an appointment.

The form requires a service, a time, and either a selected existing customer or a new customer's name and phone. Selecting Book appointment with missing information shows the matching inline requirement. The save button is disabled only while the save request is running.

When services, team members, or times will not load

The page first loads active services and active team members. If that initial load fails, use the page's Retry control. If the selected service's available times fail to load, a separate Retry control is shown in the Time section. Customer-search failures and searches with no results simply leave the result list empty.

Inspect an appointment and update its status

On Calendar, select a booking capsule. Its Appointment detail panel opens beside the grid on a wide screen and as an overlay on a narrower screen. Use Close appointment details to dismiss it.

The panel shows When & where (the booked start and end time), the current status, the customer or walk-in customer and phone when available, the booking source, and Checked in at after check-in. Under Services, each line lists its service and assigned team member, or Unassigned when none is attached. It shows an order identifier only when one exists; otherwise it states that payment details will appear once the appointment is invoiced.

Under Activity, every reminder, reschedule, captured payment, and refund is combined into one newest-first timeline. A reminder row says Reminder sent with its time. Each reschedule is its own row — Rescheduled from 16 Sep 2026 · 3:30 PM to 23 Sep 2026 · 4:30 PM, for example. Payment and refund rows include their amounts and state, such as Payment captured · ₹1,000.00, Refund in progress · ₹500.00, or Refunded · ₹500.00. Dates and times use a 12-hour clock with AM or PM. This history does not show per-channel delivery status. With no rows, the panel says No activity yet.

Current statusActions available in the detail panel
Awaiting paymentCancel only. Confirmation is not a manual action here.
ConfirmedReschedule, Check in, Cancel, No-show
Checked inStart, Cancel
In progressComplete, Cancel
Completed, Cancelled, or No-showNo lifecycle action

Selecting Cancel opens a Cancel this appointment? confirmation dialog rather than cancelling immediately. The dialog explains that cancelling releases the booked slot and notifies the customer, and offers an optional Reason text field for internal record-keeping (for example, "Customer requested reschedule"). Select Cancel appointment to confirm — with a reason entered, it is saved on the appointment; leaving it blank cancels without one. Select Keep appointment to close the dialog without cancelling.

Selecting No-show opens its own confirmation dialog, Mark this booking as a no-show?, with the body text "Any payment already taken may be kept under your no-show policy. The guest will be emailed." — it does not show a specific figure, and there is no time limit on when you can mark a booking as a no-show. Select Mark as no-show to confirm, or Keep appointment to close the dialog without changing anything.

Reschedule opens its own dialog, covered below, instead of running immediately. Check in, Start, and Complete are the only lifecycle actions that still run immediately on click, with no confirmation step.

After a lifecycle action succeeds, what happens to the detail panel depends on how you opened it. Opened by selecting a booking on the calendar, the panel closes and the status is updated in the calendar. Opened from a direct link instead — for example from a customer's Bookings tab, or an appointmentId link — the panel stays open, and its status, payment summary, and payment link update in place a moment later instead of the panel closing. While an action is saving, all lifecycle buttons in that detail panel are disabled, and the cancel dialog's own Cancel appointment/Keep appointment buttons are disabled the same way. There is no manual Confirm action — an appointment reaches Confirmed only through the payment webhook, never a button in this panel.

Reschedule an appointment

Reschedule only appears for a Confirmed appointment — it isn't a status change (the appointment stays Confirmed afterward), so it lives outside the status-transition table above and isn't offered on any other status. Selecting it opens a Reschedule appointment dialog:

Review the current time

The dialog opens with a read-only line — for example, Currently booked: Tue, 16 Sep · 3:30 PM — so you can see what you're changing before picking a new one.

Pick a new date

New date defaults to the appointment's current date. Changing it clears any time already selected below.

Keep or change the team member

Team member defaults to the assigned person (or Anyone available if the line has no assigned person). The picker offers people only, and Anyone available resolves to an eligible person. Changing it also clears the selected time, since availability is per team member.

Choose a new time and confirm

Under Time, each choice uses a 12-hour clock with AM or PM. The booking's current start is not offered when its date, start, and team member match the existing booking. Select another returned time; the chosen button is marked selected. The dialog will not let you confirm without a choice, showing Pick a new time slot if you try. If none are returned, it says No open slots for this selection. Select Reschedule to save, or Cancel to close the dialog without changing anything.

On success, the dialog closes, the detail panel updates in place to show the new time, the calendar reflects the move, and a "Appointment rescheduled successfully" toast confirms it. The Reschedule/Cancel buttons in the dialog disable while the save is running. If the slot was taken by another booking in the moments between opening the dialog and confirming, the save fails, an error toast reports it, and the dialog stays open with your selections intact so you can pick a different time.

The merchant reschedule email is titled A booking was rescheduled and names both times: A customer rescheduled a booking from [old time] to [new time]. Its details also show From and To. This wording is applied only to the original system-seeded template; if your store customised that template, your own subject and message are kept.

A staff-only account can only reschedule appointments currently assigned to its own linked team-member resource, and can only reschedule to itself — picking a different Team member as a staff account fails with an error toast ("Staff may only update their own appointments") rather than reassigning it.

The appointment's own current time slot won't appear as a choice

The dialog deliberately removes the appointment's exact current date, start time, and team-member combination from Time. This isn't a bug that blocks a real reschedule to a different time; it only means you can't use this dialog to "reschedule" an appointment onto the slot it already has. Use the Currently booked: {{time}} line to review that time, or close the dialog with Cancel to leave it untouched.

Jumping here from a customer's profile

A customer's own profile has a Bookings tab listing every appointment they've made — selecting any row there opens this same detail panel directly, without you needing to find the appointment on the calendar grid yourself. See Bookings on the Customer Profile page.

"Awaiting payment" does not appear on a booking made today

This status exists in the panel's own status mapping, but nothing in the booking flow currently sets an appointment to it — every booking is created as Confirmed immediately, with any unpaid deposit attached as a separate order rather than held on the appointment's own status. Do not use this row to troubleshoot a live booking; if a customer's deposit is unpaid, their appointment still shows Confirmed here, and the order's payment status (in Collect and record payment, below) is what actually reflects the unpaid deposit.

Collect and record payment

The detail panel's Payment area, under Services, reflects the order attached to this appointment — there is no separate payments screen for appointments.

When there is no order yet (an offering with no deposit configured, or a walk-in/POS booking taken without one), the panel shows "payment details will appear once the appointment is invoiced" and a Collect payment button. Selecting it mints a full-charge order for the booking's total price.

  • If the offering actually has a deposit policy and the appointment doesn't have an order yet, the backend refuses this with "This appointment requires its configured deposit flow"Collect payment is only for bookings without a deposit requirement, not a way to skip the deposit flow.
  • If an order already exists (most deposit-taking bookings mint one automatically at confirmation), the backend refuses with "An order has already been minted for this appointment."

Once an order exists, the panel shows the order number next to a View invoice icon button that downloads the order's PDF invoice, followed by a short money summary, in this order:

RowWhen it appearsWhat it means
Totalalwaysthe full price of the booking — one order, one invoice
Depositonly when the offering charges onethe deposit leg: what a deposit payment link charges
Balance duewhenever the order carries a balance figurethe balance leg: what a balance payment link charges, set to Total − Deposit when the order is created
Paid so faronly once some money has been collectedeverything actually received against this order, cash and card alike

Deposit and Balance due are the two legs the booking's price was split into, and they describe what each payment link charges — not how far the customer has got through paying. That's what Paid so far is for, and it is the only row recalculated from actual payments every time you open the panel. Balance due only moves at leg boundaries: it drops to the true remainder once a payment covers the whole deposit, and to zero once the order is settled. A part-payment smaller than the deposit leaves it exactly where it was.

Below the summary sits a payment-status chip (Pending, Partially paid, Paid, Failed or Refunded). Whenever money is still owed on the order, two buttons appear side by side: Send payment link (filled, the primary action) and Record payment (outlined, secondary). Online is the default path now; Record payment is the offline fallback for cash, card terminal, or bank transfer — it never opens a checkout or sends anything to the customer.

Cancelled and no-show bookings: nothing left to collect

Once a booking is Cancelled or marked No-show, the payment area switches to a read-only view: the Balance due row's label changes to Balance not collected, and the payment-status chip drops its amber Partially paid/Pending warning colour in favour of a neutral grey — even though the underlying figure hasn't changed. The Send payment link and Record payment buttons disappear entirely for these bookings, since there is no route to collect the remainder once the appointment is terminal. Active (non-cancelled, non-no-show) bookings are unaffected — they keep the Balance due label and the amber warning chip exactly as before.

One invoice per booking, not one per payment

A booking's order is minted once, for the Total amount, whether or not a deposit is involved — the deposit and the balance are two payments against the same order, not two orders. Because invoicing is keyed to the order, paying the deposit and later paying (or recording) the balance both finalize the same invoice rather than producing a second one. If a customer or your accountant is looking for a separate "deposit invoice" and a separate "balance invoice," there isn't one — the one invoice attached to the booking already covers both legs once the order is fully paid.

Click Send payment link to open the Send payment link dialog:

  • A read-only summary at the top shows what's due — Deposit or Balance due, whichever leg the order still owes, with the amount. This is resolved by the backend, not computed in the browser — the admin panel never guesses which leg is outstanding.
  • Send via offers a channel choice:
    • Copy link — the default. Nothing is sent; the dialog just gives you a link to paste yourself.
    • Email — sends the link to the customer's email on the order for a registered-customer booking; for a guest booking (no customer account attached), it falls back to the guest's own email address captured on the appointment itself.
    • WhatsApp — works only when the store's WhatsApp channel is configured. If it isn't, the option is disabled with Not available — this store has no live WhatsApp Business connection. Like Email, it uses the guest's own phone number for a guest booking that has no customer account. If the availability check itself fails, WhatsApp stays selectable and the send request makes the final decision; if that request finds no connection, the link is kept and a warning is shown.
    • SMS — always disabled, with a caption reading "Not available yet — SMS delivery isn't connected for this store". No SMS delivery provider is wired up for any store yet.
  • Link expires in (days) defaults to 1 day for a deposit link (so it can never outlive the booking's own deposit hold window) and 7 days for a balance link. You can raise or lower it; at least 1 day is required.

Click Send payment link inside the dialog to create it. A delivery problem does not discard the created link: the dialog keeps the link available so you can copy it.

What happens after you click it depends on whether the message actually went out. If it sent successfully, a toast confirms the channel (for example "Payment link emailed to the customer"). If you chose Copy link, a toast confirms the link was created — nothing to send. But if Email or WhatsApp was chosen and the message could not go out, no success toast appears. Instead, a persistent warning banner appears above the link card. Missing customer contact details show "The message was not sent because this booking has no email address. Copy the link and send it yourself." For WhatsApp, it instead says "The message was not sent because this booking has no phone number. Copy the link and send it yourself." A delivery failure shows "The message could not be sent because delivery failed. Copy the link and send it yourself." If the backend finds that the store's WhatsApp is not connected, the WhatsApp send is skipped and the dialog shows WhatsApp is not connected for this store. The created link remains available. Choosing Email separately still sends it when an email address is configured and shows Payment link emailed to the customer on success. Every warning has its own Copy link action. It stays until you copy the link, cancel it, or successfully send it again.

Why didn't my walk-in get the payment link email?

The Email channel uses the email stored on the booking. If you left Contact email (optional) blank when you created the walk-in, the payment-link dialog has no address to send to and shows The message was not sent because this booking has no email address. Copy the link and send it yourself. Use Copy link for this booking, and enter the walk-in's email in the compact composer when creating a future booking.

Once a link is active, it replaces the Send payment link / Record payment buttons with a card showing the shortened link (with a copy icon), a status chip, and — while unpaid — a countdown to expiry and a Cancel link button. Cancelling asks for confirmation first: "Cancel this payment link? The customer won't be able to pay with it anymore." Cancelling never touches the order's own payment fields; it only stops the link from being payable.

If a link expires or is cancelled without being paid, the card is replaced again by the two buttons, with a small warning chip above them reading Link expired or Link cancelled — send a new link from there. Once a link is paid, both the card and the buttons disappear and the section instead shows Paid via payment link.

Cancelling a booking or marking it a no-show automatically cancels any active payment link in the same action — the admin panel never leaves a live, payable link sitting on a terminal booking. So a cancelled or no-show booking's link card, if it ever had an active link, shows the read-only Link cancelled chip immediately (or Link expired, if the link had already lapsed before the booking became terminal) — never the full card with a working Cancel link button. There is no way to start a new link on a terminal booking either, since Send payment link / Record payment both disappear once the appointment can no longer collect money.

A customer paid but the booking still shows unpaid

The payment link settles by webhook, not instantly in the browser, and the detail panel only re-checks the link's status when it mounts. If a customer says they've paid but the order still shows a balance due, close and reopen the appointment's detail panel — that refetches the order and the link status together. If it's still unpaid after a fresh reopen and a minute or two has passed, treat it as a real payment problem rather than a display lag.

Record a payment taken offline

Use Record payment when the money has already reached you outside the platform — cash at the desk, a card terminal, a bank transfer, a UPI payment to your own account. It writes a payment against the booking's order so your figures match reality; it never charges anybody.

  1. Open the appointment's detail panel and scroll to Payment.
  2. Click Record payment. The Record Payment dialog opens showing the order number.
  3. Amount is pre-filled with the leg the booking actually owes next, not always the full outstanding — see "What the pre-filled amount is" below — and a caption underneath names that leg and figure, for example "Deposit due ₹360.00" or "Balance due ₹840.00". This caption is separate from the field's own helper line, which always reads "Estimated outstanding: ₹…" with the full live-outstanding figure (the field's upper bound) — the two can show different numbers on a deposit booking. Leave Amount alone to settle that leg in one go, or type a smaller number if the customer is paying part of it.
  4. Optionally add a Reference (optional) — a UPI transaction id, a terminal slip number, a bank reference — and a Note (optional) for anything your team needs to remember.
  5. Click Record Payment. A toast confirms it ("Payment of ₹… recorded"), and the open detail panel updates its status chip, payment figures, and activity in place — no reload needed. Once nothing is owed the status chip reads Paid and both buttons disappear.

What the pre-filled amount is. The dialog picks the leg still owed: if the order is already Partially paid, it offers the live outstanding balance (labelled Balance due). Otherwise, if nothing has been paid yet and the offering has a deposit configured, it offers the deposit amount (labelled Deposit due) rather than the full total. If neither applies (no deposit at all, or already-paid-something-toward-a-non-deposit order), it falls back to the same live outstanding figure as before — the booking's Total minus everything already received, recalculated every time you open the panel, with no leg caption shown. On a ₹1,200 booking with a ₹360 deposit where nothing has been paid yet, it offers ₹360 with a Deposit due ₹360.00 caption, not the ₹1,200 Total. If ₹300 of that deposit is then recorded (a part of the deposit — see "Recording part of a deposit" below), the order is still Pending, not yet Partially paid, so the next time you open Record payment it falls back to the live-outstanding figure with no leg caption — ₹900 — exactly as before this change. Only once a payment closes the whole deposit leg (moving the order to Partially paid) does the dialog start offering the Balance due leg with its own caption instead.

You cannot record more than the order is owed. The Amount field carries that figure as its upper bound, and the server checks it again on submit — try it anyway and the dialog shows "Payment amount (₹…) exceeds the outstanding balance (₹…)". Recording against an order that is already settled is refused the same way, with "This order is already fully paid". Both messages appear inside the dialog, so nothing is lost: correct the amount and submit again.

It cancels any live payment link. Recording a payment against a booking automatically cancels the order's active payment link, so the customer can't pay online for money you've just taken in person. The link card is replaced by a Link cancelled chip and the two buttons — send a fresh link if something is still owed.

Recording part of a deposit. You can record any amount, including less than the deposit — but the legs don't re-split when you do. Take ₹300 of a ₹360 deposit in cash and the status chip stays Pending, Balance due stays at its original figure, and a deposit link sent afterwards would still ask for the full ₹360. Only a payment that covers the whole deposit moves the booking to Partially paid and re-derives Balance due. Until then, prefer collecting the rest offline and recording it here over sending a link.

Why the offered amount matches neither Total nor Balance due

This is expected on a part-paid booking. Balance due is one leg of a pricing split, and it only re-derives when a payment closes the deposit leg — so mid-deposit it still shows the figure the order was created with. The Record Payment dialog deliberately works from Total minus Paid so far, because that is the number that actually closes the booking out. When the rows look inconsistent, check that one identity: the amount offered should equal Total minus Paid so far. If it doesn't, close and reopen the detail panel — it refetches the order, and a payment that landed by webhook after you opened the panel is the usual cause.

Read a customer's intake form answers

If the booked service has an intake form (see Intake Forms), the detail panel adds an Intake form answers section below Services, sourced from the appointment's first service line. This is the only place staff can read a customer's answers — the Offerings Submissions panel does not list them.

  • Each answer is labeled with the question's own text from the form; if the question was edited or removed from the form after this appointment was booked, the panel falls back to a prettified version of the stored field key instead.
  • A field the customer left blank, or an empty multi-select/checklist, shows as . A checkbox question shows Yes or No rather than true/false. Date and date-time questions are formatted (e.g. 5 Sep 2026 or 5 Sep 2026, 2:30 PM); every other answer type is shown as plain text.
  • If the service has a form but this specific booking has no answers on file (for example, it was booked before the form was added), the section still appears with No intake answers were submitted for this booking. instead of silently disappearing.
  • If the service has never had an intake form, this section does not appear at all — most bookings will not show it.

Why don't I see answers here?

Check three things: (1) the service actually has intake questions configured under Offerings — no form means no section; (2) the booking predates the form being added — you'll see the explicit "no answers" message, not a blank section; (3) you're reading the right service — a multi-service booking only shows answers for its first line's service.

Use My Day as staff

Screen: A staff-only account opens /appointments and sees My Day. The list includes only the appointments for the resource linked to that signed-in account, sorted by start time. Each row shows its time, customer or walk-in customer, service names, status, and any action allowed by the same status table above. This is the landing screen for the service provider persona described in Your Workspace, Navigation & Team Roles — their sidebar is narrowed to match.

Use My availability to open your linked resource's availability page. A row's action buttons are disabled while that row's status update is saving. If there are no appointments, the page says No appointments today.

If the account is not linked to a team-member resource, My Day shows a recovery message instead of the schedule or My availability link: ask an administrator to link the account in Team & Resources.

Troubleshooting this workspace

  • If Calendar is empty, use Today to rule out the selected date, then check whether the booking belongs to a different resource lane or the Unassigned lane.
  • If Time has no choices, choose an active service first, then check its active team members and their availability. The full form only requests times after a service is selected.
  • If a status action is absent, it is not valid for the appointment's current status. In particular, confirmation is not performed from Calendar or My Day.
  • If a staff member sees the link-recovery message, an administrator must link that signed-in user to a team-member resource before My Day can show their schedule.
  • If you select Jump to now and nothing seems to scroll, you were most likely viewing a date other than today — it navigates to today first and the scroll follows once that date loads, so select it again if you land on today but not yet at the current time. In Month view there is no Jump to now button at all; switch to Day or Week first.
  • If an appointment has no payment information, this panel cannot create or edit it; it only shows the order identifier when the appointment already has one.
  • If the customer did not get a payment link on WhatsApp and the warning says WhatsApp is not connected for this store, the WhatsApp send was skipped but the link was kept. Use Copy link, or choose Email when an address is configured. Connect the store's WhatsApp channel before trying WhatsApp delivery again.
  • If a walk-in did not get a payment-link email, check whether Contact email (optional) was filled when the booking was created. The send is skipped when the booking has no email; use Copy link.

Next steps