WebApp «Календарь» (calendar)
calendar — готовое мини-приложение Квесчи для записи клиентов на услуги: барбершопы, салоны красоты, СТО, врачи, тренеры, фотографы, репетиторы, курсы.
В отличие от 5-7 блоков-вопросов «выберите день / выберите время / выберите услугу», calendar показывает интерактивный календарь с занятостью прямо в мессенджере. Клиент выбирает дату и время за 2 клика.
Когда использовать
- Услуги по записи: парикмахер, врач, тренер, репетитор, фотограф.
- Аренда: студия, авто, инвентарь по слотам.
- Курсы и тренинги: запись на занятие из расписания.
- Бронирование: ресторан, баня, переговорная.
Часть 1. Настройка календаря
Шаг 1. Подключите WebApp
Раздел Списки / WebApp → Добавить приложение → «Календарь» (calendar).
Настройки:
- Название — отображается в шапке;
- Токен — для запуска не из кнопки под сообщением;
- Дизайн — выбор дизайна приложения;
- Элементы — тексты и цвета;
- Работа календаря — настройки функций;
- График работы — окно работы по дням недели и времени записи.

Скриншот 1. Настройка приложения календаря.
Шаг 2. Подключите к мессенджеру
- Через
@BotFather→ Menu Button → URL вашего WebApp. - Кнопка-ссылка под сообщением
Часть 2. Семь операций действия
Действие «WebApp/MiniApp» в сценарии действий предоставляет 7 операций для работы с календарём:
| Операция | Назначение |
|---|---|
| Календарь: данные из приложения | Получить выбранную дату/время из WebApp |
| Календарь: сделать запись | Зафиксировать запись в системе Квесчи |
| Календарь: получить все записи клиента | Извлечь массив записей подписчика |
| Календарь: получить запись клиента | Получить одну запись по ID или номеру |
| Календарь: удалить запись клиента | Отменить одну запись |
| Календарь: удалить все записи клиента | Очистить все записи (для админки) |
После возврата из WebApp текущий блок получает ответ webapp:calendar. Используйте его в условиях перехода.
Часть 3. Операция «Данные из приложения» (cal_data)
Получает то, что клиент выбрал в WebApp. Запись ещё не создаётся — это сырые данные.
| Переменная | Содержит |
|---|---|
| Дата записи 1 | Дата (формат дд.мм.гггг). Если интервал — первая дата |
| Дата записи 2 | Вторая дата (только для интервала) |
| Время записи | Время в формате чч:мм |
| Выбор одиночной записи | 1 — одиночная дата, 0 — интервал |
| Выбор времени | 1 — выбирал время, 0 — только дата |
| ID записи | Уникальный ID в приложении |
Используйте для подтверждения: «Вы выбрали #{date1} в #{time}. Подтвердить?» → если «Да» → cal_record.

Скриншот 2. Сохранение выбора клиента в переменные.
Часть 4. Операция «Сделать запись» (cal_record)
Фиксирует запись в системе Квесчи. После этой операции клиент действительно «записан».
Поля операции
| Поле | Значение |
|---|---|
| Событие | Название услуги: «Стрижка мужская», «Консультация» |
| Информация о записи | Описание для клиента/админа (адрес, номер кабинета, телефон) |
| Продолжительность в минутах | 30, 60, 90. Можно переменную |
| Имя переменной (инфо) | Куда сохранить полную информацию о записи |
ID записи в БД (recidvar) | Переменная для ID — нужен для отмены |
| Не допускать повторную запись | Галочка: не записывать клиента второй раз на ту же дату и время |
| Имя переменной (повтор) | 0 — записали, 1 — такая запись уже есть |
| Не записывать, если есть предстоящие записи | Галочка: ограничить число активных записей клиента |
| Максимум предстоящих записей | Сколько разрешено. Пусто — не более одной. Можно переменную |
| Имя переменной (предстоящие) | 0 — записали, 1 — предел исчерпан |
Повторная запись
Клиент может нажать «Записаться» дважды: вернулся в приложение, выбрал то же время, отправил ещё раз. Без проверки в календаре появятся две одинаковые записи и два комплекта напоминаний.
Галочка «Не допускать повторную запись» это закрывает. Перед фиксацией бот ищет запись этого же клиента в этом же приложении на ту же дату и время:
- запись нашлась — новая не создаётся, в переменную повтора попадает
1; - не нашлась — записываем как обычно, в переменную попадает
0.
При повторе в переменную с ID записи кладётся идентификатор прежней записи. Её можно показать клиенту или удалить операцией «Удалить запись», не разыскивая отдельно.
Проверка смотрит только записи самого клиента. Записи других людей на этот же час ей не мешают — свободные места считает само приложение по своим настройкам. Галочка защищает от повторного нажатия «Записаться» одним человеком.
Дальше в сценарии разведите ответ условием на переменной повтора:
Условие: '#{повтор}' = '1' → «Вы уже записаны на это время»
Условие: '#{повтор}' = '0' → «Записали вас, ждём»
У записей на промежуток дат времени нет — там сравнивается дата начала.
Сколько активных записей разрешено клиенту
Галочка «Не записывать, если есть предстоящие записи» решает другую задачу: ограничить, сколько записей у клиента может быть назначено одновременно. Приём у врача, консультация, бронь переговорки — записался, пришёл, записывайся снова.
Перед фиксацией бот считает записи этого клиента в этом приложении, дата которых ещё не наступила:
- набрано столько же или больше предела — новая не создаётся, в переменную
попадает
1; - меньше — записываем, в переменную попадает
0.
Поле «Максимум предстоящих записей» задаёт предел. Пусто — не более одной. Можно подставить переменную: например, разрешать больше записей тем, у кого абонемент.
Прошедшие записи не мешают: иначе клиент записался бы один раз в жизни. В переменную с ID записи попадает ближайшая предстоящая — её можно показать («вы уже записаны на 3 сентября») или отменить.
Пустое значение, ноль, минус и текст означают одно и то же — одна запись. Так вело себя ограничение до появления поля, и переменная, которая не заполнилась, не превращает запрет в разрешение.
Их можно включить обе. Каждая заполнит свою переменную, а запись не создастся, если сработала любая. Так в сценарии видно, что именно помешало: клиент жмёт кнопку второй раз или у него уже есть запись на другой день.
Напоминания
Галочка «Напоминание» включает блок настройки автоуведомлений:
- Текст напоминания — что отправить клиенту;
- Кнопки напоминания — добавить «Подтвердить / Отменить» к сообщению;
- До события в минутах — за сколько минут до записи отправить:
- Первое напоминание — обычно
1440(за сутки) или60(за час); - Второе напоминание — например,
60; - Третье напоминание —
15.
- Первое напоминание — обычно

Скриншот 3. Настройка трёх напоминаний.
Добавьте кнопки «✅ Приду» / «❌ Отмена» в напоминание. По нажатию «Отмена» запускайте сценарий с действием «Календарь: удалить запись».
Часть 5. Операция «Получить все записи клиента» (cal_get_records)
Возвращает все будущие записи подписчика массивом.
- Все записи — имя переменной (например,
my_records).
После — используйте «Перебор» массива в «Операциях с данными» для формирования строки списка.
Ваши записи:
#{my_records}
Хотите отменить какую-то?
Часть 6. Операция «Получить запись клиента» (cal_get_record)
Достаёт одну запись по номеру в списке или по ID.
- Номер из списка (
recnum) — порядковый номер из массива записей; - ID записи из БД (
recid) — уникальный ID.
Извлекает в переменные:
| Поле записи | Переменная |
|---|---|
| Наименование события | eventvar |
| Инфо о событии | infovar |
| Первая дата | format1var |
| Вторая дата | format2var |
| Время | timevar |
| Одиночная дата | singledatevar |
| С выбором времени | settimevar |
| Продолжительность | durationvar |
| ID записи | recordIdvar |
Используется для просмотра деталей конкретной записи перед её отменой/переносом.
Часть 7. Операция «Удалить запись клиента» (cal_del_record)
Отменяет одну запись по её ID. Передайте recid из переменной (после cal_record или cal_get_record).
После удаления — напоминания автоматически отменяются.
Часть 8. Операция «Удалить все записи клиента» (cal_delall_records)
Чистит все записи подписчика. Применяется в служебных сценариях:
- «Перенос данных» — удалить старые при миграции;
- «Полная отписка от услуг»;
- «Сброс для тестов».
Удалённые записи не восстановить. Подтверждайте действие у клиента отдельным блоком.
Часть 9. Типовой сценарий «Запись на стрижку»
Блок 1. Приветствие
«Добро пожаловать в Барбершоп! Записаться?»
Кнопка WebApp «📅 Выбрать время»
↓ webapp:calendar
Блок 2. Подтверждение
Сценарий действий «До»:
- WebApp/MiniApp → cal_data → переменные date1, time, recordId, ...
Сообщение: «Вы выбрали `#{date1}` в `#{time}`.
Услуга: Стрижка мужская (30 мин)
Адрес: ул. Ленина, 1
Подтвердить?»
Кнопки: «✅ Подтвердить» / «❌ Изменить»
Блок 3 (по кнопке «Подтвердить»). Сохранение записи
Сценарий действий «До»:
- WebApp/MiniApp → cal_record:
Событие: Стрижка мужская
Инфо: Адрес ул. Ленина 1, 2 этаж. Тел: +7...
Длительность: 30
Напоминание: за 1440 мин (сутки) и за 60 мин (час)
Текст: «Напоминаем о записи на `#{date1}` в `#{time}`»
Сохранить ID в переменную: my_record_id
- Список «Записи» addrow:
ClientID, recordId = `#{my_record_id}`, date = `#{date1}`, time = `#{time}`
Сообщение: «✅ Запись на `#{date1}` в `#{time}` подтверждена.
Мы напомним за сутки и за час.»
Часть 10. Сценарий «Мои записи»
Блок 1. Команда /my
Сценарий действий «До»:
- WebApp/MiniApp → cal_get_records → my_records (массив)
- Если массив пуст → переход на «Записей нет»
- Иначе: перебор → формирование строки в `#{records_text}`
Сообщение: «Ваши записи:
`#{records_text}`
Выберите номер для отмены»
Блок 2. Ввод номера
Ответ: [Answer1] (номер 1, 2, 3)
Блок 3. Подтверждение отмены
Сценарий действий «До»:
- WebApp/MiniApp → cal_get_record(recnum=[Answer1]) → детали в переменные
Сообщение: «Отменить запись `#{eventvar}` `#{format1var}` в `#{timevar}`?»
Кнопки: «✅ Да» / «❌ Нет»
Блок 4 (Да). Отмена
Сценарий действий «До»:
- WebApp/MiniApp → cal_del_record(recid=`#{recordIdvar}`)
Сообщение: «✅ Запись отменена.»
Часть 11. Продвинутые сценарии
Сценарий 1. Платная запись (оплата перед фиксацией)
- После
cal_data(выбор слота) → действие «Платежи» → ссылка#{pay_link}. - Сообщение с кнопкой «Оплатить».
- В цепочке приёма платежа → действие
cal_record(только после оплаты).
Сценарий 2. Напоминание с возможностью переноса
В кнопках напоминания добавьте «🔄 Перенести» — по нажатию открывайте WebApp снова, удалив старую запись через cal_del_record.
Сценарий 3. Запись со «слотом» услуги
В списке услуг каждая услуга имеет длительность. В Блоке 2 после cal_data подставьте длительность из услуги клиента → передайте в cal_record → бот корректно блокирует часы.
Сценарий 4. Многоуровневая запись (мастер + услуга)
- Сначала блок «Выберите мастера» (кнопки).
- По выбору → сохранить
master_id. - WebApp передаёт
master_idчерез URL-параметр → календарь показывает только окна выбранного мастера.
Сценарий 5. Корпоративная бронь переговорки
- Запись групповая — список присутствующих в
[Answer3]через запятую. - В
infoпередаётся: «Присутствуют: [Answer3], тема: [Answer4]». - Напоминание всем участникам (если у бота их ID).
Часть 12. Архитектура
Принцип 1. Подтверждение перед фиксацией
Всегда между cal_data и cal_record ставьте блок подтверждения. Клиент может «потыкать» в календаре и не подтвердить.
Принцип 2. Сохраняйте ID записи
Без recidvar после cal_record вы не сможете отменить запись. Всегда указывайте имя переменной.
Принцип 3. Минимум одно напоминание
Установите хотя бы одно напоминание за час до события. Это реально снижает % неявок.
Принцип 4. История в списке «Записи»
Дублируйте записи в свой список для аналитики и истории. Календарь хранит только активные записи.
Принцип 5. Не давайте записываться в нерабочее время
Настройте «Рабочие часы» в WebApp. Клиенты не должны видеть слотов вне работы.
Принцип 6. Адрес и инструкция — в info
В info пишите подробно: адрес с этажом, как пройти, что взять с собой, телефон администратора. Это попадёт в напоминания и снизит звонки.
Частые ошибки
#{date1}или#{time}пустые — забыли указать имена переменных вcal_dataили клиент не дошёл до выбора.- Запись не сохранилась — пропущена операция
cal_record.cal_dataтолько читает выбор, но не фиксирует. - Напоминания не приходят — клиент отписался от бота или забанил. Это вне контроля Квесчи.
- Отмена не работает — забыли сохранить
recidvarвcal_record, теперь нет ID для удаления. - Клиент бронирует и не приходит — добавьте платную бронь или предоплату.
- Слоты пересекаются — не указана
durationвcal_record. Календарь считает запись точечной. - Календарь пустой — не задано расписание в настройках WebApp («Рабочие часы»).
Что дальше
- WebApp Магазин (cat_shop) — для розницы.
- WebApp Кафе (cat_cafe) — для общепита.
- Google Календарь — синхронизация с Google Calendar.
- Платежи — оплата записи.
- Цепочки — напоминания, дожимы.
- Списки — хранение истории записей.