Apps · Marketing

Email marketing

Lists, subscribers, templates and campaigns — with open and click tracking, one-click unsubscribe and a suppression list that every send is checked against before a single message leaves.

User guideApps › Email marketing

Where it sits

Email marketing is its own installable app, living at /email-marketing. It has a hard dependency on Audiences — installing it installs Audiences too, because a campaign has to send to something.

It is also one of the channels bundled by Omni marketing. Installing Omni fans out and installs the marketing channels your plan allows, this one included. You can equally install Email marketing on its own and never touch Omni — they are separate apps, and this page describes the standalone app.

Nine screens, one app

Everything sits behind a single nav entry. The app's own left rail switches between its screens:

ScreenWhat it's for
DashboardSubscriber health and recent campaign performance, plus a quick-start panel.
ListsThe audiences subscribers belong to. Optional public signup form and double opt-in per list.
SubscribersEveryone you can mail, with status, tags and engagement counters.
CampaignsOne-off blasts and recurring sends — compose, schedule, send, report.
TemplatesReusable email designs for campaigns and automations.
AutomationsDrip campaigns, welcome series, behavioural triggers.
ReportsOpen rate, click rate and per-campaign breakdowns.
SuppressionsAddresses the workspace will never send to.
SettingsSender identities plus compliance and tracking defaults.

Before the first send

Two things in Settings decide whether a campaign can go out at all.

  1. A sender identity Settings → Sender identities — "the From: addresses your campaigns can use. At least one is required." Either create one, or use Pick from existing integrations to reuse your workspace SMTP or any connected mailbox without re-entering anything. A sender carries a From name, From email, optional Reply-to, a transport, an optional tracking domain and optional DKIM signing. One can be marked the workspace default.
  2. A physical mailing address Settings → Compliance & defaults → Physical mailing address. It is pulled into the campaign footer and the field is labelled as required at the bottom of every commercial email.

Connecting the mailbox or SMTP account itself is not done here — see Integrations. If no mailbox integration is connected, the sender picker says so and points you there.

No sender, no send

With no sender identity the campaign editor shows Configure a sender instead of a From picker. If a campaign somehow reaches the queue without one, each recipient row is written off as failed with No sender identity configured — the campaign doesn't half-send.

The same Settings screen holds the defaults every new campaign inherits: Track opens by default, Track clicks by default, List-Unsubscribe + RFC 8058, Require double-opt-in workspace-wide, a Global footer HTML block and a Send rate cap (per minute) described as a worker-wide ceiling on outbound mail.

Getting people onto a list

  1. Create the list Lists → New list. Name and description, plus two switches that matter later: a Public signup slug (setting it exposes a public subscribe form for that list) and Require double-opt-in (subscribers confirm via email).
  2. Add subscribers Three routes, all under Subscribers: Add subscriber one at a time, Import CSV, or Import from entity.
  3. Import from a CSV The first row must be the header. Recognised columns are email (required), first_name, last_name and tags (semicolon-separated). You choose which list to add them to and whether to require confirmation. The result reads back as "Imported N subscribers. Skipped N (already suppressed)."
  4. Or import from an entity you already have Import from entity pulls existing records from any entity in your workspace — pick the entity, map the email field, optionally map first name, last name and one or more fields to turn into tags. A preview shows how many valid records were found before you commit.

A subscriber's status is one of Subscribed, Pending, Unsubscribed or Cleaned. Only Subscribed people are mailed — anything else is skipped at send time, by name, on the send row.

What double opt-in changes

With it on, a new signup lands as Pending and is sent a confirmation email. Nothing goes to them until they click the confirmation link, at which point the membership flips to subscribed. It can be set per list or turned on workspace-wide in Settings.

Segments

A segment is a saved filter over your subscribers, and it can be used as a campaign target exactly like a list. Filters can test subscriber columns (email, country, language, status), engagement counters (total sent, total opened, …), dates (last opened, created — including relative "days ago" forms), tags (has / has any / has all / missing), custom fields, and membership of a list. While you build one, a live counter tells you how many subscribers currently match.

Building a template

Templates → New template. A template carries its own subject and preheader — the subject supports merge tags, and the preheader is the short summary shown in the inbox preview. Pick one of four formats:

FormatWhat you edit
HTMLRaw HTML, exactly as it will be sent.
MJMLMJML source — compiled to HTML on save.
Plain textNo markup at all.
Visual builderDrag blocks onto a canvas: Heading, Paragraph, Button, Image, Divider, Spacer, Two-column, Footer. Drag from the left panel onto the canvas, and drag the handle to reorder.

The Merge tags panel lists what you can drop into a subject or body: subscriber first name, last name and email; a one-click unsubscribe link; a list preferences link; a "view in browser" link; custom fields; and per-list override fields. Two are worth knowing by name — {{ unsubscribe_url }}, because the global footer is only appended to campaigns that don't already contain it, and {{ physical_address }}, which pulls in the mailing address from Settings.

Use Preview to see the rendered result before you save.

Sending a campaign

  1. Create it Campaigns → New campaign. Either pick a template or Start from scratch. Picking a template copies its content into the campaign as a snapshot, so editing that template afterwards cannot change a campaign that is already out or in flight.
  2. Write the content Subject, preheader and body. There's a separate plain-text version which is auto-derived if you leave it blank.
  3. Choose who it goes to Under Audience, add one row at a time with Add audience. Each row is a List, a Segment or a shared Audience, marked Include or Exclude. A live N recipients count updates as you change them.
  4. Set the From address Pick a sender identity, or Use workspace default.
  5. Check the settings Track opens and Track clicks are each Default, On or Off — "Default" meaning whatever Settings says. This is also where you turn on A/B test.
  6. Send yourself a test Put an address in Test email and hit Test. You get back "Test email queued to …". A test does not touch the campaign's audience or its report.
  7. Send now, or schedule Send now asks you to confirm — "Send this campaign to N subscribers now?" — then answers "Campaign is sending. Reports will appear shortly." Scheduling instead confirms the time it's set for.

A scheduled campaign is picked up by a check that runs every minute, so "send at 09:00" goes out at 09:00, not on some hourly tick. Mid-flight you can Pause campaign and later Resume campaign; you can also duplicate a campaign to reuse its content and targeting.

A/B tests

Turn on A/B test and add variants. Each variant has its own subject, body and a weight expressed as a percentage of the audience. Set Winner picked by to Manual selection, Highest open rate or Highest click rate. The report breaks results out per variant.

What actually happens when you hit send

Sending is a queue, not a button that blocks. Two stages run behind the scenes:

  1. Preparation The audience is resolved once — included lists and segments and audiences, minus everything you excluded, minus every address on the suppression list. One send row is written per surviving recipient, in batches, and the campaign's links are turned into tracking tokens.
  2. Delivery, one recipient at a time For each row: merge tags are filled in, links are rewritten so clicks can be counted, an open-tracking pixel is injected (when open tracking is on), the unsubscribe headers are attached, the message is signed with DKIM if the sender has it, and it goes out over that sender's transport. The outcome — sent or failed — is written back to the row and the counters.

A separate check runs every five minutes and flips the campaign from sending to sent once every one of its rows has reached a final state. Until then the report fills in live.

Reading the report

Campaigns → Report on any campaign that has gone out. The tiles are Sent, Delivered, Unique opens, Unique clicks, Bounced and Unsubscribed, followed by A/B variants, Top links (by unique clicks) and the full Sends list. That list filters by All, Sent, Delivered, Bounced, Failed and Skipped. The Reports screen aggregates open rate and click rate across campaigns.

Campaign and recipient states

Campaign statusMeans
draftNot armed. Editable, nothing queued.
scheduledArmed for a future time; the minute tick will pick it up.
sendingRows exist and are being worked through.
pausedYou pressed pause. Rows still queued are skipped rather than sent while it stays paused.
sentEvery row reached a final state.
cancelledStopped before completion.
failedPreparation could not produce a sendable campaign.

Why a message didn't go out

What you seeWhat it means
The recipient never appears in the report at all They were removed while the audience was being resolved — suppressed, excluded by one of your Exclude rows, or not actually subscribed to any included list.
Row is Skipped, reason Subscriber status=… They stopped being subscribed between preparation and delivery — unsubscribed, cleaned, or still pending confirmation.
Row is Skipped, reason Campaign … The campaign was paused or cancelled while its queue was still draining. Resume and the remaining rows go out.
Row is Failed, No sender identity configured Set one up in Settings → Sender identities, then send again.
Row is Failed with a provider error The mail server rejected that specific message. The error text is kept on the row.
Row is Bounced Delivery was refused after the fact. Hard bounces also land the address on the suppression list.

Unsubscribes and suppressions

Every send carries the standard List-Unsubscribe headers, including the one-click variant — which is what makes Gmail and Outlook show their own native unsubscribe button next to your email. Recipients also get hosted pages they can reach without logging into anything:

  • An unsubscribe page, plus a resubscribe link if they change their mind.
  • A preferences centre where they toggle which of your lists they're on, instead of leaving entirely.
  • A view in browser version of the email they were sent.
  • The public subscribe form for any list you gave a public slug, and the confirmation landing page that completes double opt-in.

The Suppressions screen is the hard stop: "N emails the workspace will never send to." Unsubscribes, hard bounces and spam complaints land here on their own. You can also Add suppression by hand — paste addresses one per line or comma-separated. Removing one warns you that "those emails will be eligible to receive again", which is the right amount of friction for an action that undoes someone's opt-out.

The footer is a safety net

The global footer HTML from Settings is appended to every campaign whose body doesn't already contain an unsubscribe link. If you hand-build a template and forget one, the footer still gives recipients a way out.

Automations

An automation is a sequence a subscriber walks through on their own. Under Automations you set a trigger and then a list of steps.

TriggersSteps
When subscriber joins a list · When a tag is added · On signup anniversary · Based on a date field · When a record is created on an entity · When a record is updated on an entity · Via flow action · Manual / API only Wait · Send email · If / else · Add tag · Remove tag · Add to list · Remove from list · Wait until time · Webhook · End

The entity triggers are the interesting ones: point an automation at any entity in your workspace, map its email field, and optionally gate it on a specific field changing to a specific value — so "deal stage becomes Won" can start a welcome series without anyone exporting a spreadsheet.

If / else branches on whether they opened or clicked a recent email, have a tag, or a custom field equals something — within a window you set. Each branch can jump to a numbered step, so a "did they click within 7 days?" gate can route to a follow-up or to a recovery sequence. Two settings govern the whole automation: Allow re-entry and Exit on unsubscribe. An automation is a draft until you Activate it, and can be paused.

Email marketing also contributes actions to the workspace flow builder — add an email to a list, remove it, or enrol a subscriber in an automation — so any flow on any entity can push people into your email programme. And each channel's send action can be sequenced with other channels in Campaign lifecycle.

Who can do what

The app is gated by app access, then by two capabilities on top:

GrantLets someone
App accessOpen Email marketing and read it — campaigns, lists, subscribers, reports. Because that includes subscriber email addresses, treat it as a deliberate grant.
Manage campaignsCreate and edit campaigns, templates, lists and segments. Without it, a member can look but not author.
Send campaignsSchedule, send and test. Without it, a member can work on a campaign but not launch it.

Admins pass all three. Splitting Manage from Send is how you let someone draft a campaign while someone else presses the button. More in Permissions.

Event history is pruned

Individual open, click, bounce, complaint and unsubscribe events are kept for 365 days and then cleared out nightly. Campaign and subscriber totals are rollup counters and are not affected — only the raw per-event log ages out, so export anything you need for long-term analysis before it does.