Перейти к содержимому

Неуспешные платежи и возврат выручки

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

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

Сервис нужен компаниям с регулярными списаниями по карте: подписочным продуктам, онлайн-школам, сервисам с ежемесячной оплатой. Он работает поверх платёжного провайдера и не заменяет его механизм повторных списаний.

  • Показывает каждый отказ сразу. Неуспешное списание появляется в дашборде с причиной, суммой, тарифом и клиентом, как только приходит событие от провайдера.
  • Считает выручку под риском. Общая сумма активных отказов видна на главном экране с разбивкой по причинам и возрасту.
  • Хранит историю попыток. По каждой операции видно, какие повторные списания были, когда и с каким результатом, и что ещё запланировано.
  • Выделяет значимых клиентов. Отказы по крупным суммам или у клиентов с высокой ценностью попадают в отдельную очередь с ответственным менеджером.
  • Координирует напоминания. Автоматические письма и ручные контакты отмечаются в одной ленте, чтобы клиент не получал противоречивых сообщений.
  • Причина определяет действие. Истёкшей карте нужна просьба обновить данные, а не очередной повтор списания; нехватка средств — повтор позже. Отказы группируют по коду причины и направляют каждую группу на своё действие.
  • Повторы должны быть видны. Каждую попытку провайдера и приложения записывают с временем и результатом, иначе команда не знает, что происходит автоматически.
  • Закрывайте неактуальные записи. Отказ, по которому прошла повторная оплата или подписка отменена, закрывается автоматически: на экране остаётся только текущий риск.
  • Приоритет — не очередь по времени. Пороги суммы и ценности клиента хранятся в настройках. Небольшой отказ получает автоматические повторы и письмо, крупный — сразу уведомление менеджеру.
  • Смену карты проводит провайдер. Приложение отмечает, отправлена ли ссылка на обновление данных, а ввод карты остаётся на защищённой странице платёжного сервиса. Данные карт в базе не хранят.
  • Несколько провайдеров — одна схема. События вебхуков разных сервисов приводятся к общей таблице отказов с единым справочником причин. Обработчик вебхуков проверяет подпись и не создаёт дубль при повторной доставке.
  • Когда хватит штатных средств. Если провайдер уже даёт настраиваемые повторы и письма, а команде не нужны приоритеты и ручные контакты, отдельный дашборд может быть лишним.

Промпты рассчитаны на AI-агента (Claude Code, Cursor и аналоги) в Laravel-проекте с установленным Filament 4.x. Отправляйте их по одному: каждый шаг даёт результат, который можно проверить до перехода к следующему.

Создай модели и миграции для дашборда неуспешных платежей: Customer
(ценность клиента, ответственный менеджер), Subscription (тариф, статус),
PaymentFailure (подписка, провайдер, внешний id операции, сумма, валюта,
код причины, нормализованная причина, статус: активен, восстановлен,
закрыт), RetryAttempt (отказ, время, результат, инициатор: провайдер или
приложение), Outreach (отказ, канал, тип: автоматическое письмо или
ручной контакт, автор, время). Добавь фабрики с демо-данными.
Сделай контроллер вебхуков для платёжного провайдера с проверкой
подписи. Событие неуспешного списания создаёт PaymentFailure, событие
повторной попытки — RetryAttempt, успешная оплата или отмена подписки
закрывают активный отказ. Повторная доставка события не создаёт дубль.
Код причины переводи в нормализованную причину по таблице соответствия.

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

Сгенерируй Filament-ресурс для PaymentFailure с вкладками по
нормализованной причине и фильтрами по сумме, возрасту и менеджеру.
Добавь вкладку «Приоритетные» для отказов выше порога суммы или
ценности клиента из конфига. В карточке покажи историю попыток и
контактов через relation managers.
Добавь действия в карточке отказа: «Отправить ссылку на обновление
карты» (только фиксирует факт отправки и канал), «Записать ручной
контакт» и «Закрыть с причиной». Если за последние сутки уже был
контакт, перед новым показывай предупреждение.
Добавь виджеты выручки под риском по причинам и возрасту и доли
восстановленных платежей за период. Крупный отказ отправляет уведомление
в панели ответственному менеджеру. Настрой доступ: менеджер видит
своих клиентов, финансовая команда — все отказы.