Appointments & Booking
Set up appointment types, configure your availability schedule, and let clients self-book from the portal.
MealStack includes a full appointment booking system — define your session types, set your weekly availability, and let clients book directly from their portal. No more WhatsApp back-and-forth to find a time.
Client self-booking requires the appointments feature toggle to be enabled in the client's portal settings. Go to Settings → Client Portal → Default Features → toggle "Appointments" on.
Setup overview
Create appointment types
Go to Settings → Appointments and define the types of sessions you offer.
Set your availability
On the same page, configure your weekly schedule — which days and hours you're available.
Enable client booking
Toggle "Client Self-Booking" on for the types you want clients to book themselves.
Clients book from the portal
Clients see a "Book Appointment" button on their portal home page and can pick an available slot.
Appointment types
Appointment types define the different kinds of sessions you offer. Each type has its own duration, price, and booking rules.
Creating a type
Go to Settings → Appointments → Add Type. Fill in:
| Field | Description | Example |
|---|---|---|
| Name | What the client sees | "Follow-up Session" |
| Duration | Session length in minutes | 30 |
| Price | Cost (leave empty for free) | ₹499 |
| Category | Groups similar types | Initial, Follow-up, Review, Check-in, Group |
| Color | Calendar display color | Blue |
| Buffer | Gap between appointments | 15 min |
| Min notice | How far ahead clients must book | 24 hours |
| Max advance | How far into the future clients can book | 30 days |
| Client booking | Whether clients can self-book this type | On/Off |
Common setup
Most practices create 2-4 types:
| Type | Duration | Price | Booking |
|---|---|---|---|
| Initial Consultation | 60 min | ₹999 | Off (practitioner-scheduled) |
| Follow-up | 30 min | ₹499 | On |
| Quick Check-in | 15 min | Free | On |
| Plan Review | 45 min | ₹699 | On |
Keep "Initial Consultation" as practitioner-scheduled only. First-time sessions typically need intake form review first — use the Discovery Wizard for these.
Availability schedule
Your availability tells the booking system when clients can book with you.
Weekly schedule
On the Settings → Appointments page, scroll to "Availability Schedule":
- Toggle days on/off — enabled days show time range inputs
- Multiple slots per day — e.g., 10:00-13:00 and 14:00-17:00 (lunch break)
- Click "Add slot" to add another time range on the same day
- Click Save Schedule to persist your changes
Date overrides
For specific dates that differ from your regular schedule:
- Unavailable — mark a day as completely blocked (holiday, personal day)
- Modified hours — override with different start/end times for that specific date
- Reason — add context that shows on the calendar (e.g., "Diwali holiday")
Special days with "Block follow-ups" enabled automatically block booking availability for that date. You don't need to create a separate date override.
Client self-booking
What clients see
When features.appointments is enabled, clients see a "📅 Book an Appointment" button on their portal home page. Tapping it opens a bottom drawer:
Step 1 — Pick a type: Shows all bookable appointment types with name, duration, price, and description.
Step 2 — Pick a time:
- Week-by-week slot grid with navigation arrows
- Available slots shown as tappable time pills (e.g., "10:00", "10:30", "11:00")
- Days with no slots are omitted
- Mode selector (in-person/video/phone) when the type supports multiple modes
Step 3 — Confirm: Summary card + "Confirm Booking" button.
What happens on booking
When a client confirms a booking:
- ✅ Booking record created with date, time, type, and mode
- ✅ Follow-up auto-created — appears on the practitioner calendar
- ✅ Confirmation card sent in client chat (rich card with "Add to Calendar" CTA)
- ✅ Push notification sent to client confirming the booking
- ✅ Practitioner notified — bell notification + email
- ✅ Reminder sent 2 days before (via existing follow-up reminders cron)
Slot availability rules
The system computes available slots by checking:
- ✅ Practitioner's weekly schedule for that day of week
- ✅ Date overrides (unavailable days, modified hours)
- ✅ Existing bookings (no double-booking)
- ✅ Buffer time between appointments
- ✅ Minimum notice (e.g., can't book less than 24h ahead)
- ✅ Special days with "block follow-ups" enabled
Notifications
When a client books
| Channel | Recipient | Content |
|---|---|---|
| Chat card | Client | "Booking Confirmed" rich card with date, time, mode, "Add to Calendar" |
| Push | Client | "Appointment confirmed: Follow-up on May 28 at 10:00" |
| Bell notification | Practitioner | Badge count increases, booking appears in dropdown |
| Practitioner | "New Booking: Priya — Follow-up, May 28 10:00" |
When practitioner cancels
| Channel | Recipient | Content |
|---|---|---|
| Chat message | Client | "Your appointment has been cancelled. Please rebook." |
| Push | Client | "Your Follow-up on May 28 was cancelled. Please rebook." |
Reminders
Clients receive a reminder 2 days before their appointment (email + push). This uses the same reminder system as follow-ups — the booking automatically creates a linked follow-up with reminderDaysBefore: 2.
Calendar integration
Bookings appear on the practitioner calendar as a distinct event type:
- Color: Indigo (or the appointment type's custom color)
- Label: "Client Name — Type Name"
- Filter: Use the event type filter to show/hide bookings
- Actions: Confirm, cancel, or mark complete from the event popover
Managing bookings
From the calendar
Click a booking event to see details. Actions available:
- Confirm — change status from pending to confirmed
- Cancel — cancels the booking and notifies the client
- Complete — marks as done (typically after running Start Visit)
- No Show — records the client didn't attend
Client cancellation
Clients can cancel their own bookings from the portal:
- Their upcoming bookings are listed (via
portal.bookings.myBookings) - They can cancel with an optional reason
- The linked follow-up is also marked as skipped
- An activity log entry is created
There's currently no automatic waitlist backfill. When a booking is cancelled, the slot simply becomes available again for others to book.
Example: Setting up booking for a solo practice
Create your types
Go to Settings → Appointments → Add Type:
- "Follow-up" — 30 min, ₹499, booking enabled ✓
- "Plan Review" — 45 min, ₹699, booking enabled ✓
Set your schedule
Toggle on Mon-Fri. Set times:
- Mon-Thu: 10:00-13:00, 14:00-17:00
- Fri: 10:00-13:00
Enable portal feature
Settings → Client Portal → Default Features → Appointments: On
Share with clients
Clients with portal access will see the "Book Appointment" button automatically. For new clients, share the portal link via WhatsApp.