Запрос "lava оплата в telegram боте для курса" обычно появляется в момент, когда онлайн-школа уже продает через Telegram, но платежи еще живут отдельно: ссылка в личке, таблица оплат, ручная выдача доступа, поддержка с вопросом "я оплатил, где уроки". Правильное решение не сводится к кнопке "Оплатить". Нужно связать оффер, сумму, ученика, внешний номер заказа, webhook от LAVA, статус покупки, CRM и сценарий доступа.

Короткий вывод: LAVA подходит для продажи курса в Telegram, если бот не просто отправляет ссылку, а создает счет под конкретного ученика, хранит pending-заказ, принимает подписанный webhook и только после подтверждения переводит покупку в оплаченный статус. В Strelo эта логика собирается вокруг ноды заказа, карточки контакта, покупок, тегов, полей и последующих веток сценария.

Коротко: LAVA отвечает за счет и платежную форму, а Strelo связывает оплату с учеником, CRM, тегами, доступом и аналитикой. Не выдавайте курс по клику на кнопку. Дождитесь подписанного webhook и статуса completed.
Для кого

Кому поможет этот разбор

Онлайн-школа

Нужно принимать оплату за курс, тариф, клуб или вебинар и автоматически выдавать доступ после подтверждения.

Продюсер запуска

Важны кнопка оплаты, дожим неоплативших, статусы заказа, выручка и понятный контроль менеджеров.

Администратор воронки

Нужно настроить LAVA, webhook, переменные заказа, теги после оплаты и безопасную ветку поддержки.

Что на самом деле нужно онлайн-курсу

Для курса важен не сам факт оплаты, а операционная цепочка после нее. Ученик должен понять, что он покупает, оплатить в удобной форме, вернуться в Telegram, получить доступ, а команда должна увидеть выручку, статус, источник и точку, где люди бросают оплату.

Официальная страница LAVA про Telegram прямо описывает сценарии монетизации бота или канала, выставление счетов в мессенджерах, API для автоматизации и выдачу ссылок или файлов после успешной оплаты. Для онлайн-школы это полезная база, но в продуктовой реализации нужен еще слой CRM и контроля статусов.

Карта решения

Что закрывает LAVA и что должен закрывать бот

Платежная форма полезна только вместе с учетом заказа, статусом ученика и следующим действием после оплаты.

КритерийLAVATelegram-ботCRM и курс
До оплатыСоздание счета и платежной ссылкиОффер, сумма, тариф, кнопка и объяснение результатаКонтакт, продукт, внешний номер заказа, источник
Во время оплатыCheckout и обработка платежаОжидание статуса и fallback на поддержкуpending-покупка без завышения выручки
После оплатыWebhook с результатом счетаСообщение об успехе и следующий шагcompleted, тег, доступ, аналитика, поддержка
Если любой слой отсутствует, ученик может оплатить, но команда не сможет надежно выдать доступ и посчитать результат.
Оффер курса: продукт, тариф, цена, обещание результата
Заказ в боте: contactId, orderId, сумма, pending
LAVA invoice: payment_url, hookUrl, срок действия
Webhook: подпись, статус, внешний номер заказа
CRM и доступ: completed, тег, поле, сообщение ученику
Для курса нужно держать вместе платежный, CRM и обучающий контур.

Как выглядит рабочий маршрут

В рабочем маршруте Telegram-бот не спрашивает администратора, прошла ли оплата. Он заранее создает заказ, получает платежную ссылку, отправляет ее ученику, ждет webhook и меняет статус только после проверки подписи. Такой подход защищает от дублей, случайных сообщений, ручной выдачи доступа без оплаты и потери контекста в поддержке.

Маршрут

Как проходит оплата курса через LAVA

  1. Выбор курса

    Ученик выбирает продукт или тариф в Telegram. Бот фиксирует сумму, описание и контакт.

  2. Создание счета

    Strelo отправляет в LAVA сумму, orderId, shopId, hookUrl и дополнительные поля.

  3. Оплата

    Ученик переходит по платежной ссылке, оплачивает и возвращается к инструкциям в Telegram.

  4. Подтверждение

    LAVA присылает webhook, обработчик проверяет подпись и переводит покупку в completed.

  5. Доступ

    Бот выдает доступ, ставит тег, обновляет поле контакта и запускает сопровождение.

Strelo

Какие части уже связаны в рабочем контуре

Интеграцияключи
shop_id

В настройках хранится проект LAVA, секрет для запросов и ключ проверки webhook.

Счетpayment_url
invoice

Нода заказа создает счет, сохраняет ссылку и внешний номер заказа.

Покупкадо webhook
pending

Покупка появляется до оплаты, но не считается выручкой до статуса completed.

Контактпосле оплаты
CRM

После webhook можно применить теги, метки, поля и ветку доступа.

Что настроить в LAVA и Strelo

Для подключения нужны проект LAVA, идентификатор магазина, ключ для подписи запросов и ключ для проверки webhook. В интерфейсе Strelo это хранится в интеграции продаж. В сценарии курса администратор выбирает подключение LAVA, задает сумму, товар или описание платежа, срок действия счета и действия после оплаты.

Важный момент: описание платежа должно быть понятно ученику и поддержке. Не стоит писать только "курс" или "доступ". Лучше фиксировать конкретный продукт: "Курс по запускам, тариф База" или "Клуб, месяц июль". Тогда при споре, возврате или вопросе менеджер видит контекст без поиска в переписке.

Настройка

Какие поля нужны до запуска

Лучше заполнить их заранее, чем разбирать ошибки во время продаж.

КритерийПолеЗачем нужноОшибка при пропуске
shop_idПроект LAVAПонимать, от какого магазина создается счетСчет не создается
secret_keyПодпись запросовПодписать JSON тела создания счетаLAVA отклонит запрос или вернет ошибку подписи
additional_keyПроверка webhookПроверять входящее уведомление от LAVAНельзя безопасно доверять payload
Название интеграцииВнутренний ориентирОтличать школу, продукт или проектКоманда путает подключения
Для боевого курса не запускайте оплату без проверки соединения и тестового платежа.
Счет

Какие данные уходят в LAVA invoice

Поля должны помогать не только оплате, но и последующему учету ученика.

КритерийПолеЧто означаетПрактика для курса
sumСумма счетаЧисло с точностью до копеекБрать из каталога продукта или переменной тарифа
orderIdВнешний номер заказаУникальный ID в системе мерчантаСвязывать webhook с pending-покупкой
hookUrlURL уведомленийКуда LAVA отправляет результатВести на endpoint интеграции Strelo
customFieldsДополнительные поляДо 500 символов по документации LAVAПередавать contactId как запасной контекст
expireСрок жизни счетаПо документации LAVA максимум 5 днейДля вебинара ставить короче, для курса без дедлайна длиннее
Главная связка для автоматизации курса: orderId, hookUrl и contactId.

Почему webhook важнее кнопки

Кнопка оплаты отвечает только за переход ученика на checkout. Решение о доступе должно принимать не сообщение ученика и не успешный редирект, а webhook от платежного провайдера. В документации LAVA для счета есть поле hookUrl, куда отправляется уведомление, а подпись строится через HMAC SHA256 по точной JSON-строке запроса. Поэтому интеграция должна подписывать исходящий запрос и проверять входящий webhook по сырым данным.

В Strelo webhook принимает публичный endpoint коммерческой интеграции. Сначала загружается интеграция, затем проверяется подпись, потом payload разбирается в нормализованную покупку. Для LAVA контакт сначала ищется по уже созданной pending-записи с тем же order_id, а customFields используется как запасной контекст. Это снижает риск, что произвольный payload подменит ученика.

Не выдавайте доступ по редиректу на success-страницу и не верьте тексту от ученика. Доступ должен открываться после подписанного webhook, проверки статуса и сопоставления с pending-заказом.
  1. 1
    Бот создал заказ и payment_url
  2. 2
    CRM сохранила pending-покупку
  3. 3
    Ученик оплатил счет LAVA
  4. 4
    Webhook подтвердил статус completed
  5. 5
    Бот выдал доступ и запустил сопровождение
До webhook заказ ожидает оплаты. После webhook он становится основанием для доступа.

Pending, completed и доступ к курсу

Самая частая ошибка в оплате курса через Telegram: считать покупку оплаченной сразу после клика по кнопке. Между кликом и подтверждением есть несколько состояний. Ученик мог открыть форму, закрыть ее, не пройти банк, оплатить позже или оплатить, но webhook задержался. Поэтому в CRM нужен pending-заказ, а не мгновенная выручка.

Когда LAVA возвращает успешный статус, покупка становится completed. В этот момент можно применить тег, метку CRM, поле контакта, отправить доступ, открыть ветку сопровождения или запустить задачу менеджеру. Если статус failed или refunded, доступ не выдается автоматически, а команда видит причину для поддержки.

Статусы

Как читать состояния платежа

Статус нужен не для красоты в CRM, а для правильного действия в боте.

КритерийСтатусЧто значитЧто делает бот
pendingСчет созданУченик еще не подтвердил оплатуПоказывает кнопку, поддержку и напоминание
completedОплата подтвержденаWebhook прошел проверкуВыдает доступ, ставит тег, запускает курс
failedОплата не завершенаОшибка, отмена или истекший счетПредлагает новую попытку или поддержку
refundedВозвратДеньги возвращены или платеж отменен после оплатыОтмечает контакт и передает в ручной процесс
Доступ к курсу должен зависеть от completed, а не от факта открытия платежной формы.
После оплаты

Что можно автоматизировать в момент completed

Доступ

Отправить ссылку на уроки, кабинет, закрытый канал или инструкцию по старту.

CRM

Поставить тег покупателя, метку тарифа и поле с датой покупки.

Сопровождение

Запустить цепочку онбординга, напоминаний и контроль первого шага.

Аналитика

Передать сумму, продукт, источник и статус в отчет по воронке.

Доступ

Пример ветки после оплаты

  1. Проверить статус

    Ветка запускается только для completed-покупки с подписанным webhook.

  2. Обновить контакт

    CRM получает тег курса, тариф, дату оплаты и внешний номер заказа.

  3. Выдать инструкцию

    Ученик получает ссылку на обучение, правила доступа и первый шаг.

  4. Оставить поддержку

    Если доступ не открылся, ученик сразу видит кнопку связи с менеджером.

Как учитывать разные тарифы курса

У курса редко бывает только одна цена. Есть базовый тариф, расширенный тариф с куратором, VIP-доступ, рассрочка, клубная подписка, ранняя цена и спецпредложение после вебинара. Если все эти варианты вести одной безымянной ссылкой, команда быстро потеряет связь между оплатой и обещанным форматом участия.

Лучше заранее договориться, что именно попадает в заказ. Название продукта отвечает на вопрос "что купил ученик", тариф отвечает на вопрос "какой объем доступа обещан", сумма отвечает на вопрос "сколько денег должно быть в отчете", внешний номер заказа отвечает на вопрос "какой webhook обновил статус". Тогда даже при ручной поддержке менеджер видит не просто "оплачен", а конкретную покупку.

Если тариф выбирается в боте, сумму можно брать из каталога продукта или из переменной. Если тариф выбирается на вебинаре, сценарий может заранее поставить переменную с нужной ценой и описанием. Если цена персональная, менеджер должен понимать, где она появилась и почему именно такая сумма ушла в LAVA.

Тарифы

Как разные модели курса влияют на оплату

Чем сложнее тарифная сетка, тем важнее хранить в заказе не только сумму.

КритерийМодельЧто записать в заказЧто выдать после оплаты
Один курсНазвание, цена, дата покупкиproductId, amount, orderIdСсылка на уроки и стартовое сообщение
Несколько тарифовБаза, куратор, VIP или клубtierId, тариф, срок доступаРазные теги, разные инструкции и разные чаты
Вебинарный офферЦена зависит от дедлайнаexpire, сегмент, источникБонус, запись вебинара или консультация
Ручная продажаМенеджер согласовал ценуКомментарий, сумма, ответственныйЗадача менеджеру и проверка доступа
Тариф должен быть виден в CRM до выдачи доступа, иначе поддержка будет сверять обещания вручную.

Как не смешать оплату и выдачу доступа

Оплата и доступ - разные события. Оплата означает, что деньги прошли и webhook подтвердил счет. Доступ означает, что ученик получил право войти в уроки, канал, кабинет или закрытый чат. Иногда эти события происходят почти одновременно, но в системе их лучше разделять.

Такой разрыв помогает в спорных ситуациях. Например, ученик оплатил, но написал другой email для LMS. Или оплатил тариф с куратором, но попал в общий поток. Или прошел возврат, а доступ еще активен. Если в CRM есть отдельные поля "статус оплаты", "тариф", "срок доступа" и "канал выдачи", поддержка решает вопрос быстрее и без поиска по нескольким таблицам.

В простом запуске достаточно тега "оплатил курс", метки тарифа и сообщения со ссылкой. В зрелом запуске добавляются дата старта, срок доступа, куратор, группа, источник заявки, UTM или пост, из которого пришел ученик. Главное не пытаться собрать все сразу. Сначала зафиксируйте платежный минимум, потом расширяйте модель данных.

Данные

Что хранить отдельно от факта оплаты

Статус оплаты

pending, completed, failed или refunded. Это основание для следующего действия.

Тариф

Название продукта, уровень доступа, срок и обещанные материалы.

Срок доступа

Когда ученик начинает обучение и когда нужно продлить или закрыть доступ.

Ответственный

Кто помогает ученику при проблеме с оплатой, LMS или входом в канал.

В Strelo платежный сценарий связан с CRM, контактами, рассылками, AI и аналитикой в одном кабинете.
В Strelo платежный сценарий связан с CRM, контактами, рассылками, AI и аналитикой в одном кабинете.

Как написать сообщение с кнопкой оплаты

Сообщение перед кнопкой влияет на конверсию не меньше, чем провайдер. В нем должны быть продукт, сумма, что произойдет после оплаты и куда писать, если банк или checkout не открылись. Чем меньше неопределенности, тем меньше нагрузка на поддержку.

Плохой вариант: "Оплатите по ссылке". Хороший вариант: "Вы выбрали курс по запускам, тариф База. Стоимость 18 900 рублей. После оплаты бот пришлет ссылку на личный кабинет и инструкцию по старту. Если форма не открылась, нажмите Поддержка". В таком сообщении нет перегруза, но есть все, что нужно ученику.

UX оплаты

Что должно быть рядом с кнопкой

Что покупает ученик

Название курса, тариф, период доступа и формат результата.

Сколько и как оплатить

Сумма, валюта, кнопка и короткое объяснение платежной формы.

Что будет после оплаты

Когда придет доступ, где искать уроки и что делать при задержке.

Куда писать

Кнопка поддержки снижает тревогу и снимает часть ручных вопросов.

Команда видит путь ученика в Telegram и может продолжить диалог с контекстом заказа.
Команда видит путь ученика в Telegram и может продолжить диалог с контекстом заказа.

Что должна видеть поддержка

После оплаты ученик чаще всего пишет в поддержку не потому, что система сломалась, а потому что он не понял следующий шаг. Поэтому карточка контакта должна отвечать на простые вопросы: какой курс куплен, какая сумма, какой статус, когда создан счет, когда пришло подтверждение, какая ссылка была отправлена и какая ветка сценария сработала.

Если поддержка видит только переписку, она вынуждена спрашивать чек, искать оплату в кабинете провайдера и сверять имя вручную. Это медленно и плохо выглядит для ученика. Если поддержка видит покупку рядом с диалогом, она может ответить сразу: "Оплата прошла, доступ отправлен в сообщении выше" или "Вижу счет, но webhook еще не подтвердил платеж, пришлю новую ссылку".

Для дорогого курса это критично. Покупатель уже сделал сильное действие, и любой ручной хаос после оплаты снижает доверие к продукту. Хорошая оплата в боте должна быть незаметной: ученик нажал, оплатил, получил доступ, а менеджер вмешался только при отклонении банка или нестандартном вопросе.

Поддержка

Что помогает отвечать без ручной сверки

Покупка в CRM

Менеджер видит сумму, продукт, статус и внешний номер заказа.

Ссылка оплаты

Можно отправить повторно или понять, какой счет открыл ученик.

История webhook

Помогает отделить задержку банка от ошибки интеграции.

Готовые ответы

Для failed, pending, completed и возврата нужны разные шаблоны.

Как считать платежную воронку

После подключения LAVA нужно смотреть не только итоговую выручку. Для курса важно разделить путь на шаги: увидели оффер, нажали оплату, открыли форму, оплатили, получили доступ, начали обучение. Если провал находится до кнопки, проблема в оффере. Если после кнопки, проверьте checkout, способы оплаты, доверие, срок действия счета и понятность возврата в Telegram.

Воронка

Какие шаги считать в оплате курса

Примерная модель диагностики. После запуска замените значения реальными данными.

Увидели оффер100%

Стартовая аудитория предложения

Нажали оплату46%

Проверяет оффер, доверие и цену

Открыли checkout38%

Проверяет ссылку, форму и устройство

Оплатили29%

Показывает качество платежного шага

Получили доступ28%

Проверяет webhook и post-payment ветку

Это шаблон измерения, а не отраслевой benchmark.
Дожим

Что делать с неоплаченным счетом

  1. Пауза

    Подождите разумное время после создания счета, не давите сразу.

  2. Напоминание

    Напомните, что место, тариф или бонус сохраняются до указанного срока.

  3. Поддержка

    Дайте кнопку для вопроса, если форма не открылась или банк отклонил оплату.

  4. Новый счет

    Если срок истек, создайте новый счет вместо повторного использования старой ссылки.

Какие данные нужны для отчета

Отчет по продажам курса должен отвечать не только на вопрос "сколько денег пришло". Он должен показывать, какие офферы привели к оплатам, где люди бросили платеж, какие тарифы покупают чаще и какие источники дают учеников с меньшим числом обращений в поддержку.

Минимальный набор данных: contactId, orderId, invoiceId, сумма, валюта, продукт, тариф, статус, время создания счета, время подтверждения, источник входа и ссылка на сценарий. Для рекламы полезно дополнить это UTM, каналом, постом или сегментом. Для операционной команды полезны метки: доступ выдан, поддержка нужна, возврат, ручная проверка.

Если этих данных нет, владелец курса видит только итоговую выручку. Он не понимает, сколько людей нажали оплату, сколько открыли форму, сколько не завершили банк и сколько дошли до доступа. Поэтому интеграция LAVA должна быть частью аналитики, а не отдельной платежной ссылкой.

Отчетность

Минимальный контракт данных по оплате курса

Эти поля позволяют связать рекламу, Telegram, платеж и доступ.

КритерийДанныеЗачем нужныКому полезны
contactIdУченик в CRMСвязать оплату с перепиской и тегамиПоддержке и менеджеру
orderIdВнешний номер заказаСопоставить счет, webhook и покупкуАдминистратору и разработчику
product и tierКурс и тарифПонять, какой доступ обещанКуратору и LMS-администратору
sourceКанал входаСчитать окупаемость оффераМаркетологу и владельцу
Без этого минимума платежи есть, но управляемой воронки курса нет.
Платежная аналитика полезна, когда заказ связан с источником, статусом и шагом воронки.
Платежная аналитика полезна, когда заказ связан с источником, статусом и шагом воронки.

Где обычно ломается запуск

Большинство проблем появляется не из-за LAVA как провайдера, а из-за неполной схемы вокруг него. Нет описания товара, срок счета слишком короткий, webhook не проверяется, дубль уведомления создает повторную покупку, а поддержка не видит, какой заказ открывал ученик.

Риски

Четыре сбоя, которые нужно закрыть

Webhook не дошел

Проверьте доступность endpoint, логи, повтор доставки и ответ обработчика.

Подпись не совпала

Не выдавайте доступ. Логируйте ошибку без секретов и проверяйте ключи.

Нет pending-заказа

Платеж трудно связать с учеником. Нужны orderId и сохраненная покупка до оплаты.

Нет поддержки

Ученик оплатил, но не понял следующий шаг. Добавьте явный маршрут помощи.

LMS

Как связать Telegram-продажу и обучение

LAVA подтверждает оплату, но место выдачи уроков может быть разным.

КритерийГде учится ученикЧто делает TelegramЧто проверить
Закрытый каналМатериалы в TelegramВыдает ссылку и инструкциюПравила доступа, модерация, удаление после возврата
LMSУроки в отдельной системеПередает оплату, тариф и контактМатчинг ученика, email, срок доступа
Ручной доступМенеджер выдает доступСоздает задачу и показывает статусSLA поддержки и журнал действий
Для старта достаточно Telegram-доступа, но правила возврата и поддержки лучше описать заранее.
Юридические и налоговые требования к чекам, возвратам, оферте и обработке персональных данных зависят от модели бизнеса. Перед боевым запуском проверьте их с бухгалтером или юристом.

Минимальный запуск за один день

Для первой версии не нужно строить сложную LMS-архитектуру. Достаточно одного продукта, одной цены, понятного сообщения, LAVA-интеграции, pending-покупки, webhook, тега "оплатил", сообщения с доступом и отдельной ветки поддержки для проблемных оплат. Сложность лучше добавлять после первых реальных платежей.

Запуск

Минимальный checklist перед продажей

Подключение

shop_id, secret_key и additional_key сохранены, проверка соединения прошла.

Продукт

Указаны название курса, тариф, сумма, валюта и понятное описание платежа.

Webhook

Подпись проверяется, orderId связывается с pending-покупкой, дубль не создает выручку дважды.

Доступ

После completed ученик получает инструкцию, тег, поддержку и следующий шаг.

QA

Тесты перед рекламным трафиком

Проверяйте не только оплату, но и весь путь ученика.

КритерийТестЧто должно случитьсяЧто считать ошибкой
Успешный платежОплатить тестовый курсcompleted, тег, доступ, сообщениеДоступ не выдан или нет покупки в CRM
Отказ оплатыЗакрыть форму или получить failedДоступ не выдается, есть повторная попыткаКурс открыт без confirmed webhook
Дубль webhookПовторить уведомление с тем же orderIdПокупка не задваивается, триггер не стреляет второй разДве покупки или два доступа
ПоддержкаНаписать вопрос после оплатыМенеджер видит заказ, статус и продуктНужно искать оплату вручную
Платежный сценарий готов только после теста успеха, отказа, дубля и поддержки.

Когда не стоит усложнять

Если вы продаете первый мини-курс на маленькую аудиторию, не нужно сразу строить сложную карту статусов, LMS-синхронизацию и десяток тарифов. Начните с одного продукта, одной цены, понятного сообщения и одного сценария после оплаты. Цель первой версии - доказать, что ученик может пройти путь без ручной сверки.

Но даже в самой простой версии не стоит жертвовать тремя вещами. Первая - уникальный orderId, чтобы webhook можно было связать с заказом. Вторая - pending-покупка, чтобы команда видела, кто начал оплату. Третья - проверка подписи, чтобы доступ не открывался от случайного запроса. Все остальное можно нарастить после первых платежей.

Когда появятся повторные запуски, несколько тарифов, кураторы и партнерские источники, структура уже будет готова. Вы добавите сегменты, отчеты, дожимы, новые поля контакта и интеграцию с LMS без переделки базовой платежной логики. Это и есть смысл правильной связки LAVA и Telegram-бота: сначала надежность, потом масштабирование.

Итог

LAVA в Telegram-боте для курса стоит внедрять как платежный контур, а не как отдельную ссылку. Счет должен быть связан с учеником, статус должен приходить через webhook, CRM должна хранить pending и completed, а доступ должен выдаваться только после подтверждения. Тогда Telegram становится не просто местом переписки, а каналом продажи, оплаты, учета и сопровождения ученика.

Для команды онлайн-школы это меняет ежедневную работу. Продюсер видит выручку и потери на шагах, администратор понимает, кому выдан доступ, менеджер отвечает с контекстом заказа, а ученик не ждет ручной сверки. Именно такая связка нужна, когда курс продается внутри Telegram, а не через набор разрозненных ссылок.

Strelo

Соберите оплату LAVA как часть Telegram-воронки

В Strelo можно связать курс, счет LAVA, кнопку оплаты, webhook, CRM, доступ, теги и аналитику без ручной сверки оплат в таблицах.

Открыть Strelo

Частые вопросы

LAVA сама выдаст доступ к курсу?

Нет. LAVA принимает платеж и отправляет уведомление. Доступ должен выдать бот или LMS после проверки статуса оплаты.

Можно ли отправлять ученику обычную ссылку LAVA без CRM?

Можно, но это слабая схема для курса. Без CRM труднее понять, кто оплатил, кому выдан доступ и где потерялись заявки.

Что такое hookUrl в оплате LAVA?

Это адрес, на который LAVA отправляет уведомление о результате счета. Для автоматизации курса он должен вести на обработчик интеграции.

Почему нельзя выдавать доступ сразу после перехода на successUrl?

Редирект показывает маршрут пользователя, но не является надежным подтверждением платежа. Для доступа нужен подписанный webhook и статус completed.

Какие поля нужны в сообщении с кнопкой оплаты?

Название курса, тариф, сумма, что произойдет после оплаты, срок действия предложения и кнопка поддержки.

Как обрабатывать повторный webhook?

Система должна использовать orderId и idempotency-логику, чтобы повтор уведомления не создавал вторую покупку и не запускал доступ дважды.