# Учебный черновик: два напоминания о корзине Это собственная учебная модель редакции, а не результат генерации RetailCRM. Никакая CRM не подключена; сообщения не отправляются. Все идентификаторы вымышлены, контактов и данных клиентов нет. ## Что считаем правильным Условный магазин хочет сначала напомнить о корзине без скидки, а затем предложить учебный промокод. Интервалы 1 час и 24 часа, тексты, ключ повтора и правила остановки придуманы для упражнения. Это не рекомендации по частоте, правовое заключение или описание внутренней реализации RetailCRM. 1. Вход: событие «корзина оставлена». Проверить актуальные согласие на выбранный маркетинговый канал и отсутствие оплаты. Неизвестное значение не считать разрешением. Если проверка не пройдена — остановиться без сообщений. 2. Проверить ключ `(клиент, корзина, версия цепочки)`. Второй вход по тому же ключу не запускает ещё одну цепочку: ни во время ожидания, ни после завершения. Новая корзина — отдельный ключ; общую частоту контактов с клиентом эта модель не ограничивает. 3. До наступления срока шага вернуть «ожидать»; ранний вызов ещё не проверяет согласие и оплату и не закрывает цепочку. Через 1 час от входа заново проверить оплату и согласие. Если всё в порядке — записать только намерение первого сообщения: «В корзине остались товары. Проверить корзину». Никакой скидки в нём нет. Если данные не позволяют продолжить — завершить всю цепочку, не только один шаг. 4. Второе сообщение — не раньше 24 часов от входа и не раньше 23 часов после фактической отметки первого напоминания: берём более поздний срок. Если первый шаг запоздал, второе сообщение переносится, а не следует сразу за ним. Когда срок наступил, заново проверить оплату, согласие и актуальность учебного промокода. Первое напоминание уже должно быть отмечено. При пропущенном первом шаге второй запрещён. 5. Промокод действует только при `момент проверки < promo_expires_at`. Ровно в момент окончания он уже недействителен. Просрочка или неизвестный срок — завершить цепочку без второго сообщения и без автоматической замены предложения. 6. Если все проверки пройдены — записать намерение второго сообщения: «Учебный код DEMO-CODE ещё действует. Проверить корзину». Это условный текст без обещания размера скидки. Отметить цепочку завершённой. 7. Повторная обработка уже выполненного шага не создаёт второго намерения сообщения. В этом офлайн-упражнении отметка и запись намерения происходят последовательно в одном процессе. Сбои записи, конкурентные обработчики, доставка и повтор отправки не моделируются. Перед КАЖДЫМ намерением сообщения используются входные данные именно этого момента, а не снимок при входе. При переносе в настоящую CRM отдельно нужно проверить свежесть данных, соответствие согласия каналу и содержанию, отписку, общий лимит контактов, ассортимент/остатки/цены, границы времени, сбои доставки и атомарность защиты от дублей. Офлайн-карта не даёт допуска к запуску рассылки. ## Схема на бумаге Вход → актуальные согласие/оплата → защита от повторного входа → ожидание 1 ч → актуальные согласие/оплата → первое намерение → ожидание до более позднего из сроков: 24 ч от входа / 23 ч после первого намерения → актуальные согласие/оплата + первое намерение + срок промокода → второе намерение → конец. На любой запретительной ветви — конец без следующего сообщения. Повтор входа или шага — пропуск повтора без нового намерения; исходная допустимая цепочка может продолжиться.