How to build an appointment system for your business (and why the calendar is the easy part)
An appointment system needs four pieces of data: what gets booked, who handles it, what hours it runs, and how long each appointment takes. Duration is the one that almost always gets left out, and it's the one that causes double-bookings.
Ximena runs a physical therapy clinic in Tampico, on her own. Her day brings three different things: an initial assessment that takes an hour, forty-minute follow-up sessions, and equipment therapy that runs twenty-five.
She books everything through WhatsApp. Every couple of weeks, the same thing happens: a new patient shows up at 11:00 for an assessment, when she already had another session booked for 11:30. Someone waits forty minutes in the waiting room, or someone just leaves.
Ximena doesn’t need a prettier calendar. She needs her schedule to know that an assessment doesn’t fit in the same slot as a follow-up. That’s what this post is about: how to build an appointment system that actually gets your hours right, and the one piece of data almost everyone leaves out.
What is an appointment system, and how is it different from a contact form?
An appointment system is the thing that decides which hours your customer can pick, and holds that hour for them. It shows real open slots, and once someone takes one, that slot disappears for everyone else.
A contact form doesn’t do any of that. It receives “I’d like Thursday afternoon” and drops it in a tray for you to reply to. It’s a request, not a booking.
Both have their place — just for different things. If you always negotiate the time — you look at the case first and then decide how long it’ll take — a form works fine. If you already know ahead of time how long each thing you do takes, that’s when a calendar pays off, because every back-and-forth message to nail down a time is time you’re not billing for.
The four pieces of data that make it work
Any online booking system, no matter where you build it, needs exactly four things:
- What gets booked. Your services: initial assessment, follow-up session, equipment therapy.
- Who or what handles it. This is called the resource: you, each stylist, each chair, each treatment room, each court. It’s whatever gets occupied when someone books.
- What hours it runs. Your regular weekly hours: Monday to Friday 9 to 2 and 4 to 7, Saturdays 9 to 1.
- How long each appointment takes. Sixty minutes for the assessment. Forty for the follow-up. Twenty-five for equipment therapy.
The first three almost always get filled in. The fourth is the one people skip, and it’s exactly the one that breaks everything.
Why do your appointments overlap even though you already have a calendar?
Because the duration is written in two places, and the two don’t agree.
On your page you wrote “Initial assessment — 60 min” as plain text, because it looks good next to the price. Separately, in your calendar settings, slots are split into thirty-minute blocks, because that’s how it came out of the box. Your customer reads “one hour,” picks a thirty-minute block, and the calendar sides with the thirty.
Nobody made a mistake. You have two numbers, and the calendar only listens to one of them.
That’s why, when we built this in Proyecta, duration lives in the resource and not in the service. Once a service has a calendar, the only duration that exists is the resource’s, and that’s the number that splits up the slots. There’s no second “duration” field you can fill in on the service page — on purpose: a number written there would contradict the very slots the calendar is offering.
It starts at sixty minutes per appointment until you change it, service by service, on the Availability screen. That’s the one step that saves you a full waiting room: going in and setting 40 for follow-up and 25 for equipment therapy, just once.
And when it comes to not letting two people take the same slot, that’s not something you configure: the engine holds the time in a single operation, so two people hitting submit at the same moment can’t both end up with 11:00.
How do you block off a day you’re not opening?
With exceptions, which are separate from your weekly schedule.
Your regular schedule is the rule: Tuesdays 9 to 2. The exception is September 16th, the long weekend you’re taking, the morning you have a course. You mark that day and it stops offering slots, without touching your usual schedule or having to remember to put it back on Monday.
It’s the smallest part of all this, and the one people appreciate the most. If the only way you have to close a day is to delete your whole schedule, sooner or later you’ll forget to put it back.
What your customer sees, and what you see
Your patient lands on your page, picks the service, sees the real open hours, and books one. If the service has a price, they pay right then; if it doesn’t, the appointment is confirmed right away, free. You don’t have to put a price on something to be able to book it.
Afterward, they have their account page, where they can see their upcoming appointments and cancel without messaging you. Once they confirm, the confirmation already includes how to cancel or reschedule.
On your end there are two screens, and it’s worth not mixing them up. Availability is where you set things up: the resource for each service, your weekly hours, exceptions, and how long each appointment takes. Bookings is your day-to-day schedule, where you see who’s coming and at what time. You’ll barely open the first one again. You’ll open the second one every morning.
What if you don’t set hours for a service?
Then that service has no calendar, and behaves like a form: requests come in, and you reply.
That explains the “no times are showing up” issue a lot of people run into. It’s not broken: that service was simply never given a resource with set hours, so it does the only honest thing it can do, which is take a message instead of inventing availability for you.
It’s also useful on purpose. Ximena left two services with calendars and one — house-call therapy, where the time depends on where she has to go — as a request. Not everything in your business has to fit into blocks.
How to have it up this week
You describe it, and it comes out working. Literally, write it like this:
“A page for my physical therapy clinic in Tampico, with three services that can be booked online: a 60-minute initial assessment for 700 pesos, a 40-minute follow-up session, and 25-minute equipment therapy. I’m open Monday to Friday 9 to 2 and 4 to 7, and Saturdays 9 to 1. House-call therapy should be request-only.”
From there you get a published page, with its calendar, your bookings, and a link you can send over WhatsApp. Before you hand it to anyone, check two things: that each service’s duration is the one that actually matches reality, and that your hours are this week’s hours, not last year’s.
And before you build anything, here’s a five-minute exercise that almost always changes the numbers you were about to set: open last week’s calendar and mark every appointment that didn’t take as long as it was supposed to. If you find three or more, that’s your problem — and it wasn’t the calendar.
When you want to see it with your own business, describe it at proyecta.dev and publish it.