The post has been translated automatically. Original language: Russian
Problem
When a Kazakhstani needs a doctor, he opens clinic websites one at a time, searches for a phone number, wonders about the price and reads scattered reviews. There is a growing market in Kazakhstan, and there are few high-quality solutions for small towns and clinics.
We did Clinica.kz , directory of doctors and clinics in Kazakhstan. Now it is used by about 30 thousand people per month.
Product
- Catalog by city. Doctors, clinics, specialties, services, and diagnostics.
- Patient reviews and clinic charts.
- Pharmacy section. Comparison of drug prices by city, launched in September 2026 as a separate showcase.
- The clinic's office. The clinic confirms the rights to the profile, corrects the data, and responds to reviews.
Technical solutions
We deliberately chose a simple stack. For a product with our traffic, a complex infrastructure would only add costs and points of failure.
| Layer | What we use | Why |
| Backend | PHP 8.3, its own mini-MVC | We control the code, there is no dependence on the framework |
| DB | PostgreSQL 16 | Search via pg_trgm, there is no separate search engine |
| The frontend | Tailwind CSS and Alpine.js | Minimum of JS, fast pages |
| Cards | MapLibre and OpenFreeMap | No API keys and no download fees |
| Resend | Reviews, one-time codes, notifications | |
| Moderation | Telegram Bot API | Applications and edits are sent to the chat, a one-click solution |
| Deployment | GitHub Actions and Coolify | Push to main expands production along with migrations |
The main principle is not to build infrastructure in advance. We didn't install Redis and Meilisearch until the load or task required them. The PostgreSQL search is doing well. The cache is simple and file-based. Each such decision saves the team time and money.
Moderation and trust
The medical catalog is based on trust, so we don't have auto-publishing of everything.:
- The clinic submits an application for a profile with supporting documents.
- The request goes to the moderator.
- Every edit to the profile is also checked.
- Reviews are confirmed by email.
This slows down growth, but protects the product from fraud and errors in medical data.
What worked
- The mobile scenario is ahead of the desktop one. Most users come from their phones.
- SEO as the main channel. Pages by city, specialty, and service provide organic traffic
- The second product is based on the same core. The pharmacy section uses the same infrastructure and audience and is growing faster than a new service from scratch.
What have you learned
- A simple stack speeds up iterations. You can roll out changes several times a day.
- Data is more important than the interface. The main work is on the quality and relevance of information about doctors and prices.
- Moderation should be built into the product from day one, because it won't work later.
- Every external API costs money. We chose solutions without keys and limits wherever we could.
Проблема
Когда казахстанцу нужен врач, он открывает сайты клиник по одному, ищет телефон, гадает о цене и читает разрозненные отзывы. В Казахстане растущий рынок, и качественных решений для малых городов, и клиник мало.
Мы сделали Clinica.kz {это название проекта, ссылка убрана - пожалуйста пропустите}, каталог врачей и клиник Казахстана. Сейчас им пользуются около 30 тысяч человек в месяц.
Продукт
- Каталог по городам. Врачи, клиники, специальности, услуги и диагностика.
- Отзывы пациентов и карта клиник.
- Аптечный раздел. Сравнение цен на лекарства по городам, запущен в сентябре 2026 года как отдельная витрина.
- Кабинет клиники. Клиника подтверждает права на профиль, правит данные и отвечает на отзывы.
Технические решения
Мы сознательно выбрали простой стек. Для продукта с нашим трафиком сложная инфраструктура только добавила бы расходы и точки отказа.
| Слой | Что используем | Почему |
| Бэкенд | PHP 8.3, собственный мини-MVC | Контролируем код, нет зависимости от фреймворка |
| БД | PostgreSQL 16 | Поиск через pg_trgm, отдельного поискового движка нет |
| Фронтенд | Tailwind CSS и Alpine.js | Минимум JS, быстрые страницы |
| Карты | MapLibre и OpenFreeMap | Без API-ключей и без платы за загрузки |
| Почта | Resend | Отзывы, одноразовые коды, уведомления |
| Модерация | Telegram Bot API | Заявки и правки приходят в чат, решение одним нажатием |
| Деплой | GitHub Actions и Coolify | Push в main разворачивает продакшн вместе с миграциями |
Главный принцип: не строить инфраструктуру заранее. Мы не ставили Redis и Meilisearch, пока их не потребовали нагрузка или задача. Поиск на PostgreSQL справляется. Кэш простой и файловый. Каждое такое решение экономит время команды и деньги.
Модерация и доверие
Медицинский каталог держится на доверии, поэтому у нас нет автопубликации всего подряд:
- Клиника подаёт заявку на профиль с подтверждающими документами.
- Заявка уходит модератору.
- Каждая правка профиля тоже проходит проверку.
- Отзывы подтверждаются по email.
Это замедляет рост, но защищает продукт от накрутки и ошибок в медицинских данных.
Что сработало
- Мобильный сценарий прежде десктопного. Большинство пользователей приходит с телефона.
- SEO как основной канал. Страницы по городам, специальностям и услугам дают органический трафик
- Второй продукт на том же ядре. Аптечный раздел использует ту же инфраструктуру и аудиторию и растёт быстрее, чем новый сервис с нуля.
Чему научились
- Простой стек ускоряет итерации. Выкатывать изменения можно несколько раз в день.
- Данные важнее интерфейса. Основная работа идёт над качеством и актуальностью информации о врачах и ценах.
- Модерация должна быть встроена в продукт с первого дня, потому что позже её не наладить.
- Каждое внешнее API стоит денег. Мы выбирали решения без ключей и лимитов там, где могли.