Adrian R.L.M
All projects

For businesses that live on bookings and appointments.

SaaS Booking Platform

Online booking system with integrated payments for professionals and small service businesses.

Timeline3 Weeks
RoleFull Stack Developer
Tech StackNext.js · Stripe · PostgreSQL
reservation-system-delta.vercel.app/es
01 of 19

The Problem

Many service professionals (classes, consultations, creative sessions) manage their bookings manually via WhatsApp, email, or unsynchronized calendars, creating errors, wasted time, and missed appointments.

  • Disorganized bookings across multiple channels.
  • Uncontrolled cancellations and no-shows.
  • Lack of upfront payments or deposits.
  • Generic tools poorly adapted to their real workflow.

The Solution

I designed and developed a SaaS platform that centralizes the management of bookings, clients, and payments in a single system, allowing professionals to automate their schedule and reduce operational friction.

  1. 01

    Authentication and Access Control

    Flexible and secure authentication system supporting multiple access methods and clearly separating Admin, Provider, and Client roles.

    • Login with Google OAuth, Email/Password, and Magic Links.
    • OTP verification for email registrations.
    • RBAC with differentiated portals.
    • Active abuse protections: rate limiting, CAPTCHA, and honeypots.
  2. 02

    Advanced Booking Engine

    Configurable booking engine allowing professionals to define services, availability, and complex rules without friction for the end client.

    • Flexible services: duration, price, capacity (1-on-1 or groups).
    • Hybrid availability with weekly rules and date exceptions.
    • Automatic buffers between appointments to avoid overlaps.
    • Concurrency management per service and global limits.
  3. 03

    Google Calendar Sync

    Two-way synchronization with Google Calendar to avoid double bookings and keep the schedule always updated.

    • Automatic import of external events.
    • Real-time blocking of busy times.
    • Automatic update upon cancellations or rescheduling.
  4. 04

    Integrated Payments and Monetization

    Complete payment system with Stripe allowing upfront charges, automatic payouts, and a scalable SaaS model.

    • Upfront payments to confirm bookings.
    • Stripe Connect Express for direct provider payouts.
    • Support for platform fees per transaction.
    • Monthly or annual subscription plans for providers.
  5. 05

    Recurring Bookings Management

    Native support for periodic bookings, ideal for classes, therapies, and continuous services.

    • Weekly or monthly configuration.
    • Automatic generation of future sessions.
    • Centralized management of cancellations and changes.
  6. 06

    Internationalization (i18n)

    Platform ready for international audiences with full multi-language support.

    • Interface fully translated to English and Spanish.
    • Automatic language detection via middleware.
    • Localized emails and error messages.
  7. 07

    Automation and Notifications

    Automation system reducing manual tasks and keeping clients and providers informed.

    • Automatic reminders 24h and 1h before the appointment.
    • Transactional emails for confirmations and cancellations.
    • Serverless cron jobs.
  8. 08

    Analytics and Dashboard

    Interactive dashboard for providers to understand their business performance.

    • Revenue and booking volume metrics.
    • Most popular services.
    • Clear visualizations using interactive charts.

Tech Stack

Built with 12 modern technologies, chosen to be fast, secure and easy to maintain.

Next.jsStripePostgreSQLPrismaTailwindshadcn/ui
See the full technical breakdown

Framework

Next.js 14

Language

TypeScript

Database

PostgreSQL

ORM

Prisma

Auth

Auth.js

Payments

Stripe Connect

Email

Resend

Styling

TailwindCSS

UI

Shadcn/UI

Validation

Zod

Forms

React Hook Form

i18n

next-intl

Technical Challenges

Handling Webhook Idempotency

Ensuring Stripe webhooks are processed exactly once. Network retries could cause duplicate records if not handled correctly.

webhook-handler.tsjavascript
const handleWebhook = async (req, res) => {
  const event = req.body;
  
  // 1. Check Redis for Idempotency Key
  const isProcessed = await redis.get(event.id);
  if (isProcessed) {
    return res.status(200).send("Already processed");
  }

  // 2. Process Business Logic
  try {
    if (event.type === 'invoice.paid') {
      await updateInvoiceStatus(event.data.object);
    }
    
    // 3. Mark as processed for 24h
    await redis.set(event.id, 'processed', 'EX', 86400);
    res.json({ received: true });
  } catch (err) {
    console.error(err);
    res.status(500).send();
  }
};

Have a similar problem?

Tell me how you handle it today and I will tell you what can be automated or improved.

Tell me what's holding you back