
Campaigns vs Sequences
Campaign States
Safety Review
Scheduling a campaign can put it inwaiting_approval instead of scheduled.
This is an anti-abuse hold, not an error: nothing is sent while a campaign is in
this state, and the campaign is not lost.
This most often happens on new accounts. The checks run against your account
and your sending domain, so a brand-new workspace or a recently registered
domain is the usual reason a first send is held. Once your account and domain
have a track record, later sends normally go straight to scheduled.
A campaign is held when any of these apply:
- New or unverifiable domain. Your sending domain or your company website domain was registered in the last 7 days, has no public registration record, or the website did not respond when we checked it.
- Content that matches known abuse patterns. Business-opportunity, guaranteed income, or high-pressure “act now” language in the subject, preheader, or body.
- Automated content review. Campaigns to 10 or more recipients, or campaigns whose content hits our review watchlist, are checked automatically before the first send.
- Contacts held for review. If your audience includes contacts our team is reviewing, the campaign is held whatever its size.
waiting_approval as described below.
Established accounts that our team has marked as trusted skip these checks,
except the hold for contacts under review, which applies to every account.
What happens next
Held campaigns are reviewed by the Sequenzy team. When a review finishes:- Approved - the campaign returns to
scheduledand sends at its original time. If that time has already passed while it waited, it moves straight tosending. - Rejected - the campaign moves to
rejectedand the reason is available inrejectionCommentonGET /api/v1/campaigns/{campaignId},sequenzy campaigns get <id>, and theget_campaignMCP tool.
If you are building an unattended integration, treat
waiting_approval as a
normal outcome of scheduling. Check status in the schedule response, and if
it is waiting_approval, log it and poll the campaign instead of retrying the
schedule call. Retrying will not clear the hold.Creating a Campaign

1. Choose Recipients
From Subscribers, apply filters or select contacts, then choose Create campaign. Analytics activity groups offer the same action. Choose a template, use an existing email, start blank or write an AI prompt. The complete matching group across every page is saved directly in the campaign when you create the draft. This does not create a list, change list membership or enroll contacts in sequences. New matching contacts do not join the draft automatically; edit its selected contacts or use a saved segment if you want a changing audience. Email eligibility is checked before sending. Saved lists and segments keep their existing Create campaign and Create sequence actions. Unsaved filtered groups offer campaign creation only. Draft campaign rows show an Audience set chip when an audience has been configured. It is not a final recipient count; review the audience before sending. Use Create Campaign for a Group,sequenzy campaigns from-audience, or MCP create_campaign_for_audience to create a blank draft with the same frozen contact selection. Update its content using the existing campaign tools before reviewing and sending.

2. Select Email Template
Choose or create the email content:- Use an existing template from your library
- Create new content in the editor
- Duplicate and modify a previous campaign
equals, contains, exists, or numeric comparisons.
Conditions are not limited to profile values: you can also target segment membership, custom events (for example “performed purchase in the last 30 days”), tags, lists, subscription status, engagement (opened or clicked recently), Stripe and store purchases, signup date, email provider, and SMS status - the same filters you use to build segments. These rules are checked against live subscriber data when each email is sent.
For an else branch, use the Conditional (if/else) block, or duplicate the block and invert the rule on the copy. Attribute and variable conditions use the same merge-tag variable names you already use in emails, but without the {{ }} braces.
3. Choose Sender
Select who the email appears to come from:4. Schedule or Send

- Send Now: Queue immediately
- Schedule: Pick a specific date and time
- Spread Over Time: Distribute sends linearly over 1–72 hours
- Start time: Send now or schedule a future start
- Delivery strategy: All at once, Spread Over Time, or Send Time Optimization
5. Review and Send

Checking your email
The badge in the editor toolbar opens the email check. It groups findings by links, images, content, subject line, preview text, accessibility, email clients and sender, and Show next to a finding selects the block to fix. Links and images are checked live as you edit: each one is opened from our servers and reported as working, broken (page not found, domain doesn’t exist, certificate problem, redirect loop), unreachable, or couldn’t verify when a site refuses automated checks. Without a request, the check also flags links missinghttps://, mistyped addresses, localhost and staging URLs, placeholder domains
such as example.com, link shorteners, and link text that shows a different
domain than the link goes to. Links built from merge tags that change per
recipient are only checked for valid syntax; {{company.url}} links use your
company website.
To run the same check outside the editor, use the
Check Campaign endpoint,
sequenzy campaigns check, or the check_email MCP tool. Sequence steps and
templates have matching checks.
Delivery Options
These options refine how a campaign goes out. Choose them in the Schedule step.Recurring Campaigns
Scheduled campaigns can repeat automatically. When scheduling, set Repeat to “Every week” or “Every month” and the campaign becomes a recurring template:- At each run time, Sequenzy duplicates the template into a normal one-shot campaign and sends it
- The audience is re-evaluated at every run, so new subscribers who match the list or segment are included and removed ones are skipped
- Each run gets its own campaign (named after the template with the run date) with its own stats
- The email content is snapshotted per run - you can edit the template between runs, and the next run picks up your changes without altering past runs
- Cancel the recurring campaign to stop the series; runs already sent are unaffected
If the platform is briefly unavailable at a run time, the run starts as soon
as it recovers. Runs missed by more than the full interval are skipped, not
sent in a burst.
Spread Over Time
Enable Spread Over Time to distribute your campaign sends gradually over a configurable window, protecting your sender reputation during warmup. How it works:- Choose when the campaign should start sending
- Select “Spread over time” as the delivery strategy
- Use the slider to choose a delivery window (1-72 hours)
- The first batch sends at the chosen start time
- Remaining batches are spaced evenly across the window
- Warming up a new sending domain
- Sending your first large campaign (1,000+ recipients)
- You’ve sent fewer than 10,000 emails total (Sequenzy will recommend this automatically)
Spread Over Time and Send Time Optimization are mutually exclusive. You can
only enable one per campaign.
Recipient Limit
Turn on Recipient limit on the schedule step to send to only part of the audience. Enter the maximum number of recipients and Sequenzy keeps the first that many matching subscribers, ordered by subscriber ID, after every audience rule, exclusion and suppression is applied. When to use:- Ramping up a new sending domain a few hundred contacts per day
- Soft-launching an offer or price change to a small group before the full send
- Working through a large import in daily batches
- Capping send-quota spend on a campaign whose segment keeps growing
maxRecipients in the API, the CLI
(--max-recipients) and MCP.
Attachments
A campaign can carry up to 10 files, 5MB in total, that every recipient receives, such as a weekly PDF report. CC and BCC copies and test emails get the same files. Add them withattachments when you
create or
update a campaign through the API, with
sequenzy campaigns create --attach ./report.pdf in the CLI, or with the
create_campaign and update_campaign MCP tools. The dashboard shows attachments
in the review and sent views; use the API, CLI or MCP to change them. Sends, test
emails, duplicates and recurring runs include them.
Sequenzy loads every file when sending starts. If one is missing or too large,
nothing is sent and the campaign returns to draft so you can fix it; a resumed
send stays paused and shows the reason. Keep URL files available until the
campaign finishes sending: a file removed mid-send stops the remaining
recipients. Large attachments make every email heavier, so link to big files
instead.
Pauses and Sending Locks
A manual campaign pause stores the pause on that campaign. You can resume it from the campaign page, and Sequenzy uses the saved spread setting unless you choose a new one on resume. Company sending pauses and account bans act as parent sending locks. When the lock engages, every campaign that is mid-send is paused automatically with the label Paused with company sending (or Paused with the account for a ban), so no further chunks are attempted while the lock is active. Scheduled campaigns keep their schedule and show Sending paused until the lock clears. When the lock is removed, those campaigns resume automatically on the normal resume path: remaining recipients continue at the same pacing as before the pause, using the saved spread setting. Scheduled campaigns that came due during the pause start; future scheduled campaigns wait for their scheduled start. You cannot resume one of these campaigns on its own while the company lock is still active; the campaign page, API, CLI and MCP explain which lock applies. An admin restoring sending can leave those campaigns paused instead. They then stay paused until you resume them from the campaign page, API, CLI or MCP. Campaigns you manually paused before the company lock engaged remain paused when company sending is restored.Automatic Pauses for Deliverability
Sequenzy watches each campaign’s own bounce, temporary bounce and complaint rates while it sends. Once a campaign has sent at least 50 emails, it is stopped when 20% or more of them hard bounce, 50% or more soft bounce, or 1% or more draw a complaint. For an established sender, only that campaign is paused, with the label Paused automatically for deliverability and the rate that tripped. Your other campaigns, sequences and transactional email keep sending. The campaign does not restart when company sending is restored. Clean the recipient list, then resume it from the campaign page, API, CLI or MCP. Its rate is measured over the whole send, so it pauses again if the rate stays over the limit. A sender counts as established with at least 20,000 sent emails, a workspace older than 30 days, a paid plan, and no recent pause for phishing, content review, complaints or an admin hold. For other senders, company sending is paused instead. It is also paused when campaigns are paused this way 3 times within 24 hours, including the same campaign pausing again after a resume. While company sending is paused, resume it before resuming one of these campaigns. Company-wide bounce and complaint limits also still pause company sending on their own.Send Time Optimization
Enable Send Time Optimization to deliver emails at each subscriber’s optimal time based on their engagement patterns. How it works:- Toggle “Send Time Optimization” on the schedule step
- Sequenzy analyzes each subscriber’s historical open times (last 90 days)
- Emails are delivered within a 12-hour window at each subscriber’s optimal hour
- Subscribers without enough data receive emails at the scheduled time
- Subscribers need at least 5 email opens in the last 90 days
- The UI shows how many subscribers have computed optimal times
Recipient’s Local Time
Deliver a scheduled campaign at the same wall-clock time in every recipient’s own timezone - “send when it’s 8pm for the customer”. How it works:- Store a timezone on your contacts (see Subscribers) - via the API
timezonefield, a CSV import, the MCP tools, or the contact page - On the schedule step, pick a date and time and choose “Recipient’s local time” as the delivery strategy
- Each contact receives the campaign when their local clock reaches the scheduled time. Timezones ahead of yours are delivered earlier - processing starts when the scheduled time first occurs on Earth (UTC+14)
- Contacts without a stored timezone receive the campaign at the scheduled time in your timezone, and timezones whose local time already passed when processing starts receive it immediately
- The option is available once at least one recipient has a known timezone; the schedule step shows how many contacts will get local-time delivery
- Not combinable with repeats, Spread Over Time, or Send Time Optimization
- Also available from the API (
sendInRecipientTimezone+scheduledTimezone), the CLI (campaigns schedule --in-recipient-timezone --scheduled-timezone), and the MCPschedule_campaigntool
Filtering Options
Status Filters
Tag Filters
Example: Target customers, exclude churned:
Email Filters
is and is_not match the full address and ignore case, so they are the right
choice for explicit allowlists (QA contacts) and exclusions. Use contains when
you want a domain or substring.
Example: Target company emails:
Date Filters
You can use rolling values like
7 days ago, natural language like last week, or fixed dates like 2026-03-01 and Mar 1 2026.
Rolling values update automatically as time passes. Fixed dates stay fixed.
Examples:
Name Filters
Filter Combinations
Filters are combined with AND logic:Variations Canvas
The email editor’s Canvas tab puts alternative versions of a campaign’s email side by side, so you can compare them before choosing one. Variations don’t change what the campaign sends until you use one.- Just say what you want. The Canvas chat reads each message to see what you’re asking for. With an email or some of its sections selected, an instruction like “make the hero dark” or “I don’t like this” changes that email in place, with Undo. Ask for options (“give me 3 headline options”) to compare a few versions of the selected sections, or for variations (“2 more variations”) to get new emails. Say how many you want, or leave it to the assistant.
- Ask for variations. Describe a direction and the new versions appear as each one is ready, and keep generating if you reload or leave the page. Each takes its own direction and its own structure in your brand’s look, so they differ from each other. Ask for “more like this” to stay close to a version you liked, or for “something completely different” to get bold versions with their own layout, colors and fonts. The AI Assistant in the Edit tab offers Create 2 vastly different variations too. You can also ask the AI Assistant in the Edit tab for “three variations” and it opens the canvas instead of editing the email. Requests that rely on attached images or your GitHub repository stay normal edits. Up to 8 versions can generate at once for one email. On an empty email, each version is a complete first draft.
- Change one part. Click a section inside a selected variation (Shift-click to add more) and say what should change; ask for options to get a few to compare instead: hover to preview one in place, then Apply. Undo steps back through your changes, newest first.
- Move around. The canvas zooms and pans like a whiteboard: scroll to pan, pinch or hold Cmd/Ctrl and scroll to zoom, and drag empty space to move around. Arrows show which variation each one came from, labeled with the request that made it. Drag a variation by its title to place it anywhere; Tidy up puts everything back. Show everything (Shift+1) fits all variations on screen.
- Use one. Use in campaign puts the variation’s content in the email and saves it, including its own colors and fonts when it has them. If the email’s current content isn’t already a variation, it’s kept as a new one first (“Before V2”), so you can always go back. Variations that follow your email’s look keep the one they had.
- Discard. Discarded variations can be restored with Undo. Their branches move up a level while they’re gone.
sequenzy campaigns variations in the CLI, and with the variation tools in MCP. Through those, using a variation works on draft campaigns only; in the editor it saves like any other change.
Public Share Links
Every email campaign can be shared through a public “view in browser” link - useful for showing a campaign to stakeholders, clients, or anyone outside your audience. Unlike the{{viewInBrowserUrl}} merge tag, which serves one
recipient’s personalized copy, the share link renders an anonymized version:
a sample contact instead of subscriber data, an inert unsubscribe link, and no
open or click tracking.
Click Share in the campaign editor to open the hosted page in a new tab - the
link is minted automatically the first time, and drafts can be shared too, so
you can circulate a campaign for review before it is scheduled or sent. Links
can also be created via the API,
with sequenzy campaigns share, or through the share_campaign MCP tool. The
link is a high-entropy URL that only exists once it is created, and it is
revocable via the API, sequenzy campaigns unshare, or unshare_campaign -
after revoking, the old URL returns 404 immediately and sharing again produces
a different URL.
Transactional emails, sequence emails, and standalone templates can be shared
the same way through their underlying email: use the Share button in the
email editor, the templates API,
sequenzy templates share, or the share_template MCP tool. Campaign links
stay campaign-level so a shared A/B campaign always shows the winning
variant.
Sending Process
When a campaign is sent:Personalization
Available Variables
Use these in your email content:
The
subscriber. prefix also accepts the contact’s core fields -
{{subscriber.firstName}}, {{subscriber.lastName}}, {{subscriber.email}},
and {{subscriber.name}} - so either form works for those. A custom attribute
of the same name still wins. The prefix is scoped to the contact, so it does not
reach company or URL variables: use {{COMPANY_NAME}}, not
{{subscriber.companyName}}.
Example
|there syntax provides a fallback if the name is missing, and
{{ FIRST_NAME | default: "there" }} does the same thing.
Raw HTML Attribute Values
Merge tag values are always HTML-escaped, so an attribute holding markup like<p>...</p> renders as visible code. When a custom attribute stores trusted,
prebuilt HTML - for example a unique per-recipient body your system generated -
add the html. prefix to render it as markup:
{{subscriber.subject}} in the subject line pairs with it for per-recipient
subjects.
Keep these rules in mind:
- Only render HTML you generate or trust. Never route end-user input through a
raw HTML tag; a regular
{{subscriber.attribute}}stays escaped. - Injected HTML is sanitized: scripts, inline event handlers, and dangerous URLs are stripped.
- The prefix only applies in HTML text position. Inside attributes such as
hreforsrc, the value is validated and escaped like an ordinary tag. - Store final HTML. Merge tags still present in the injected HTML are substituted before sending, so resolve your own placeholder syntax first.
{{html.prerenderedHtml}}.
Tracking
Open Tracking
When enabled, Sequenzy tracks email opens via a tracking pixel.Click Tracking
When enabled, links are wrapped to track clicks:You can enable/disable tracking per company in Settings → Tracking.
Analytics
When a Campaign Was Sent
Reopening a finished campaign shows the date and time it went out next to the Sent badge. A campaign without recorded pacing readsSent <date>; a paced
one reads Finished <date>, because for native sends that timestamp is when the
last recipient was handed off rather than when sending began. Hover or focus the info button
beside it for the recorded send strategy - no pacing recorded, spread evenly
over a set number of hours, or at each recipient’s optimal open time - plus the
scheduled time when one was set. Imported campaigns may not include pacing
metadata from their source provider. The scheduled time is not presented as the
actual start, because safety review or queue delays can postpone delivery.
You do not have to open a campaign to check. Each row in the campaign list shows
a relative age, and hovering its Sent badge gives the same record - the exact
date, plus the recorded pacing when there is any.
The same record is available outside the dashboard. sentAt, spreadOverHours,
sendTimeOptimization, and sendTimeWindowHours all come back from
List Campaigns,
Get Campaign, the sequenzy campaigns list and
sequenzy campaigns get commands, and the list_campaigns / get_campaign MCP
tools. Change draft pacing with Update Campaign
or apply it when scheduling. STO is
campaign-only; sequences use a sending window instead.
After sending, view campaign performance:
Revenue Attribution
If you have goals configured, sent campaigns show revenue attribution metrics:
Attribution uses your workspace’s attribution window (24 hours unless you change it; campaign goals default to 7 days). See Goals for the window settings and supported billing integrations.
Tracking Over Time
View how engagement changes:Resending to Non-Openers
After a campaign finishes sending, you can resend it to everyone in the same audience who didn’t open it. This is a simple way to recover opens - a second touch, often with a fresh subject line, reaches the people who missed the first send. On a sent campaign, use the Send to non-openers button. Before creating anything, it shows an estimate of how many subscribers haven’t opened the campaign yet, so you know the size of the resend up front. Confirming creates a new draft named<campaign> (Non-openers) that:
- Reuses the original campaign’s audience (all subscribers, lists, a saved segment, or a filtered audience), and
- Adds a “didn’t open this campaign” rule so only people who haven’t opened it yet are targeted.
excludedCampaignOpenerIds, recreate it from the original campaign and review the new draft before scheduling.
Resending to non-openers becomes available 6 hours after a campaign finishes
sending. This gives opens time to register, so the estimate and the resend
audience are accurate. It is not offered for imported
campaigns, which have no opens in Sequenzy to resend
against.
- API:
POST /api/v1/campaigns/{campaignId}/resend-to-non-openers(see the API reference) - CLI:
sequenzy campaigns resend-to-non-openers <id> - MCP: the
resend_campaign_to_non_openerstool
Imported Campaigns
When you move to Sequenzy, you can bring your old campaigns with you as historical records by creating them withstatus: "sent" and the original
sentAt (see Create Campaign). Sequenzy
records campaigns created this way as imported history and labels them
Imported in the campaign list and on the campaign page.
Only the email content and the send date come across. Sequenzy never delivered
these campaigns, so it has no recipients, delivery records, opens, clicks or
bounces for them - the campaign page says so in place of the usual analytics
rather than showing zeros. Resending to non-openers is unavailable for the same
reason.
Everything else works normally: you can view and share the email, duplicate it
into a new draft, rename it, and label it alongside the campaigns you send from
Sequenzy.
Organizing Campaigns and Sequences

Create a Label

Campaign Types
Newsletter
Regular updates to your entire list:Product Announcement
New feature or product launch:Promotional
Sales, discounts, special offers:Re-engagement
Bring back inactive subscribers:Segmented Updates
Different content for different segments:Best Practices
1. Test Before Sending
- Send a test email to yourself
- Check personalization renders correctly
- Verify links work
2. Segment Thoughtfully
Don’t send everything to everyone:3. Time Your Sends
- B2B: Tuesday-Thursday, 10am-2pm
- B2C: Evenings and weekends
- Consider time zones: Schedule for recipient’s local time
4. Monitor Deliverability
Watch your metrics:5. Respect Unsubscribes
- Process unsubscribes immediately
- Don’t re-add unsubscribed contacts
- Provide easy unsubscribe links
Campaigns vs Transactional
Pick an A/B winner by revenue, a goal or an event
Opens and clicks are not always what you want more of. In Test settings under Pick winner by, you can also judge variants by what recipients did afterwards:- Most goal conversions: the variant whose recipients convert on a goal most often, per delivered email.
- Most goal value: the variant that brings in the most goal value per delivered email. Choose Revenue to pick the variant that made the most money from purchases and orders.
- Most recipients who fire an event: the variant whose recipients most
often fire an event you choose, such as
trial.converted, after receiving it.
winnerCriteria to goal_conversion_rate,
goal_value or event_rate with winnerGoalId (a goal ID or
default-revenue) or winnerEventName, for example
sequenzy ab-tests update ab_123 --winner-criteria goal_value --winner-goal default-revenue.
Get A/B Test Stats reports each variant’s
conversions and value under outcome.
Control a running campaign A/B test
Your campaign review shows the fields that differ, winning metric, percentage of the full audience, assigned and sent recipients, total duration and deadline. Use Change time to set total minutes from the original start (15–1,440), Change sample size to set how much of the audience (5–50%) gets the test variants, or Finish test early to choose which variant the remaining audience receives. In Finish test early you can also pick Pick by [metric] now: the variant leading on the test’s winning metric so far wins, without waiting for the rest of the test time. Through the API, CLI and MCP, sendendTestNow: true (sequenzy ab-tests update ab_123 --end-now). Already committed sends keep
their variant. Pausing the campaign pauses delivery; changing settings does not
resume it. You can retry a pending audience change or discard a failed one.
The same workflow is available through Update A/B Test
and Select A/B Test Winner, CLI
ab-tests get, ab-tests update --test-percentage 30 --duration-minutes 120,
and ab-tests select-winner, and MCP get_ab_test, update_ab_test, and
select_ab_test_winner. Use --cancel-sample-update or cancelSampleUpdate: true
to discard a failed request; repeat the same target or selected winner to retry.
Is the difference real?
Under the variant results, the campaign review tells you whether the leading variant’s advantage on the winning metric is statistically significant at 95% confidence, not yet significant, or still too early to judge (fewer than 30 recipients per variant, or too few opens or clicks). With more than two variants, the leader has to beat every other variant. Sequence A/B steps show the same note when metrics are visible on the canvas. The check is informational: automatic winner selection still picks the highest rate when the test period ends, so a leader that is not yet significant may be noise. Once a winner is chosen, the note keeps describing the test itself: it compares only the emails sent before the winner was picked, not the winner’s later sends to the rest of your audience. Get A/B Test Stats returns the same result assignificance, sequenzy ab-tests stats prints it, and the MCP
get_ab_test_stats tool includes it.
When reducing a campaign sample, only queue jobs whose sends have never started and that have no committed recipients can be withdrawn. Active jobs and pending transport retries finish first, so the minimum can rise before the change applies. Retrying preserves the request; discarding a failed change keeps work already performed, including withdrawn sample jobs. Recipients without committed sends remain eligible for the eventual winner.
Related
Sequences
Automated multi-step workflows
Subscribers
Managing your contact list
Tags
Segmenting for targeting
Transactional
Per-user triggered emails