Double opt-in newsletter management for Marble CMS: subscriber lists, HTML campaigns, open/click tracking.
composer require marblecms/marble-newsletter
php artisan marble:newsletter:installPublish config:
php artisan vendor:publish --tag=newsletter-config| Key | Default | Description |
|---|---|---|
from_name |
APP_NAME |
Sender name |
from_email |
MAIL_FROM_ADDRESS |
Sender email |
double_opt_in |
true |
Require email confirmation |
confirmation_subject |
'Please confirm…' |
Confirmation email subject |
confirmation_view |
newsletter::emails.confirmation |
Confirmation email view |
{{-- Basic --}}
<x-newsletter::subscribe-form />
{{-- With list and redirect --}}
<x-newsletter::subscribe-form :list-id="1" redirect="/thank-you" />
{{-- With name field and custom button --}}
<x-newsletter::subscribe-form :show-name="true" button-label="Join us" />Props:
list-id— attach subscriber to this list (optional)redirect— URL to redirect to after submit (default/)show-name— display a name input field (defaultfalse)button-label— submit button text (defaultSubscribe)placeholder— email input placeholder
- Visitor submits the subscribe form
- If
double_opt_in = true, aConfirmationMailis sent with a unique token link - Visitor clicks the link →
GET /newsletter/confirm/{token}→ status set toconfirmed SubscriberConfirmedevent is fired
Add {{unsubscribe_url}} anywhere in your campaign body. The mailing service replaces this with the subscriber's unique unsubscribe URL before sending.
- Open tracking: a 1×1 transparent GIF pixel is appended to every campaign email
- Click tracking: wrap links using
route('newsletter.track.click', [$token, base64_encode($url)])
Navigate to Newsletter in the top nav:
| Section | Description |
|---|---|
| Overview | Stats: confirmed subscribers, lists, sent campaigns |
| Subscribers | Paginated list with status, lists, delete |
| Lists | Create/delete subscriber lists |
| Campaigns | Create, edit, view stats, send |
| Command | Description |
|---|---|
marble:newsletter:install |
Run migrations |
marble:newsletter:send {campaign} |
Send campaign by ID (for large lists / cron) |
| Event | Fired when |
|---|---|
SubscriberConfirmed |
Subscriber confirms opt-in |
SubscriberUnsubscribed |
Subscriber unsubscribes |
CampaignSent |
Campaign finished sending |
| Table | Description |
|---|---|
newsletter_subscribers |
Subscriber records |
newsletter_lists |
Named groups |
newsletter_subscriber_list |
Pivot: subscriber ↔ list |
newsletter_campaigns |
Campaign records |
newsletter_sends |
One row per subscriber per campaign |
newsletter_opens |
Open tracking events |
newsletter_clicks |
Click tracking events |