CodingIdeas.ai
← Browse All Ideas

Build Guide

How to Build a Booking App

There are 47 million solo service providers globally still taking bookings over WhatsApp — every one of them is a potential customer for your scheduling app.

Intermediate1–2 weeks

Booking apps are one of the most monetisable categories for solo founders: service providers will pay $20–50/month to stop managing appointments manually.

Data model

The core tables you'll need before writing any UI.

Providerid, user_id, name, slug, timezone, booking_url_enabled
Serviceid, provider_id, name, duration_minutes, price, buffer_minutes
Availabilityid, provider_id, day_of_week (0–6), start_time, end_time
Bookingid, provider_id, service_id, customer_name, customer_email, start_at (UTC), end_at (UTC), status (pending/confirmed/cancelled), stripe_payment_intent

Build order

The sequence that minimises rewrites — build in this order.

1

Provider profile and services

Create a provider profile with name and timezone. Add a services list — each service has a name, duration (e.g. 60 min), price, and buffer time between appointments.

2

Availability configuration

Add a weekly availability grid — the provider sets which hours they work each day. Store as day_of_week + start_time + end_time rows. Show a preview of open slots.

3

Public booking page

Create /book/[slug] — a public page for customers. Show a date picker. For the selected date, calculate open slots by subtracting existing bookings from availability windows.

4

Slot calculation logic

Write a function: given a date, the provider's availability, existing bookings, service duration, and buffer time — return an array of available start times as UTC ISO strings. This is the core algorithm.

5

Stripe payment at booking time

When a customer selects a slot and fills in their details, create a Stripe Payment Intent. Only confirm the booking after payment succeeds via the webhook. Never book without confirmed payment.

6

Email confirmations and reminders

On booking confirmed, send email to both provider and customer via Resend. Schedule a reminder 24h before via a Vercel cron job that queries bookings starting in the next 24–25h window.

7

Google Calendar sync

Use the Google Calendar API with OAuth. On each new booking, create a calendar event on the provider's Google Calendar. On cancellation, delete it. Store the Google event ID on the booking row.

Build it with AI — Architect Prompt

Paste this into Claude, Cursor, Windsurf, or any AI coding tool. It includes the full context of this guide — data model, build order, and pitfalls — so the AI starts with everything it needs.

ClaudeCursorWindsurfCopilotGemini
architect-prompt.txt
<context>
App: Booking App
Difficulty: Intermediate
Estimated build time: 1–2 weeks

Data model:
  Provider: id, user_id, name, slug, timezone, booking_url_enabled
  Service: id, provider_id, name, duration_minutes, price, buffer_minutes
  Availability: id, provider_id, day_of_week (0–6), start_time, end_time
  Booking: id, provider_id, service_id, customer_name, customer_email, start_at (UTC), end_at (UTC), status (pending/confirmed/cancelled), stripe_payment_intent

Recommended build order:
  1. Provider profile and services — Create a provider profile with name and timezone. Add a services list — each service has a name, duration (e.g. 60 min), price, and buffer time between appointments.
  2. Availability configuration — Add a weekly availability grid — the provider sets which hours they work each day. Store as day_of_week + start_time + end_time rows. Show a preview of open slots.
  3. Public booking page — Create /book/[slug] — a public page for customers. Show a date picker. For the selected date, calculate open slots by subtracting existing bookings from availability windows.
  4. Slot calculation logic — Write a function: given a date, the provider's availability, existing bookings, service duration, and buffer time — return an array of available start times as UTC ISO strings. This is the core algorithm.
  5. Stripe payment at booking time — When a customer selects a slot and fills in their details, create a Stripe Payment Intent. Only confirm the booking after payment succeeds via the webhook. Never book without confirmed payment.
  6. Email confirmations and reminders — On booking confirmed, send email to both provider and customer via Resend. Schedule a reminder 24h before via a Vercel cron job that queries bookings starting in the next 24–25h window.
  7. Google Calendar sync — Use the Google Calendar API with OAuth. On each new booking, create a calendar event on the provider's Google Calendar. On cancellation, delete it. Store the Google event ID on the booking row.

Known pitfalls to avoid:
  - Not locking slots during checkout — two customers can select the same slot simultaneously. Use a database lock (SELECT FOR UPDATE) or a short-lived reservation row to hold the slot while payment processes.
  - Storing times in local timezone — always store start_at and end_at in UTC. Convert to the provider's timezone only for display. A provider in Tokyo and a customer in London will both see the correct local time.
  - Forgetting buffer time in slot calculation — if a service is 60 min with 15 min buffer and a booking starts at 9am, the next available slot is 10:15am, not 10:00am.

Tech stack (intermediate): Next.js + Supabase + Stripe + Resend + Google Calendar API
</context>

<role>
You are a Senior Full-Stack Engineer and product architect who has shipped production Booking Apps before. You know exactly where developers get stuck and how to structure the project to avoid rewrites.
</role>

<task id="step-1-clarify">
Before writing any code or spec, ask me 3–5 clarifying questions that will meaningfully change the architecture. Focus on: scale expectations, auth requirements, platform (web / mobile / both), must-have vs nice-to-have features for the MVP, and any hard constraints (budget, deadline, existing infrastructure).

<example>
BAD: "What tech stack do you want to use?" — too broad, doesn't change architecture decisions.
GOOD: "Do you need real-time sync across devices, or is single-device with periodic refresh acceptable? This decides whether we use WebSockets or simple REST polling and significantly affects infrastructure complexity."
</example>
</task>

<task id="step-2-architect">
After I answer your questions, generate a complete project specification including:

1. Final tech stack with version numbers
2. Full file and folder structure
3. Complete database schema — every table, column, type, index, and foreign key
4. All API routes with request/response shapes and auth requirements
5. Component tree with TypeScript props interfaces
6. Auth and authorisation flow (who can do what)
7. Step-by-step implementation plan in the exact build order from <context> above
8. All environment variables with descriptions

<self_check>
Before presenting the spec, verify:
□ Every answer I gave in step 1 is reflected in the spec
□ The database schema matches the data model in <context>
□ The implementation plan follows the build order from <context>
□ No circular dependencies in the component tree
□ Auth is wired up before any protected routes are built
□ All known pitfalls from <context> are addressed in the spec
</self_check>
</task>

<task id="step-2.5-agents-md">
Generate an AGENTS.md file at the project root. This file is read automatically by Claude Code, Cursor, Windsurf, Sourcegraph Cody, and all major AI coding tools at the start of every session.

Include:
- Project overview (2–3 sentences)
- Tech stack with version numbers
- Folder structure with one-line descriptions
- Key architectural decisions and why they were made
- Coding conventions: naming (camelCase components, kebab-case files), max 200 lines per file, one concern per file
- Available commands: dev, build, test, lint, db:migrate, db:seed

Note in the file: "Cursor users can symlink .cursorrules → AGENTS.md. Claude Code users can symlink CLAUDE.md → AGENTS.md."
</task>

<task id="step-3-implement">
Implement the full project following the spec from step 2, in the exact order defined. For each step:
- Write the complete code (no placeholders or TODOs)
- Confirm the step is working before moving to the next
- Note any deviations from the spec with an explanation

<constraints>
- Max 200 lines per file. WHY: every file must fit in one AI context window for easy review and editing.
- One concern per file. WHY: mixing auth logic into API routes makes it impossible to reuse — extract to lib/auth.ts.
- TypeScript strict mode, no `any` types. WHY: catches data shape mismatches at compile time, not in production at 2am.
- All database queries in server components or API routes only. WHY: keeps credentials server-side, prevents accidental client-side exposure.
- All environment variables documented in .env.example. WHY: the next developer (or your future self) should be able to set up the project in under 5 minutes.
- Comment every non-obvious decision. WHY: AI tools read your comments to understand intent — without them, the next edit will break the pattern you established.
</constraints>
</task>

How to use this prompt

  1. 1.Copy the prompt above
  2. 2.Open Claude, Cursor (Cmd+L), or Windsurf
  3. 3.Paste the prompt and send — the AI will ask 3–5 clarifying questions
  4. 4.Answer the questions, then it generates your full project spec
  5. 5.Continue in the same session to implement step by step

Common mistakes

What trips up most developers building this for the first time.

⚠️

Not locking slots during checkout — two customers can select the same slot simultaneously. Use a database lock (SELECT FOR UPDATE) or a short-lived reservation row to hold the slot while payment processes.

⚠️

Storing times in local timezone — always store start_at and end_at in UTC. Convert to the provider's timezone only for display. A provider in Tokyo and a customer in London will both see the correct local time.

⚠️

Forgetting buffer time in slot calculation — if a service is 60 min with 15 min buffer and a booking starts at 9am, the next available slot is 10:15am, not 10:00am.

Recommended tech stack

Pick the level that matches your experience.

No-code

Calendly clone on Bubble.io + Stripe — functional in 3 days

Intermediate

Next.js + Supabase + Stripe + Resend + Google Calendar API

Advanced

Next.js + Supabase + Stripe + Twilio (SMS) + Google/Outlook Calendar + multi-staff support

Take it further — related ideas

Each comes with revenue math, a full build guide, and a prompt to paste into Claude or Cursor.

9 ideas in the archive

Ship in:
beginnerBusiness Automation

ContractPulse - Vendor Renewal and Health Monitor for Bootstrapped SaaS Teams

Small SaaS teams routinely lose money on zombie vendor contracts because no one owns the renewal calendar. ContractPulse ingests your vendor invoices and emails, surfaces upcoming renewals, flags price drift, and sends Slack alerts 30 days out. It's the CFO dashboard you couldn't afford to hire.

Time to ship2 weeks
DemandHigh
Revenue7/10
AI quality score6/10
View Details →
intermediateGig Economy

PawRoute - White-Label Booking App for Independent Dog Walkers

Independent dog walkers are hemorrhaging clients to Rover's 30% commission cut while managing everything via PayPal.me links and texts. PawRoute gives every solo pet care pro their own branded booking page, live GPS walk tracking for anxious owners, and Stripe-powered invoicing.

Time to ship3 weeks
DemandHigh
Revenue8/10
AI quality score8/10
View Details →
beginnerGig Economy

CoachSlot - Mobile Booking and Payments for Solo Fitness Coaches

Solo yoga teachers and PTs are running $5k/month businesses on WhatsApp and bank transfers like it's 2009. CoachSlot gives every solo fitness coach a personal booking link, Stripe card payments, and automatic cancellation fee enforcement — no more ghost clients.

Time to ship2 weeks
DemandVery High
Revenue8/10
AI quality score7/10
View Details →
intermediateSaaS

ShiftFill - Self-Service Shift Swap Marketplace for Hourly Retail and Hospitality Teams

Shift managers at retail and restaurant chains spend 2 hours every Sunday texting staff to fill open shifts because their scheduling software has no self-service swap layer. ShiftFill is a mobile-first marketplace where employees post and claim open shifts in real time with manager approval in one tap.

Time to ship3 weeks
DemandVery High
Revenue8/10
AI quality score7/10
View Details →
beginnerSaaS

BookSlot - Freelancer-First Scheduling With Built-In Payments and Session Types

Calendly was built for sales teams, not solopreneurs charging $200/hour for consulting sessions. BookSlot is a scheduling tool where paid sessions, custom meeting types, and instant rescheduling are table stakes — not $20/month add-ons.

Time to ship2 weeks
DemandVery High
Revenue7/10
AI quality score6/10
View Details →
intermediateDeveloper Tools

ScopeCrawl - API Documentation Change Monitor That Pings You Before Your App Breaks

Third-party APIs change their docs silently and your integration breaks in production while you're asleep. ScopeCrawl crawls API documentation pages on a schedule, diffs them semantically against prior versions, and sends you a Slack or email alert the moment a breaking change appears. Your on-call rotation will thank you.

Time to ship1 week
DemandHigh
Revenue7/10
AI quality score7/10
View Details →
beginnerProductivity

ChronoStack - Async-First Meeting Scheduler That Eliminates the 6am Standup for Distributed Teams

Your Istanbul-to-Vancouver team has exactly one 30-minute window where everyone is vaguely conscious and it keeps getting booked for a standup that could have been a Loom. ChronoStack analyzes your team's timezone spread, calendar density, and meeting preferences, then recommends a weekly meeting architecture that minimizes synchronous time while keeping async handoffs visible and accountable. Distributed team leads will pay $29/month before the coffee brews.

Time to ship10 days
DemandHigh
Revenue6/10
AI quality score6/10
View Details →
intermediateBusiness Automation

TimeStitch - Auto-Capture Billable Work from Calendar and Email

Slack bot that passively watches your calendar, email, and message activity to build a daily billable hours log with one-click confirmation. No manual time entry reconstruction from memory at 5pm.

Time to ship5 weeks
DemandVery High
Revenue8/10
AI quality score8/10
View Details →
low-codeProductivity

MeetingCost - Real-Time Meeting Economics Dashboard

Connect your calendar and watch the real-time cost of active meetings tick up by employee salary. Brilliant for showing why 15-minute recurring syncs with 8 people are expensive.

Time to ship2.5 weeks
DemandHigh
Revenue8/10
View Details →