Vertical GuideApril 2026 · 11 min read

Build a Booking / Appointment App in Under an Hour

Booking apps are a clean AI-buildable category: small feature set, clear revenue model (Stripe deposits or subscription), and repeat customers who install for reminder pushes alone. This guide walks through building one in under an hour, then shipping it to a solo service business that actually pays for it.

Quick path

Generate the calendar, time picker, and confirmation flow with ShipNative. Use Supabase for bookings + availability rules, Stripe for deposits, and expo-notifications for reminders. One hour to preview, one day to shippable.

What a booking app actually needs

  • Service list with duration + price
  • Calendar / time-slot picker respecting availability rules
  • Customer details capture + Stripe payment
  • Confirmation screen + email + calendar link
  • Upcoming bookings list with reschedule / cancel
  • Push reminders at -24h and -1h
  • Provider view: today’s schedule + incoming bookings

The AI prompt to start with

Booking app for [niche: personal trainers /
barbers / massage therapists / tutors].

Two roles: customer and provider.

CUSTOMER flow:
1. Home: provider card + list of services
   (name, duration, price).
2. Service detail: date picker (disable dates
   outside availability), time slot grid.
3. Checkout: name, phone, notes, Stripe
   deposit payment ($25 or full price).
4. Confirmation: date/time, "Add to Calendar"
   link, Reschedule / Cancel.
5. My bookings: list of upcoming + past.

PROVIDER flow:
1. Today: schedule with back-to-back appointments.
2. Week: 7-day calendar view, tap to see details.
3. Settings: services, availability rules,
   buffer times, deposit policy.

DATA (Supabase + RLS):
- services (id, provider_id, name, duration,
  price)
- availability_rules (id, provider_id, day_of_week,
  start_time, end_time)
- bookings (id, customer_id, service_id,
  start_time, status, stripe_payment_intent)

REMINDERS: expo-notifications scheduled for
-24h and -1h before start_time.

Dark theme, clean typography, tab navigation.

For prompt structure, see How to Write Prompts That Produce Better React Native Code.

Availability logic without pain

Availability is the part most booking apps over-engineer. Keep it simple:

  • Availability rules — one row per day-of-week with start/end times. Monday 9–5, Tuesday 9–5, Wednesday off, etc.
  • Buffer time — a setting per service (e.g., 15 min) to prevent back-to-back.
  • Blocked slots — a separate table for one-off holidays or vacations.
  • Compute slots on the fly from the rules + bookings + blocks rather than pre-generating. Simpler math, no stale data.

Payments: deposit or full

Physical-service bookings use Stripe (no Apple tax). Pick the right model:

  • Deposit at booking, balance at service. Best for high-ticket services where you want commitment without taking full payment upfront. Stripe PaymentIntent with manual capture.
  • Full payment upfront. Best for low-stakes services or when no-shows are costly.
  • Auth only, charge on completion. Use PaymentMethod with Stripe’s off-session charges. Card on file gets charged after the appointment.

Full Stripe setup walkthrough: Adding Stripe Payments to a React Native App.

Reminders that reduce no-shows

Reminder pushes reduce no-shows by 30–50%. Schedule two:

  • -24 hours: polite confirmation with reschedule link.
  • -1 hour: quick reminder with map link to the location.

Schedule both with expo-notifications when the booking is confirmed. Cancel the scheduled notifications when a booking is rescheduled or canceled.

Rescheduling and cancellations

  • Allow reschedule up to X hours before (provider setting).
  • Cancellation before the window: automatic full refund via Stripe.
  • Cancellation inside the window: partial refund or no refund per policy.
  • Clear, visible policy on the booking confirmation screen — prevents disputes.
  • Always send push + email on any change. Trust is the product.

Monetization: B2B SaaS vs per-booking

  • B2B SaaS (provider subscription): $19–49/month per provider. Straightforward, aligned with incumbents (Acuity, Setmore).
  • Per-booking fee: 1–5% of each transaction. Attractive for providers who don’t want monthly fees. Lower upfront but less predictable revenue.
  • Hybrid: free tier with 5% fee, paid tier with 0% fee. Drives adoption; upgrades become automatic at scale.

Launch: one profession, one city

Don’t build “booking for everyone.” Pick one profession and one city — barbers in Brooklyn, physical therapists in Austin, tutors in Chicago. Hand-onboard 10 providers, make the app exceptional for that niche, then expand. The generic Calendly killer has been tried 40 times; the vertical-specific booking app wins repeatedly. For launch tactics, see Pre-Launch Marketing for Mobile Apps.

Common mistakes to avoid

  • Building Google Calendar sync in v1. Ship with “Add to Calendar” link instead.
  • Skipping deposits in high-no-show categories. You fund no-shows with your stress.
  • One reminder instead of two. -1h is the one that converts.
  • Complex availability (custom per-day exceptions, per-service overrides). Keep it rule-based.
  • Targeting everyone. Pick one profession, win it, expand.

Frequently Asked Questions

Do I really need a native app for bookings, or is a web page fine?

Web is fine for one-off bookings. Native wins when you expect repeat visits — customers install your app, get reminder pushes, and re-book in two taps. For coaches, trainers, or small service businesses with returning clients, native drives meaningfully higher repeat rates.

How do I handle timezones for bookings?

Store all times in UTC in your database. Display in the user's local timezone using the device timezone. When the service provider is in a different zone than the customer, let both parties see their own local time — Google Calendar style. Use date-fns-tz or Luxon, not ad-hoc offsets.

Should I take a deposit or full payment at booking?

Depends on industry. High-no-show verticals (hair, restaurants, medical) should take a deposit. Lower-stakes bookings (free consultations, casual coaching intros) can skip upfront payment. If in doubt, charge a refundable deposit — it qualifies serious customers.

What about Google Calendar integration?

For v1, skip it. Let service providers add bookings to their calendar manually via a "Add to Calendar" link. For v2, integrate Google Calendar and Apple Calendar via OAuth. Full two-way sync is a v3 project that many booking apps never actually need.

How do I handle cancellations and refunds?

Set a cancellation window (e.g., 24 hours). Before the window: automatic full refund via Stripe. Within the window: fee or no refund depending on your policy. Communicate the policy clearly at booking time to avoid disputes.

Stripe Payments in React Native

The payment layer behind every booking flow.

See setup →

Push Notifications in Expo

Reminders are half the product — wire them right.

Read guide →

Ship a real React Native app today

Describe, preview, and export Expo code — free to start.

Build with ShipNative →