Telegram bot · card payments · web admin panel

Salon booking, right inside the chat

A client picks a service, a specialist and an open time slot, pays a deposit by card and gets reminders. Staff run the schedule in a web panel — bookings made in the bot show up there immediately.

Demo login: demo / demo123 — every section is open, editing is disabled. The bot speaks Russian; the interface is fully translatable.

This is a running system, not a mockup. The bot takes real bookings and the panel shows a real database. Payments run in YooKassa test mode: an invoice is issued for real, but no money is charged — you can walk the whole flow at no risk.

What it looks like

Screens captured on demo data — the same ones you get when you open the live demo.

Salon schedule by specialist
Schedule: one day, every specialist, booked slots and open gaps in a single grid.
Admin dashboard
Dashboard: bookings and revenue for today and this week, new clients, cancellations, share of bookings made in the bot.
Payments screen
Payments: amounts, statuses, date filters and a refund queue carrying the YooKassa charge id.
The whole flow: booking, card payment, “my bookings”, cancelling with a refund, and the price list. Sped up 2.5×, client phone masked; the bot speaks Russian.

What each side gets

For the client — in the bot

  • Booking in under a minute: service, specialist, day, time — free slots are computed from the specialist's shifts and the service duration.
  • Card deposit inside Telegram, with no redirect to a third-party site.
  • Reminders: a day ahead with a cancel button, while the slot can still be freed; two hours ahead, short and without buttons.
  • "My bookings": see upcoming visits and cancel while cancellation is still allowed.
  • Phone number comes from Telegram's share-contact button — nothing to type.

For the salon — in the panel

  • Schedule across all specialists at once; a visit can be added by hand — for a client who called in.
  • Services: price, duration, who performs it, and a deposit percentage set per service.
  • Specialists: weekly shifts, days off, and deactivation that keeps their history intact.
  • Clients: visit history, lifetime spend, and whether they came from the bot or the front desk.
  • Salon settings: booking grid step, how far ahead the calendar opens, cancellation cut-off in hours.
  • Roles: admin sees everything, a specialist sees only their own schedule, demo access is read-only.

Why this is not a no-code bot

Appointment booking looks simple right up until you try to write it. These are the places where it turns out not to be, and how each is handled.

Concurrency

Two people cannot take one slot

A client hits "Confirm" at the exact moment the front desk enters a walk-in. Three layers guard it: a lock on the specialist-and-day pair, an overlap check under that lock, and a unique index in the database in case a write ever bypasses the service layer.

Money

The slot is held while payment runs

Minutes pass between "Confirm" and the money arriving, and the slot stays reserved that whole time. If payment never comes, the slot returns to sale on its own.

Reliability

A repeat delivery never double-charges

Telegram redelivers the payment update until it is acknowledged, so a repeat is routine rather than a failure. Amounts are verified against our own database, and reprocessing the same update changes nothing.

Tested

124 automated tests

Including cases you cannot reproduce by hand: a payment landing in the final second of the hold, two clients racing for one slot, two reminder cron runs firing in parallel.

How it is built

124
automated tests
7
admin panel sections
3
roles with distinct permissions
24/7
on a VPS with HTTPS and auto-renewed certificates
PHP 8.2 — no framework: own router, container, migrations MySQL 8 Redis — dialog state Telegram Bot API — webhook Telegram Payments + YooKassa Vue 3 · Vite · Pinia Docker Compose · nginx · Let's Encrypt PHPUnit

The same thing, built for your business

Your services and staff

Prices, durations, shifts, per-service deposit size, salon name and contacts — all of it is configured in the panel, with no code changes.

Live payments

Switching from test mode to live is a single setting. The payment provider here is YooKassa; another Telegram Payments provider can be wired in instead.

Deployment and handover

Set up on your server: domain, HTTPS with auto-renewal, database backups. Updates ship with one command.

Let's talk

Tell me about the business: how many specialists, whether you need deposits, and what you already run. I will tell you what the existing system covers and what needs writing.