Turn any of your staff — barbers, therapists, stylists — into bookable providers your customers can reserve time with, online, straight from a link you share on WhatsApp or Instagram. Each booking takes a deposit at the moment of booking (percentage-configurable per service), hard-blocks the slot for anyone else, and lets your customer cancel themselves within the window you set.
You don't need a separate booking app — the whole flow lives inside your BusinessSensor.
Before you start
- Paystack must be connected for your shop. Ask an administrator to set it up under Setup → Payment gateways if the Book now button on the public page doesn't proceed to payment.
- Each staff member you want bookable is a "Service Provider" — set them up under Setup → Service providers.
- Each service they perform is an Inventory item where Item
Type = "Service", with a Selling price filled in and (ideally)
a duration in minutes (
Unit Time Intervalon the Item — this is what the slot picker uses). - Optionally set a Deposit percent on the Service item so the customer only pays part of the total online (e.g. 50%) and settles the balance in person.
Steps — one-time setup
- Open Setup → Service providers and click + New provider.
- On the General tab:
- Name (required) — how the customer will see them.
- Phone / email — optional; used for internal contact.
- Cancellation window (hours) — how many hours before the appointment a customer forfeits their deposit if they cancel. Leave blank for "always refund".
- Default commission % — this provider's default cut of the service price. (Commission accrual arrives in a later release.)
- Max concurrent bookings — leave at 1 for a barber/therapist (one appointment at a time). Higher only if the provider handles multiple customers simultaneously.
- On the Schedule tab, tap Add on each day the provider works, and set the open/close time window. Add multiple rows on one day for split shifts (e.g. Mon 09:00-13:00 + Mon 15:00-18:00 with a lunch break in between). Days with no rows show as Closed — customers can't book those days.
- On the Services tab, pick each service this provider performs
from the dropdown, then set the four cells on its row:
- Price — defaults to the Item's Selling price. Edit it to charge more or less for this particular provider (a senior barber charges more than a junior).
- Comm % — optional per-service commission override.
- Minutes — how long this booking occupies the slot. Leave it blank to use the item's own duration (shown greyed in the box), or type a number to override it for this provider — 30 for a junior's haircut, 45 for a senior's.
- Also needs — leave as Nothing else unless the service needs a second resource on top of the person. See below.
- Save.
When a service needs more than the person
Some services can't happen just because the staff member is free. A massage needs a treatment table; a consultation may need a second member of staff. Set Also needs on that service's row:
| Choice | What it does |
|---|---|
| Nothing else | Only the provider has to be free. |
| Any free table | Blocks the slot unless at least one bookable table is free. Use this when the tables are interchangeable. |
| Table — <name> | Pins the service to that one table. |
| Any free colleague | Blocks the slot unless another provider is free to assist. |
| Person — <name> | Pins the service to one named colleague. |
This is what stops the classic double-sell: two therapists, one treatment table. Both are free at 10am, so the diary looks open — but only one 10am booking can actually happen. With Any free table set, the second customer never sees that slot.
Rooms are not in this list. A room is sold as a reservation
(Item Type = Reservation) through the normal booking path, not held as
a service resource.
Repeat for every bookable staff member.
Steps — share the booking link
Each provider has their own public booking page. To get its link:
- From the list: click the chain-link icon on the provider's row in Setup → Service Providers. The link is copied, ready to paste.
- From the provider: open them and look under Public booking link on the General tab — the full address is shown with a Copy button next to it.
Share it the same way you'd share a shop link:
- Paste it into a WhatsApp broadcast, Instagram bio, Facebook page.
- Print a QR code that points to it, stick it on the mirror at the chair, on the reception counter, at the door.
The customer opens it and walks through four steps: pick service → pick date → pick time slot → pay deposit. When their card clears, their booking flips to Confirmed and shows up in your booking cockpit.
What happens to the deposit
The money the customer pays online doesn't sit in limbo. The moment it clears it is recorded as money held on the customer's account — you can see it on their statement straight away, and it counts in your banking, not just in the booking screen.
It leaves that holding state in one of three ways:
| What happens | The deposit |
|---|---|
| Customer comes and is served | applied to their bill when you close it — a ₦5,000 deposit against a ₦12,000 bill leaves ₦7,000 to collect |
| Customer cancels in time | stays as credit, ready to refund. Refunds are made by hand — see below |
| Customer cancels too late, or doesn't turn up | forfeited: automatically invoiced as income |
A deposit bigger than the bill isn't lost. If the customer paid ₦5,000 and the bill comes to ₦3,000, ₦3,000 is applied and the remaining ₦2,000 stays on their account for next time.
Turning on automatic forfeits
Forfeits only happen if you've told the system what to call the income.
- Create an item with Item Type = Fees — call it something like Forfeited booking deposit. Set its tax treatment however your accountant wants it.
- Open Setup → Preferences → Bookings and pick that item under Forfeited-Deposit Item.
Leave it empty and nothing is ever forfeited automatically — the money just stays as credit on the customer's account, which you can refund or let them use on a future visit.
Refunds
Refunds are never automatic. When a customer cancels in time, the system tells you a refund is due and leaves the credit on their account; you make the actual payment through your bank or the Paystack dashboard, then record it as a refund. Nothing pushes money back out on its own.
Steps — day of the appointment
- Open Front office → Bookings. The list view shows the next two weeks. The timeline view shows one day, one row per provider, with each booking as a coloured block scaled to its duration.
- When the customer arrives, click Check in (blue arrow icon) on their row. The booking flips to CheckedIn.
- When the service is done, click Complete (green tick). The booking flips to Completed.
- If they don't turn up within a reasonable time, click No-show (amber X). Deposit forfeited by default.
Tips
- Test your own link — copy the booking link and open it on your phone first. Book a fake slot (pay via a test card) to see the whole loop before customers do.
- Duration is critical — the slot picker uses it to work out how long each slot needs to be. Set it in the Minutes cell on the Services tab (per provider), or on the Item to cover every provider at once. A service with neither can't be booked online.
- Split shifts — the schedule editor supports multiple windows per day. Use two rows for morning + afternoon around a lunch break, or three for morning/afternoon/evening.
- "None attached" warning on the provider list — that provider is set up but has no services attached, so customers can't book them. Open the Services tab and add at least one.
- Deactivate temporarily — untick Active on a provider to hide them from the public picker without deleting them. Their bookings stay.
Common problems
- Public page says "Provider not found" → the provider isn't Active, the ID in the URL is wrong, or they were deleted. Check they're marked Active on Setup.
- "This provider hasn't attached any services yet" → open their edit modal, Services tab, and add at least one. Without it, customers see the picker with nothing to pick.
- Customer says "no slots available" all day → check the Schedule tab has hours for that day of week. Empty = closed. Also make sure the service has a duration — either in the Minutes cell on the Services tab, or on the Item itself. A service with neither doesn't produce any slot ranges.
- Slots vanish even though the provider is free → that service has Also needs set, and every table (or colleague) it can use is already booked at those times. Add another bookable table, or change the service to Nothing else if it doesn't really need one.
- "This service needs a resource that isn't set up for booking" → Also needs is set to a kind that has no bookable rows — usually tables that were never opted in to online booking. Either opt one in or set the service back to Nothing else.
- "Monday: closing time (09:00) must be after opening time (17:00)" → the two times on that row are the wrong way round, or a row runs past midnight. Split an overnight shift into two rows (e.g. 20:00–23:59 on one day and 00:00–04:00 on the next) — a single row can't cross midnight.
- Save fails and the provider appears in the list anyway → the provider is saved before its schedule and services are. Reopen it from the list, fix what the message pointed at, and save again; you won't get a duplicate.
- "Someone just booked that slot" (409 error at pay-time) → the slot got taken by another customer between when this customer loaded the page and clicked Pay. This is the double-book protection working — the customer re-picks another slot.
- Deposit is 0 / "This service has no priced deposit configured" → the Service item has no Selling price, or its DepositPercent is set to 0. Fix on the Item.
- Customer paid but the booking still says "Awaiting Payment" →
Paystack hasn't confirmed the transaction yet (usually a few
seconds). Ask them to refresh the
/booking/{token}page; the?pay=callback verifies once. If it's still pending after a minute, the payment may have failed on Paystack's side — check the dashboard. - A no-show's deposit didn't become income → check Setup → Preferences → Bookings has a Forfeited-Deposit Item picked. Without one, the money stays as credit on the customer's account instead — no money is lost either way.
- Customer's cancellation refunded even though they cancelled late → refunds are manual today. The booking gets marked Cancelled either way; the system tells you whether the customer is inside or outside the cancellation window (via the banner on the confirmation page and in the operator list). You process the refund on the Paystack dashboard if it's due.
- Can't check in from an "Awaiting Payment" booking → the
transition is
Confirmed → CheckedIn, so an unpaid booking can't be checked in. Either wait for payment or, if you're taking cash on arrival, mark the deposit paid on the Paystack side and refresh — the check-in button will appear.