Skip to content

Pauses

A campaign pauses itself when bounces or complaints get too high, so a bad list can’t damage your sender reputation beyond its first stage. You can also pause one yourself. Pausing one campaign never affects another, or your test sends: the sender checks each campaign’s own state before every batch.

pauseReason What happened
hard_bounce_rate Hard bounces passed 2% of sent emails
complaint_rate Complaints passed 0.1% of delivered emails
ses_paused SES paused sending for your account or rejected the sending domain
manual You paused it

The rates are checked after every bounce and complaint, and before every stage, once 1,000 emails are delivered. Suppression-list and undetermined bounces don’t count toward the bounce rate. You can change the thresholds in settings.

When a campaign pauses itself, we email your account’s admins and publish a campaign.paused event to your EventBridge bus.

We also check your SES account once a day, between campaigns too. If its bounce rate reaches 5% or its complaint rate reaches 0.1% (the rates at which AWS starts reviewing an account), or SES changes your account’s enforcement status or pauses sending, we email your admins. The email repeats each day until the problem clears.

Only a sending campaign can be paused. Here’s one to try it with:

Terminal window
curl -X POST "$BASE/templates" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
-d '{"name":"Pause demo","version":{"subject":"Hello","html":"<p>Hello</p><p><a href=\"{{ unsubscribe_url }}\">Unsubscribe</a> {{ footer_address }}</p>","fromName":"Example Co","fromEmail":"news@example.com"}}'
curl -X POST "$BASE/campaigns" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
-d '{"name":"Pause demo","templateId":"<tp_...>","templateVersion":1,"segment":{},"stagePlan":{"type":"preset","name":"warmup"}}'
curl -X POST "$BASE/campaigns/<cm_...>/schedule" -H "Authorization: Bearer $KEY" -H 'Idempotency-Key: pause-demo-schedule'

Once it’s sending, pause it:

Terminal window
curl -X POST "$BASE/campaigns/<cm_...>/pause" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' \
-d '{"reason":"checking the pricing link"}'

Emails already handed to SES still arrive, and a batch that was already going out can finish its last few emails. Batches still waiting are dropped without sending, and their contacts wait for you to resume.

Check it worked: the campaign shows "state": "paused" and "pauseReason": "manual".

Terminal window
curl "$BASE/campaigns/<cm_...>" -H "Authorization: Bearer $KEY"

Before you resume after an automatic pause

Section titled “Before you resume after an automatic pause”
  1. Read the report by stage: which stage the bounces or complaints came from, and how many. See Reports.
  2. For bounces, check where the list came from. An old or bought list needs cleaning before you send to it again.
  3. For complaints, check that everyone on the list asked for this email, and that the From name and subject make the sender obvious.
  4. For ses_paused, read the SES account dashboard and any AWS Support messages first.

Resume needs acknowledge set to the campaign’s pauseReason, to confirm you know why it stopped:

Terminal window
# Expect 422 acknowledge_mismatch
curl -X POST "$BASE/campaigns/<cm_...>/resume" -H "Authorization: Bearer $KEY" -H 'Idempotency-Key: pause-demo-resume-1' \
-H 'Content-Type: application/json' -d '{"acknowledge":"hard_bounce_rate"}'
curl -X POST "$BASE/campaigns/<cm_...>/resume" -H "Authorization: Bearer $KEY" -H 'Idempotency-Key: pause-demo-resume-2' \
-H 'Content-Type: application/json' -d '{"acknowledge":"manual"}'

Resuming runs the current stage again in a new round. Batches queued before the pause are dropped, and the round queues again whatever hasn’t been sent, so nobody gets the email twice.

Check it worked: the campaign is sending again, with pauseReason null.

Cancelling stops a scheduled, sending or paused campaign for good. Its schedules are deleted, anything still queued is dropped, and every recipient who was never sent to is marked skipped, so the report adds up.

Terminal window
curl -X POST "$BASE/campaigns/<cm_...>/cancel" -H "Authorization: Bearer $KEY"

Check it worked: the campaign shows "state": "cancelled". Its report still shows everything that was sent, and skipped counts the rest.