SendSetsDocs

Campaigns

Create and send cold outreach campaigns safely.

A campaign sends a sequence of emails to a list of contacts, spread across your connected mailboxes. SendSets handles timing, volume limits, and mailbox rotation so sending looks natural and stays safe.

Before you start

You need at least one active mailbox and a contact list. Warm new mailboxes before running cold campaigns from them. See Deliverability.

Shared workspace access

Campaigns belong to the workspace. Members with View campaigns can read campaign details, steps and activity logs regardless of who created them. Manage campaigns allows members to edit settings, create or edit steps, arrange the step canvas and delete steps. Campaign overview metrics require View analytics. See Team and roles for permission details.

Select the workspace that owns the campaign before opening it. Creating a campaign does not grant access to it from a different workspace.

Create a campaign

Campaigns > New campaign opens a wizard that first asks what you are sending: a sequence or a one-time email. For a sequence the steps are Basics (name, description), Schedule (timezone, sending days, hours, an optional delay before the first email), Sending (mailbox tags, daily limit per mailbox, stop on reply, open and click tracking, UTM parameters, unsubscribe header), and First email (subject, body, optional follow-ups). Follow-ups added here are connected in order, each waiting the number of days you set after the previous step; open the Steps tab to rearrange, branch, or change the waits. Only a name is required; the first email can be skipped and written in the full editor on the Steps tab, and everything else except the campaign type can be changed later from settings. The choice between a sequence and a one-time email is fixed at creation: switching means creating a new campaign. Closing a wizard with unsaved edits asks before discarding them.

The campaign starts as a draft. Nothing sends until you start it.

One-time emails

A one-time email is a campaign with a single message and no follow-ups: an announcement, an update, a single ask to a segment. It is still a campaign underneath, so it sends through your mailbox pool with the same rotation, per-mailbox daily caps, spacing, suppression, tracking and analytics as a sequence. What changes is the flow and the wording.

Pick One-time email on the wizard's first step. The steps are then Basics, Email (subject and body, both required), Audience (one or more segments; every current member becomes a lead, and a contact in several of them is emailed once), Sending (mailbox tags, daily limit, tracking, unsubscribe header) and Send. The last step chooses Send now or Schedule for later with a date and time, sets the sending days and window, and shows an estimate: how many recipients the segments resolve to, how many mailboxes will send, the pool's daily ceiling, and the day the last send is expected to land. The estimate is the earliest finish under the daily caps, not a promise. A thousand contacts on one mailbox at the default cap is a multi-week send, and the wizard says so before you confirm.

Confirming creates the campaign, links the segments (so the campaign keeps enrolling contacts who join them later, exactly like linking a segment), and starts it. A scheduled one waits for its date, then sends inside the window. If the start is refused, for example because the segments are empty or the list fails the launch check, the email is kept as a draft and its page explains why.

In the campaigns list a one-time email carries a One-time badge and reads draft, scheduled (started, waiting for its date), sending or sent; the Type filter shows only sequences or only one-time emails. The Overview tab reports opens, clicks, replies and bounces the same way it does for a sequence. Adding a second email step to a one-time email is refused: create a sequence when you want a reminder later.

Plain text only

Settings > Plain text only sends the campaign without an HTML part. Recipients get the plain-text body with the mailbox's plain-text signature, and because open pixels and wrapped links need HTML, open and click tracking are off for that campaign whatever their toggles say. Test emails respect it too, so what lands in your own inbox is what recipients get.

Senders and rotation

Pick mailboxes in Sending accounts three ways, and the first two combine:

  • By tag: every active mailbox with that tag, including ones you tag later.
  • Individually: specific mailboxes by hand.
  • All active mailboxes: the default when you pick neither.

A campaign set through the API to sender_strategy: "explicit" is the exception to the third line: it never falls back to every active mailbox. If its list empties out, because the mailboxes were disconnected or the list was replaced with nothing, it uses any tags it also has, and with none it pauses itself rather than widening to every mailbox in the workspace. See replace senders.

Sending accounts always resolve inside the campaign's own workspace. If you belong to more than one workspace, a tag you reuse across them still only picks up mailboxes belonging to the workspace that owns the campaign, so one workspace's sending reputation, daily caps, and warmup are never spent on another's traffic.

Follow-ups stay on the same mailbox

Rotation chooses a mailbox for a lead's first email, and that mailbox sends the rest of that lead's sequence. Three emails from three addresses is not a conversation, and a reply belongs in the mailbox the contact was written to from.

RotationBehavior
Even spacing (recommended)Picks the mailbox idle longest, the most natural pattern
Round-robinCycles in order: A, B, C, back to A
WeightedSends more from healthier, higher-limit mailboxes

Whichever mode you pick, it decides which mailbox starts a lead. Every mailbox still stays inside its own daily cap and minimum gap, so a campaign's volume is the sum of its mailboxes' budgets as always.

The Leads tab shows each lead's mailbox in its Sender column, and a contact's Activity tab shows it beside their progress. A lead has none until its first email goes out.

ESP matching optionally aligns sender and recipient providers (Gmail to Gmail). Prefer same falls back to any mailbox when no same-provider one is free; Strict same makes the contact wait instead. A contact left waiting this way waits alone: the campaign moves on to the next lead in the queue rather than stopping, and comes back to them when a matching mailbox is free. An unknown recipient provider never blocks a send. Like rotation, it applies to a lead's first email: a follow-up goes out from the mailbox the contact already knows.

When a lead's mailbox is busy, or gone

Two things can happen to a lead's mailbox, and SendSets treats them differently:

  • Busy: it has used its daily budget, or it is outside its own sending hours. The lead waits for it, and the rest of the campaign keeps sending from the mailboxes that are free. Nothing is lost: the lead sends when the mailbox is next available, and the activity log notes the wait once a day.
  • Gone: it was disconnected, removed from the campaign's sending accounts, sent to rest, held by warmup health, or its domain is failing authentication. Waiting would leave the contact silent for days, so the lead moves to another mailbox in the pool and the campaign's activity log records the change.

Removing a mailbox from Sending accounts therefore hands its in-flight leads to the remaining mailboxes as each of them reaches its next step. Adding a mailbox never moves an existing lead; it picks up new ones.

Sending limits

SendSets is mailbox-first: safe volume is the sum of each mailbox's budget, not one global limit. Limits stack, and the smallest always wins.

LimitDefaultWhat it does
Per-mailbox cold cap50/dayHard ceiling for cold mail from one mailbox
Minimum gap600sShortest spacing between two sends from one mailbox, always enforced
Campaign daily limitPer campaignA per-mailbox cap for this campaign, validated 3 to 5000

The campaign daily limit applies as a minimum against the cold cap, so it can lower a mailbox's volume but never raise it above the mailbox's own daily cap (default 50/day).

Only an email actually handed to a sending worker counts against a mailbox's daily budget and its minimum gap. The scheduler's own wake-ups, a step it deferred because its slot was not due yet, and action or wait steps never do, so a campaign started outside its sending window still has its whole budget when the window opens. When every mailbox on a campaign has used its budget for the day, the campaign stays active and waits for the next day; the activity log notes it once per day. It also waits, rather than pausing, when every mailbox is outside its own hours, resting, or held back by warmup health. A pool that is part spent and part asleep says so too, naming how many of each, because that campaign resumes when the sleeping mailbox reopens rather than tomorrow.

Don't push past the defaults casually

Anything above 50/day per cold mailbox needs positive reputation signals and a low complaint rate behind it. Adding mailboxes is safer than forcing a few to send more.

Daily ramp-up grows volume gradually instead of starting at full limit: ramp start (default 10), ramp increment (default 5), and ramp ceiling (default 50). It applies as another minimum, so it only lowers today's volume while ramping. This is separate from mailbox warmup; the two work together.

Lead flow throttles new contacts with Max new leads per day (0 for unlimited, up to 1000). At the cap, follow-ups to in-flight contacts continue and new leads resume tomorrow. You can prioritize new leads over follow-ups, and choose whether to attempt addresses verification flagged risky.

Keep running for new leads turns a campaign into an ongoing one: when it runs out of leads it stays active and shows waiting for leads instead of finishing, then sends the sequence to each lead as they arrive from a linked segment, a form, the API, Zapier, Make, n8n or an automation. Linking a segment, pointing a form at the campaign, or saving an automation that enrols leads in it turns it on, and so does pressing play on a finished campaign whose every lead is done; turn it off in the campaign's preferences to have the campaign finish once every lead is done. A campaign with this on can be started with no leads yet. An end date still ends it.

Adding leads

The Leads tab takes contacts four ways. From contacts opens a picker over the workspace contact list: search by name, email or company, filter by category, tick individual people or Select loaded, or Select all matching to add everyone the search returns, up to 50,000 at a time (narrow the search and repeat past that). Contacts already in the campaign are marked as leads and skipped. Import runs the file import wizard with this campaign preselected (its Options step can also pin the file into segments), Sheet sync attaches a Google Sheet, and Add lead creates a single new contact in the campaign. Any workspace member with contact access can add leads to any campaign in the workspace, whoever created it.

Segments on the same toolbar links segments to the campaign as a live audience, up to 20 per campaign. Linking enrols every current member immediately and turns on Keep running for new leads, and contacts who enter a linked segment later are enrolled on their own, within a couple of minutes. An active campaign wakes to send to them (a campaign waiting for leads picks up straight away), a finished one restarts through the usual launch checks, and a paused one accumulates them for later. A contact who leaves a linked segment keeps their lead row, but detaching the segment itself takes its leads back out, so swapping one segment for another leaves the campaign with the new list rather than both. Leads the campaign has already emailed stay, as do any you added by hand and anyone a segment that stayed linked still covers; the dialog asks before a save that costs leads. See linking a segment to a campaign.

Every linked segment is shown in a Linked segments strip under the toolbar, so the audience feeding the list is always visible. Each chip names the segment and shows how many of its members are leads right now (120/120); clicking it filters the list to that segment's leads, and the arrow next to it opens the segment. A segment that matches no contacts says no contacts instead of a count, and one whose members were removed from the campaign by hand shows how many are held out with an Add back action, which re-enrols every current member and clears the removals. When a campaign has linked segments but no leads, the empty state explains why (the segments are empty, or their members were removed by hand) rather than offering to link a segment again.

Export on the toolbar downloads the leads as CSV, XLSX or JSON. The scope is the campaign: Every lead exports the whole list, Filtered the leads matching the current filters, Selected the ticked rows. The Campaign-ready column preset adds each lead's status and whether they opened, clicked or replied. The same export lives on a segment page for its members.

A lead can also be taken out again: the remove button on a lead's row, or Remove from campaign in the selection bar when several are ticked, drops the lead from this campaign without deleting the contact. The header checkbox covers the leads loaded so far, and the bar under it offers Select all matching when more leads match than are on screen. The removal sticks: a linked segment will not re-enrol that contact automatically, even while they still match it, until you add them back yourself. Neither offers to delete the contact itself: inside a campaign the destructive action is leaving the campaign, and deleting a contact from the workspace is done from the contacts list.

Lead statuses

StatusMeaning
QueuedIn the campaign, not emailed yet
ProcessingSome but not all steps sent, still moving
DoneEvery step sent, no reply or bounce
RepliedContact replied; sending stops
BouncedA send hard-bounced
FailedA step could not be sent after every retry; hover the status for the reason
PausedThe lead's flow is held, by an out-of-office auto-reply or by hand; hover the status for why and until when
UnsubscribedUnsubscribed or suppressed

A lead is Processing only while steps remain, so a finished campaign reads as done rather than stuck mid-flight.

Out of office and pausing one lead

When a recipient's mailbox answers a step with an away message, that is not a reply: SendSets never counts an auto-reply as a human one, so stop on reply does not fire and, left alone, the next step would go out on schedule to an empty desk. SendSets holds the lead instead, in every campaign that contact is still a lead of rather than only the one that was answered. An empty desk is an empty desk, so a contact you are running two sequences to is held in both. Completed campaigns are left alone, since nothing in them will send again.

The hold reads the return date out of the away message when it can. English, German, French, Spanish, Portuguese, Italian and Dutch phrasings are recognised (back on 8 September, zurück am 09.09.2026, ab dem 10.9., jusqu'au 12 septembre), in ISO and day-dot-month form as well as written months. Two kinds of date are deliberately not read, because a wrong one parks a live lead for weeks: slash dates, since 9/8/2026 means two different days on two sides of the Atlantic, and a month with no day (until October), since there is no way to tell which day in it was meant. The lead resumes one working day after the date it found, so the follow-up does not land in the backlog of their first morning back. When no date can be read, the hold is the workspace's fallback, 7 days by default, set under Settings > Sending > Out of office. The same section turns the whole behaviour off.

A hold does not spend the step's wait. A follow-up three days behind its step, held for a week, goes out three days after the contact is back rather than the moment they return, so the sequence keeps its pacing instead of arriving all at once. Only the part of the hold that overlapped that wait counts, so a hold the lead has already served is never charged to a later step. A campaign whose remaining leads are all paused does not finish: it stays active and waits for them, and its activity log says so once rather than every pass. Resuming any of them puts the campaign straight back to work.

The same hold is available by hand, and it is the missing middle between leaving a lead alone and the two permanent levers. The Subscribed toggle takes the contact out of every campaign for good and the suppression list blocks the address workspace-wide; neither is the right answer to "they are on holiday for a week". The pause button on a lead's row holds that one contact in that one campaign, until a date or until you resume them. By hand it is one campaign on purpose, unlike the out-of-office hold: you are deciding about this sequence, not reporting that the person is away. They stay subscribed, they stay a lead, and the flow picks up where it stopped.

An away message is recognised by the subject line the recipient's mail provider writes (Automatic reply:, Automatische Antwort:, Abwesenheitsnotiz, Réponse automatique, and the same conventions in Spanish, Portuguese, Italian, Dutch, the Nordic languages and Polish) or by the RFC 3834 and vendor headers it carries. It is matched at the START of the subject only, never inside it: a reply from a person carries your own subject back, so a campaign about annual leave or working out of the office still has every human reply read as a reply.

A held lead reads Paused in the list and carries its reason on hover. Open the contact's Activity tab and the campaign panel shows the hold with Resume now next to it, and Stop, which converts a dated hold into one with no end. Resume drops the held time rather than carrying it, so the step goes back to the schedule it would have had if the hold had never happened: on the campaign's next pass when that moment has already passed, otherwise when the step's own wait elapses. It lifts the hold, it does not skip the sequence's pacing. Pausing and resuming are audited, and every teammate's list updates live.

Who opened, clicked and replied

Next to each lead's status, the Leads list shows three engagement columns: Opened, Clicked and Replied, each with the number of emails in the sequence the person engaged with. A dash means the lead was emailed and has not engaged; the cell is blank for a lead not emailed yet. An open counts when a person opened the email, or clicked a link in it. Mail clients that fetch every image automatically (Apple Mail Privacy Protection, for example) show as auto instead, the same opens the campaign overview reports as automatic, so they never pass for engagement. Clicks are held to the same standard: a link followed from a known mail security network, within the instance's automated-click window after the send (thirty seconds by default), or several links of one email followed within a few seconds of each other, is a security gateway scanning the message, not the recipient. Those clicks are kept on the contact's activity marked auto, counted apart on the campaign overview, and never make a lead Clicked, never fire a clicked branch or automation, and never send a webhook. See Link tracking and UTM parameters.

Opens depend on the recipient's mail client loading images. Outlook, many corporate setups and some privacy-minded clients block them, so a person can read an email and still show no open; the info icon on the column says as much. A click is stronger evidence, so a click by the person always counts as an open too. Open the contact's Activity tab to see each open and click with the mail client and location it came from. Some Outlook and Apple privacy fetches use the same stripped image-proxy header. Those show Image proxy without an operating system or device rather than claiming the wrong client.

The chips above the list are filters. Click a status chip (Processing, Done, Replied, Queued, Bounced, Paused, Unsub) or an engagement chip (Opened, Not opened, Clicked, Not clicked, Replied, Not replied) to show only those leads; click it again to clear. One status and one engagement chip can be active at once and both must match. The numbers on the chips are campaign-wide totals, and filtering happens on the server, so a scope shows every matching lead however long the list is. Not opened, Not clicked and Not replied only cover leads that have been sent at least one email: a queued lead has not had the chance. The same filters live in the Filters sheet under Lead status and Engagement.

Engagement updates live as opens, clicks and replies arrive; no refresh is needed. Export from the Leads tab offers four extra columns (Lead status, Opened, Clicked, Replied), whether you export the current scope or selected rows.

What one lead is doing next

Open a contact and go to Activity: the panel at the top lists every campaign the contact is in, with the flow drawn step by step (sent, opened, clicked, replied, bounced or failed on each), the lead status, the last thing that happened, and the next action.

The next action is worked out on the spot by the scheduler, through the same rules a real send goes through: the delay before the first email, the step's wait, the campaign's start date and sending windows, each mailbox's daily cap and spacing, and the new-lead limit. Nothing is stored per contact, because a campaign is a single task that picks the next lead each time it runs. The times it shows are the constraints themselves, never the send spacing, so reading the panel twice gives the same answer twice. So the panel shows one of:

StateMeaning
DueThe step is due now. The time shown is when the campaign next works through its queue, not a slot held for this contact; leads queued ahead of this one can still push it to a later pass
WaitingA hard constraint holds the step back. The panel names it (Waiting 2 days before the first email, Waiting 3 days after Email 1, Outside the campaign's sending window, Today's new-lead limit is reached) and shows the earliest the step can go, not a promised time
PausedThis lead is held (out of office, or paused by hand), or the campaign is not running. The panel says which, and a held lead carries Resume now
BlockedThe campaign cannot send at all right now: no mailbox attached, every sending domain failing authentication, or past its end date

When a step's branches are still undecided (if they open within 3 days), the panel says the next step depends on their response and when that window closes. A lead that has finished, replied, bounced, failed or unsubscribed shows why the flow ended instead.

One lead that cannot be sent right now never holds up the campaign. Each pass walks the queue in order and sends the first lead it can place, so a contact waiting for a same-provider mailbox, for the mailbox their conversation belongs to, or for their own working hours is skipped for that pass while the leads behind them go out. The campaign only waits when every lead in the queue is waiting, and it comes back and looks again within fifteen minutes.

A step counts as sent only once the sending worker has handed it to the mailbox provider. If the worker cannot send (the mailbox was still loading, the provider refused the message, a storage hiccup), the step goes back to the queue, the failure appears in Needs attention with the reason, and the next pass retries it. After five failed attempts the lead is marked Failed and dropped from the campaign, so a mailbox that can never send does not loop forever. A recipient the mail server refuses outright is not retried: it is recorded as a Bounced lead straight away and goes through the same bounce handling (suppression, guardrails, webhooks) as a bounce notice. A campaign that finished while a send was still in flight reopens to retry it.

No contact is emailed the same step twice. Each step is recorded as attempted before the send is handed to a worker, so a crash, a restart, or a database hiccup in the moment between the two cannot make the step look unsent and send it again. The trade-off is a step whose outcome is genuinely unknown, when the worker stops responding mid-send: after 30 minutes with no answer the step is treated as a failed attempt, appears in Needs attention, and is retried like any other failure.

With Link tracking on, every link in the email body becomes its own tracked link, so SendSets records which link was clicked, not only that one was. Open a contact's Activity tab and a click reads Clicked Pricing, with the campaign, step and sending mailbox on the row and, expanded, the link's text, its full URL, every UTM parameter it carried, the browser, and whether a person or a scanner followed it. The campaign's live feed names the link the same way, and the campaign.email_clicked webhook carries the URL and the link text.

UTM parameters (on by default for campaigns created in the dashboard, off for campaigns created through the API unless you send utm_tracking) tag every link when the email is sent, so nobody has to add them by hand and clicks show up attributed in your web analytics:

ParameterValue
utm_sourcesendsets, or the value you set on the campaign
utm_mediumemail, or the value you set
utm_campaignThe campaign name as a slug (q3_outbound), or the value you set
utm_contentThe link's own text as a slug (pricing_page); a link with no text, such as an image, is numbered link_1, link_2 in order

A link that already carries one of these keeps the hand-written value; only the missing parameters are added. Existing query strings and fragments are left exactly as written, and the tags go on the real destination, so they survive the tracking redirect. Anchors, mailto: and tel: links, and anything that is not http(s) are never touched. UTM tagging works with link tracking off too: the tags are added and the link is otherwise left as written. Bare URLs in the plain-text part are tagged as well, numbered link_1, link_2 since they have no text. Change the source, medium and campaign values under Settings > Deliverability; leave a field empty to use the default.

Scheduling

Campaigns send only inside the weekly sending windows you define, in the campaign's timezone. Each day is independent, with different hours or several windows per day, set from presets like Mon-Fri 9-5 or by dragging on the grid (which is Monday-first).

A step whose turn comes while the window is shut waits for the next one; it is never sent late to catch up. That holds however overdue it is, so a follow-up whose wait elapsed at two in the afternoon does not go out at eleven at night because the campaign happened to look at it then. The step keeps its place in the queue and leaves in the next window that has mailbox capacity.

Within a window SendSets spreads the day's emails evenly, adds random jitter, and rounds to natural send times so nothing arrives in obvious bursts. A mailbox with its own timezone is also kept inside its local business hours (8am to 8pm).

The spread covers every mailbox on the campaign, not one at a time: the day's remaining capacity across the whole sending pool is paced across the hours left in the window. Adding a second healthy mailbox roughly doubles how fast a campaign works through its leads, while each mailbox still stays inside its own daily cap, hourly ceiling and minimum gap.

When nothing is due (every lead is inside a step's wait, for example), the campaign re-checks itself at least every 15 minutes rather than sleeping until the next step falls due; the activity log notes it once a day rather than on every check. Leads added to a running campaign start sending straight away, without waiting for the next step or a restart, unless the campaign sets a delay before the first email.

Delay before the first email

By default a contact's first email is due the moment they enter the campaign. Schedule > Before the first email holds it back instead: pick a preset (1 hour, 4 hours, 1 day, 2 days, 3 days, 1 week) or a custom amount in minutes, hours or days, up to 90 days. The same control sits on the Trigger card at the top of the Steps canvas, and both write one setting.

The delay counts from when that contact entered the campaign, not from when the campaign started. A contact who joins a linked segment three weeks after launch still gets the full delay from their own arrival, which is what makes it useful for a campaign that keeps enrolling people. Once the delay elapses the email goes out in the first sending window that has mailbox capacity, exactly like any other step, so a 2 days delay on a Friday afternoon lands on Monday morning if you only send on weekdays.

Follow-up spacing is separate and unaffected: that is each step's own wait, set on the connection into it (see Sequences). Every lead carries the moment it was enrolled, so turning a delay on does not re-delay people who joined weeks ago: their wait is already long past. Leads enrolled before this setting existed have no recorded moment and fall back to the campaign's creation date, which has the same effect. Changing the delay on a running campaign takes effect on save.

Optional campaign dates bound when it may send. Leave both blank to run open-ended. Picking today as the start date means "start now", and clearing a start date on a running campaign removes the wait entirely. Schedule changes on an active campaign take effect immediately: the next send is recomputed on save, so a campaign waiting on a future start date starts sending as soon as you clear or shorten it. Past the end date nothing goes out at all, including a follow-up that came due before it: the campaign finishes instead, and its activity log says it reached its end date.

Start and stop

The play and pause buttons work from the list row or the detail view. Starting moves the campaign to active and begins scheduling inside your windows and limits; pausing stops new scheduling immediately and resumes from where it left off.

A campaign can pause itself: paused, no accounts when it loses every sender or no sender can send under its settings (a sending behaviour profile with no working days), paused, trial expired when a trial ends, auto-paused when a guardrail trips, needs verification when address verification has refused every remaining lead (the campaign offers to re-verify them or send anyway; see address verification), and plain paused if it ever loses its workspace, because unsubscribes, bounces and complaints are checked per workspace and cannot be honoured without one. It moves to finished once every contact completes the sequence or its end date passes, unless Keep running for new leads is on: then it stays active and shows waiting for leads until the next lead arrives, and only its end date finishes it. Configured to do so, it also stops following up with a contact the moment they reply.

An auto-pause is never silent. It writes a red entry to the campaign's activity log saying which of the several possible causes it was, and every teammate's campaign list moves to the paused status live, so a campaign that stops sending overnight is visible the moment anyone looks at it rather than hours later.

A finished campaign starts again on its own when a lead is added to it, whether by a linked segment, the API, a form, an integration or an automation, through the same launch checks as pressing play. If a check refuses the restart (the list is a bounce risk, the plan cannot send, too many campaigns are active), the activity log says so and the new leads wait until you fix the cause and press play. Pressing play also works after extending or clearing the end date. If there is genuinely nothing left to send, pressing play turns on Keep running for new leads and the campaign stays active, waiting for leads, so it never dead-ends on a campaign that only ran out of people to write to; the activity log notes the switch.

Duplicate and delete

Every campaign has a menu, on its row in the list and in the header of its detail view, with Edit, Duplicate, Start or Pause, and Delete. Both actions need the Manage campaigns permission; a member without it is told which permission is missing instead of the action failing later.

Duplicate creates a new draft from the campaign's configuration and opens its settings so you can rename it (it starts as name (copy)), pick a different audience, change the copy, or adjust the schedule before starting it. The copy keeps every setting, the steps with their branching, the sending accounts, folders, tags, A/B variants and attachments. It does not keep leads, progress, statistics, activity, the ramp level, an auto-pause, or a start or end date that has already passed. The original is not touched, and the two campaigns are independent from then on. A duplicate counts as a new campaign for the daily creation limit.

Delete asks for confirmation that spells out what goes: the campaign, its steps, lead progress and activity. Contacts and emails already sent stay. A running campaign can be deleted directly; the confirmation says so, and sending stops immediately because every task waiting for the campaign is cancelled together with it. The same action is available at the bottom of the campaign's Settings. Deletion cannot be undone.

Auto-pause guardrails

Preferences > Opt-out line chooses what this campaign appends after the signature: the workspace default from Settings > Sending, a reply-to-opt-out sentence, an unsubscribe link, or nothing. Unsubscribe header attaches the RFC 8058 headers alongside. See unsubscribe and suppression.

Preferences > Auto-pause stops a campaign the moment its rates leave the band you set, instead of waiting for a mailbox provider to react. Off by default.

RuleDirectionDefaultWhy
Bounce ratepause at or above5%Amazon SES puts an account under review at 5% and can pause sending at 10%
Complaint ratepause at or above0.10%Google asks senders to stay under 0.10% and never reach 0.30%
Reply ratepause belowoffA campaign at volume that nobody answers is spending reputation for nothing

Two more controls keep the rules honest:

  • Only after is the sample floor. No rule fires below this many sends in the window, because one bounce out of four is not a 25% bounce rate. Default 50.
  • Measured over the last is the rolling window in days. 0 measures the campaign's whole history. Default 7.

Setting a rate to 0 turns that rule off. The check runs every 15 minutes, and when several bands are breached at once the campaign is paused with the most damaging reason attached: complaints first, then bounces, then replies.

A paused campaign shows the reason and the numbers behind it on the Auto-pause section, and everyone on the team who can see campaigns gets a notification. Starting the campaign again clears the marker, but the next check re-evaluates from scratch, so fix the underlying problem first.

Live activity

The detail view streams sends, opens, clicks, replies, bounces, and skips as they happen, for every teammate at once. A Needs attention panel above it surfaces failures such as a step that could not be scheduled, a send the worker could not complete, or a mailbox whose sending worker is offline; these retry automatically and stay visible so nothing fails silently.

If scheduling stalls on a transient infrastructure hiccup, SendSets re-seeds within a few minutes. Pausing and resuming forces a fresh start.

Content checks

SendSets scores each step's copy out of 100 for the signals spam filters weight: trigger wording, stacked punctuation, ALL-CAPS subjects, link and image counts, image-only bodies, empty or oversized bodies, and attachments.

Anything the checker can point at, it points at: the badge names the subject or the body (or both, when the wording straddles the two), the offending words are quoted back exactly as you typed them, and the line they sit in is shown for context. You never have to hunt through your own copy for a word the checker already found.

A few issues are about the message as a whole rather than any wording in it. An empty subject, an empty or oversized body and an image-heavy layout name the half they concern but have nothing to quote; an attachment on a cold email concerns neither half, so it shows as a plain line with no badge. Every issue, located or not, carries its fix in a sentence.

You see it in three places:

  • In the editor, re-scored as you write a step.
  • In the launch dialog, alongside the other pre-send checks, with the lowest-scoring step named and its worst issue quoted as Subject: or Body:. Only email steps are scored; wait and action steps carry no copy.
  • In the campaign activity feed, if the copy that actually goes out scores below your floor, again naming the half of the message at fault.

That last one catches what the first two cannot. The editor scores the template; the send path scores the message after merge fields, spintax, A/B selection and AI blocks have resolved, which is where a clean template becomes "Hi ," or picks the one spammy spintax branch. It logs once per step per day, not once per recipient.

Settings > Sending > Content checks turns it off or moves the floor, which defaults to 60 and accepts 1 to 100.

Advisory, not a gate

A low score never blocks or delays a send. It is a signal to rewrite, not a verdict: a legitimate email can score badly, and a well-scoring one sent to a bad list will still fail.

Analyze with AI

The rules above catch what rules can catch. Analyze with AI, under the score in the step editor, reads the copy itself and reports what a filter and a human reader will object to:

  • the specific word, phrase or sentence, quoted from your draft, and whether it is in the subject or the body
  • why that fragment hurts deliverability or replies
  • what to write instead
  • a rewritten subject line, which you can apply in one click
  • copy-level advice that has no single fragment to point at
  • an overall deliverability score out of 100

It runs on the AI provider configured for the deployment (see AI credits for the cost, and Configuration for self-host setup). It needs the Use AI permission. A deployment with no provider configured says so in place of the button rather than offering something that cannot run.

Every quote is checked against your draft before it is shown. A fragment the model could not have copied from your copy is dropped rather than displayed, so the panel never points at a sentence you did not write.

Re-check

Re-check re-scores the copy on the spot instead of waiting for the editor's debounce, and once you have run an AI analysis it re-runs that too. Edit what the findings told you to edit, press it, and the panel shows the new score against the previous one: +14 since your last check.

The AI score is deliberately not sampled, so re-checking copy you did not touch returns the same number. A change in the score is a change in the copy.

When the draft has moved on from the analysis on screen, the panel says so and highlights the button, rather than presenting stale findings as current.

Easing out of warmup

A mailbox that has been warming does not jump straight to its full cold cap. Going from 40 warmup emails a day to 50 cold emails the next morning is the volume jump mailbox providers penalise, so SendSets ramps into it.

The mailbox starts at a volume set by how long it warmed, then adds 5 a day until it reaches the cap you configured:

Warmed forStarts cold at
under a week5/day
one to two weeks10/day
two weeks or more20/day

The ramp only ever lowers a cap, never raises one, so your configured limit and the campaign's daily limit still bind. A spam placement pauses the climb for the same three days it pauses the warmup ramp, and the paused days are subtracted rather than made up. The mailbox drawer shows today's allowance and roughly when it reaches your cap.

Only for mailboxes that warmed

A mailbox that never used warmup is not gated. This exists to smooth the warmup-to-cold transition, not to cap senders who never opted into warmup.

The launch check on your list

Starting a campaign measures its recipient list first and refuses to launch one that is known to be largely undeliverable. Mailbox providers put a sender under review at around a 5% bounce rate, so the number worth seeing is the one you can see beforehand.

What it counts:

  • Known-invalid addresses only. Verification has to have actually rejected the address. A list nobody has verified is not evidence of a bad list, so it is never blocked on that basis, only pointed out.
  • Deliverable recipients only. Suppressed and unsubscribed leads are skipped at send time, so counting them would make a bad list look fine.
  • Lists of at least 50. Below that a share means nothing, and no launch is refused on it.

A refused launch shows why and offers Launch anyway, for a list you verified with another service. Through the API the same override is acknowledge_list_risk on the start request.

Above 4% projected bounce the launch is refused with the number and what to do about it. Between 2% and 4% it launches with a warning. The same projection appears in the launch dialog before you click, so a refusal is never a surprise.

Safety posture

Defaults are deliberately conservative, aiming at a low complaint rate rather than maximum throughput:

  • Spacing over bursts: the minimum gap and even distribution keep a natural cadence.
  • Spread, don't concentrate: volume splits across many mailboxes and worker IPs.
  • Ramp gradually: raise volume only while performance stays healthy.
  • Health gating: a mailbox in deliverability trouble has its cold volume cut or paused automatically.
  • Human timing: mailboxes with sending behavior enabled keep randomized working hours, volume, and spacing in their own timezone.

A practical band is 30 to 50/day for warmed mailboxes, starting newer ones at 10 to 20.

Keep warmup running

SendSets limits a campaign mailbox to at most five warmup messages per day, so campaign traffic stays primary. Warmup cannot compensate for one repetitive template sent to a poorly targeted list: personalize, test meaningful A/B variants, and honor suppression and unsubscribe signals.

On this page