Projects / Own product · independently built
Automated Booking Marketplace
TypeScript · Next.js · PostgreSQL · Claude / GPT / Gemini · Railway
A booking marketplace with 87,000+ vendor listings that I built independently -- and built to run itself. The interesting problem was never the booking flow; it was keeping a catalog of that size alive without a content team.
Around 40 scheduled jobs across two runtimes do the routine work: listing enrichment, translation into 17 languages, content generation, and email triage. Enrichment runs a Claude to GPT to Gemini fallback chain that extracts descriptions, priced services, and contacts from vendor websites and menu photos, with checks against prices no source supports. Vendors without a website get search-grounded enrichment instead.
Autopilot is deliberately narrow. A removal request is handled automatically only after a single confident vendor match and a live check for zero bookings; everything ambiguous goes to a person with an AI-drafted reply waiting. That one rule -- automate the case you can verify, route the rest -- is most of the system's safety.
The rest is operational guardrails: idempotency flags, per-item failure isolation, batch caps, provider fallback, and a global cost-pause switch for the day something goes sideways. Two articles on this site -- on the marketplace that keeps working and on cost guards -- come directly from this system.
AI in production
- Multimodal listing enrichment: a Claude → GPT → Gemini fallback chain extracts descriptions, priced services, and contacts from vendor websites and menu photos, with checks against unsupported prices
- Search-grounded enrichment for vendors with no website (Gemini with Google Search grounding)
- Scheduled content generation: a pipeline for drafting directory articles from marketplace data, with batch limits and cost controls
- LLM email triage with a narrow autopilot: removal requests qualify for automatic handling only after a single confident vendor match and a live check for zero bookings — other requests go to human review with an AI-drafted reply
- Vendor translation pipeline into 17 languages
- Ops guards throughout: idempotency flags, per-item failure isolation, batch caps, provider fallback, and a global cost-pause switch