Продукт, о котором речь, — система бронирования речных прогулок для progulkipokazanke.ru. От первого разговора до работающего бронирования прошло три недели. Ниже — что в этот срок влезло, что нет и за счёт чего он вообще получился таким.
Что было нужно
Компания катает людей по Казанке. До этого места бронировали в переписке: человек писал, оператор сверялась с расписанием в таблице, называла время, принимала оплату переводом. Работало, пока поток был небольшой.
Нужно было: выбор рейса из реального расписания, оплата онлайн, автоматическое письмо с кодом брони, уведомление оператору. И чтобы расписание по-прежнему вела сама оператор — руками, в таблице, без отдельной админки, которую пришлось бы осваивать.
Почему Google Sheets, а не «нормальный» бэкенд
Расписание уже жило в Google-таблице, и Айгуль, оператор, работала с ним каждый день. Любая база данных означала бы, что таблицу нужно куда-то переносить, а человека — переучивать. Это добавило бы к проекту недели и создало точку отказа там, где её не было.
Поэтому: таблица осталась базой. Логика — Google Apps Script. Оплата — ЮKassa через СБП. Уведомления оператору — телеграм-бот. Форма — эмбед в Tilda Zero Block, потому что сайт уже на Tilda и переезжать было незачем.
Связка выглядит несерьёзно ровно до того момента, как посчитаешь, сколько стоит альтернатива и сколько людей придётся переучить.
Что заняло время на самом деле
Форма бронирования — четыре шага, скелетон на загрузке, таймер удержания брони, валидация, липкий футер на мобильном — собралась быстрее всего. Это понятная работа с понятным результатом.
Время съели вещи, которых в задаче не было видно:
Правовые страницы. Политика обработки персональных данных по 152-ФЗ и публичная оферта с таблицами возвратов и реквизитами. Это не «текст на страницу» — это решения о том, за сколько часов до рейса возврат полный, за сколько частичный, и что происходит при отмене по погоде. Такие решения принимает заказчик, а не разработчик, и на них уходит несколько заходов.
Конфигурация. Каждый из четырёх файлов эмбеда получил объект настроек сверху — реквизиты, условия оферты, контакты. Без этого любая правка означала бы лезть в код.
Ограничения платформы. Эмбед в Tilda Zero Block принимает только фрагмент разметки — без DOCTYPE, html, head и body. Узнаёшь об этом не из документации, а когда страница разъезжается.
Где связка ломается
Две вещи вылезли уже на живых бронях.
Первая: у Apps Script на бесплатном тарифе жёсткий потолок в шесть минут на выполнение. Функция очистки просроченных резервов ходила в таблицу построчно, и по мере роста листа резервов начала в этот потолок упираться. Лечится переписыванием на батчевые getValues/setValues — читать и писать пачкой, а не по строке.
Вторая интереснее. Часть клиентов, выбравших рейс на 17:00, записывались как 10:00. Нашлось это не по логам, а потому что Айгуль стала руками править строки в таблице. Ручные правки оператора — это всегда сигнал: человек чинит то, что должна чинить система, и обычно молча.
Что влезает в три недели
Влезает: работающий сквозной сценарий — выбор, оплата, подтверждение, уведомление. Правовые страницы, если заказчик готов быстро отвечать на вопросы про возвраты. Документация для того, кто будет это поддерживать.
Не влезает: нагрузочные сценарии и всё, что вылезает на объёме. Три недели дают продукт, который работает на текущем потоке. Дальше он начинает упираться в потолки платформы, и это нормально — к этому моменту уже понятно, стоит ли вкладываться в переезд.
Что получилось за сезон
За сезон 2026 через модуль прошло около 780 оплаченных броней и порядка 2200 пассажиров.
Отдельно стоит сказать про потолки, потому что цифры выше их и нащупали. Шестиминутный лимит Apps Script — это не абстрактное ограничение из документации: он наступил на конкретном количестве строк в листе резервов, и до этого момента всё работало. Так же и с батчингом: пока броней немного, построчные обращения к таблице никого не беспокоят.
Связка из таблицы и скриптов честно отработала сезон на этом объёме. Это и есть ответ на вопрос, стоило ли делать «нормальный» бэкенд сразу: на таком потоке — не стоило.