On this page
- What You Will Build
- Premium Plugins
- Prerequisites
- Overview
- Installing the Plugin
- Installing Responsiv.Campaign
- Creating a Subscriber List
- Generating the Default Template
- How Campaign Templates Work
- Signup Form
- Creating the Signup Partial
- How the Form Works
- Including the Partial
- How Email Confirmation Works
- Creating Confirmation and Unsubscribe Pages
- Try It Out
- Sending Campaigns
- Creating a Campaign
- Editing Campaign Content
- Personalization Tags
- Previewing and Testing
- Launching the Campaign
- Campaign Statuses
- Scheduling and Automation
- Try It Out
- Customizing the Template
- Opening the Template
- Understanding the Syntax Fields
- Template Tags
- Customizing the Design
- Creating Multiple Templates
- Dynamic Campaigns
- What Are Dynamic Templates
- Creating the Blog Digest Template
- How Dynamic Rendering Works
- Adding Subscribers on Registration
- Setting Up a Repeating Campaign
- Summary
- Managing Subscribers
- Going Further
In this tutorial, you will build a mailing list system for your website. Visitors subscribe through a signup form, you compose professional HTML email campaigns in the backend, and the plugin handles sending, tracking, and unsubscribing automatically. You will also create a dynamic template that pulls your latest blog posts into a recurring newsletter.
What You Will Build
- A subscriber list with a frontend signup form and email confirmation
- A campaign template for sending professional HTML emails
- Backend tools for composing, previewing, and launching campaigns
- A customized email template with your own branding and layout
- A dynamic campaign that automatically includes your latest blog posts
Premium Plugins
Responsiv.Campaign is a premium plugin available from the October CMS Marketplace. Premium plugins work exactly like free plugins: you install them the same way and use their components identically. The only difference is that premium plugins require a license to install.
Prerequisites
Before starting this tutorial, make sure you have:
- October CMS installed and running
- A theme with a default layout that includes Tailwind CSS and the AJAX framework
- The Creating a Blog tutorial completed (for the Dynamic Campaigns section)
- Mail configured in Settings > Mail Configuration (campaigns send real emails)
Overview
- Installing the Plugin: install Responsiv.Campaign, create a subscriber list, and generate the default campaign template
- Signup Form: build a subscription form partial with email confirmation
- Sending Campaigns: compose and launch your first email campaign
- Customizing the Template: replace the default template with your own branding and layout
- Dynamic Campaigns: create a blog digest template with repeating sends
Installing the Plugin
The Responsiv Campaign plugin provides everything you need for email marketing: subscriber management, campaign composition with a visual editor, template syntax fields, scheduled and staggered sending, open tracking, and automatic unsubscribe handling.
Installing Responsiv.Campaign
Navigate to Settings > Updates & Plugins > Install Packages and search for "Responsiv.Campaign". Click Install to add it to your project.
Alternatively, install via the command line:
php artisan plugin:install Responsiv.Campaign
After installation, you will see a new Mailing List section in the backend navigation with links to Campaigns, Lists, Subscribers, and Settings.
Creating a Subscriber List
Navigate to Mailing List > Lists and click New List. Create a list with the following details:
| Field | Value |
|---|---|
| Name | Newsletter |
| Code | newsletter |
Subscriber lists are opt-in groups that visitors join via signup forms on your site. You can create multiple lists for different purposes (e.g., a product updates list and a blog digest list). Each list tracks its own subscribers independently.
Generating the Default Template
Navigate to Mailing List > Campaigns and click New Campaign. Since no campaign template pages exist yet, the plugin offers to generate one for you. Click Create a Default Template to create a default CMS page at campaign/default-template.htm with the campaignTemplate component already attached.
This page serves as the HTML scaffold for all your campaign emails. You will customize it later, but the default template gives you a working starting point with a header, banner image, content sections, and footer.
After the template is generated, close the campaign creation dialog. You will create your first campaign after setting up the signup form.
How Campaign Templates Work
Campaign templates are CMS pages with the campaignTemplate component. Unlike regular pages, they do not use a site layout. Instead, they contain a complete HTML email document with inline styles and table-based formatting (required for email client compatibility).
Templates use a special syntax for editable fields:
{text name="greeting" label="Greeting"}Default value{/text}: a single-line text input{textarea name="intro" label="Introduction"}{/textarea}: a multi-line text input{richeditor name="body" label="Content"}{/richeditor}: a WYSIWYG content editor{fileupload name="banner" label="Banner image"}{/fileupload}: a file upload field{repeater name="sections" prompt="Add section"}...{/repeater}: repeatable groups of fields
When you create a campaign and select a template, these syntax fields appear as an editable form in the backend. The content you enter is rendered into the template HTML and sent to subscribers.
Signup Form
Now that you have a subscriber list and campaign template, you need a way for visitors to join your mailing list. In this step, you will build a signup form as a CMS partial so it can be included anywhere on your site.
Creating the Signup Partial
Create a new partial at partials/subscribe-form.htm:
[campaignSignup]
list = "newsletter"
confirm = 1
templatePage = "campaign/default-template"
==
<div id="subscribe-form">
<h3 class="text-lg font-semibold mb-3">
Subscribe to our newsletter
</h3>
<form
data-request="campaignSignup::onSignup"
data-request-update="{ subscribe_result: '#subscribe-form' }"
>
<div class="flex flex-col sm:flex-row gap-2 mb-2">
<input
name="first_name"
type="text"
placeholder="First name"
class="px-3 py-2 border border-gray-300 rounded-md text-sm"
/>
<input
name="last_name"
type="text"
placeholder="Last name"
class="px-3 py-2 border border-gray-300 rounded-md text-sm"
/>
</div>
<div class="flex gap-2">
<input
name="email"
type="email"
placeholder="you@example.com"
class="flex-1 px-3 py-2 border border-gray-300 rounded-md text-sm"
required
/>
<button
type="submit"
data-attach-loading
class="px-4 py-2 bg-blue-600 text-white text-sm rounded-md hover:bg-blue-700"
>
Subscribe
</button>
</div>
<p class="text-xs text-gray-500 mt-2">
We will never spam or share your email address.
</p>
</form>
</div>
The result partial is rendered after the form is submitted. Create a new partial at partials/subscribe_result.htm:
{% if error %}
<div class="p-3 bg-red-50 text-red-700 text-sm rounded-md">
{{ error }}
</div>
{% elseif isThrottled %}
<div class="p-3 bg-yellow-50 text-yellow-700 text-sm rounded-md">
Please wait a few minutes before making another subscription request.
</div>
{% elseif requireConfirmation %}
<div class="p-3 bg-green-50 text-green-700 text-sm rounded-md">
We have sent you an email to confirm your subscription. Please check your inbox.
</div>
{% else %}
<div class="p-3 bg-green-50 text-green-700 text-sm rounded-md">
You are now subscribed. Welcome aboard!
</div>
{% endif %}
How the Form Works
The form uses data-request="campaignSignup::onSignup" to call the signup handler. The campaignSignup:: prefix is the component alias, which is needed because the partial can be included on any page.
The data-request-update attribute tells the AJAX framework to replace the #subscribe-form container with the subscribe_result partial after the handler completes. This gives the visitor immediate feedback without a full page reload.
The component properties control the behavior:
list = "newsletter": the subscriber is added to the "Newsletter" list you created earlierconfirm = 1: the subscriber must confirm their email address before they are fully addedtemplatePage = "campaign/default-template": the CMS page used to generate the email confirmation URL
Including the Partial
Add the signup form to any page or layout using the partial tag. For example, to add it to the footer of your default layout:
<footer class="bg-gray-100 border-t border-gray-200 mt-12">
<div class="max-w-5xl mx-auto px-4 py-8">
{% partial 'subscribe-form' %}
</div>
</footer>
You can also create a dedicated subscribe page. Create a page at pages/subscribe.htm:
title = "Subscribe"
url = "/subscribe"
layout = "default"
==
<div class="max-w-md mx-auto">
{% partial 'subscribe-form' %}
</div>
How Email Confirmation Works
With confirm = 1, the signup process works in two steps:
- The visitor fills in the form and submits it. The plugin creates a subscriber record (marked as unconfirmed) and sends a verification email.
- The subscriber clicks the confirmation link in the email. The link points to your campaign template page (
campaign/default-template.htm) with a?verify=1parameter. ThecampaignTemplatecomponent verifies the subscriber and redirects them to a confirmation page.
The verification email is sent using the responsiv.campaign::mail.confirm_subscriber mail template, which you can customize under Settings > Mail Templates.
Creating Confirmation and Unsubscribe Pages
When subscribers confirm their email or unsubscribe from a campaign, they should land on a friendly page rather than a plain HTML message. Create two simple pages for this.
Create a page at pages/subscribe/confirmed.htm:
title = "Subscription Confirmed"
url = "/subscribe/confirmed"
layout = "default"
==
<div class="max-w-md mx-auto text-center py-12">
<h1 class="text-2xl font-bold mb-4">
You are confirmed!
</h1>
<p class="text-gray-600 mb-6">
Your email address has been verified and you are now subscribed to our newsletter.
</p>
<a href="/" class="text-blue-600 hover:underline">
Return to the homepage
</a>
</div>
Create a page at pages/subscribe/goodbye.htm:
title = "Unsubscribed"
url = "/subscribe/goodbye"
layout = "default"
==
<div class="max-w-md mx-auto text-center py-12">
<h1 class="text-2xl font-bold mb-4">
You have been unsubscribed
</h1>
<p class="text-gray-600 mb-6">
You will no longer receive emails from us. If this was a mistake, you can subscribe again at any time.
</p>
<a href="/" class="text-blue-600 hover:underline">
Return to the homepage
</a>
</div>
Now update the campaignTemplate component in campaign/default-template.htm to redirect to these pages. Open the page in the CMS Editor and update the component configuration:
[campaignTemplate]
verifyPage = "subscribe/confirmed"
unsubscribePage = "subscribe/goodbye"
When a subscriber confirms their email, they are redirected to /subscribe/confirmed. When they click an unsubscribe link in a campaign email, they are redirected to /subscribe/goodbye.
Try It Out
- Include the signup partial on a page and visit it in your browser
- Fill in the form with your email address and submit it
- Check Mailing List > Subscribers in the backend to see the new subscriber (marked as unconfirmed)
- Check your email inbox for the confirmation message and click the verification link
- You should be redirected to the "Subscription Confirmed" page
- Back in the backend, verify the subscriber is now confirmed
Sending Campaigns
With subscribers on your list, you are ready to send them content. In this step, you will compose a campaign using the default template, preview it, and launch it to your subscriber list.
Creating a Campaign
Navigate to Mailing List > Campaigns and click New Campaign. Enter a name for your campaign (e.g., "Welcome Newsletter") and select the "Default template" page that was generated earlier. Click Create Campaign to save it.
The campaign is created in Draft status. While in draft, you can edit the content as many times as you like.
Editing Campaign Content
After creating the campaign, the template's syntax fields appear as an editable form. The default template includes several fields:
- Introductory message: the headline text. The default is "Hello there, {first_name}!" which will be personalized with each subscriber's first name.
- Banner image: upload an image to display at the top of the email.
- Opening statement: a short paragraph introducing the email.
- Content sections: a repeating field where you can add multiple sections, each with a heading and rich text content. Click "Add another content section" to add more.
- Salutation: a closing message.
Fill in these fields with your content. The right sidebar shows a content guide with available template tags and formatting tips.
Personalization Tags
Campaign emails support personalization tags that are replaced with subscriber-specific values when the email is sent:
| Tag | Description |
|---|---|
{first_name} |
Subscriber's first name |
{last_name} |
Subscriber's last name |
{email} |
Subscriber's email address |
{unsubscribe_url} |
Link for the subscriber to opt out |
{browser_url} |
Link to view the email in a web browser |
You can use these tags both in the syntax field content and directly in the template HTML. The {first_name} tag is already used in the default template's greeting.
Previewing and Testing
Before launching, you can preview the campaign and send a test email. Click the Send Test Message button, enter your own email address, and click Send. You can optionally select a subscriber list and a specific subscriber to see how the personalization tags resolve for that person.
Check your inbox for the test email. Verify that the content looks correct, the personalization tags resolved properly, and the "View in browser" and "Unsubscribe" links work.
Launching the Campaign
When you are satisfied with the content, click Launch Campaign. You will be asked to select which subscribers should receive the email.
Under Subscriber Lists, select the "Newsletter" list. If you have RainLab.User installed, you will also see Recipient Groups like "All registered users" that you can select alongside your lists.
The launch dialog offers several options:
- Delayed launch: check this to schedule the campaign for a specific date and time. The campaign will stay in Pending status until the scheduled time.
- Staggered launch: divides subscribers into smaller groups and sends in batches. Useful for large lists to avoid email provider rate limits. You can stagger by time period or by a fixed number of messages per batch.
- Repeat frequency: automatically duplicates the campaign after it is sent and schedules the next send. This is covered in the Dynamic Campaigns section.
For your first campaign, leave these options unchecked and click Launch. The campaign will process immediately.
Campaign Statuses
A campaign moves through several statuses during its lifecycle:
- Draft: content is being edited. This is the only status where you can modify the campaign.
- Pending: the campaign is scheduled but has not reached its launch date yet.
- Processing: the subscriber list is being prepared. For large lists, this may take a few minutes. The backend displays this status as "Pending".
- Active: emails are being sent. Some subscribers may have already received the message.
- Sent: all emails have been delivered. The campaign dashboard shows open rates and unsubscribe counts.
- Cancelled: the campaign was stopped before completion.
- Archived: the campaign has been archived and its subscriber tracking data deleted.
Scheduling and Automation
The plugin processes campaigns automatically using the system scheduler. Pending campaigns are checked and active campaigns are sent in batches every 5 minutes.
If your scheduler is not running, you can manually process campaigns with:
php artisan campaign:run
Make sure your cron table is configured for automated campaign processing in production.
Try It Out
- Create a new campaign and fill in the content fields
- Send a test message to your own email address
- Launch the campaign to your "Newsletter" list
- Check the campaign status as it progresses from Pending to Sent
- Open the test email and verify the "View in browser" and "Unsubscribe" links work
Customizing the Template
The default campaign template provides a working starting point, but you will want to match it to your site's branding. In this step, you will learn how the template syntax works and create a custom email design.
Opening the Template
The campaign template lives at campaign/default-template.htm in your theme. Open it in the CMS Editor. You will notice it looks different from your regular site pages:
- It does not use a layout. Campaign templates are standalone HTML email documents.
- The HTML uses table-based formatting with inline styles. This is required because email clients like Gmail and Outlook strip
<style>blocks and ignore modern CSS features like flexbox and grid. - The
[campaignTemplate]component handles email verification, unsubscribe links, and open tracking.
Understanding the Syntax Fields
The template uses a special syntax for defining editable fields. When you create a campaign and select this template, these fields appear as a form in the backend where you can enter your content.
Here are the field types available:
Text
A single-line input for short text like headings and labels.
{text name="greeting" label="Greeting"}Hello, {first_name}!{/text}
The text between the opening and closing tags is the default value.
Textarea
A multi-line input for paragraphs of plain text.
{textarea name="intro" label="Introduction" size="small"}{/textarea}
The optional size attribute controls the height of the textarea in the backend form (small, large).
Rich Editor
A WYSIWYG content editor for formatted HTML content.
{richeditor name="body" label="Email content" size="huge"}{/richeditor}
File Upload
A file upload field. The output value is the full URL path to the uploaded file.
{fileupload name="banner" label="Banner image" imageWidth="600" imageHeight="200"}{/fileupload}
Use the output as an <img> src attribute:
<img src="{fileupload name="banner" label="Banner image"}https://placehold.co/600x200{/fileupload}" />
Repeater
A repeating group of fields. Each instance adds another set of the inner fields.
{repeater name="sections" prompt="Add another section"}
<h2>{text name="heading" label="Heading"}{/text}</h2>
{richeditor name="content" label="Content"}{/richeditor}
{/repeater}
The prompt attribute sets the button text for adding new instances.
Template Tags
In addition to the syntax fields, campaign templates support bracket tags that are resolved per subscriber when the email is sent. These tags work both inside syntax field content and directly in the template HTML.
| Tag | Output |
|---|---|
{first_name} |
Subscriber's first name |
{last_name} |
Subscriber's last name |
{email} |
Subscriber's email address |
{browser_url} |
URL to view the email in a web browser |
{unsubscribe_url} |
URL for the subscriber to opt out |
{tracking_pixel} |
Invisible image tag for open tracking. The plugin injects one automatically before </body>, so only add this tag when you need to control its placement |
Always include an {unsubscribe_url} link in your templates. Most email providers require it, and campaigns without one are more likely to be flagged as spam.
Customizing the Design
Here is a simplified template you can use as a starting point. It replaces the default with a cleaner structure while keeping the table-based email HTML pattern required for compatibility.
Open campaign/default-template.htm in the CMS Editor and replace its contents:
title = "Newsletter"
url = "/campaign/message/:code"
description = "Clean newsletter template with a rich editor"
[campaignTemplate]
verifyPage = "subscribe/confirmed"
unsubscribePage = "subscribe/goodbye"
==
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
Newsletter
</title>
</head>
<body style="margin: 0; padding: 0; background-color: #f3f4f6;">
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td align="center" style="padding: 24px 0;">
<!-- Email container -->
<table cellspacing="0" cellpadding="0" border="0" width="600" style="width: 600px; background-color: #ffffff; border-radius: 8px; overflow: hidden;">
<!-- Header -->
<tr>
<td style="background-color: #1e3a5f; padding: 24px 32px; text-align: center;">
<h1 style="margin: 0; color: #ffffff; font-family: Arial, Helvetica, sans-serif; font-size: 24px; font-weight: bold;">
My Site
</h1>
</td>
</tr>
<!-- Body -->
<tr>
<td style="padding: 32px;">
<div style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: 1.6; color: #333333;">
<p style="margin: 0 0 16px;">
{text name="greeting" label="Greeting"}Hello, {first_name}!{/text}
</p>
{richeditor name="body" label="Email content" size="huge"}{/richeditor}
</div>
</td>
</tr>
<!-- Footer -->
<tr>
<td style="background-color: #f9fafb; padding: 24px 32px; border-top: 1px solid #e5e7eb;">
<div style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #6b7280; text-align: center; line-height: 1.5;">
<p style="margin: 0 0 8px;">
You received this email because you subscribed to our newsletter.
</p>
<p style="margin: 0;">
<a href="{browser_url}" style="color: #2563eb; text-decoration: none;">
View in browser
</a>
•
<a href="{unsubscribe_url}" style="color: #2563eb; text-decoration: none;">
Unsubscribe
</a>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
This template has:
- A branded header with your site name and color
- A greeting field with the subscriber's first name
- A single rich editor for the main email content
- A footer with "View in browser" and "Unsubscribe" links
- An invisible tracking pixel for open rate tracking, injected automatically before the closing
</body>tag
You can adjust the colors, add a logo image, or restructure the sections to match your brand. Just remember to keep using HTML tables with inline styles for email compatibility.
Creating Multiple Templates
You can create multiple CMS pages with the campaignTemplate component, and each one becomes a selectable template when creating a campaign. For example:
- Newsletter: the template above with a greeting and rich editor for general updates
- Announcement: a minimal template with just a heading and short text for urgent notices
- Product Update: a template with a file upload for product images and repeating feature sections
Each template page needs its own URL with a :code parameter (e.g., /campaign/announcement/:code). The verifyPage and unsubscribePage settings should be the same across all templates.
Dynamic Campaigns
So far, every campaign you have sent uses static content: the same email for every subscriber. In this final step, you will create a dynamic template that pulls your latest blog posts into the email, and set it up as a repeating weekly digest.
What Are Dynamic Templates
By default, campaign templates render once and the same HTML is sent to every subscriber. Dynamic templates are different: they are rendered once per subscriber at send time, meaning the template can include live data from your site using CMS components and Twig logic.
Enable dynamic rendering by setting isDynamic = "1" on the campaignTemplate component.
Note: dynamic templates increase database storage because a copy of each rendered email is saved per subscriber. For large lists, this is an important consideration.
Creating the Blog Digest Template
This template uses the collection component from the Creating a Blog tutorial to pull in the latest published posts.
Create a new page at pages/campaign/blog-digest.htm:
title = "Blog Digest"
url = "/campaign/blog-digest/:code"
description = "Weekly digest with the latest blog posts"
[campaignTemplate]
isDynamic = "1"
verifyPage = "subscribe/confirmed"
unsubscribePage = "subscribe/goodbye"
[collection]
handle = "Blog\Post"
==
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>
Blog Digest
</title>
</head>
<body style="margin: 0; padding: 0; background-color: #f3f4f6;">
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr>
<td align="center" style="padding: 24px 0;">
<!-- Email container -->
<table cellspacing="0" cellpadding="0" border="0" width="600" style="width: 600px; background-color: #ffffff; border-radius: 8px; overflow: hidden;">
<!-- Header -->
<tr>
<td style="background-color: #1e3a5f; padding: 24px 32px; text-align: center;">
<h1 style="margin: 0; color: #ffffff; font-family: Arial, Helvetica, sans-serif; font-size: 24px; font-weight: bold;">
Weekly Blog Digest
</h1>
</td>
</tr>
<!-- Intro -->
<tr>
<td style="padding: 32px 32px 16px;">
<div style="font-family: Arial, Helvetica, sans-serif; font-size: 16px; line-height: 1.6; color: #333333;">
<p style="margin: 0;">
{text name="greeting" label="Greeting"}Hi {first_name}, here are our latest posts this week.{/text}
</p>
</div>
</td>
</tr>
<!-- Blog posts -->
{% set posts = collection.take(5).get() %}
{% for post in posts %}
<tr>
<td style="padding: 16px 32px; {{ not loop.last ? 'border-bottom: 1px solid #e5e7eb;' }}">
<div style="font-family: Arial, Helvetica, sans-serif;">
<h2 style="margin: 0 0 4px; font-size: 18px; color: #1e3a5f;">
<a href="{{ 'blog-post'|page({slug: post.slug}) }}" style="color: #1e3a5f; text-decoration: none;">
{{ post.title }}
</a>
</h2>
<p style="margin: 0 0 8px; font-size: 12px; color: #9ca3af;">
{{ post.published_at_date|date('F j, Y') }}
</p>
{% if post.excerpt %}
<p style="margin: 0; font-size: 14px; line-height: 1.5; color: #4b5563;">
{{ post.excerpt }}
</p>
{% endif %}
</div>
</td>
</tr>
{% endfor %}
<!-- Footer -->
<tr>
<td style="background-color: #f9fafb; padding: 24px 32px; border-top: 1px solid #e5e7eb;">
<div style="font-family: Arial, Helvetica, sans-serif; font-size: 12px; color: #6b7280; text-align: center; line-height: 1.5;">
<p style="margin: 0 0 8px;">
You received this email because you subscribed to our newsletter.
</p>
<p style="margin: 0;">
<a href="{browser_url}" style="color: #2563eb; text-decoration: none;">
View in browser
</a>
•
<a href="{unsubscribe_url}" style="color: #2563eb; text-decoration: none;">
Unsubscribe
</a>
</p>
</div>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
This template queries the five most recent blog posts and renders each one with a title, date, and excerpt. Because it is a dynamic template, the blog posts are fetched at send time, so subscribers always receive the latest content.
How Dynamic Rendering Works
When the campaign processes, the plugin renders the CMS page for each subscriber individually. The collection component runs its query during each render, pulling the latest blog posts from the database. The rendered HTML is stored in the campaign's subscriber pivot table so that:
- Each subscriber's email is a snapshot of the content at the time it was sent
- The "View in browser" link shows the exact email that was delivered
- You can verify what each subscriber received in the backend
The {text} syntax field for the greeting is still editable in the campaign form. Static syntax fields and dynamic CMS components work together in the same template.
Adding Subscribers on Registration
If you have RainLab.User installed (from the Forum or Helpdesk tutorials), registered users are automatically available as campaign recipients. The Campaign plugin registers an "All registered users" recipient group.
When launching a campaign, you can select this group under Recipient Groups alongside your subscriber lists. This means:
- Signup form subscribers: anonymous visitors who opted in via the newsletter form
- Registered users: anyone with an account on your site
You can target both groups with a single campaign, or use them separately for different campaigns.
Setting Up a Repeating Campaign
A repeating campaign automatically duplicates itself after sending and schedules the next send. This is ideal for a weekly blog digest.
- Navigate to Mailing List > Campaigns and create a new campaign
- Enter a name like "Weekly Blog Digest" and select the Blog Digest template
- Fill in the greeting text. Since the blog posts are pulled dynamically, you only need to write the intro once.
- Click Launch campaign and select the "Newsletter" list
- Check the Repeat frequency option and select Weekly as the frequency
- Optionally check Delayed launch and pick a date and time for the first send (e.g., next Monday morning)
- Click Launch
After the campaign sends, the plugin automatically creates a duplicate campaign with a launch date one week in the future. This continues indefinitely until you manually cancel the latest pending campaign.
Each new iteration re-renders the dynamic template, so the blog posts will be different each week as you publish new content.
Summary
You now have a complete mailing list system built with October CMS:
- Plugin Setup: installed Responsiv.Campaign and created a subscriber list
- Signup Form: a reusable partial with email confirmation that visitors use to join the mailing list
- Campaign Sending: composed and launched an email campaign from the backend
- Custom Template: replaced the default template with your own branding and layout
- Dynamic Campaigns: a blog digest template that pulls live content, with automatic weekly sends
Managing Subscribers
The backend provides full subscriber management under Mailing List > Subscribers. You can:
- View all subscribers with their confirmation status and subscription date
- Filter subscribers by date range or confirmation status
- Import subscribers from a CSV file (useful for migrating from another platform)
- Export your subscriber list to CSV
- Manually confirm or unsubscribe individual subscribers
Under Mailing List > Lists, you can also add recipients from groups like "All registered users" to a subscriber list.
Going Further
- Multiple templates: create different template designs for announcements, product updates, and digests
- Staggered sending: for large subscriber lists, use the staggered launch option to send in batches and avoid email provider rate limits
- Meta data: enable the
metaDataproperty on the signup component to capture extra subscriber information like interests or preferences. Add<input name="meta[interest]" />fields to your form. - Custom tags: register your own personalization tags from a plugin using the
registerMailCampaignTags()method in your Plugin.php file - Campaign statistics: after a campaign is sent, the preview page shows open rates, unsubscribe counts, and per-subscriber delivery status
Was this article helpful?