Telegram-бот-магазин с корзиной на динамическом каталоге
Не всем нужен полноценный интернет-магазин. Мастеру маникюра, преподавателю онлайн-курсов, организатору воркшопов часто хватает 5–15 позиций — и поднимать ради этого отдельное решение избыточно. Этот кейс — про мини-магазин прямо внутри Telegram-бота: каталог-карусель с листанием, корзина с накоплением товаров, оплата на итоговую сумму.
📌 Задача
- Показать клиенту небольшой каталог товаров или услуг прямо в боте.
- Дать собрать заказ из нескольких позиций (накопить корзину).
- Выставить счёт на общую сумму и принять оплату через подключённую платёжную систему.
- Сделать так, чтобы каталог можно было пополнять без захода в админку — из самого чата с ботом.
🎯 Кому подойдёт
Магазин на 5–15 позиций для мастеров, преподавателей, ивент-менеджеров. На тот же паттерн ложится не только торговля — это «накопительный каталог»: клиент собирает несколько позиций, бот считает их общую сумму и показывает заказ списком.
- Бронирование набора услуг — клиент выбирает несколько процедур, бот собирает общий счёт.
- Запись на курс с модулями — клиент выбирает нужные модули, бот считает стоимость.
- Сбор заявок мероприятия — участник набирает места или билеты.
⚠️ Когда это не подойдёт
Если каталог большой (сотни товаров, фильтры по характеристикам, склад, личный кабинет покупателя, отзывы) — лучше использовать специализированные решения. SamBot в таком сценарии можно подключить как канал общения с клиентом — уведомления, поддержка, рассылки — но сам каталог держать в нём не стоит.
⚙️ Что увидит клиент
- Пишет в бот «магазин» (или другое выбранное вами слово).
- Получает карточку первого товара: фото, название, цена, кнопки ◀ ▶ для листания, «В корзину», «Перейти в корзину».
- Листает каталог кнопками ◀ ▶.
- В нужных карточках жмёт «В корзину» — бот молча добавляет товар.
- Нажимает «Перейти в корзину» — видит свой заказ списком, итоговую сумму и кнопку «Оплатить» с уже подставленной суммой.
- Жмёт «Оплатить» — переходит на страницу платёжной системы и оплачивает.
- При желании может нажать «Очистить корзину» — начать сборку заново.
🔧 Что получит мастер
В админке — стандартный список оплат через подключённую платёжную систему (ЮKassa, Robokassa, Prodamus, Т-Банк). Каждая оплата привязана к конкретному клиенту в боте, видно кто и на какую сумму. Опционально каждая покупка дублируется строкой в Google Таблицу — простой учёт без отдельной системы.
А главное — добавить новый товар можно прямо из чата с ботом: написать «товар», отправить фото с подписью «Название | Цена», и всё. Без админки.
🛠 Как это собирается в SamBot
Если бота ещё нет — пройдите быстрый старт для Telegram или ВКонтакте. Дальше нужны три параметра, одна платёжная система и пять реакций. Количество товаров на структуру не влияет.
1. Параметры
В разделе «Параметры» создайте три параметра:
catalog, режим «Хранить все значения» — общий список товаров.cart, режим «Хранить все значения» — персональная корзина клиента.catalog_position, режим «Хранить последнее значение» — номер товара, который клиент сейчас просматривает.
2. Платёжная система
В разделе «Оплаты» подключите любого провайдера (ЮKassa, Robokassa, Prodamus, Т-Банк …). Понадобится в реакции корзины.
3. Реакция «Добавить товар»
Это «админ-режим» для пополнения каталога. Подробно описан в отдельной статье — «Как накопить данные в параметре через реакцию». Кратко:
- Триггер — ключевое слово
товарв вашем личном чате с ботом. - Сообщение — «Отправьте фото товара с подписью в формате «Название | Цена».»
- В настройке «Сохранить ответ»: ожидаемый тип — фото, параметр
catalog, режим «Хранить все значения», галка «Глобальный».
4. Реакция «Витрина»
Показывает один товар по текущей позиции. Триггер не указывается — запускается только из цепной реакции (см. ниже).
- В блоке «4. Действия» в уже включённом «4.1. Отправить сообщение» добавьте одно сообщение типа «Фото». Файл фото оставьте пустым — включите «Отправить параметр» и в поле подстановки впишите:
Это сложная подстановка: сначала бот посмотрит текущую позицию клиента, потом возьмёт фото из каталога по этой позиции.{global:catalog:{user:catalog_position}} - В этом же сообщении включите «С текстом» и впишите подпись через формулу:
Здесь{formula:FIELD(JP({global:catalog:{user:catalog_position}};"$.caption");" | ";"{0} — {1}₽")}JP(...; "$.caption")достаёт исходную подпись («Мыло | 500»), аFIELD(...; " | "; "{0} — {1}₽")переоформляет её в «Мыло — 500₽» по шаблону. - Добавьте четыре кнопки:
- ◀ — тип «Реакция», ведёт в «Назад» (шаг 5).
- ▶ — тип «Реакция», ведёт в «Вперёд» (шаг 5).
- В корзину — тип «Реакция», ведёт обратно в «Витрину» (re-render), плюс в настройках кнопки нажмите «Сохранить ответ»: параметр
cart, режим «Хранить все значения», значение — формула:
Это сохранит подпись текущего товара в корзину.{formula:JP({global:catalog:{user:catalog_position}};"$.caption")} - Перейти в корзину — тип «Реакция», ведёт в «Корзина» (шаг 7).
5. Реакции «Назад» и «Вперёд»
Две похожие реакции, обе только из цепи. Назначение — обновить позицию клиента и показать товар.
Назад:
- В настройке параметров реакции добавьте
catalog_positionс режимом «Хранить последнее значение» и значением:
MAX с единицей — нижняя граница, чтобы листание не ушло в ноль.{formula:MAX({user:catalog_position}-1;1)} - В блоке цепной реакции («4.16. Запустить реакцию») выберите «Витрину» и поставьте «В личные сообщения».
Вперёд — то же, но значение позиции:
{formula:MIN({user:catalog_position}+1;COUNTA({global:catalog:1-}))}
MIN с COUNTA(...) — верхняя граница, она автоматически равна числу товаров в каталоге.
6. Реакция «Магазин» (вход)
Триггер — ключевое слово магазин в личке. Назначение — сбросить позицию на первую и запустить витрину.
- В настройке параметров реакции добавьте
catalog_position, режим «Хранить последнее значение», значение1. - В цепной реакции («4.16») укажите «Витрину», чат — «В личные сообщения».
7. Реакция «Корзина»
Показывает заказ списком, итог и кнопку оплаты. Триггер не нужен — запускается из кнопки «Перейти в корзину» витрины.
- Одно сообщение типа «Текст» с двумя формулами:
Первая формула проходит по всем товарам корзины и форматирует каждый по шаблону. Вторая считает сумму вторых полей (цен).Ваш заказ: {formula:JOIN(NL();FOREACH({user:cart:1-};LAMBDA(item;FIELD(item;" | ";"{0} — {1}₽"))))} Итого: {formula:SUM(FOREACH({user:cart:1-};LAMBDA(item;FIELD(item;" | ";1))))}₽ - В этом же сообщении кнопка «Оплатить» типа «Оплата». В поле «Сумма» вставьте ту же формулу:
Сумма счёта будет ровно равна сумме корзины — клиент платит за то, что собрал.{formula:SUM(FOREACH({user:cart:1-};LAMBDA(item;FIELD(item;" | ";1))))} - Вторая кнопка — «Очистить корзину» типа «Реакция», ведёт в реакцию очистки.
8. Реакция «Очистить корзину»
- Одно сообщение «Корзина очищена.»
- В настройке параметров реакции добавьте
cartс режимом «Удалить все значения». Это сотрёт всё содержимое корзины этого клиента.
💡 Что можно докрутить
- Скидка от суммы — в поле «Сумма» оплаты вместо чистой SUM поставьте
IF(SUM>3000;SUM*0.9;SUM). И строку «Скидка 10% от 3000 ₽» в тексте корзины. - Категории каталога — несколько параметров (
catalog_clothes,catalog_accessories) и по витрине на каждый раздел. - Уведомление менеджеру после оплаты — цепная реакция на успешную оплату с тем же списком товаров отправляется в ваш админский чат.
- Запись заказа в Google Таблицу — в реакцию «Корзина» добавьте действие «Отправить в Google Таблицу». Мини-CRM без отдельной системы.
Если нужна помощь
SamBot — это конструктор, всё описанное собирается мышкой в админке без программиста. Если хочется быстрый старт — напишите нам, поможем настроить под вашу нишу или предложим готовый шаблон. Стоимость доступна и для самозанятых мастеров, и для маленьких студий.
Заведите бота, попробуйте на своём ассортименте — и через час у вас будет рабочий мини-магазин внутри Telegram.