Live in production · toolbelthandyman.info

Toolbelt Handyman Services

A multi-tenant SaaS platform for handyman businesses — a public marketing site, a full operations admin panel, and “Riley,” an AI receptionist that answers every inbound call 24/7 over voice and chat and books real jobs. Live at toolbelthandyman.info, with tenant subdomains served from *.toolbelthandyman.info.

Screenshots

Toolbelt Handyman marketing site — homepage hero and 'what we fix' service gridToolbelt Handyman services page — drywall, fixtures, and exterior work grouped by trade

Multi-Tenant Day One

Per-tenant branding by subdomain on wildcard TLS; onboard a new shop with one Organization row

24/7 AI Receptionist

Riley answers every call on voice and chat, books real jobs, and recovers from its own mistakes

Production-Grade

44 Prisma models, 1,301 tests, TypeScript strict, A2P 10DLC approved and routed

Tech Stack

Backend: Node 20, TypeScript 5 strict, NodeNext ESM, Express 4 + EJS
Database: PostgreSQL 15 + pgvector, Prisma 5 (per-org isolation)
Queues: Redis 7 + BullMQ workers (reminders, webhooks, cleanup)
AI: OpenAI Realtime API GA (gpt-realtime); Anthropic Claude Sonnet
Comms: Twilio Voice + Messaging, A2P 10DLC (CUSTOMER_CARE campaign)
Payments: Stripe Checkout + signed webhook verification
Email: IONOS Postfix SMTP in-house (no third-party email vendor)
Media: sharp (image resize / SVG→PNG); sanitize-html; multer
Infra: Docker Compose + nginx wildcard vhost; Let's Encrypt wildcard TLS
Observability: Sentry client + server, pino structured logs, GA4

Platform Features

Riley — AI Receptionist

One AI brain on the phone and the browser chat widget — answers every inbound call 24/7 and books real jobs into the operations system.

  • OpenAI Realtime API GA (gpt-realtime), G.711 μ-law end-to-end — no resampling
  • Twilio Voice + Media Streams; browser /chat bridged into the same CallSession
  • Tools: bookAppointment, takeMessage, transferToLivePerson, answerQuestion (RAG)
  • Spells back names, addresses, and emails before booking
  • Business-hours / after-hours / holiday / emergency mode resolution
  • Configurable persona, voice, and turn-detection per tenant

Operations Admin

A per-org operations console at admin.<tenant-domain> with SUPER_ADMIN cross-org switching for staff.

  • Live ops dashboard: jobs in-flight, tech locations, today's revenue
  • Customers (rolling lifetime value, SMS consent stamp) + Jobs with audit log
  • Calendar day/week/month with drag-to-reschedule
  • Google Calendar two-way sync per tech
  • Route optimization across an assigned day's jobs
  • Outbound reminder SMS scheduling (T-24h, T-1h, T+0 arrival)

Dispatch & Team

Tech roster, skills matrix, and a dispatcher engine that keeps the owner in the loop on every job.

  • Skills matrix, availability windows, exception dates, document-expiry tracking
  • Per-org rates: after-hours surcharge, holiday surcharge, emergency rate
  • Dispatcher engine: owner SMS A/B/C with candidate ranking + ETA
  • Tech PWA: phone + OTP login, 6 screens, GPS ping for live ETA
  • Rolling tech stats on every COMPLETED job (jobs done, on-time %, rating)
  • Every dispatch owner-confirmed via SMS

Marketing Site + Tenant CMS

A fast, mobile-first marketing site with a fully toggleable per-tenant CMS — owners author their own public site.

  • Per-tenant subdomain branding (logo, favicon, palette) injected as CSS vars
  • Announcement marquee, hero banner carousel, owner-authored sections (TinyMCE)
  • Featured Services, Service Areas grid, moderated Reviews wall
  • Footer navigation editor + full blog stack (index, detail, category, tag)
  • JSON-LD (HomeAndConstructionBusiness, Service), Open Graph + Twitter cards
  • A2P-compliant SMS consent checkbox on /book and /chat

Billing & Documents

Stripe Checkout wired straight into the job lifecycle, with a customer-facing tracking page.

  • Tech sets final price → owner approves → customer pays → webhook → rating SMS
  • Stripe webhook signature verification + customer dispute form
  • Public /track/:jobId tracking page (no login)
  • Document upload (multer + Docker volume), authenticated download
  • Auto-rating SMS fires after a job is COMPLETED
  • Pay success / cancel flows with consent-stamped intake

Compliance & Reliability

Production-grade plumbing so SMS actually delivers and no caller is ever stranded.

  • Twilio A2P 10DLC: Standard brand, CUSTOMER_CARE campaign, MessagingServiceSid
  • Verbal A2P consent stamp on the call + checkbox consent on web forms
  • Phantom-tool-call auto-recovery: parser creates the Job + owner SMS on a miss
  • CallSession with full transcript, tool-call log, auto-tags, outcome detection
  • BullMQ workers: reminders, document expiry, webhook DLQ, zombie-call cleanup
  • Sentry + pino structured logging; daily backup script

Use Cases

Independent Handyman & Small Shops

Never miss a call

Riley answers every call 24/7, books real appointments, and texts the owner — so a missed call never becomes a missed job.

After-Hours & Emergency

24/7 coverage

After-hours date/time booking with Riley, plus an emergency mode that confirms the emergency rate before booking.

Multi-Tenant / White-Label

White-label

Every surface is multi-tenant on day one. Onboard a new handyman business with a single Organization row + branding seed.

Owner-Confirmed Dispatch

Owner in the loop

The dispatcher engine ranks techs and SMSes the owner A/B/C; every dispatch is owner-confirmed before a tech is committed.

See Toolbelt in production

Toolbelt Handyman Services is live at toolbelthandyman.info and sold per-tenant, white-labeled to your brand. Visit the live site, or get in touch for a walkthrough of the marketing site, operations admin, and Riley — the AI receptionist.