BookOne.Party
Engineering journal — a continuation of CallOne.pro/learningsv.2026.06
Engineering journal · 12 eras · ~30 min read

From snowplows
to soirées

How a contractor dispatch platform birthed a private venue marketplace — same builder, same playbook, new vertical. A continuation of CallOne.pro/learnings, picked up where it left off.

0
Days
0
Commits
0
Cities
0
Products
Scroll — the journal begins below ↓
Jan 2026 · The Snowstorm

A snowstorm, a phone number, and a bet

Toronto gets buried in snow. The idea was simple: what if a homeowner could call one phone number and get their driveway plowed? No app, no browsing, no forms. Just talk to an AI, and a driver shows up.

Jan 12–28 · EcoPlow

Learning in production

Every improvement came from a real customer, a real driver, or a real bug. Not from planning — from doing. The 17 days that taught the team what the platform actually had to be.

Late Jan · The Pivot

From vertical MVP to platform

EcoPlow proved the model: AI voice agent → job creation → contractor dispatch → payment. But it was built for one service in one city. The bigger opportunity was any home service — across any geography. CallOne needed to be a platform.

Jan 31 – Feb 24 · CallOne hardening

Hardening with real callers

The platform was built. Now it had to survive real phone calls, real SMS conversations, and real voice transcripts with accents, background noise, and ambiguous addresses. Every staging test call found 2–3 new bugs.

Feb 25–26 · BookOne genesis

The pivot to private events

Same builder. Same Clean Architecture playbook. Same voice-first AI wedge. New vertical: private venue bookings. Two days. 37 commits. The platform was production-capable before it had a customer.

Feb 27 – Mar 17 · Marketplace

Production-ready marketplace

The MVP became a marketplace. Production-readiness audit. Security hardening. Multi-city regional routing. First venue live (VIG Chicago). The voice branch ID incident. Direct booking. Multi-option proposals. The promotion pipeline.

Mar 18–31 · Voice maturity

Voice maturity, multi-tenant

Two-node voice workflow. Per-venue agent personalities (Akiro Japanese, St. John's Irish, ZezaFound Syrian). Dedicated SMS lines for multi-location chains. Cross-location proposals. 10+ venues in production.

Apr 8–17 · Multi-category

Beyond events — multi-category marketplace

Catering category. Score Pizza in-browser voice widget. Tripleseat CRM forwarding for Lyla Toronto. A2P 10DLC compliance. Admin v3.8–v3.13: notes, retention, analytics drill-down. The platform stops being just "private events" and becomes a multi-service marketplace.

Apr 23 – May 17 · Voice maturity

Make the caller give better answers

The platform leaves Toronto: Ottavio goes live in Montreal in French and English. Live transfer hands a real caller to a human. A gold-standard agent baseline stops config drift. And /go-live becomes deterministic — gates, snapshots, auto-rollback. The through-line: a small, fast model captures high-quality structured data when the instructions do the thinking, not the model.

May 15 – Jun 9 · Multi-venue

One platform, many shapes

A single venue becomes a taxonomy: standalone, hospitality group, franchise. Five roles, RLS at the database layer, and a factory that turns a URL into a venue + agent. New York opens via Members Only; Chicago via the Exodo group; Milos fans out to twelve cities. Same-brand multi-city is a group of per-city widgets, not a franchise.

May 18 – Jun 16 · Hardening

A live platform earns trust

Thirteen-plus locations are live across four cities, so the work turns inward: Sentry in both environments, an RLS security audit, and the domain moved to bookoneparty.com. When a refactor quietly broke inbound voice, it gets diagnosed, fixed, and turned into a post-deploy smoke test so it can never recur silently.

May 19 – Jun 16 · Consumer marketplace

A second product — plan your party

The same stack grows a consumer side: someone planning a party browses real venues, builds a shortlist, sends one brief, and the platform does the outreach for them. A network ingested from public directories spans New York, Chicago, Miami, Toronto, and Montreal. It is live behind flags on staging — and it runs beside the solo founder’s own outreach engine.

Jun 17 – Jul 7 · Reliability & the consumer loop

The loop, closed — works for a real person

There is a difference between "works when you click the right button" and "works for a real person." This era is the distance between the two: a broken conversational front door diagnosed from ElevenLabs’ own error logs and repaired in two attended stages; then a single-day audit-and-fix sprint where the founder ran his own product like a customer, watched a fully-captured brief vanish, and shipped nine commits that made losing one structurally impossible.

Built with

The stack as it actually shipped.

NestJS
11.0
Next.js
15.1
React
19.0
TypeScript
5.7
Bun
1.3.8
Turborepo
2.8
Tailwind
4.0
DaisyUI
5.0
Supabase
PostgreSQL
Twilio
SMS + Voice + Streams
ElevenLabs
Conv. AI
Gemini
2.5 Flash
Stripe
20.x
SendGrid
Transactional
Google Maps
Geocoding
GCP Cloud Run
us-east1
Vercel
Edge
Vitest
2.1
UUID
v7
Sentry
Error tracking
Claude Code
Opus 4.8
Codex
OpenAI
Takeaways

What we learned along the way.

  1. Ship early, learn from real calls.

    Every voice AI improvement came from a real conversation. You cannot design for accents, background noise, or salespeople from an armchair. The platform matures by surviving real calls.

  2. The mock pattern is essential.

    From day one, every external service had a mock adapter. CallOne ran 713 tests in 12 seconds with zero API keys. BookOne inherits the same discipline: tests deterministic, fast, and free.

  3. Staging isolation is non-negotiable.

    Learned the hard way at CallOne (staging wrote to prod). Codified at BookOne: staging-first workflow, separate Supabase branch, separate Cloud Run project, separate Twilio numbers, separate ElevenLabs branches. Never again.

  4. AI coding tools are multipliers, not replacements.

    Claude Code shipped 42,000 lines in six days at CallOne and another 50,000+ at BookOne. But architecture decisions, market validation, and voice agent tuning still required human judgment.

  5. Every phase builds on the last.

    Clean architecture and comprehensive tests are not overhead. They are what made it possible to ship 9 phases in 6 days at CallOne and another nine eras in nineteen weeks at BookOne without regressions.

  6. Document as you go.

    CLAUDE.md, agent CHANGELOG, promotion logs, MEMORY.md — these are not afterthoughts. They are the institutional memory that makes each new session productive instead of starting from scratch.

  7. EcoPlow taught CallOne. CallOne taught BookOne.

    The rewrites were not waste — they were applied learning. Each platform inherited the previous one’s shape on day one. The compound interest of architectural discipline.

  8. Voice quality is venue-specific.

    Posticino’s Calabrese voice is not Akiro’s Japanese is not St. John’s Irish. Standard voices do not work for luxury venues. Tune the voice, the prompt, the farewell — per venue.

  9. Snapshots beat rollbacks.

    Every /go-live saves a reference/promotions/<ts>.snapshot.json before promoting. If something breaks, restore from the snapshot, not from a half-remembered last-known-good commit.

  10. Never overwrite production contact fields.

    Formalized after the Apr 13 hotfix. Production contact_phone, contact_email, contact_name belong to the venue. The promotion script preserves them by default and refuses to clobber.

  11. Make the caller give better answers — don’t make the model think harder.

    A low-latency product needs a small, fast model. The way to make it feel as capable as a large one is to push the intelligence into the instructions: ask the right question at the right moment so the caller hands over clean, structured data. Quality comes from the prompt design, not from the model carrying a heavier decision.

  12. Silent failures are the only kind that hurt.

    A captured contact that never became a booking threw no error and paged no one. Structured logging plus an out-of-band monitor that polls the source of truth turns the invisible loss into an SMS alert with a one-tap recovery. If a path can drop data without crashing, watch it from the outside.

  13. Same-brand multi-city is a group, not a franchise.

    Milos has twelve cities; each posts to its own form and notifies its own owner, so each is its own venue row sharing one brand block. The deciding question is always “does this location have its own inbox?” The widget factory makes the distinction a spec field, not a debate.

  14. Outbound success is not inbound success.

    Twilio signs inbound webhooks with the primary auth token only. A rotation that left the new token as secondary 403’d every inbound call for seven days while outbound tests stayed green. Verify a rotation with a real inbound call, never just a synthetic outbound one.

  15. A second product fits inside the first stack.

    The consumer marketplace was built beside the venue platform: one partition, fail-closed flags, and an adversarial guard proving “flags off ≡ byte-identical.” The running business never felt the new one being built — and the tools built for venues (live transfer, the agent) became the engine that grows it.

Where we are today

The platform is live in four cities. A second product is taking shape.

0
Live venues
0
Commits
0
Weeks live
0
Modules in this journal
Engineering Journal — BookOne.Party