What a complaint spike means, and the levels that matter
A campaign went out, and within a day the complaints, the unsubscribes or both were far above anything the account normally sees. The content looked like every other send. That points at the audience and the timing first. Hold the next campaign, read the rates against the levels below, then work through the causes in order.
A complaint is a stronger signal than an unsubscribe. An unsubscribe removes one contact from the list. A complaint tells the mailbox provider the mail was unwanted, and complaints can harm the sending domain's reputation, which is the thing that decides inbox placement, as the guide to email deliverability sets out.
An older industry benchmark, from 2017, puts average unsubscribe and bounce rates at around 0.02% of a send. Against that baseline, a rate of 0.5% is very high.
Complaint levels and what happens at each
| Level | What happens | What to do |
|---|---|---|
| Unsubscribes or bounces around 0.02% of a send (baseline, not a complaint level) | The industry average for unsubscribes and for bounces. | Normal. Keep the planned schedule. |
| Domain spam rate of 0.30% or higher, or a blocklisting | The sending domain is flagged as needing action (action_needed). | Diagnose the domain before another campaign goes out. |
| Complaints above 0.5% of sends, with at least 100 sends | Nitrosend stops sends automatically. This counts as a critical breach, as does a bounce rate above 5%, and the account moves to quarantine. | Stop campaigns and find the segment the complaints came from. |
| More than 5% of contacts hard bounced or complained in the last 30 days | Nitrosend moves the account to its high protection level. | Work through every cause below before sending again. |
The levels use different measures: a per-send average, a domain spam rate, a per-send complaint rate and a share of contacts over 30 days. Nothing here sets a level between 0.02% and 0.30%. The deliverability guide explains why the 0.30% level matters so much, and a blocklisting is checked on the blacklist page.
A level usually trips on a send that has mostly gone out already, so the stop affects the campaigns after it rather than the one that caused it.
What causes spam complaints after a send
Check these in order. Each one comes from who was mailed and when, not from what the email said.
- Contacts nobody had mailed in months. Someone who subscribed six months ago and has not received an email since may not remember subscribing at all. Mailing that group carries a real risk of complaints, enough to reach the level where Nitrosend stops sends automatically, and enough to harm the sending domain's reputation.
- A jump in sending frequency. Sending too often is the number one reason people unsubscribe, and complaint rates spike when a sender goes from not emailing at all to three or four emails a week. A new campaign series running on top of an existing automated flow can produce that jump without anyone planning it.
- People who never subscribed to this sender. A list collected for another brand, shared by a partner or gathered for a different purpose reaches people who never asked for this mail. A CSV import through
nitro_import_contactsasserts consent for the contacts it creates, so the file has to be right before it goes in. - Too much volume, too soon, from a new or quiet domain. A large first send hits every weak contact at once, so their complaints all land in one campaign. Ramping the first sends and authenticating the sending domain with SPF and DKIM helps protect its reputation.
How to fix a complaint spike by cause
First, find where the complaints came from
Pull the last campaign's numbers with nitro_get_insights, which returns email analytics with trends, benchmarks and recommendations, and read the complaint and unsubscribe rates against the table above. Then use nitro_query, which queries any Nitrosend entity, to pull the contacts behind those numbers and look at what they share: where they came from, when they subscribed, and when they were last mailed.
Complained and bounced addresses are suppressed automatically, so they will not be mailed again. Nothing needs deleting by hand.
Contacts nobody had mailed in months
Build a segment of the contacts who engaged recently with nitro_manage_audience, which manages segments, lists, tags and subscriptions, and send campaigns only to that segment until the rate settles. The guide to email segmentation covers how to split a list this way. The dormant group goes into a re-engagement email campaign rather than the regular schedule, and anyone who does not respond to it stays out of regular sends.
A jump in sending frequency
Bring the cadence back to what subscribers were used to before the spike, then raise it gradually. If an automated flow added the extra sends, edit its draft with nitro_compose_flow. That call never activates a flow, so the change goes live only once it is approved with nitro_control_delivery.
People who never subscribed
Take them out of the file before it is imported. Inline records sent to nitro_import_contacts are subscribed only when the record says so explicitly, while a CSV import asserts consent for every contact it creates. For people already imported, move them out of the segment that receives campaigns with nitro_manage_audience.
Too much volume from a new or quiet domain
Check the domain with nitro_manage_domains, which can verify and diagnose a sending domain, and confirm the records described in email authentication are in place. Then grow volume in batches from most engaged to least, the way warming up an email domain works. Before the next campaign, run it through nitro_review_delivery for a spam analysis and preflight. That review is read-only and never sends anything.
What to do next
Check placement first: the domain's spam rate in Google Postmaster Tools and the last campaign's complaint rate from nitro_get_insights. If either sits at a level in the table, or the mail may be landing in spam folders, hold further campaigns. Sending more of it into spam adds complaints and does nothing for the campaign. A campaign does not go out until it is approved with nitro_control_delivery, so holding it means not approving the next send.
Once the cause is fixed, send the next campaign to the engaged segment only, check it with nitro_get_insights, and widen in batches while the complaint rate stays near the baseline. Keep watching the domain's spam rate in Google Postmaster Tools alongside it.
Application mail such as password resets and receipts is a separate stream with its own rules, covered in transactional email best practices. If bounces spiked in the same send as the complaints, an import was probably behind both, and bounce rate spike after importing a list has the re-import order. If opens fell instead, start with open rate dropped.
Go deeper
Common questions
No. Nitrosend suppresses complained and bounced addresses automatically, so they are not mailed again. The work is finding the segment they came from, because the rest of that segment was mailed the same way and can push the account past 5% of contacts bounced or complained in 30 days.
A complaint rate above 0.5% over at least 100 sends counts as a critical breach, and the account is moved to quarantine. Mailing subscribers who have not heard from the sender in months risks complaints at that level.
Less so. An unsubscribe removes a contact, while a complaint counts against the sending domain. Both still say the same thing about the send. The top reason people unsubscribe is sending too often, and an older industry benchmark puts the average unsubscribe rate around 0.02%, so a spike well above that is worth the same checks.
Hold campaigns until the cause is found, especially if the mail may be landing in spam folders, and check the domain's spam rate against the 0.30% level first. When sending resumes, start with the most engaged segment and widen in batches while complaints stay near the baseline.
Hand the diagnosis to an agent
Ask your agent in Claude, ChatGPT or Cursor, through the Nitrosend MCP server, to pull the last campaign's complaint and unsubscribe rates with nitro_get_insights, find what the complaining contacts share with nitro_query, and build an engaged-only segment with nitro_manage_audience for the next send.