Telegram-бот-магазин с корзиной на динамическом каталоге

Не всем нужен полноценный интернет-магазин. Мастеру маникюра, преподавателю онлайн-курсов, организатору воркшопов часто хватает 5–15 позиций — и поднимать ради этого отдельное решение избыточно. Этот кейс — про мини-магазин прямо внутри Telegram-бота: каталог-карусель с листанием, корзина с накоплением товаров, оплата на итоговую сумму.

📌 Задача

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

🎯 Кому подойдёт

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

  • Бронирование набора услуг — клиент выбирает несколько процедур, бот собирает общий счёт.
  • Запись на курс с модулями — клиент выбирает нужные модули, бот считает стоимость.
  • Сбор заявок мероприятия — участник набирает места или билеты.

⚠️ Когда это не подойдёт

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

⚙️ Что увидит клиент

  1. Пишет в бот «магазин» (или другое выбранное вами слово).
  2. Получает карточку первого товара: фото, название, цена, кнопки ◀ ▶ для листания, «В корзину», «Перейти в корзину».
  3. Листает каталог кнопками ◀ ▶.
  4. В нужных карточках жмёт «В корзину» — бот молча добавляет товар.
  5. Нажимает «Перейти в корзину» — видит свой заказ списком, итоговую сумму и кнопку «Оплатить» с уже подставленной суммой.
  6. Жмёт «Оплатить» — переходит на страницу платёжной системы и оплачивает.
  7. При желании может нажать «Очистить корзину» — начать сборку заново.

🔧 Что получит мастер

В админке — стандартный список оплат через подключённую платёжную систему (Ю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 с режимом «Хранить последнее значение» и значением:
    {formula:MAX({user:catalog_position}-1;1)}
    MAX с единицей — нижняя граница, чтобы листание не ушло в ноль.
  • В блоке цепной реакции («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.