Skip to content
The pipeline

Sending & deliverability

Gmail, the daily cap, pacing like a person, and the bounce brake.

Approved emails leave from your own Gmail, one at a time, spread through the working day, the way a person sends them. Deliverability is the real limit on the whole system, so sending is the most guarded stage.

The rules#

SettingValueWhy
daily_send_cap25A personal Gmail sends cold mail safely at about this rate.
send_window10:00–19:00, Mon–FriPeople at their desks; no cold mail at weekends.
pacing.front_loadfalseSpread across the window — never a burst at 10:00.
pacing.max_per_run1A laptop waking from sleep never fires a backlog.
pacing.jitter_fraction0.35Slot times vary, so it doesn’t look automated.
guessed_daily_cap25A separate allowance for pattern-guessed addresses.
bounce_brake6 in 7 daysPast this, guessed addresses stop; verified ones still go.
contact / company cooldown30 daysNobody is asked twice in a month.
per_domain_daily_cap3At most three cold emails a day into one company’s mail domain; the rest wait for a later day.
spam_pause_hours48After Gmail refuses any mail as spam, no cold mail leaves at all for two days.
spam_block_cooldown_days21…and none goes into that company or its domain for three weeks.

A sending day#

  1. 10:16first email
  2. 10:39email
  3. 10:48email
  4. 11:20email
  5. …about one every 20 minutes, jittered
  6. 18:26email
  7. 18:4825th — the last of the day
The 25 slots for Tue 20 Oct 2026, as computed by warmup.slots(). Every run of the send job agrees on them.

What happens to one email#

  1. Is a slot due?
    Every 5 minutes the send job asks how many slots have passed today, minus how many were used, capped at one per run.
  2. Pick the next approved email
    Follow-ups first, then cold asks. A guessed address is skipped if the guessed cap is spent or the brake is on.
  3. Re-check the person
    Still ready, not suppressed, not cooling down — things can change between approval and sending.
  4. Check the company’s domain
    A cold email waits (it is never rejected) if three have already gone into that domain today, or a spam block is still cooling down.
  5. Claim and reserve
    Atomically move the email from approved to sending, and reserve one unit of today's cap in the ledger before the mail leaves.
  6. Send
    Over Gmail SMTP with your app password (or, in dry-run mode, written to outbox/). The message is built the way Gmail's own compose builds one — text with a minimal HTML twin, links on words, no tracking, no attachment, none of the headers that give a script away. On failure the reservation is released and the email marked failed.
What happens if you push it
On 19 Oct 2026, with the old settings (cap 60, front-loaded, 40–90 s apart), about thirty near-identical emails went into one company within an hour. Four guessed addresses bounced and Gmail refused all further mail with 550 5.4.5 Daily user sending limit exceeded after 24 sends. The rules above are the fix. Finish a company over more days — never by raising the cap.
And a second time, a different way
On 23 Oct 2026 Gmail let mail through but refused 9 of 24 asks into one company as spam (5.7.1 Message blocked): about fifteen near-identical asks had gone into the same domain within hours. Hence the per-domain cap, the 48-hour pause and the 21-day cooldown above, and the review gate's deliverability flags. These settings only ever hold mail back; the 25-a-day cap is unchanged.

Pausing and checking#

outreach preflight reports live-send readiness (red / amber / green with fixes); outreach ledgershows today's use. To pause sending, unload com.zonuly.tick.send (see Runbook) or reply “pause” to a notification email when the bot is on.