← All documentation

Appointments

Run a practice booked by the hour: services in person or over video, practitioners, working hours and exceptions, deposits and cancellation fees, intake, reminders, and your daily schedule.

Appointments are for work you sell as someone’s time — a massage, a treatment, a reading, a consultation. A client picks a service, picks an hour with a specific practitioner, pays, and gets a confirmation with a link to manage the booking. You get a schedule.

Unlike experiences, which sell a fixed-capacity session to a group, an appointment reserves one person’s exclusive time. That difference drives everything below: a session can hold twelve people, an hour can hold one.

Appointments is a platform type. An organization is either an appointments practice or it isn’t, and switching it on is done for you during onboarding — you won’t find a toggle. Once it’s on, Schedule appears in your sidebar under Appointments.

Who can sign in?

The practice owner, and any admins. They run everything on this page: the schedule, every setup screen, cancellations, moves, refunds and phone bookings.

Practitioners, if you invite them. If you work alone, nothing changes: you are the only login and you run the whole diary. If you work with other people, each person on Practitioners can have a login of their own:

  1. Open Schedule → Practitioners. Each person’s card has an Account line: none, invited, or the email they sign in with.
  2. Press Invite as a user on their card, check the email address, and send. They get an email with a link to set a password. (Organization → Users can send the same invite: pick which practitioner the login is for. A practice has no markets, so nothing asks for one.)
  3. When they accept, the card shows the email they sign in with. Until then you can resend or withdraw the invite from the card.

A practitioner who signs in lands on their own schedule and sees only their own appointments. On those they can:

  • cancel under your cancellation policy, which refunds what the policy says;
  • move it to a new time, still with them, since only you can hand a client to someone else;
  • mark a no-show;
  • connect their own calendar and Zoom on Calendar & video, where they see only their own row.

They can’t change services, hours or time off, booking questions, reminders, the consent form, packages, or how clients reach you. They also can’t take phone bookings, refund outside a cancellation, waive a late-cancellation fee, or see billing, payouts or anyone else’s appointments. Those stay with the owner and admins. Removing a practitioner’s login under Organization → Users ends their access at once and frees their card to be invited again. Archiving the practitioner does the same.

What do I need before clients can book?

Five things, in this order. A new practice’s Schedule page shows a checklist of what is still missing, and it disappears once a client can book.

  1. Billing in good standing — an active VendorStreet membership, plus your plan subscription if your account is on one. Appointments is not free, and this is the gate on publishing a service and on your public booking page. See What does it cost? below.

  2. Your organization timezone. Every hour a client sees, every reminder, and every line on your schedule is rendered in it. Set it under Settings → Organization. Get this wrong and the whole system is politely, consistently wrong.

  3. Stripe connected. Every appointment is a paid booking. There is no free-booking path — a service priced at zero can be created but cannot be booked online, because checkout is a Stripe session and Stripe rejects a zero amount. Set this up under Settings → Organization → Payouts; see Payments & Payouts.

  4. Your practice configured. You do the core of it yourself, from the buttons at the top of Schedule:

    • Practitioners — add each person clients book with (add yourself, even if you work alone), set their weekly hours, and add time off for holidays or a one-off change of hours. A practitioner with no hours cannot be booked, and the page says so.
    • Services — name, length, price, the gaps you want kept free around it, how far ahead it must be booked, your cancellation window and late-cancellation fee, a deposit if you take one, whether you meet in person or by video, and who provides it. A service is saved as a draft; Publish puts it on your booking page. If publishing is refused, the page tells you why and where to fix it — usually billing, or a practitioner who has not yet connected the account that hosts video calls.
    • Booking questions — anything you need to ask beyond name, email and phone. Choose whether an answer is asked every visit or remembered, and — if you travel to clients — which remembered question is where the appointment happens. A question’s kind can’t be changed once it exists; stop asking it and add another. Answers already given are always kept.
    • Reminders — the messages you send around an appointment, by email or text. None are sent until you add one. Start from an example, press a placeholder to insert it, and check the preview before you save. Messages are switched off rather than deleted.
    • Locations — only if you work from more than one place, or some of your work is at a fixed place and some isn’t. A location does nothing until you use it: set where a service happens under Services, and where each block of hours is worked under Practitioners → Weekly hours. If you visit clients you don’t need one — ask for their address as a booking question. The same screen has How clients reach you — see How clients reach you.
    • Rooms & equipment — only if you have fewer of them than people. A room needs open hours just as a person needs working hours: one with none is never free, so any service that needs it offers no times. Saving a service warns you if that is about to happen.
    • Calendar & video — connect each practitioner’s Google Calendar or Outlook calendar, and their Zoom account if you use Zoom. See Connecting a practitioner’s accounts.
    • Packages — only if you sell sessions up front. See Packages.
    • Consent form — only if clients must agree to something before they book. See Consent form.

    Two things live inside those screens rather than beside them. Roles (on Practitioners) appear once you say different people do different work; a service then asks for a role. Categories (a button on Services) are the headings on your booking page, in your order — they only group services and never change what can be booked.

    A service that needs several people, or a room as well, is set under Who provides it. Every line has to be free at the same time, each filled by a different person or item. The form won’t let you ask for more than you have.

  5. Your booking link shared. Once configured, your public page is live at /book/your-practice-slug.

How does the calendar actually decide what’s available?

Worth understanding, because it explains most surprises.

A service says what it needs — one therapist, or one therapist and one room. Each practitioner and each asset is a resource, and a resource can do certain kinds of work (its skills). An hour is offered only when every resource the service needs is free for the whole of it.

Availability is built from three layers, in order:

  • Working hours — a repeating weekly pattern per resource. “Mondays 9–5, Saturdays 10–2.”
  • Exceptions — dated changes that beat the weekly pattern. A blackout removes time (holiday, training day). An override replaces it (“this Saturday, 12–4 instead”).
  • Existing bookings — anything already reserved.

Two things are easy to trip over:

Buffers are invisible to the client and real to your calendar. A service can carry a buffer before and after — travel, setup, laundry. A 60-minute massage with a 30-minute buffer after occupies 90 minutes of the practitioner’s day but shows the client a 60-minute appointment. Your schedule shows the appointment; the calendar blocks the buffer.

The booking cutoff is per service. “No bookings within 2 hours” is a property of the service, not the practice, so a mobile visit needing travel time can close earlier than a studio session.

Working somewhere as well as somewhere else

A practitioner can have hours at a location and hours that aren’t tied to one. Working hours and exceptions can each be scoped to a location, and an unscoped rule serves everything.

The rule is: a service at a location can only be booked in hours that are either unscoped or scoped to that location. So “Tuesdays and Thursdays at the studio, Mondays and Wednesdays mobile” is expressed as location-scoped weekly windows, and mobile work simply doesn’t appear on studio days.

How do services work?

A service is what a client picks. It carries:

  • Duration — the appointment length the client sees.
  • Buffers — before and after, invisible to the client (above).
  • Price — in cents. 18000 is $180.00.
  • Deposit — none (pay in full at booking), fixed (a set amount), or percentage.
  • Booking cutoff — how close to the start a client can still book.
  • Cancellation window — how much notice counts as a proper cancellation.
  • Late-cancellation fee — what you keep inside that window (below).
  • Requirements — which resource types, and how many of each.
  • Whether a client may request a specific practitioner.
  • Where it happens — in person, or over video (below).

Lifecycle. A service is draft, active, hidden, or archived. Only an active service can be booked; draft and hidden are invisible to clients but can still be previewed internally, so you can build a service and its hours before anyone can reach it. Archived retires it for good.

Services are archived rather than deleted, so an old appointment always still knows what it was for — and so does your reporting.

Services that happen over video

A service can be in person or video. A video service is booked and paid for exactly like any other — same deposit rules, same Stripe, same refunds — and the client’s confirmation carries a link to join instead of an address to walk to.

Two providers: Google Meet and Zoom. You choose per service, so a practice can run consultations on Zoom and quick check-ins on Meet if that’s what suits. The meeting is always hosted on the practitioner’s own account, never ours — so the invite carries their identity, and no recording ever lands in a platform-owned bin.

What you need, for Meet. The practitioner’s own Google Calendar connected (below). Nothing else: no new sign-in, no new permission, and if their calendar is already connected they already have Meet.

What you need, for Zoom. The practitioner’s Zoom account, connected once on Schedule → Calendar & video, the same way a calendar is connected. You press Connect beside Zoom on their row, and they sign in to their own Zoom and approve it, in the same sitting — see Connecting a practitioner’s accounts. Zoom is separate from the calendar: connecting one does not connect the other, and a practice can use Zoom having never connected a calendar at all.

Setting one up. Draft the service, mark it as video, pick the provider, assign the practitioner, then publish. That order matters, because publishing is where we check: we refuse to publish a video service whose practitioners aren’t connected to the provider it uses. It is a blunt refusal on purpose. The alternative is a service that sells a consultation it cannot produce a way to attend, and you’d find that out from the client, after they’d paid.

The same check runs in the other direction. You cannot reassign a published video service to a practitioner who isn’t connected, and you cannot disconnect an account a published video service depends on — take the service off video, or unpublish it, first. The check knows which provider a service uses: disconnecting Zoom won’t be blocked by a service that runs on Meet.

Everyone in the pool needs connecting. If a video service can go to any of three practitioners, all three need to be connected to that service’s provider. Booking picks whoever is free, so two out of three means it fails for one client in three, at random.

Zoom’s free plan will cut your appointment off at 40 minutes

Zoom’s free Basic plan ends every meeting at 40 minutes — including one-to-one meetings. This used to be true only of group meetings, and it changed in 2022. It matters here more than anywhere: a 50- or 60-minute consultation with a single client is the most common thing this feature is used for, and on a free Zoom account it will cut off mid-session.

We warn you when you save a Zoom service longer than 40 minutes, and that warning is not a refusal — we deliberately don’t ask Zoom which plan an account is on, so we can’t tell whether it applies to you. If the practitioner’s Zoom is on a paid plan, ignore it. If it isn’t, either shorten the service or upgrade that Zoom account before you publish.

Zoom connections expire after 90 days without use

Unlike a Google Calendar connection, which lasts until it’s revoked, a Zoom connection expires once it has gone 90 days without being used — that’s Zoom’s rule, not ours. Every video booking renews it, so a busy practice never sees the date arrive. A practitioner who takes no video bookings for a quarter comes back to a dead connection through no fault of their own.

The expiry date is shown beside each connection on the Calendar & video page, with a warning once it is two weeks away. Reconnecting is the fix and takes a moment; it does not need a disconnect first. If it lapses with appointments already booked, you’ll get the same urgent notification described below.

If a practitioner removes VendorStreet from their Zoom account (in Zoom’s own app settings), Zoom tells us and we delete that connection straight away — we are required to, and the credentials are dead anyway. You get an urgent notification naming the practitioner and how many upcoming appointments have their meeting on that account. Those links still work; rescheduling or cancelling just won’t update the meeting until Zoom is reconnected.

If a practitioner’s connection lapses

The link is created when the booking is confirmed — which is after the client has paid. If the connection has broken by then, we do not fail the booking. The appointment is real and the client’s money is taken, so:

  • The appointment is confirmed and the hour is held, exactly as normal.
  • You get an urgent notification naming the appointment, the client and what went wrong.
  • The client is told the link will follow — and it does. They are never shown a link that doesn’t work, and never left to guess.

What to do. Reconnect the practitioner’s Google Calendar, or their Zoom account, whichever the service uses, on Calendar & video. That’s all. The moment the connection is back we create the link for every upcoming video appointment of theirs that’s missing one, and email it to each client who was told it would follow — once, in a short “Here’s your video link” email. We also check every quarter of an hour, so a connection that recovers on its own is picked up too. The link appears on the client’s manage page at the same time, and any reminder template that uses {{join_url}} carries it from then on.

A phone booking you took with Email the client unticked is the exception: that client was never emailed, so we don’t start now. The link is still created; use Resend link on the Schedule to send it. If the appointment is very soon, don’t wait on any of this — call the client or send them a link yourself.

You are told once per appointment, not once per attempt.

Two more things are reported the same way, because on Zoom a meeting has a life of its own. If an appointment is rescheduled and the Zoom meeting cannot be updated to match — the connection lapsed in between, say — the client’s link still works but the meeting behind it shows the old time, and you are told so. If an appointment is cancelled and the Zoom meeting cannot be removed, its link may still admit people, and you are told to delete the meeting in Zoom yourself. Neither can happen on Google Meet, where the meeting is the calendar entry.

Disconnecting Zoom is refused while upcoming appointments have their meeting on that account — we would lose the ability to move or cancel those meetings. Reassign or cancel them first. Reconnecting never needs a disconnect.

What does it cost?

Two separate charges, and it’s worth being clear which is which.

The VendorStreet membership — $50/year for your organization. This is the same membership every operator pays and it covers everything you run. Without it you cannot publish a service, and your public booking page will not take new bookings. See Billing.

Your appointments plan — how you pay for running the practice itself. Three models, negotiated per practice, so which one you’re on is whatever we agreed — ask us if you’re not sure.

ModelWhat your client paysWhat you pay us
Flat planThe service priceA monthly or annual subscription; nothing per booking
Per bookingThe service priceA fixed fee out of each booking’s proceeds
Booker-paidThe service price plus a small booking feeNothing per booking

In every case you connect your own Stripe account, the money lands there, and you are the merchant of record. Only who pays us changes. Neither charge is the money your clients pay you.

If you’re on a flat plan, a Plan subscription card appears on your Billing page where you subscribe and manage it. If you’ve been given a promo code for a signup campaign, it goes in that card’s promo field — codes are issued for a specific product, so a code for the plan won’t work on the membership or the other way round.

The booking fee, if you’re on that model. It’s charged to the client at checkout as its own line — never folded into your price — and it comes to us rather than to you. Your client sees it on the booking page before they choose a time, again on the summary before they pay, on the Stripe page, and in their confirmation email. Your service price is quoted unchanged throughout.

On your side: Paid on an appointment is what you were paid for the service, and the balance due at the visit is worked out from that. The booking fee is listed separately, so if a client asks why their card statement says $182 against your $180 service, the answer is on the appointment.

One caveat worth knowing rather than being surprised by: because you’re the merchant of record, Stripe’s processing fee is charged on the whole amount, including the booking fee you don’t receive. On a $2 fee that’s a few cents.

Models can be combined. A negotiated deal can have both a per-booking fee and a booking fee, in which case we collect from both sides. That’s deliberate when it happens, not a mistake — but it’s the sort of thing to confirm you agreed to.

If the fee changes. A booking is charged the fee that was quoted when the client started booking. Renegotiating your deal never changes what an existing or in-progress booking costs.

Refunds. The booking fee is refunded in full whenever a client cancels without a cancellation charge — including when you cancel on them, or waive your own fee. It’s kept only on a late cancellation that costs them a fee. See the refund table below.

Phone bookings don’t carry one. A booking you take yourself charges nothing, so there’s no booking fee on it. The fee is for booking online.

If billing lapses. Your booking page stops taking new bookings and says so plainly, naming your practice and pointing clients at your phone — it does not go blank, and it says nothing about billing. Nothing is unpublished: your services stay exactly as configured and serve again the moment you’re paid up. Clients who already have a booking can still view, move and cancel it from their manage link, and your schedule keeps working, including moving appointments for them. A lapsed plan subscription does not normally stop anything at all — by default we go back to charging per-booking fees until it’s live again.

What happens with the money?

Deposits. If a service takes a deposit, the client pays the deposit at booking and the balance in person. The balance is shown on your schedule, per appointment and totalled for the day. Nothing else in the system tracks whether you collected it — there’s no “paid in full” flag yet, so the schedule is what stands between a deposit and an unpaid balance.

Cancellations. A client cancelling outside the window is refunded in full, automatically. Inside the window, the fee your service specifies is withheld and the rest refunded:

Fee typeWhat you keep
noneNothing — always a full refund
forfeit_depositWhatever they paid at booking
percentageThat share of the service price
fixedThat many cents

The fee is always clamped to what was actually paid. A policy that keeps “100% of the price” cannot withhold more than a 25% deposit if a deposit is all the client handed over. It is also computed on the service money only — a booking fee, if your practice has one, is never something your cancellation policy can keep.

The booking fee follows one rule: returned whenever the cancellation costs the client nothing, kept when your policy withholds a fee. So a cancellation in good time refunds everything; a late one costs the client your fee and the booking fee. Cancelling on a client’s behalf, or waiving your fee, returns it.

The client sees exactly what cancelling will cost before they confirm it, computed by the same rule that will run. The figure they’re quoted is the total that goes back to their card, booking fee included — and the same total is what you’re quoted on the appointment before you confirm a cancellation for them.

Our per-booking fee is never refunded. Whatever is refunded, by whom and why — a cancellation in good time, a waived late fee, a goodwill refund — the per-booking platform fee on that appointment stays with VendorStreet. The client still gets back exactly the amount they’re quoted; the refund comes out of what the booking paid you. If a client paid a booking fee and gets it back, we return that part ourselves, so you never pay for our fee.

If a refund fails, the cancellation still completes: the hour is released and the booking is cancelled, because the alternative is a client who can’t cancel and an hour lost from your calendar. The client is told the refund is on its way rather than that it has arrived. You’re shown what Stripe said, the failed refund appears on the appointment with a Retry button, and our team is alerted too. You may prefer to phone them and rebook rather than refund — that choice is deliberately left to you.

Packages

A package is a number of sessions sold up front, at one price. Set one up under Schedule → Packages: a name, how many sessions, the price, and which services it can be used for. The screen shows what that works out at per session, and that’s the only place a discount appears. “Book 3, get 1 free” is simply four sessions at the price of three.

A package is saved as a draft until you put it on sale. Once it’s on sale, it’s offered on your booking page. Taking it off sale stops new sales, and anyone who already bought one keeps their sessions.

How a client uses one. They pay for the package through Stripe, like a booking. Once payment clears they get an email with a link, and that link is how they spend their sessions: it opens your booking page with the package applied and shows how many sessions are left. The link is the client’s credential, like the manage link. Without it a session can’t be spent, so knowing someone’s email address is never enough to book against their package. Tell clients to keep that email.

What happensThe session
They book with the linkOne session is used. Nothing is paid, and the booking is confirmed straight away.
They cancel in good timeIt goes back on the package
They cancel late, inside your windowIt’s used, the same as a late cancellation keeping a fee
The service is non-refundableAny cancellation uses it, however early
You cancel for them and waive your feeIt goes back on the package
They don’t turn upIt stays used

The last session can’t be spent twice. If two bookings race for it, the second is refused.

Fees. If you pay us a fee per booking, or your clients pay a booking fee, it’s charged when the package is sold, once for each session in it. A session booked from a package carries no booking fee of its own.

Packages don’t expire, and there’s no way yet to refund the unused sessions on one.

If clients must agree to something before they book, such as a treatment consent or a waiver, write it under Schedule → Consent form. Until you publish one, clients book without being asked to accept anything. It applies to every service.

Once it’s published, every online booking shows it in full, beside your cancellation policy, with a box the client ticks: I have read and agree to followed by your form’s title. The box is never pre-ticked, and the booking can’t go ahead without it.

A published version is never edited. Changing the wording writes the next version, and publishing that retires the current one. Clients booking from then on accept the new wording. Each acceptance keeps a copy of the exact title and text the client was shown, so editing your form never changes what someone already agreed to. Earlier versions stay listed on the screen, with the date each was retired. A published form can be replaced but not switched off.

If you change it while someone is booking, they’re stopped, told the form has been updated, and asked to read the current version and tick again. It’s checked when they reserve the time and again when they go to pay, so nobody books against wording you’ve since replaced.

Phone bookings aren’t asked. The form is for clients booking themselves. When you take a booking by phone, get consent however you normally do.

Acceptances are stored with each booking, but there’s no screen yet for looking one up. Ask us if you need one.

What does the client see?

Booking. Service, then time, then their details, then Stripe. Times are shown in your practice’s timezone with the zone named, so a client booking from another state sees your hours, not theirs.

A ten-minute hold. The slot is reserved when they submit, and they go straight to payment; reaching Stripe stretches the hold to thirty minutes. If they abandon checkout, the hold lapses and the hour comes back. A client who backs out of the Stripe page lands on their appointment page, which offers Continue to payment — the same payment page, while the hold lasts — or Release this time to give the hour back. Once the hold has run out it says so, that nothing was charged, and offers to book again. Two people racing for the same hour: one gets it, the other is returned to a freshly loaded list rather than a slot that’s already gone.

A confirmation email with a calendar attachment. It names the practitioner they’re seeing, where (the location’s name and address, the address they gave you, or “Online”), and the money: the price, what they paid online, and any balance due at the appointment — or that a package session covers it. A $50 deposit toward $180 reads as both figures, with the $130 to pay on the day. If the appointment is moved, the same calendar event moves rather than a second one appearing.

A card receipt from Stripe. Every online payment — an appointment or a package — asks Stripe to email the client a receipt for the charge, and the confirmation tells them it comes separately. It names the amount charged; the confirmation is where the price and the balance due live.

Practitioners’ names are shown to clients — in that email, on the calendar entry and on their appointment page. Only the name: a practitioner’s email and phone never reach a client.

On a video appointment, the join link — in that email, in the calendar attachment, and on their manage page. It is not on your public booking page, and it never will be: anyone holding that link can join the meeting. If they lose it, the manage link in their email gets it back.

If the appointment moves to a new time, the link stays the same. If the move puts them with a different practitioner, the meeting moves with them: the old link stops working and the email telling them about the move carries a fresh one. If the appointment is cancelled, the meeting is deleted and the link stops working — which is the point.

A manage link. No account, no password — the link in their email is the credential. From it they can view their appointment — who with, where, the price, what they paid and what’s due on the day — add it to their calendar with Add to calendar (the same calendar file the confirmation carries), move it to a new time under your rules, and cancel it. Once it’s cancelled, the page says what happened to the money in the same words as the cancellation email: refunded, a refund owed, the fee you kept, or the package session returned or used — and it keeps up, so a refund that goes through later shows there too. How far a client can move it themselves, and what you’re told when they do, is in When a client wants to move an appointment. Tell clients to keep the email; there is no “forgot my booking” flow for them. If a client has lost it, use Resend link on the appointment in Schedule: it emails them their manage link again — the same link, nothing new is created — with the join link on a video appointment. It only ever goes to the email address on the booking, and at most three times an hour per appointment; each send is recorded on the practice’s audit record. A reminder template that uses {{manage_url}} carries the link too, so a client with reminders set up gets it again before the appointment.

A “book again” link in the confirmation, which is what lets us remember their details next time.

A cancellation email, whoever cancelled. It says the appointment is off, who cancelled it, and what happened to the money in one sentence: the amount refunded when Stripe accepted the refund, “a refund of $X is owed — we’ll email you as soon as it goes through” when Stripe refused it, the fee that applied when nothing is due, or that the session went back to their package. When a refused refund later goes through — you press Retry, our sweep finishes it, or Stripe reports it — the client gets that second email then, once. Every one of these emails replies to your practice, not to us — see below for which address.

How clients reach you

On Locations, How clients reach you takes a phone number and an email address for clients. They’re printed wherever a client might need you: your booking page (when a service has no times or can’t be booked online), their appointment page, and the confirmation and cancellation emails. Leave them blank and clients are told to reply to their confirmation email instead.

When you set a client email, it’s also where replies to your appointment emails go — the built-in confirmation and cancellation, and every email template you address to the client (reminders, follow-ups). Without one, replies go to your organization’s contact email, or failing that the account owner’s. The contact details under Settings → Organization are your contact of record and are never shown to clients — so if that’s a personal inbox, set a client email here.

When a client wants to move an appointment

Clients can move their own appointment from their manage link, within the rules you set on the service. The page states the rule before they start (“You can move this appointment once, up to 48 hours before it, to a time within 30 days of the original date”), how many moves they have left and the latest date they can pick. It offers only times the move will accept — with the practitioner they booked, never someone else — and asks them to confirm with the stakes spelled out (“This uses your one reschedule — after this you won’t be able to move it again”). When the rules say no, the page says why — inside your window, the allowance used up, the appointment already started — and gives them your contact details from How clients reach you.

You’re told every time a client moves. A built-in email goes to the practitioner’s email on their resource (the address your “to the practitioner” templates use), saying who moved, from when to when, who with, and how many moves they have left. If the move put the client with someone else (only possible on a service where clients choose who they see), both the old and the new practitioner get it. If you already have your own active rescheduled email template addressed to the practitioner, that template is their email about the move and the built-in one isn’t sent as well — one email per move. If the practitioner has no email on file, it isn’t a valid address, or it bounces when we send, the email goes to your practice’s reply-to address instead (your client email, else your organization’s contact email, else the owner’s) with a note to pass it on — check their email under Practitioners. The client gets the usual “your appointment has moved” email with an updated calendar invitation, and the move is on the appointment’s history as the client’s. Moves you make yourself don’t email you.

The picker opens on the weeks around the appointment and pages further ahead (and back towards today) as far as the range allows. A client can move an appointment a handful of times an hour at most — enough for a time taken under them, not enough for a script to walk it round your calendar. If a client picks a time already inside your cancellation window, the page warns them first that it will be final and that cancelling it would be late.

The rules, set on the service under Services. They apply to the manage link and to anything else moving an appointment on the client’s behalf, such as a partner website that books for you:

  • Client reschedules allowed. How many times a client can move it themselves. A new service starts at 1. Empty is no limit (clients can move from their link as often as the window allows), and 0 is none — set 0 if clients should always ask you. Services you created before this default keep whatever they had.
  • New time must be within (days of the original). How far a move may land, in calendar days from the date they first booked, however many times it has moved since. Empty is no limit.
  • Never inside your cancellation window. A client can only move an appointment before the window starts. Inside it the answer is no, whatever is left of the allowance, because that’s the time you need to rebook the hour.

A client move also keeps your booking cutoff: they can’t move into a time a new booking couldn’t take. Past the rules — inside the window, allowance spent — a client who still needs to move asks you, and you do it from Schedule — see Rescheduling for a client.

Your own moves are never limited. Moving an appointment from Schedule doesn’t count against the allowance, and ignores both the window and the range. It also resets where the range is counted from: if you have to push someone six weeks out, their days run from the new date you gave them, not the one they first booked.

Non-refundable is on the same form. Ticked, what you keep on a late cancellation applies to every cancellation, however early. It doesn’t make a move late: whether a client can move depends only on the window.

What do we remember about a client, and when?

Intake questions come in two kinds:

  • Per-visit — asked fresh every time. “Anything we should know today?”
  • Remembered — asked once and offered back next time. Their address, most usefully.

A question can be flagged as the appointment’s location, which is how mobile practices work: the client’s address becomes where the appointment happens, and it’s what shows on your schedule and in your reminders.

Two rules protect that, and both matter for a practice that visits people at home:

Knowing an email is not enough to recall an address. Remembered answers unlock only for someone holding the “book again” link from their own inbox. Without it, a returning client just fills the form in again.

Taking one appointment somewhere else does not move their address. A one-off — at work, at a friend’s — applies to that visit only. Changing what’s remembered is a separate, explicit choice they have to tick.

How do reminders work?

Two layers.

Built in, always on: the confirmation email with its calendar attachment, sent when payment clears.

Yours, configured: a ladder of templates. Each has a channel (email or SMS), a trigger, and — for time-relative ones — an offset. “SMS, 24 hours before” is trigger scheduled, offset -1440. “Email, the day after” is trigger after, offset 1440. Triggers are booked, scheduled, after, cancelled, rescheduled, and no_show.

Templates can be scoped to one service or apply to all of them, and addressed to the client or to the practitioner — a “you have a new booking” note to staff is the same machinery.

A message for one service is sent as well as your messages for every service, not instead of them. This is what lets “a reminder the day before everything” sit alongside “and a questionnaire for hypnosis sessions” without writing the reminder out once per service. It also means that if you add a message for one service at a moment your every-service message already covers — both the day before, both by email — that client gets two. What a client receives, at the top of the Reminders screen, shows this: pick a service and it lists the messages you’ve set up that one of its clients gets, in the order they arrive, and says so when two or more arrive together; messages to the practitioner are listed separately. It lists your messages, not the built-in ones — the confirmation, and the emails when an appointment is cancelled or moved, aren’t on it. A text only reaches a client who ticked the box to get texts, and only on a plan that sends texts; on a plan that doesn’t, texts are left off the list. Reminders set for different times arrive separately, except that a booking made after more than one of those times has passed may get them together.

When a client replies to a template email, the reply reaches your practice (see How clients reach you). A template addressed to the practitioner has no reply address: it’s your practice writing to its own staff, and a practitioner’s reply never goes to the client.

Bookings you take by phone go through the same templates. The one switch on a phone booking, “Email the client a confirmation”, is about the client: unticked, they get neither the built-in confirmation nor any “booked” template addressed to them. Your own notices to the practitioner go out either way, and so do the time-based reminders — a “24 hours before” reminder reaches a phone booking the same as one paid online, even though the client pays at the visit.

Available placeholders: {{customer_name}}, {{service_name}}, {{practice_name}}, {{resource_name}}, {{when}}, {{manage_url}}, {{join_url}}, and the ones listed under Follow-ups after the appointment below, which work in every template. A placeholder we can’t fill is refused when you save rather than shipped as a blank — a typo would otherwise reach every client that template covers.

What a client receives answers a different question from Preview: preview is one message’s words, this is every message of yours one service sends. Preview shows the message filled in with example details — for an email, the whole email in the branded layout your client sees. Send a test to me emails that same example to the address you sign in with, with [TEST] in the subject. It never goes to a client and is not recorded as a sent message. A text-message template is emailed to you as its words, so testing costs no texts.

Things worth knowing:

  • Each template sends once per appointment. You cannot double-remind someone by running anything twice. Two different templates landing at the same moment is a separate thing, and What a client receives is where you see it.
  • A rescheduled appointment is reminded again about its new time, and the record of the old reminder is kept. Follow-ups are the exception: one that has gone out is about a visit that happened, so it is never sent again.
  • A reminder more than 6 hours overdue is skipped, not sent late. A “tomorrow at 9” text arriving the morning of is worse than silence.
  • {{join_url}} is available in your templates. It is the video link on a remote appointment, and empty on an in-person one or on a video one whose link isn’t ready — so a reminder that uses it degrades to a sentence with a gap rather than mailing a broken link. It works in SMS as well as email. Anyone who has the link can join the call, so it only goes to the client or practitioner the template is addressed to.
  • SMS needs consent. Clients tick a box at booking; absent is not consent, and we will not text without it. This is a legal requirement, not a preference — the wording on the booking form is doing real work, so don’t ask for it to be pre-ticked.
  • SMS is billed per segment. Long messages send as several. You’ll be warned when you save one, and the warning counts each placeholder at the length it really fills in to — a {{manage_url}} link is about 200 characters, more than one segment on its own.

Follow-ups after the appointment

Choose After the appointment under When, and say how long after: an hour, the next day, up to 30 days. The wait is counted from when the appointment was booked to end, so one “the day after” template fits a 30-minute and a 90-minute session alike. A session that runs over does not move it.

A follow-up is not sent:

  • to a client you marked as a no-show;
  • for an appointment that was cancelled;
  • for appointments that ended before you created the template. Saving a new follow-up applies to appointments ending from now on; it does not reach back to last week’s clients.

Start from the example, Thank-you and aftercare, the day after, and make it yours. These placeholders exist for follow-ups, and work in any template:

PlaceholderFills in as
{{first_name}}The client’s first name, or “there” if we have no name
{{date}}The date alone, like “Tuesday, September 30”, in your time zone
{{end_when}}When it was booked to end, like {{when}}
{{duration}}How long it was booked for: “45 minutes”, “1 hour 30 minutes”
{{practitioner_name}}The person they saw. Empty when no person is booked on it ({{resource_name}} can be a room)
{{service_description}}The service’s description from your menu
{{amount_paid}}What they paid online, booking fee included, like “$180.00”. Empty for a package session, a pay-at-the-visit booking, or a free service
{{practice_phone}}, {{practice_email}}Your phone and email from How clients reach you, on Locations. Empty if you haven’t set them
{{book_again_url}}Your booking page with this service already chosen. A returning client’s saved answers are remembered
{{package_remaining}}”You have 3 sessions left on your Five-visit pass.” when the visit came out of a package; empty otherwise
{{package_url}}The client’s own link to book with the sessions left on their package. Empty unless the visit came out of a package with sessions left, booked under the buyer’s own email. Never filled in on a message to the practitioner

An empty placeholder fills in as nothing, so a template that mentions {{package_remaining}} still reads cleanly for a walk-in.

Give package clients {{package_url}}, not only {{book_again_url}}. The booking page charges full price. Only the package link spends a session they have already paid for. The package link works like a key to the client’s package, which is why it only goes to the person who bought it.

Follow-ups are transactional only. They go out as appointment messages, with no unsubscribe link, because they are about the visit the client just had. Aftercare, a thank-you and a link to book again are fine. A newsletter, a sale or an offer is marketing, and marketing needs an unsubscribe link on every message. Don’t use follow-ups for it.

Calendars

A practitioner can have one calendar connected: Google Calendar or Outlook, whichever they already use. Either one gets their VendorStreet appointments written into it, moved when rescheduled and removed when cancelled. They differ in whether the practitioner’s own events can stop a booking, so read the one that applies.

Connecting a practitioner’s accounts

Calendars and Zoom are connected per practitioner, on Schedule → Calendar & video. Each practitioner has a row. You press Connect on their row, you’re sent to Google, Microsoft or Zoom, and whoever signs in and approves there is the account that gets connected to that practitioner.

The simplest way is for the practitioner to do it themselves. Once they have a login (see Who can sign in?), they sign in as themselves, open Calendar & video, and press Connect on their own row, the only row they see. They then approve it with their own Google, Microsoft or Zoom account.

You can still connect a colleague from your own sign-in, for example someone with no login. Then they sign in to their own account at that step, at your computer, in your VendorStreet session. VendorStreet has no way to tell whose account it is. The row is connected to whichever account approved it, so an owner who approves with their own Google account has connected their own calendar to someone else’s row.

Start and finish it in one sitting, in the same browser. The link sent to Google, Microsoft or Zoom is tied to your practice, to that practitioner’s row and to the VendorStreet sign-in that pressed Connect. It can’t be forwarded to someone to finish elsewhere: if the approval comes back to a different sign-in, it’s refused and you’re asked to start again. That’s deliberate. Without it, a link could be used to attach a stranger’s account to your practice.

The page tells each practitioner to sign in as themselves and press Connect on their own row, and a practitioner with a login can do exactly that.

Google Calendar

Google Calendar is one-way. Events already in a practitioner’s Google Calendar do not block bookings here. If they keep personal commitments in Google and expect VendorStreet to route around them, it won’t. For a practitioner on Google, time off belongs in exceptions (time off, on Practitioners), where the availability engine can see it.

We ask only for permission to manage events, not to read the whole calendar, and the connection is stored encrypted. If it breaks — a revoked password, a removed app — the connection goes into an error state and needs reconnecting; appointments are unaffected while it’s down. Meet appointments are the exception: the calendar connection is what creates their join link, so see If a practitioner’s connection lapses. A Zoom appointment is unaffected — its meeting has nothing to do with the calendar.

The same connection powers Google Meet. The permission we already ask for is enough to create a meeting on the event, so a practitioner who connected their calendar last year can offer video services today without reconnecting or approving anything new.

Outlook calendar

Outlook and Microsoft 365 calendars connect the same way, and are written to the same way.

Outlook is two-way. Time marked busy in the practitioner’s Outlook calendar is kept off your booking page. We read it every 15 minutes, up to 120 days ahead, and again at the moment a client reserves a time, an appointment is moved, or you take a phone booking. So a meeting they add at 9:01 stops a 9:05 booking, even though the page the client opened at 9:03 still showed the slot. If Microsoft is slow to answer at that moment, we use the last copy rather than hold the booking up.

  • What counts as busy. Anything not marked free or working elsewhere blocks the time, including tentative. Their VendorStreet appointments, which we wrote there ourselves, aren’t counted twice.
  • What we keep. Only when they’re busy, never what the event is called or who it’s with.
  • What we ask for. Permission to read and write calendars. Not mail, not contacts.
  • All-day events east of UTC. In a calendar set to a timezone east of UTC, such as in Europe, an all-day event can currently be read as the day before it. Calendars in American timezones are unaffected.

A Microsoft 365 organisation may have to approve VendorStreet first. Many work accounts only let an administrator approve a new app. If so, the practitioner is told exactly that when they come back from Microsoft, and whoever manages the Microsoft account has to approve VendorStreet once before anyone there can connect.

If the connection stops working, the busy time we last read stays in place, because a slightly old picture of their week is safer than suddenly opening every slot they were busy in. The Calendar & video page says to reconnect. If the problem is on our side rather than theirs, the page says that instead, and their connection is left alone. Disconnecting removes all the busy time that connection brought in.

There’s no Meet on Outlook. A Google Meet link needs a Google Calendar connection. A practitioner on Outlook can still take video appointments over Zoom. Microsoft Teams isn’t offered.

Running your schedule

Schedule in the sidebar’s Appointments group, and where signing in lands you. Day is the default; Week shows the same thing Monday to Sunday, grouped by day. With more than one practitioner, a Practitioner filter shows one person’s day at a time. A practitioner signed in as themselves sees Your schedule instead: only their own appointments, with no filter to choose. Times are always in your practice’s timezone — the one your clients booked against — so travelling doesn’t shift your day under you.

Each appointment shows the time, the client, the service, where it happens, which practitioners are on it, their phone and email as working links, everything the client answered on your intake form, and any balance still to collect. The day is totalled at the top.

  • Holds don’t appear. Someone mid-checkout is not an appointment, and planning around bookings that mostly never happen is worse than not seeing them.
  • Cancellations are hidden unless you ask for them, and never counted in the day’s total.

Cancelling for a client

Cancel on the appointment. You’re shown what was paid, whether this is inside your cancellation window, and — when your policy would withhold a fee — two choices side by side:

  • Apply the cancellation policy, which keeps the fee your service specifies.
  • Waive the late-cancellation fee, which refunds in full.
  • A different amount…, for “cancel, and give her half back” in one step. Type the amount (anything from $0 up to what was paid) and a reason; the reason is kept on your record, not sent to the client.

The waiver is yours to give and is never the default; the record still says the cancellation was late, because it was. The figures are computed by the same rule that runs when you confirm, so the number you quote on the phone is the number that goes back.

If the refund fails, you’re told so plainly — with what Stripe said — rather than being shown a success. The appointment is still cancelled and the hour still released, and the failed refund waits on the appointment for you to Retry.

The client is emailed either way: that it’s cancelled, and the amount coming back — or that it’s owed and will follow. On A different amount… the tick Email the client switches that email off; untick it and the client hears nothing from us about this cancellation, now or when a refund later goes through.

Refunding outside your policy

Refund… on an appointment returns any amount of what the client paid online, at any time — before the appointment, after it, or long after you cancelled it. It’s how a practice with a no-refund policy still makes the occasional exception, and cancelled appointments show it too whenever money is left to refund.

  • The amount is prefilled with everything left and can’t go above it. Two people refunding the same appointment at once can’t both succeed.
  • A reason is required. An exception to a written policy is exactly what you’ll be asked to explain later; it’s kept on your record and never sent to the client.
  • The client is emailed with the amount and when to expect it (usually 5–10 business days) unless you untick Email the client. The email goes when the refund actually goes through — so a refund Stripe refused is announced when your Retry succeeds, not before, and never twice.
  • A booking fee the client paid comes back only when you refund the full amount that’s left. If the service has been refunded in full but the booking fee hasn’t, the dialog says so and a $0 refund returns just the fee.
  • A refund whose confirmation from Stripe didn’t come back shows on the appointment as not having gone through, and is finished automatically within about a quarter of an hour.
  • Each appointment lists its refunds — yours, your cancellation policy’s, and any our support team made on your behalf — and a refund Stripe refused shows Stripe’s reason with Retry beside it.

Refunds only cover money that went through Stripe. A balance collected in person is yours to settle however you took it.

Refunded in Stripe directly? If you (or anyone with access to your Stripe account) refund a payment from the Stripe dashboard, the appointment shows Refunded $X outside VendorStreet. The appointment itself is left alone — a refund says nothing about whether the client is still coming — so cancel it too if that’s what you meant.

Disputed. If a client disputes the charge with their bank, the appointment is marked Disputed. Nothing else changes; disputes are answered in your Stripe dashboard.

Once the appointment has ended it can no longer be cancelled — by you or by the client from their manage link. A session that was delivered has nothing left to call off, and cancelling it would have refunded the client for an hour they attended. Cancel and Reschedule disappear from the row; if the client didn’t turn up, mark a no-show instead. An appointment that’s under way can still be cancelled, and counts as a late cancellation.

The same floor applies to moving it. Once an appointment has ended, nobody can move it — not you, not the client, not a partner site. While it’s under way you can still move it (the practitioner ran late, the client had to leave), but the client can’t move it from their side, whatever your cancellation window says.

A package session — one the client paid for with a package credit rather than at booking — shows as Package session with nothing due. Cancelling it moves the credit, not money: in time, the session goes back onto the client’s package; inside your cancellation window it’s used up, unless you choose to return it, which is the same waiver you’d apply to a fee. A no-show on a package session leaves the credit used.

The note you add is for your own records. It isn’t sent to the client.

Rescheduling for a client

Reschedule, then pick from real availability — the same engine your booking page uses. Your own booking cutoff doesn’t apply here: someone ringing at 8am for a 9am slot is a booking, not a policy violation. Neither does your cancellation window, which exists to protect you from short notice and is yours to absorb.

The client keeps their practitioner. The times offered are the ones the person they booked with can take, and the dialog says who that is. If that person can’t do the new time, you’re shown nothing for it rather than having the client quietly handed to someone else. In a practice with more than one practitioner you can change who — pick another name, or Anyone available — and that’s a decision you make, not one the system makes for you. The same rule holds when a client is moved through a partner site: they stay with the person they chose.

Nothing is charged or refunded, and it doesn’t use up the client’s own moves. The client gets the standard “your appointment has moved” email and an updated calendar invitation that moves the existing event rather than adding a second one, and any reminders are re-armed for the new time. On a video appointment the join link survives the move — it is attached to the appointment, not to the time — so a client who has already saved it doesn’t need the new one.

Marking a no-show

Mark no-show, available once the appointment has been and gone. It records that the client didn’t turn up, and who recorded it.

No money moves, and none can. We hold no card for your clients, so a no-show cannot be billed after the fact. Whatever was paid at booking — a deposit, the whole fee — stays with you; a balance you were going to take in person simply never arrives, so the appointment drops out of the day’s balance to collect. If missed appointments should cost something, that has to be set up in advance: a deposit plus a cancellation window on the service.

The hour stays on your calendar. You were there, so it still counts as an appointment; releasing it would let the slot be rebooked in the past.

Marked the wrong client? Undo no-show. Both the mark and the correction stay on your record.

Resend link, on any appointment that isn’t cancelled and has an email address. It emails the client the link to their appointment page — the same one their confirmation carried; nothing new is created and the old one keeps working — and, on a video appointment, the join link. If the video link isn’t ready yet, the email says so, and the client is sent it automatically once it is.

It only ever goes to the email address on the booking, never one you type in, because that link is the key to the client’s appointment. Each appointment can be sent at most three times an hour, and every send is on your audit record.

Taking a booking over the phone

Book by phone, top right. Pick the service, optionally name a practitioner — you can, even on a service where clients can’t choose online — then a day and a time from real availability. Add the client’s name, email and phone, and answer whatever your intake form asks.

Nothing is charged. The client pays at the visit, so the whole fee shows as due on the day, exactly like an unpaid balance. There’s no card on file and no online payment of any kind.

The confirmation email is a choice. Tick it and the client gets the same confirmation, calendar attachment and manage link an online booking gets — including the ability to cancel it themselves. Leave it unticked for the client standing at your desk with the appointment card already in their hand. It only decides what the client is sent: a “new booking” note addressed to the practitioner goes out regardless.

The slot is checked at the moment you save it, not when the list was drawn. If a client’s online checkout takes the hour first, you’re told and asked to pick again — the same answer a second client would get. Being the practice doesn’t let you double-book a practitioner.

What still isn’t here

Setting up your practice is yours to do, from the screens at the top of Schedule. What isn’t in this release:

  • Memberships, gift certificates for appointments, recurring appointments, group bookings and waitlists.
  • Practitioners editing their own hours or time off. They can see them; you or an admin change them.
  • Time off at one location only. Time off added on Practitioners closes every location for those dates. Closing just one location is something we set up for you.
  • A month view. Day and Week only.
  • Expiring packages, or refunding a package’s unused sessions.

A video link that fails to be created is retried every quarter of an hour while the practitioner’s connection is working, and straight away when it’s reconnected — see above. We don’t ask Zoom which plan an account is on, so the 40-minute warning is a warning rather than a check. Microsoft Teams is not offered. Recordings and transcripts are not offered and are not planned.

Moving from another booking system

We’ve migrated from Amelia and the shape of the work is known: services, categories, practitioners, clients, and appointment history come across.

The one thing that does not survive is historical availability — Amelia never versioned it, so there is no record of what hours were offered last March. Current working hours are re-entered by hand at cutover, which is a good moment to confirm them with each practitioner rather than trusting a dump.

  • Billing — your membership, your plan subscription, promo codes
  • Payments & Payouts — connecting Stripe, statements, payout timing
  • Troubleshooting — paid but no confirmation, reminders not arriving, calendar disconnected
  • Reporting — revenue across appointments, markets, and experiences