Remi

Hackathon: H0 Hackathon

Live Demo: remiai.vercel.app

SMS Number: +1 (365) 990-5609


Inspiration

Most local service businesses — barbers, salons, cleaners, trades — run on their phone. Every missed text is a missed booking. They can't hire a receptionist, and they can't be available 24/7. Remi is the AI that handles it for them.


What It Does

Sign up, enter your business info, and Remi is live on WhatsApp immediately. The AI handles everything customers text in:

  • Instant replies, 24/7 — questions about hours, pricing, and availability answered the moment they come in
  • Automatic bookings — customers describe what they need, Remi collects their name, confirms the time, and saves the appointment to Firestore
  • Appointment reminders — sent automatically 24 hours and 1 hour before every booking to reduce no-shows
  • Review requests — Remi follows up after every visit and asks for a review
  • Live dashboard — every conversation, booking, and interaction visible in one place

How I Built It

Architecture

WhatsApp (customer)
      │
      ▼
Twilio Webhook → /api/webhook/sms (Next.js on Vercel)
      │
      ▼
Gemini 2.5 Flash Agent
  └── parses booking intent from conversation
      │
      ▼
Firebase Firestore
  ├── businesses
  ├── conversations
  └── bookings
      │
      ▼
Twilio → WhatsApp reply to customer

Tech Stack

Layer Technology
AI Model Gemini 2.5 Flash (Google AI)
Messaging Twilio, WhatsApp Business API
Backend Next.js API Routes (App Router)
Database Firebase Firestore
Auth NextAuth + Google OAuth
Payments Stripe (subscriptions + webhooks)
Frontend Next.js 16, Tailwind CSS, shadcn/ui
Hosting Vercel

How the AI Booking Works

The Gemini agent runs on every inbound WhatsApp message. It has full conversation history and a system prompt that knows the business's services, hours, and FAQs. When a booking is confirmed with a specific name, service, and time, the model appends a structured BOOKING_JSON block to its reply. The webhook parses it and writes the booking to Firestore in the same request — no second API call, no polling.


Challenges

  • Booking intent extraction: Getting Gemini to reliably emit structured JSON only when a booking is actually confirmed — not on every mention of a time — required careful prompt engineering with explicit examples of what counts as confirmed vs tentative.
  • Twilio signature validation in production: The raw URL Twilio sends in x-twilio-signature must match exactly, including protocol and path. Subtle mismatches caused 403s until the validation was tightened.
  • Stripe webhook secret: The signing secret was accidentally stored as the environment variable name instead of its value in Vercel — caused silent failures on every subscription event until caught.

What's Next

  • Google Calendar sync so bookings appear in the owner's calendar automatically
  • Multi-staff scheduling with availability per team member
  • WhatsApp template messages for proactive outreach campaigns
  • Analytics dashboard with revenue forecasting from booking trends

Team

Built solo by @kyisaiah47.

Built With

  • firebase-firestore
  • google-gemini-2.5-flash
  • next.js
  • nextauth
  • stripe
  • tailwind-css
  • twilio
  • typescript
  • vercel
  • whatsapp-business-api
Share this project:

Updates