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.
The ladder
Section titled “The ladder”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:
| Level | When | What happens |
|---|---|---|
| Warning | You pass 50% of the threshold | Email to the account owner. Nothing is stopped. |
| Urgent warning | You pass 80% of the threshold | Email + notice in your dashboard. Still nothing stopped. |
| Suspension | You cross the threshold | Sending 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 window | 7 days |
| Hard bounce threshold | 10% |
| Complaint threshold | 0.3% |
| Bounce floor | 5 events |
| Complaint floor | 3 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 observe | Rate | Do we act? |
|---|---|---|
| 10 complaints in 5,000 sends | 0.2% | No — the bound is 0.11%, not enough |
| 100 complaints in 50,000 | 0.2% | Yes, a warning — the bound is 0.16% |
| 10 complaints in 20 sends | 50% | 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.
How sending resumes
Section titled “How sending resumes”Reactivation is automatic, but it requires all three at once:
- 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.
- 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. - 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.
Using the transactional endpoint for bulk
Section titled “Using the transactional endpoint for bulk”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.
Attachments with viruses
Section titled “Attachments with viruses”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.
How to stay out of here
Section titled “How to stay out of here”- 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.