Skip to content

When we throttle your sending

Rate limits and quotas are limits you know about in advance. This page is about the other kind: what happens when the quality of your sending starts doing damage, and what you have to do to get back to normal.

You share sending infrastructure with other accounts. A purchased list or an unconfirmed signup form doesn’t only affect you — it affects everyone sending from the same IP. That’s why this isn’t negotiable, and why we’d rather warn you three times before cutting anything off.


Every hour we evaluate your hard bounces and spam complaints over a rolling 7-day window. Depending on how close you are to your plan’s threshold:

LevelWhenWhat happens
WarningYou pass 50% of the thresholdEmail to the account owner. Nothing is stopped.
Urgent warningYou pass 80% of the thresholdEmail + notice in your dashboard. Still nothing stopped.
SuspensionYou cross the thresholdSending stops for the channel responsible.

We don’t just look at the average. We measure each channel separately — marketing and transactional — because a 5% complaint rate on your campaigns dilutes to 0.5% inside a large transactional volume and wouldn’t trigger anything, even though that 5% is exactly what’s burning your reputation.

Thresholds depend on your plan and are visible in your dashboard. The values in use today are:

Measurement window7 days
Hard bounce threshold10%
Complaint threshold0.3%
Bounce floor5 events
Complaint floor3 events

We don’t compare your rate — we compare what your rate proves

Section titled “We don’t compare your rate — we compare what your rate proves”

Ten complaints across 5,000 sends and a hundred across 50,000 are both 0.2%. They don’t mean the same thing: the first is a bad week, the second is your rate.

So we don’t measure against the observed percentage, but against the lower bound of a 95% confidence interval — the lowest your true rate could plausibly be given what we saw. At low volume that interval is wide and it takes overwhelming evidence to cross the threshold; at high volume it narrows and barely being over is enough.

What we observeRateDo we act?
10 complaints in 5,000 sends0.2%No — the bound is 0.11%, not enough
100 complaints in 50,0000.2%Yes, a warning — the bound is 0.16%
10 complaints in 20 sends50%Yes, suspension — the bound is 29.9%

We suspend the channel at fault, not the account

Section titled “We suspend the channel at fault, not the account”

If the problem comes from your campaigns, your campaigns and sequences stop. Your transactional mail — signups, password resets, receipts — keeps going out normally.

The reverse applies too. And if we can’t determine where the problem came from (the damage is spread out, or the events couldn’t be attributed to a channel), everything stops: when in doubt we don’t narrow it down.

When transactional is suspended, POST /v1/mail/send responds:

{
"error": {
"type": "authorization_error",
"code": "transactional_suspended",
"message": "El envío transaccional de esta cuenta está suspendido por tasas de rebote o queja fuera de umbral. Revisa el detalle en el panel."
}
}

Your dashboard session is never cut off by this. Locking you out would take away the very screen where you can see why you were suspended and request reactivation.


Reactivation is automatic, but it requires all three at once:

  1. The cooldown expires. It starts at hours and grows with each repeat offense: crossing the threshold a second or third time means waiting longer than the first.
  2. You acknowledge the pause. A button in your dashboard (POST /v1/client/keys/:id/acknowledge-pause). It isn’t red tape: it makes sure a human saw the problem, rather than just waiting out the clock.
  3. Your metrics go back to green. Dropping just below the threshold isn’t enough — you have to drop well below it. Reactivating right at the line would have the account bouncing in and out of suspension all day.

POST /v1/mail/send is for transactional mail: one to one, triggered by something the recipient did. It has no per-domain pacing, no marketing suppression check, and no campaign tracking.

When we detect the same body sent to many distinct recipients within 24 hours, that send is rejected with 422 and you get an email explaining it. Nothing else is stopped.

But if the pattern keeps up, it enters the same ladder above and ends up suspending your transactional channel. It isn’t a punishment for volume: that traffic delivers worse through that path and generates complaints that everyone pays for.

For bulk sending use campaigns, which do have pacing, suppressions, tracking and better deliverability.


If your server has scanning enabled, attachments are checked before sending. An infected attachment returns 422, naming the file and the signature detected:

{
"errors": [
{
"field": "attachments",
"code": "virus_detected",
"message": "El adjunto \"factura.pdf\" fue rechazado por el antivirus (Eicar-Test-Signature)."
}
]
}

We tell you which file so you don’t have to guess when sending several. If the scanner is temporarily unavailable, your mail goes out anyway: we don’t stop your email over a failure on our side.


  • Double opt-in confirmation on your lists. It’s what lowers complaints the most.
  • Remove people who don’t open. An old list that never gets pruned is the number one cause of hard bounces. You can send a re-confirmation campaign and unsubscribe whoever doesn’t respond.
  • Don’t buy lists. It gets detected fast, and it’s the shortest path to a suspension.
  • Check your dashboard. Your metrics against your plan’s threshold are always visible, not only when something breaks.