MAATRIX / Блог / Детский центр: сайт с расписанием и оплатой абонементов на своём сервере

Детский центр: сайт с расписанием и оплатой абонементов на своём сервере

MAATRIX

Сайт-визитка на бесплатном конструкторе решает ровно одну задачу — рассказать о центре и показать телефон. А дальше начинается ручная работа: администратор отвечает на одни и те же вопросы про расписание, записывает ребёнка в блокнот или таблицу, выставляет счёт за абонемент отдельным сообщением и ждёт перевода. Родителю неудобно, администратору тяжело, а центр теряет заявки в те часы, когда никто не берёт трубку. Разбираемся, что нужно, чтобы родитель сам записал ребёнка и оплатил абонемент онлайн — на сайте, который стоит на вашем сервере и работает так, как нужно именно вам.

Почему бесплатный конструктор упирается в потолок

Конструкторы сайтов хорошо справляются с витриной: фотографии зала, описание направлений, контакты. Но как только вы пытаетесь встроить туда живое расписание групп с ограниченным числом мест и приём оплаты абонементов — начинаются компромиссы.

Типичная схема на конструкторе выглядит так: на сайте — форма «Оставить заявку», дальше администратор перезванивает, уточняет, свободно ли место в группе, называет сумму абонемента и присылает реквизиты для перевода. Каждая запись — это минимум один звонок или переписка в мессенджере, причём в рабочее время администратора, а не тогда, когда у родителя есть пять свободных минут вечером.

Проблема не в том, что конструктор «плохой» — он честно делает то, для чего создан. Проблема в том, что расписание с местами в группах, абонементы с остатком занятий и заморозкой на время болезни, автоматическое обновление статуса оплаты — это уже не витрина, а маленькая учётная система. Встроить такую логику в шаблонный конструктор либо нельзя вовсе, либо можно только через сторонний сервис по подписке, который берёт процент с каждой оплаты или ограничивает число записей в месяц.

Родителям в итоге всё равно, на чём сделан сайт — им важно записать ребёнка за минуту и увидеть, что оплата прошла. Если для этого нужно звонить — часть просто не дозвонится или отложит запись, а отложенная запись в детский центр нередко означает, что родитель в итоге запишется туда, где это можно сделать сразу.

Что должен уметь сайт с расписанием и оплатой

Прежде чем говорить о технической стороне, стоит честно перечислить, что реально нужно от такого сайта — без этого списка легко утонуть в лишних функциях или, наоборот, упустить важное.

  • Публичное расписание групп по направлениям — с возрастом, днём недели, временем, залом и педагогом.
  • Отображение свободных мест в группе в реальном времени, чтобы не набирать больше, чем позволяет зал.
  • Запись на пробное занятие и запись в постоянную группу — это разные сценарии, их нельзя смешивать в одной форме.
  • Личный кабинет родителя: какие дети записаны, на какие занятия, сколько занятий осталось по абонементу.
  • Онлайн-оплата абонемента с автоматическим обновлением статуса — оплатил, значит абонемент активен, без ручного подтверждения администратором.
  • Заморозка и перенос занятий при болезни ребёнка — без этого родители будут звонить именно по этому поводу чаще всего.
  • Уведомления о ближайшем занятии и об окончании абонемента.

Из этого списка видно, что ядро системы — это не столько «сайт», сколько связка из трёх частей: публичная страница с расписанием, личный кабинет с историей посещений и абонементом, и модуль приёма оплаты, который умеет сообщать остальным двум частям, что деньги пришли.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Архитектура на своём сервере: сайт, расписание, платежи

Когда вы держите всё это на собственном сервере, а не собираете из трёх разных SaaS-сервисов, у вас появляется то, чего обычно не хватает в готовых конструкторах — контроль над тем, как части системы говорят друг с другом.

Практическая схема выглядит так:

  1. Веб-сайт — публичная часть с расписанием и формой записи. Может быть на готовой CMS (например, WordPress с плагином бронирования) или на отдельном самописном модуле, если готовые плагины не покрывают вашу логику групп и абонементов.
  2. База данных расписания и абонементов — таблицы с группами, занятиями, местами, записями детей, статусом абонемента и историей посещений. Это сердце системы: именно отсюда сайт узнаёт, свободно ли место, и именно сюда записывается результат оплаты.
  3. Обработчик платежей — серверная часть, которая принимает уведомление от платёжного шлюза о поступлении оплаты и обновляет статус абонемента в базе. Это ключевой узел: без него оплата и запись живут отдельно друг от друга, и администратору всё равно приходится сверять их вручную.
  4. Личный кабинет родителя — веб-интерфейс поверх той же базы, показывающий актуальное состояние: сколько занятий осталось, когда следующее, история оплат.

Такая схема требует немного больше настройки, чем «поставил конструктор и готово», но она разовая. Дальше сайт работает сам: родитель записывается, платит, видит остаток занятий — а администратор занимается детьми и педагогами, а не сверкой таблиц.

Если у центра уже есть сайт на стороннем хостинге и вы просто хотите добавить расписание и оплату, разумный путь — перенести сайт на свой VPS и уже там развернуть модуль бронирования: на общем хостинге вы обычно не можете поставить нужные расширения или настроить приём вебхуков от платёжной системы так, как нужно.

Расписание занятий: группы, залы, педагоги, места

Расписание детского центра сложнее, чем кажется на первый взгляд, потому что в нём одновременно живут несколько ограничений: возраст ребёнка, вместимость зала, занятость педагога и повторяемость занятий по неделям.

На практике удобно хранить расписание как набор регулярных «слотов» — направление, день недели, время, зал, педагог, максимум мест — и отдельно связывать с каждым слотом список конкретных занятий на календарные даты, потому что почти всегда бывают исключения: педагог в отпуске, праздничный день, перенос из-за ремонта зала. Если расписание жёстко зашито в шаблон сайта, каждое такое исключение превращается в правку кода. Если оно лежит в базе и редактируется администратором через простую панель — это пять минут работы, а не заявка веб-мастеру.

Отдельно стоит продумать список ожидания: если группа заполнена, родитель должен иметь возможность встать в очередь и получить уведомление, если освободится место — это частый сценарий в популярных группах раннего развития и подготовки к школе, и его отсутствие напрямую превращается в звонки администратору «а вдруг место освободилось».

Пример упрощённой структуры таблиц для такой схемы:

CREATE TABLE groups (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100),
  age_from INT,
  age_to INT,
  hall VARCHAR(50),
  teacher VARCHAR(100),
  capacity INT,
  weekday SMALLINT,
  start_time TIME
);

CREATE TABLE lessons (
  id SERIAL PRIMARY KEY,
  group_id INT REFERENCES groups(id),
  lesson_date DATE,
  status VARCHAR(20) DEFAULT 'scheduled' -- scheduled, cancelled, moved
);

CREATE TABLE bookings (
  id SERIAL PRIMARY KEY,
  lesson_id INT REFERENCES lessons(id),
  child_id INT REFERENCES children(id),
  subscription_id INT REFERENCES subscriptions(id),
  status VARCHAR(20) DEFAULT 'confirmed' -- confirmed, cancelled, frozen
);

Это не готовое решение, а скелет, от которого можно оттолкнуться — реальная схема у вас обрастёт полями под конкретные направления и правила центра, но принцип «слот + конкретное занятие + запись» работает почти для любого детского центра, от студии рисования до спортивной секции.

Приём оплаты абонементов онлайн: как это устроено технически

Онлайн-оплата — это та часть, которую страшно делать самостоятельно, и не зря: работа с деньгами требует аккуратности. Но техническая суть проще, чем кажется, если разложить её на шаги.

  1. Родитель на сайте выбирает тип абонемента (разовое занятие, 4 занятия в месяц, 8 занятий в месяц, безлимит — набор зависит от вашего центра) и нажимает «Оплатить».
  2. Сайт создаёт заказ на своей стороне со статусом «ожидает оплаты» и перенаправляет родителя на страницу оплаты платёжного сервиса.
  3. После оплаты платёжный сервис отправляет на ваш сервер уведомление (вебхук) о том, что платёж прошёл, с указанием суммы и идентификатора заказа.
  4. Ваш сервер проверяет подлинность уведомления, находит заказ по идентификатору и переводит абонемент в статус «активен» — с этого момента родитель видит в личном кабинете оплаченные занятия.

Важный момент, который часто упускают: обработчик вебхука должен быть готов к тому, что уведомление может прийти повторно или с задержкой, и не должен зависеть от того, находится ли родитель в этот момент на сайте — платёж может подтвердиться через минуту после того, как человек закрыл вкладку. Это стандартная асинхронная логика, и держать её на своём сервере даже удобнее, чем в облачном конструкторе: вы видите логи каждого запроса и можете быстро разобраться, если оплата «зависла» между статусами.

Какой конкретно платёжный сервис подключать — зависит от того, где юридически оформлен центр и какая у вас форма расчётов; это отдельный разбор с бухгалтером или интегратором, и мы сознательно не называем конкретных провайдеров — выбор сильно зависит от вашей юрисдикции и условий эквайринга. Технически же почти любой современный платёжный сервис работает по описанной выше схеме «заказ → оплата → вебхук», так что архитектура сайта от выбора конкретного провайдера почти не зависит.

Отдельно стоит продумать частичные и групповые сценарии: абонемент на двоих детей из одной семьи, скидку постоянным клиентам, возврат за пропущенные по вине центра занятия. Всё это — правила поверх той же таблицы subscriptions, и на своём сервере вы добавляете такое правило один раз в коде, а не ждёте, пока разработчик стороннего сервиса реализует нужную вам механику скидок в общем продукте для тысяч клиентов.

Личный кабинет родителя и уведомления

Личный кабинет — это то, что превращает разовую оплату в спокойствие для родителя: он должен без звонка администратору понимать, что происходит с абонементом ребёнка.

Минимальный набор, который снимает большинство вопросов:

  • Список детей и их группы (если в центр ходят несколько детей из семьи — это должно быть в одном кабинете).
  • Остаток занятий по абонементу и дата его окончания.
  • История посещений — был на занятии, пропустил, занятие отменено центром.
  • Кнопка «заморозить абонемент» на период болезни с указанием причины — это снимает необходимость звонить и объяснять ситуацию администратору.
  • История платежей — чтобы не искать чек в почте перед сдачей документов на налоговый вычет за дополнительное образование ребёнка, если центр выдаёт такие справки.

Уведомления имеет смысл делать по email или мессенджеру — напоминание за день до занятия, предупреждение об окончании абонемента за несколько занятий до конца, чтобы родитель успел продлить, не пропустив ни одного посещения. Похожая логика напоминаний уже отработана в других нишах с регулярной записью, например у автосервисов и в записи к врачу — принцип «запись плюс напоминание на своём сервере» переносится на детский центр почти без изменений, меняется только предметная область.

Важно не переусердствовать с уведомлениями: если родитель получает сообщение перед каждым занятием каждого из двух детей в трёх кружках, поток быстро превращается в спам, который отключают. Разумно давать родителю самому выбрать, какие уведомления получать, а какие нет — прямо в личном кабинете.

Сколько это стоит и что нужно от сервера

Хорошая новость в том, что сайт с расписанием и оплатой для одного детского центра — это лёгкая нагрузка. У вас не сотни тысяч посетителей в сутки, а несколько десятков-сотен родителей, которые заходят проверить расписание или продлить абонемент. Для такой задачи не нужен дорогой выделенный сервер — вполне достаточно небольшого VPS, где сайт, база данных и обработчик платежей спокойно уживутся вместе.

Из практических соображений при выборе:

  • Резервное копирование обязательно — база с записями детей, абонементами и историей платежей не должна зависеть от одного диска. Настройте регулярный бэкап базы данных отдельно от бэкапа файлов сайта.
  • HTTPS не обсуждается — на сайте форма с оплатой и персональными данными детей, сертификат нужен в любом случае, большинство панелей управления выпускают его бесплатно и автоматически.
  • Локация сервера влияет на скорость загрузки для родителей и на то, с какими платёжными и почтовыми сервисами удобнее интегрироваться — для центра, работающего с зарубежной аудиторией или предпочитающего оплату сервера картой без привязки к российским банкам, часто выбирают сервер в Великобритании.
  • Домен и SSL стоят отдельных денег, но это разовые и небольшие расходы по сравнению с ежемесячной комиссией сервиса онлайн-записи, который берёт процент с каждой записи или платёж за каждое дополнительное рабочее место администратора.

Точную конфигурацию (сколько ядер и памяти) лучше подбирать по факту — если кроме сайта на сервере будет крутиться что-то ещё, например личный кабинет педагогов или хранилище фотоотчётов с занятий, стоит взять запас по диску и памяти заранее, апгрейд задним числом всегда возможен, но удобнее не откладывать его на момент, когда сервер уже начал тормозить.

Нужен сервер под эту задачу?

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Можно ли начать с малого — просто расписание без онлайн-оплаты?

Да, и это разумный первый шаг. Разверните публичное расписание и форму записи, оставив оплату по старой схеме (перевод, наличные при посещении). Модуль платежей можно добавить позже, когда убедитесь, что расписание и запись работают стабильно.

Что будет с записями и оплатами, если сервер временно недоступен?

Ничего критичного, если у вас настроен мониторинг и резервные копии: сайт восстанавливается из бэкапа за то время, которое требуется на разворачивание сервера заново, а данные о записях и оплатах, сохранённые до сбоя, не теряются. Именно поэтому регулярный бэкап базы данных — не опция, а обязательная часть настройки.

Нужно ли отдельное мобильное приложение для родителей?

Обычно нет. Адаптивный сайт, который нормально открывается с телефона, закрывает подавляющее большинство сценариев — родители чаще заходят через браузер по ссылке из сообщения, чем ищут отдельное приложение в сторе. Приложение имеет смысл, только если у вас сеть из многих центров и родители заходят действительно часто.

Как быть с персональными данными детей на сайте?

Минимизируйте то, что хранится в открытом виде: используйте инициалы или ID вместо полного ФИО в интерфейсах, где это возможно, ограничивайте доступ к базе только необходимым сотрудникам и не храните на сервере ничего, что не используется системой напрямую. Это тема отдельного разбора, но общий принцип — чем на своём сервере, тем проще контролировать, кто и как имеет доступ к данным, в отличие от стороннего облачного сервиса, где вы не видите всей картины.

Что делать, если у центра несколько филиалов?

Расширьте таблицу групп полем «филиал» и добавьте фильтр в публичное расписание — родитель выбирает удобный филиал, а система показывает свободные места именно там. Технически это небольшое расширение той же схемы, а не отдельный проект.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →