Pacing
Send at a pace your domain survives
Caps per sender, per domain, per recipient — stacked, and an email goes out when every rule that matches it agrees. What cannot go now waits in a queue you can read.
nora@northwind.io
jonas@northwind.io
sofia@northwind.io
Both rules live. Mail arrives in bursts and leaves on a rhythm — the pile at each address is what the rules are holding this second.
Three senders under two live rules. Each address keeps its own cadence, and together they never cross the account cap.
The rules
Stack as many as you like
A rule is a number, a window, and what it counts per: 100 a day per sending address, 5 a day to any one person, 1 a minute across the whole account. Write as many as you want and stack them — an email goes out when every rule that matches it agrees, and waits in the queue until they do. You call send once.
Four say go, one says not yet — so it waits, and leaves the second that rule frees. Queued, not refused: you called send once, and there is nothing to retry.
Every rule carries its own patterns — *@acme.com for a whole domain, billing@* for a local part wherever it turns up — so a rule only has a say over the mail you point it at, and * for every send. A rule with no patterns catches nothing.
In the console
Everything that is waiting, and what for
Pacing
Right now
1,284 waiting. The next goes out Tomorrow 09:00, in 15h 12m, when Business hours lets it.
Held back by
Waiting
nora@northwind.io → sales@lindmetall.de
RFQ 4471 — 3mm brushed sheets
nora@northwind.io → m.faber@stahlhandel.at
Quote wk 38 — cutting
jonas@northwind.io → procurement@havik-bv.nl
Re: lead times on brushed stock
jonas@northwind.io → s.kallio@pohjola-steel.fi
Quote 4468 — revised
Nothing is dropped
A send that a rule holds is accepted, not refused. It sits in the queue and leaves the moment every rule that matches it agrees.
Which rule, not how many
The number held is the least useful thing on the page. The bar over it names the rule doing the holding, which is the one you would change.
Override by hand
Something urgent stuck behind a warm-up goes out on one click, or one call, whether or not the rule was ready for it.
In your code
Nothing to schedule, nothing to retry
await aiinbx.pacingRules.create({ name: "Warm the new domain", kind: "limit", match: [{ field: "from", pattern: "*@new.northwind.io" }], limit: { scope: "from_domain", amount: 200, per_seconds: 3600 },})const email = await aiinbx.emails.send(payload) if (email.pacing) { console.log(email.pacing.held_by, email.pacing.estimated_send_at)}await aiinbx.emails.send({ ...reset, pacing: { skip: true, count: false },})Around it
What else decides when mail leaves
Sending hours
The other kind of rule in the same list: a timezone and the hours mail may leave in it, so nothing lands at 3am on a Sunday.
Spread
Perfectly even gaps are one of the cheaper tells of automation. One dial from 0 to 100 varies them, at a little throughput.
One space per customer
A rule in a customer's space reads their mail alone and stacks under yours — they can tighten what they send, never loosen your cap.
Ceilings you start with
The domain every workspace starts with — <slug>.aiinbx.app — comes paced: 100 a day, 20 an hour, 10 a day to any one person. A domain of your own is held to none of it.