Write us on Telegram@Odilient

MARKETPLACE

Bronjoy

Online appointment booking marketplace for Uzbekistan. Customers find barbers, salons, clinics and gyms on a map and book online; businesses run bookings from one dashboard.

In-house product
Client
Local Services
Industry
Ongoing since 2025
Duration
2026
Year
Where it started

The Challenge

Most small service businesses in Uzbekistan take bookings by phone, and few have a website of their own. A booking marketplace there has to be useful before any venue signs up, work in Russian, Uzbek and English, and meet people where they already are, which in this market means Telegram. Businesses also need tools simple enough to use between clients.

What we did

The Solution

We built a multi-tenant booking platform on a Laravel 12 API with two Nuxt 4 apps: a server-rendered marketplace for customers and a dashboard for businesses. A data pipeline seeded the catalog with real venues their owners can claim. Customers book with a one-time code, businesses manage everything from the dashboard or Telegram, and AI assistants can search and book through MCP.

Built with
Laravel 12Nuxt 4PostgreSQLRedisMeilisearchLaravel OctaneFilamentTailwind CSSTelegram Bot APIDocker
Inside the build

How It Came Together

An appointment booking marketplace for Uzbekistan

Bronjoy is an online appointment booking marketplace for service businesses in Uzbekistan: barbershops, hair and nail salons, cosmetology and dental clinics, massage studios, gyms and car services. Customers find a venue on a map, compare services and prices in so'm, and book a time without a phone call. Businesses get a calendar, client list, staff schedules and reviews in one dashboard.

It is our own product, designed, built and operated by our team, from the pipeline that seeded the catalog to the Telegram bots owners use to confirm bookings. bronjoy.com went live on August 27, 2026, and in September 2026 the site listed 23,727 venues across Tashkent, Samarkand, Bukhara and other cities.

Key features

  • Map-first search — venues cluster on a map of Uzbekistan, with list and photo-grid views and filters for category, price and rating.
  • Venue pages built for search — every venue has its own page under a city and category URL, with services, opening hours, directions and staff profiles.
  • Verified online booking — a guest enters a one-time code sent to their phone or email before the appointment exists, so businesses do not get bookings from numbers nobody answers.
  • Business dashboard — appointments, calendar, staff schedules, services, clients, waitlist, reviews, referrals and multiple branches, with two-way Google Calendar sync.
  • Claim your listing — owners of pre-listed businesses claim their profile with a registration or tax certificate, and an AI check reads each document before a person reviews it.
  • Telegram throughout — a customer bot and Mini App for booking, a staff bot for running the business from chat, and a support bot with human escalation.
  • An AI assistant for owners — in the dashboard and in Telegram, it books and moves appointments, manages clients, services and schedules, and answers questions about revenue.
  • MCP servers — AI assistants such as Claude can search the public catalog and book, and a business can connect its own assistant to its calendar.
  • Three languages — Russian, Uzbek and English across both apps and every bot.

Architecture and tech stack

Backend

The backend is an API-only Laravel 12 application on PHP 8.4, served by Laravel Octane on Swoole, with PostgreSQL and PostGIS, Redis, Horizon queues and Meilisearch through Laravel Scout. Routes fall into public, customer and organization groups with separate guards, and organization endpoints run inside a tenant context enforced by a BelongsToTenant trait on every tenant model. Controllers stay thin and business logic lives in services. Payments sit behind a driver interface with Stripe Checkout, Click and Payme implementations. The only server-rendered UI is the Filament admin panel, where our team reviews claims, support threads and AI agent activity.

Frontend

A pnpm monorepo holds two Nuxt 4 apps: the server-rendered customer marketplace and a single-page provider dashboard. Both use a TypeScript API client generated from the backend's OpenAPI spec, which Scramble produces. The spec is committed, so the frontend type-checks and builds in CI without a running backend. The UI uses Tailwind CSS v4, shadcn-vue on reka-ui, Pinia, VeeValidate with Zod, and Leaflet with supercluster for the map.

Infrastructure

Production runs in Docker Compose on a self-managed server behind Cloudflare, with Full (Strict) TLS and Authenticated Origin Pulls. The Octane container is never published to the host; nginx reaches it over an internal Docker network. A deploy fails before migrating if a production secret is missing, and the database is backed up nightly. A trilingual Docus site at docs.bronjoy.com covers the API, integrations and guides for owners.

SEO and localization

The customer app is built as a search surface. City, category and venue pages are server-rendered in Russian, Uzbek and English. A shared SEO composable adds WebSite with SearchAction, breadcrumb and FAQ markup; city and category listings carry ItemList entries of LocalBusiness with addresses, coordinates and ratings; venue pages add review markup. Sitemaps and robots rules come from the Nuxt SEO modules, and venues keep a slug history, so an old URL still resolves to the current page after a rename.

Localization is a product rule: every interface string exists in all three locales, and English leaking onto a Russian or Uzbek page is treated as a bug. Directory vocabulary such as services, amenities, payment methods and landmarks is translated once into a shared dictionary and resolved per request, rather than stored per venue.

Operations

Scheduled jobs send appointment reminders, cancel expired unpaid bookings, expire waitlist offers, sync calendars, deliver Telegram digests and check search health, and heartbeats feed a health endpoint. One production incident is recorded in the scheduler itself: per-minute commands, each forking a PHP process of about 200 MB, overlapped in a 512 MB container and were OOM-killed, and every killed run left a 24-hour overlap lock behind. We moved those commands to five-minute background runs with short lock expiries, so a killed run now costs one missed heartbeat rather than a day of red health checks.

Our role

We own Bronjoy end to end: product design, the Laravel API, both Nuxt apps, the Python data pipeline, the Telegram bots, AI features, documentation, deployment and operations. Backend development started in October 2025, and the frontend monorepo followed in November.

Several parts have their own case studies: the business directory pipeline, the Telegram booking bot and Mini App, the staff bot for business owners, the multilingual help bot, the MCP servers and the AI voice receptionist, which works as a demo but is not yet switched on in production.

Bronjoy draws on our web app development, Telegram bot development and AI integration and automation services. For another product we build and run ourselves, see BiliMind.

Video Demo

Product Walkthrough

Let's Build

Want something like Bronjoy?

Tell us what your product needs to do. We'll shape the scope, map a timeline and send a fixed price — free, and with no obligation to proceed.

Free consultation No commitment Fast reply