Newsletter Management
Newsletter signup, subscriber management and sending for Sylius - double opt-in, categories, per-channel settings, tracking, statistics, CSV export, storefront and Shop API
Newsletter Management
This documentation always describes the latest published version.
Overview
Newsletter signup, subscriber management and sending for Sylius shops. Visitors sign up on a dedicated page or through the footer form, confirm with double opt-in and manage their subscription through a personal link, with no login. In the admin you write newsletters, send or schedule them, review the delivery log and statistics, and export the subscriber list as CSV.
Everything works in both modes: the Twig storefront and the Shop API (headless) share the same business logic. Settings apply per channel.
The plugin can be switched on per channel: as long as a channel has no enabled configuration, it offers no signup at all (the page and the Shop API answer 404, and there is no footer form).
graph LR
A["Storefront: /newsletter and footer"] --> C["NewsletterSubscriptionManager"]
B["Shop API: /shop/newsletter-subscriptions"] --> C
C --> D["Channel settings"]
D --> E["Subscription in the database"]
D --> F["Mails: confirmation, welcome"]
G["Admin: write, send, schedule newsletters"] --> H["Deliveries in the database"]
I["Cron job: mmd:newsletter:send"] --> H
H --> J["Newsletter mails to confirmed subscribers"]
Documentation
| Page | Contents |
|---|---|
| Installation and operation | Installation, setup command, update, cron jobs, uninstalling |
| Configuration | Per-channel settings, categories, admin interface, practical examples |
| Storefront integration | Signup page, footer form, confirmation, managing a subscription, unsubscribing, Twig hooks, theme notes |
| Shop API / headless | Endpoints for signup, confirmation, unsubscribing, preferences and categories, error format |
| Writing and sending newsletters | Editor, placeholders, preview and test send, send now, scheduling, delivery log |
| Tracking and statistics | Tracking modes, statistics dashboard, retention periods and cleanup |
| Extending | Event before signup, form extension, ALTCHA, overriding templates |
| Troubleshooting and FAQ | Common problems, known limitations, frequently asked questions |
| Technical details | Architecture, plugin structure, entities and tables |
Features
| Feature | Description |
|---|---|
| Signup with double opt-in | Dedicated /newsletter page and footer form; confirmation link by mail, switchable per channel |
| Prefetch-safe unsubscribe | The unsubscribe link only shows a page; the subscriber is unsubscribed only by clicking the button |
| Categories | Translatable newsletter categories, optionally restricted to certain channels; no selection means the general newsletter |
| Per-channel settings | Newsletter on/off, double opt-in, footer form, sender, privacy policy page, mailer transport, tracking, retention periods |
| Sylius checkbox becomes a real subscription | The newsletter checkbox from registration and the customer account creates a subscription with double opt-in |
| Manage without login | Welcome mail with a personal link to change name and categories and to unsubscribe |
| Newsletter editor | Subject, preheader, HTML and text, placeholders, preview, test send, duplicate |
| Sending and scheduling | Send now or schedule, delivery in batches by cron job, retries, delivery log |
| Tracking | Off, anonymous (counters only) or personal with consent |
| Statistics | Admin dashboard with subscriber trend and per-newsletter figures |
| Retention and cleanup | Periods per channel; two commands clean up subscriptions and tracking data |
| CSV export | Subscriber list from the admin, filterable by status and channel |
| Shop API | Signup, confirmation, unsubscribing, preferences and categories headless |
| Spam protection hook | Event before every signup and an extensible form, used by the ALTCHA plugin |
Requirements
| Requirement | Version | Notes |
|---|---|---|
| Sylius | ^2.2 | Tested against Sylius 2.2 and 2.3 |
| PHP | ^8.3 | |
| Symfony | ^7.4 | |
| API Platform | ^4.2.1 or ^5.0 | api-platform/doctrine-orm, api-platform/metadata and api-platform/state for the Shop API; your project's Sylius version decides which major version is installed |
| Database | MySQL or MariaDB | The migrations are written in MySQL syntax (AUTO_INCREMENT, ENGINE = InnoDB); PostgreSQL is not supported |
kernel.secret |
not empty | In Sylius taken from APP_SECRET. It signs the tracking links in the newsletters; all application servers must use the same value |
| Cron job | required | Without mmd:newsletter:send no newsletter goes out, see Installation |
License
Commercial license, all rights reserved.
Support
For questions about the license, technical questions or bugs, contact me at support@markus-michalski.net.