Детский центр: сайт с расписанием и оплатой абонементов на своём сервере
Сайт-визитка на бесплатном конструкторе решает ровно одну задачу — рассказать о центре и показать телефон. А дальше начинается ручная работа: администратор отвечает на одни и те же вопросы про расписание, записывает ребёнка в блокнот или таблицу, выставляет счёт за абонемент отдельным сообщением и ждёт перевода. Родителю неудобно, администратору тяжело, а центр теряет заявки в те часы, когда никто не берёт трубку. Разбираемся, что нужно, чтобы родитель сам записал ребёнка и оплатил абонемент онлайн — на сайте, который стоит на вашем сервере и работает так, как нужно именно вам.
Содержание
- Почему бесплатный конструктор упирается в потолок
- Что должен уметь сайт с расписанием и оплатой
- Архитектура на своём сервере: сайт, расписание, платежи
- Расписание занятий: группы, залы, педагоги, места
- Приём оплаты абонементов онлайн: как это устроено технически
- Личный кабинет родителя и уведомления
- Сколько это стоит и что нужно от сервера
Почему бесплатный конструктор упирается в потолок
Конструкторы сайтов хорошо справляются с витриной: фотографии зала, описание направлений, контакты. Но как только вы пытаетесь встроить туда живое расписание групп с ограниченным числом мест и приём оплаты абонементов — начинаются компромиссы.
Типичная схема на конструкторе выглядит так: на сайте — форма «Оставить заявку», дальше администратор перезванивает, уточняет, свободно ли место в группе, называет сумму абонемента и присылает реквизиты для перевода. Каждая запись — это минимум один звонок или переписка в мессенджере, причём в рабочее время администратора, а не тогда, когда у родителя есть пять свободных минут вечером.
Проблема не в том, что конструктор «плохой» — он честно делает то, для чего создан. Проблема в том, что расписание с местами в группах, абонементы с остатком занятий и заморозкой на время болезни, автоматическое обновление статуса оплаты — это уже не витрина, а маленькая учётная система. Встроить такую логику в шаблонный конструктор либо нельзя вовсе, либо можно только через сторонний сервис по подписке, который берёт процент с каждой оплаты или ограничивает число записей в месяц.
Родителям в итоге всё равно, на чём сделан сайт — им важно записать ребёнка за минуту и увидеть, что оплата прошла. Если для этого нужно звонить — часть просто не дозвонится или отложит запись, а отложенная запись в детский центр нередко означает, что родитель в итоге запишется туда, где это можно сделать сразу.
Что должен уметь сайт с расписанием и оплатой
Прежде чем говорить о технической стороне, стоит честно перечислить, что реально нужно от такого сайта — без этого списка легко утонуть в лишних функциях или, наоборот, упустить важное.
- Публичное расписание групп по направлениям — с возрастом, днём недели, временем, залом и педагогом.
- Отображение свободных мест в группе в реальном времени, чтобы не набирать больше, чем позволяет зал.
- Запись на пробное занятие и запись в постоянную группу — это разные сценарии, их нельзя смешивать в одной форме.
- Личный кабинет родителя: какие дети записаны, на какие занятия, сколько занятий осталось по абонементу.
- Онлайн-оплата абонемента с автоматическим обновлением статуса — оплатил, значит абонемент активен, без ручного подтверждения администратором.
- Заморозка и перенос занятий при болезни ребёнка — без этого родители будут звонить именно по этому поводу чаще всего.
- Уведомления о ближайшем занятии и об окончании абонемента.
Из этого списка видно, что ядро системы — это не столько «сайт», сколько связка из трёх частей: публичная страница с расписанием, личный кабинет с историей посещений и абонементом, и модуль приёма оплаты, который умеет сообщать остальным двум частям, что деньги пришли.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверАрхитектура на своём сервере: сайт, расписание, платежи
Когда вы держите всё это на собственном сервере, а не собираете из трёх разных SaaS-сервисов, у вас появляется то, чего обычно не хватает в готовых конструкторах — контроль над тем, как части системы говорят друг с другом.
Практическая схема выглядит так:
- Веб-сайт — публичная часть с расписанием и формой записи. Может быть на готовой CMS (например, WordPress с плагином бронирования) или на отдельном самописном модуле, если готовые плагины не покрывают вашу логику групп и абонементов.
- База данных расписания и абонементов — таблицы с группами, занятиями, местами, записями детей, статусом абонемента и историей посещений. Это сердце системы: именно отсюда сайт узнаёт, свободно ли место, и именно сюда записывается результат оплаты.
- Обработчик платежей — серверная часть, которая принимает уведомление от платёжного шлюза о поступлении оплаты и обновляет статус абонемента в базе. Это ключевой узел: без него оплата и запись живут отдельно друг от друга, и администратору всё равно приходится сверять их вручную.
- Личный кабинет родителя — веб-интерфейс поверх той же базы, показывающий актуальное состояние: сколько занятий осталось, когда следующее, история оплат.
Такая схема требует немного больше настройки, чем «поставил конструктор и готово», но она разовая. Дальше сайт работает сам: родитель записывается, платит, видит остаток занятий — а администратор занимается детьми и педагогами, а не сверкой таблиц.
Если у центра уже есть сайт на стороннем хостинге и вы просто хотите добавить расписание и оплату, разумный путь — перенести сайт на свой 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
);
Это не готовое решение, а скелет, от которого можно оттолкнуться — реальная схема у вас обрастёт полями под конкретные направления и правила центра, но принцип «слот + конкретное занятие + запись» работает почти для любого детского центра, от студии рисования до спортивной секции.
Приём оплаты абонементов онлайн: как это устроено технически
Онлайн-оплата — это та часть, которую страшно делать самостоятельно, и не зря: работа с деньгами требует аккуратности. Но техническая суть проще, чем кажется, если разложить её на шаги.
- Родитель на сайте выбирает тип абонемента (разовое занятие, 4 занятия в месяц, 8 занятий в месяц, безлимит — набор зависит от вашего центра) и нажимает «Оплатить».
- Сайт создаёт заказ на своей стороне со статусом «ожидает оплаты» и перенаправляет родителя на страницу оплаты платёжного сервиса.
- После оплаты платёжный сервис отправляет на ваш сервер уведомление (вебхук) о том, что платёж прошёл, с указанием суммы и идентификатора заказа.
- Ваш сервер проверяет подлинность уведомления, находит заказ по идентификатору и переводит абонемент в статус «активен» — с этого момента родитель видит в личном кабинете оплаченные занятия.
Важный момент, который часто упускают: обработчик вебхука должен быть готов к тому, что уведомление может прийти повторно или с задержкой, и не должен зависеть от того, находится ли родитель в этот момент на сайте — платёж может подтвердиться через минуту после того, как человек закрыл вкладку. Это стандартная асинхронная логика, и держать её на своём сервере даже удобнее, чем в облачном конструкторе: вы видите логи каждого запроса и можете быстро разобраться, если оплата «зависла» между статусами.
Какой конкретно платёжный сервис подключать — зависит от того, где юридически оформлен центр и какая у вас форма расчётов; это отдельный разбор с бухгалтером или интегратором, и мы сознательно не называем конкретных провайдеров — выбор сильно зависит от вашей юрисдикции и условий эквайринга. Технически же почти любой современный платёжный сервис работает по описанной выше схеме «заказ → оплата → вебхук», так что архитектура сайта от выбора конкретного провайдера почти не зависит.
Отдельно стоит продумать частичные и групповые сценарии: абонемент на двоих детей из одной семьи, скидку постоянным клиентам, возврат за пропущенные по вине центра занятия. Всё это — правила поверх той же таблицы subscriptions, и на своём сервере вы добавляете такое правило один раз в коде, а не ждёте, пока разработчик стороннего сервиса реализует нужную вам механику скидок в общем продукте для тысяч клиентов.
Личный кабинет родителя и уведомления
Личный кабинет — это то, что превращает разовую оплату в спокойствие для родителя: он должен без звонка администратору понимать, что происходит с абонементом ребёнка.
Минимальный набор, который снимает большинство вопросов:
- Список детей и их группы (если в центр ходят несколько детей из семьи — это должно быть в одном кабинете).
- Остаток занятий по абонементу и дата его окончания.
- История посещений — был на занятии, пропустил, занятие отменено центром.
- Кнопка «заморозить абонемент» на период болезни с указанием причины — это снимает необходимость звонить и объяснять ситуацию администратору.
- История платежей — чтобы не искать чек в почте перед сдачей документов на налоговый вычет за дополнительное образование ребёнка, если центр выдаёт такие справки.
Уведомления имеет смысл делать по email или мессенджеру — напоминание за день до занятия, предупреждение об окончании абонемента за несколько занятий до конца, чтобы родитель успел продлить, не пропустив ни одного посещения. Похожая логика напоминаний уже отработана в других нишах с регулярной записью, например у автосервисов и в записи к врачу — принцип «запись плюс напоминание на своём сервере» переносится на детский центр почти без изменений, меняется только предметная область.
Важно не переусердствовать с уведомлениями: если родитель получает сообщение перед каждым занятием каждого из двух детей в трёх кружках, поток быстро превращается в спам, который отключают. Разумно давать родителю самому выбрать, какие уведомления получать, а какие нет — прямо в личном кабинете.
Сколько это стоит и что нужно от сервера
Хорошая новость в том, что сайт с расписанием и оплатой для одного детского центра — это лёгкая нагрузка. У вас не сотни тысяч посетителей в сутки, а несколько десятков-сотен родителей, которые заходят проверить расписание или продлить абонемент. Для такой задачи не нужен дорогой выделенный сервер — вполне достаточно небольшого VPS, где сайт, база данных и обработчик платежей спокойно уживутся вместе.
Из практических соображений при выборе:
- Резервное копирование обязательно — база с записями детей, абонементами и историей платежей не должна зависеть от одного диска. Настройте регулярный бэкап базы данных отдельно от бэкапа файлов сайта.
- HTTPS не обсуждается — на сайте форма с оплатой и персональными данными детей, сертификат нужен в любом случае, большинство панелей управления выпускают его бесплатно и автоматически.
- Локация сервера влияет на скорость загрузки для родителей и на то, с какими платёжными и почтовыми сервисами удобнее интегрироваться — для центра, работающего с зарубежной аудиторией или предпочитающего оплату сервера картой без привязки к российским банкам, часто выбирают сервер в Великобритании.
- Домен и SSL стоят отдельных денег, но это разовые и небольшие расходы по сравнению с ежемесячной комиссией сервиса онлайн-записи, который берёт процент с каждой записи или платёж за каждое дополнительное рабочее место администратора.
Точную конфигурацию (сколько ядер и памяти) лучше подбирать по факту — если кроме сайта на сервере будет крутиться что-то ещё, например личный кабинет педагогов или хранилище фотоотчётов с занятий, стоит взять запас по диску и памяти заранее, апгрейд задним числом всегда возможен, но удобнее не откладывать его на момент, когда сервер уже начал тормозить.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли начать с малого — просто расписание без онлайн-оплаты?
Да, и это разумный первый шаг. Разверните публичное расписание и форму записи, оставив оплату по старой схеме (перевод, наличные при посещении). Модуль платежей можно добавить позже, когда убедитесь, что расписание и запись работают стабильно.
Что будет с записями и оплатами, если сервер временно недоступен?
Ничего критичного, если у вас настроен мониторинг и резервные копии: сайт восстанавливается из бэкапа за то время, которое требуется на разворачивание сервера заново, а данные о записях и оплатах, сохранённые до сбоя, не теряются. Именно поэтому регулярный бэкап базы данных — не опция, а обязательная часть настройки.
Нужно ли отдельное мобильное приложение для родителей?
Обычно нет. Адаптивный сайт, который нормально открывается с телефона, закрывает подавляющее большинство сценариев — родители чаще заходят через браузер по ссылке из сообщения, чем ищут отдельное приложение в сторе. Приложение имеет смысл, только если у вас сеть из многих центров и родители заходят действительно часто.
Как быть с персональными данными детей на сайте?
Минимизируйте то, что хранится в открытом виде: используйте инициалы или ID вместо полного ФИО в интерфейсах, где это возможно, ограничивайте доступ к базе только необходимым сотрудникам и не храните на сервере ничего, что не используется системой напрямую. Это тема отдельного разбора, но общий принцип — чем на своём сервере, тем проще контролировать, кто и как имеет доступ к данным, в отличие от стороннего облачного сервиса, где вы не видите всей картины.
Что делать, если у центра несколько филиалов?
Расширьте таблицу групп полем «филиал» и добавьте фильтр в публичное расписание — родитель выбирает удобный филиал, а система показывает свободные места именно там. Технически это небольшое расширение той же схемы, а не отдельный проект.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →