Ostap Kovalisko

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

From this work