---
title: The Mass Mailer
description: The mass mailer sends a designed email to a segment of your customers — a price change, a new product, a seasonal offer. You build the email visually, describe the audience with a handful of rules, check how many people…
url: "https://rackhelm.com/documentation/mass-mailer/"
updated: "2026-09-24"
category: "Content, Storefront & Marketing"
---

# The Mass Mailer

The mass mailer sends a designed email to a segment of your customers — a price change, a new product, a seasonal offer. You build the email visually, describe the audience with a handful of rules, check how many people that comes to, and either save a draft or schedule the send. This article is for operators.

## Before you start

> **Note:** The mass mailer is gated on the `manage_campaigns` permission. That key is not part of the shipped permission set, so in a default install only a **Super Admin** can open these screens.

Two things must be working before a campaign will actually go out:

- **Outbound mail** — configured under **Platform Settings → Mail Settings**.
- **Queue workers**, including one consuming the `bulk-email` queue, plus the scheduler running `campaigns:process-scheduled` (it is registered to run every minute).

## Creating a campaign

1. Open **Mass Mailer → Create Campaign**.
2. Give it an **Internal Name** — this is for your list, not for recipients — and an **Email Subject**.
3. Build the **Email Body** in the editor, or pick a saved template from the dropdown and select **Load Template**.
4. Set the **Segmentation Rules**, then select **Calculate Audience Size** to see how many people match.
5. Set **Schedule At**, choose a **Save Action**, and save.

![The Create Campaign screen with the email builder, segmentation rules and scheduling options](/wp-content/uploads/rackhelm-docs/content-campaign-create.png)
The campaign editor. Calculate Audience Size resolves the rules server-side before you commit to a send.

| Field | What it does |
| --- | --- |
| **Internal Name** | Required, up to 255 characters. Shown only in the admin list. |
| **Email Subject** | Required, up to 255 characters. |
| **Email Body** | Required. Built in a drag-and-drop email editor tuned for newsletters. Supports the variables `{first_name}`, `{last_name}` and `{name}`. |
| **Schedule At** | When the campaign should go out. Leave it blank and choose *Schedule / Send* to send as soon as the scheduler next runs. |
| **Save Action** | *Save as Draft (Do not send)* or *Schedule / Send*. Only these two states can be saved — "processing" and "completed" are set by the sender. |

## Choosing the audience

Two rules always apply and cannot be switched off: the recipient must be marketing opted-in, and must not be a guest account. On top of that:

| Rule | Effect |
| --- | --- |
| **Account Status** | *Active Users Only (Default)*, *Everyone*, or *Disabled Users*. |
| **Must Have Role(s)** | Recipient must hold at least one of the selected roles. |
| **Must Own Product Group(s)** | Recipient must have a service from one of these groups. |
| **Must Own Specific Product(s)** | Recipient must have a service for one of these products. |

Ownership counts services that are active or pending cancellation. Where both product and group rules are set, matching either is enough; the role rule, when set, applies on top.

> **Warning:** Accounts are marketing opted-in by default and there is no opt-in checkbox in the customer's own settings — the unsubscribe link in a campaign email is the only way a customer switches it off. Make sure that matches the consent position set out in your privacy policy before you send anything promotional.

## Templates

A campaign template is a saved email body you can reuse. Manage them under **Mass Mailer → Templates**, or create one without leaving the campaign editor with **Save as Template**. A template has just two fields, **Template Name** and **Template Body**; loading one replaces whatever is currently in the editor.

## Sending, and what happens next

Nothing is sent from the browser. Once a campaign is **scheduled** and its send time has passed:

1. The scheduled task picks it up and marks it **processing**, which also stops it being picked up twice.
2. The audience is resolved and walked in batches of 500. A recipient row is created for each person.
3. One send job per recipient is queued on the `bulk-email` queue.
4. The campaign is marked **completed**.

> **Note:** "Completed" means every message has been queued, not that every message has been delivered. Actual delivery depends on your workers and your mail provider.

A campaign that is processing or completed can no longer be edited or (for processing) deleted. Use **Duplicate** on the list to copy it into a fresh draft named "… (Copy)" with the schedule cleared.

**Send Preview Email** on the edit screen sends the campaign to your own address, rendered exactly as a recipient would receive it.

## Tracking and unsubscribe

Every campaign email has two things appended automatically:

- A 1×1 tracking pixel. The first time a recipient loads it, the open is recorded against their recipient row.
- An unsubscribe block. The link opens a confirmation page; the customer's marketing opt-in is switched off only once they confirm there.

Both links are cryptographically signed and rate limited to 60 requests a minute, so they cannot be forged or replayed against other accounts. The campaign list's **Sent To** column shows how many recipient rows exist for each campaign.

![The campaigns list showing status badges, schedule and recipient counts](/wp-content/uploads/rackhelm-docs/content-campaigns-index.png)
Draft, Scheduled, Processing and Completed campaigns, with the recipient count per campaign.

## Troubleshooting

| Symptom | Cause and fix |
| --- | --- |
| A scheduled campaign never sends | The scheduler is not running. Confirm the cron entry that runs Laravel's scheduler exists, and that `campaigns:process-scheduled` appears in it. |
| Status says Completed but no email arrived | The messages are queued on `bulk-email`. Make sure a worker is consuming that queue, then check your mail logs. |
| Audience size is 0 | The rules exclude everyone. Remember the two mandatory rules: guests are excluded, and anyone who has unsubscribed is excluded. |
| "Cannot edit a processing or completed campaign" | Duplicate it instead and edit the copy. |
| Opens are always zero | Most mail clients block remote images by default, so open tracking under-reports. Treat it as a floor, not a count. |
| An unsubscribe link says the link is invalid | The signature was altered — usually a mail client rewriting the URL, or the link being copied by hand. Ask the customer to click it directly from the email. |
| The campaign sent to fewer people than the calculated audience | The audience is resolved again at send time; anyone who unsubscribed or was disabled in the meantime drops out. |
