Skip to content
Full-StackShippedMar 2026

Hearth & Hair Booking Platform

End-to-end service business web platform with automated booking, real-time calendar integration, and transactional email workflows. Shipped with real users.

Role
Full-Stack Developer (Independent)
Timeline
Jan 2026 – Mar 2026
Team
2 people
Client
Hearth & Hair

The problem

A growing service business was losing bookings to phone tag and double-bookings. It needed a self-serve platform where clients book online against live availability and get confirmed automatically.

Constraints

  • Concurrent bookings must never produce a double-booking
  • Confirmations and reminders must never go out twice, even when a job retries
  • Real customers from launch — built by a two-person team in about three months

Architecture

  1. Step 1, Interface

    Booking app

    Next.js self-serve booking

  2. Step 2, Compute

    Availability service

    Server-side, single source of truth

  3. Step 3, Data

    PostgreSQL

    Bookings and schedules

  4. Step 4, External

    Calendar sync

    Real-time, prevents double-booking

  5. Step 5, Ingest

    Email queue

    Idempotent confirmations and reminders

A Next.js application on Vercel computes availability server-side from a single PostgreSQL source of truth, stays in sync with the business calendar, and hands confirmations and reminders to a queued, idempotent email workflow.

Engineering decisions

  1. Availability from a single source of truth

    Context
    Two clients booking the same slot at the same moment is exactly when double-bookings happen.
    Decision
    Computed availability on the server from one source of truth rather than trusting what each browser last saw.
    Trade-off
    Every availability check goes through the server — the price of removing the race condition.
  2. Queued, idempotent email workflows

    Context
    Transactional email jobs can retry after a timeout, and a duplicate confirmation erodes trust.
    Decision
    Queued confirmation and reminder emails and made every send idempotent.
    Trade-off
    More plumbing than sending mail inline, in exchange for exactly-once behaviour from the customer's point of view.
  3. An AI-assisted development workflow

    Context
    A two-person team needed to move quickly without sacrificing quality.
    Decision
    Built the platform with an AI-assisted development workflow.

Outcomes

Yes — Live

Real Users

Monitored

Uptime

AI-Assisted Dev

Build Approach

  • Live on Vercel and serving real customers
  • Measurably reduced the manual scheduling overhead the business used to carry
  • Uptime monitored in production

Reflections

Lessons learned

Putting it in front of real users surfaced edge cases no spec ever would have — timezone handling, cancellation flows, and reminder timing all needed real iteration once actual bookings started flowing. That feedback loop, more than any upfront design, is what turned a working build into a dependable product.

Tech stack

  • Next.js
  • React
  • TypeScript
  • Node.js
  • PostgreSQL
  • Vercel

Related writing

  • Best Practice

    Exactly once, from the customer's point of view

    Double bookings and duplicate confirmation emails are the same bug in two costumes. Patterns from building a booking platform for a real service business.

    3 min read

    • #reliability
    • #postgresql
    • #nextjs
    • #idempotency

Work with me

Facing a similar challenge?

I build systems like this end to end — from the first architecture sketch to production. Tell me about yours.