
Подписка с подтверждением (Double Opt-In) для OpenCart
Модуль double opt-in для OpenCart: подписка активируется только после перехода по ссылке из письма. Запись согласия с IP и датой, отписка в клик, экспорт CSV. Free до 200 подписчиков, Pro — без лимита.
- Совместимость
- OpenCart 4.0.2 – 4.1.x
- PHP
- 7.4 и новее
- Лицензия
- один сайт, навсегда
- Триал
- 7 дней, без карты, один на сайт
- Обновлено
- 26.09.2026
Что есть во Free,
а что даёт Pro
Бесплатная версия работает без ограничения по времени. Pro добавляет остальные функции из таблицы.

Триал стартует, когда вы попросите
Свежая установка — бесплатная версия, ничего не включается само. Кнопка «Попробовать Pro 7 дней» → e-mail → ключ сразу в окне и письмом.

Один ключ — один сайт
Переносите магазин — отвяжите лицензию на старом домене и активируйте на новом сами. Если наш сервер недоступен, Pro работает ещё 14 дней.
Технические требования
OpenCart 4.0.2 – 4.1.x (версии для 3.x и 2.3 — в разработке).
PHP 7.4+ (работает и на 8.0–8.3).
MySQL/MariaDB с поддержкой InnoDB и utf8mb4.
Настроенная почта магазина (Система → Настройки → Почта): модуль отправляет письма тем же транспортом, что и остальной магазин, — отдельные доступы заводить не нужно.
История версий
Список подписчиков с фильтром снова открывается на драйвере базы PDO.
Ссылки «подтвердить подписку» и «отписаться» больше не срабатывают от почтового сканера.
Купленный ключ остаётся вашим: как только наш сервер подтвердил оплату, Pro работает дальше.
Все версии (4)
Полный цикл double opt-in, подчинение штатной галочки, четыре письма с редактированием по языкам, грид подписчиков с доказательством согласия, экспорт CSV, напоминание и ретенция по…
Вместе с Подписка с подтверждением (Double Opt-In) для OpenCart покупают
4 модуля одним заказом — на 40% дешевле, чем по отдельности


Nova Poshta Premium — модуль Новая Почта для OpenCart 2.3, 3.x и 4.x

LiqPay — оплата картой для OpenCart 2.3, 3.x и 4.x

Telegram-уведомления и Viber/SMS покупателям для OpenCart
Полное описание модуля
Штатный OpenCart считает согласием саму галочку. Покупатель поставил «Подписаться на новости» при регистрации — и в базе сразу появляется customer.newsletter = 1. Ни подтверждения, ни даты, ни следа, откуда это согласие взялось. Адрес, который кто-то вписал в чужую форму регистрации, из списка уже не убрать, а доказать, что человек действительно соглашался, нечем.
Модуль превращает эту галочку в заявку. Флажок поднимается только после того, как человек перешёл по ссылке из собственного почтового ящика — и именно тогда в базе появляется запись о согласии со временем, источником и IP.
Как это выглядит для покупателя
В подвале (или там, где вы поставите форму) — поле e-mail, по желанию поле имени и кнопка. После отправки человек сразу видит: «Почти готово — проверьте почту и перейдите по ссылке в письме. До этого мы ничего вам не будем отправлять».
В письме одно действие — ссылка подтверждения. После клика открывается страница магазина в вашей теме (используется штатный шаблон common/success, поэтому вид наследуется от темы) с текстом «Подписка подтверждена». Следом приходит короткое приветственное письмо, в котором уже есть ссылка на отписку в один клик.
Если человек вводит адрес, который уже подтверждён, он видит «Этот адрес уже подписан» — и ни одного лишнего письма не получает. Это намеренно: иначе любой мог бы засыпать чужой ящик «подтверждениями», просто вводя его в форму.
Что получает админ
Отдельный грид подписчиков в настройках модуля: адрес, имя, состояние (ожидает / подтверждено / отписан / ошибка), источник (форма, кабинет, админка, импорт), язык, IP, дата заявки и дата подтверждения. Фильтры по состоянию, источнику, адресу и периоду.
Кнопка «Отправить ещё раз» для тех, кто не подтвердил. Экспорт CSV всех подтверждённых адресов — вместе с доказательством согласия (источник, IP, обе даты), в UTF-8 с BOM, чтобы Excel не превратил украинские имена в кракозябры.
Счётчики по каждому состоянию на виду, чтобы был виден реальный размер списка, а не «сколько когда-то поставили галочку».
Как это работает — шаг за шагом
- Человек оставляет адрес — в форме модуля или штатной галочкой при регистрации или в кабинете.
- Создаётся строка в собственной таблице с состоянием «ожидает», токеном, IP, user-agent, языком и источником. Если галочку поставили в штатной форме, модуль опускает
customer.newsletterобратно в 0 — пока согласия нет, его нет и в базе. - Уходит письмо с подтверждением на языке той версии сайта, с которой пришла заявка.
- Переход по ссылке переводит строку в «подтверждено», ставит дату и поднимает штатный флажок
customer.newsletter, чтобы остальной магазин видел ту же картину. - Через заданное количество часов тем, кто не подтвердил, уходит ровно одно напоминание. Строка помечается как «напомнено» независимо от того, дошло ли письмо, — чтобы мёртвый адрес не крутился в цикле.
- Неподтверждённые заявки старше N дней удаляются сами. Адрес, который не подтвердил, — не подписчик, и держать его вечно нет оснований.
Отписка работает в один клик из любого письма: переход по ссылке переводит строку в «отписан», опускает штатный флажок и (по желанию) отправляет короткое подтверждение, чтобы у человека оставалось письменное доказательство.
Что под капотом
Одна собственная таблица cc_news_subscriber: строка на пару (магазин, адрес), с состоянием, токеном и доказательством согласия. Уникальный ключ по паре не даёт задвоений, а повторная заявка от того же адреса оживляет ту же строку с новым токеном — поэтому ссылка из старого письма перестаёт действовать.
Токен — 48 шестнадцатеричных символов из random_bytes. Один и тот же токен обслуживает и подтверждение, и отписку: после подтверждения он намеренно не меняется, потому что именно на нём держится ссылка «отписаться» во всех будущих письмах.
Защита формы — скрытый honeypot вне потока документа и вне табуляции, плюс подписанный штамп времени (HMAC от параметров инсталляции), который не переписать со стороны клиента. Штамп живёт сутки, поэтому форма переживает полное кэширование страницы. Дополнительно — лимит заявок с одного IP в час и, по желанию, штатная капча магазина.
Тексты писем живут в библиотеке, а не в языковых файлах: письмо собирается из трёх разных контекстов (витрина, админка, запуск по расписанию), и язык письма — это язык подписчика, а не язык текущего запроса. Пустое поле шаблона всегда откатывается на встроенный текст, неизвестный язык — на английский.
Модуль не трогает ни одного файла ядра: работает через штатные события OpenCart и собственные маршруты витрины.
Как установить
- Расширения → Установка расширений → загрузить zip.
- Расширения → Модули → найти «Подписка с подтверждением (Double Opt-In)» → нажать «+». На этом шаге создаётся таблица и регистрируются события и задания по расписанию.
- Открыть настройки, включить модуль и сохранить.
- Вставить форму в нужное место темы:
{{ cc_newsletter }}в любом Twig-шаблоне. - Если в магазине уже есть подписчики со штатной галочкой — нажать «Импортировать существующих подписчиков». Импорт выполняется один раз и только вручную: он заводит их как подтверждённых, потому что магазин уже считает их подписчиками, и никогда не возвращает тех, кто отписался.
Вопросы
о модуле
Не нашли ответ? Напишите в Telegram — ответим в течение рабочего дня.
Не сломается ли моя регистрация?
Нет. Обработчик событий обёрнут так, что любая ошибка в нём не доходит до покупателя.
А если я не хочу, чтобы модуль трогал штатную галочку?
В настройках есть переключатель «Не трогать» — тогда работает только собственная форма модуля.
Что станет со старыми подписчиками?
Ничего, пока вы сами не нажмёте кнопку импорта. При инсталляции модуль не импортирует никого.
Сколько живёт ссылка подтверждения?
По умолчанию 72 часа, настраивается.
Удалятся ли данные при удалении модуля?
Нет. Таблица подписчиков намеренно остаётся — это доказательство согласия по каждому адресу.
Пока нет ни одного отзыва. Будьте первым.
Пока вопросов нет. Спроси — мы ответим в течение 24 часов.
Не тот вариант, что искали?
Делаем кастомные модули под WordPress, WooCommerce, OpenCart и Shopify. Расскажите о задаче — подготовим оценку.
Заказать кастомный модуль
Покупка модуля
—


