Blog · Deliverability
Why FBL Complaints Persist on Transactional Email Even When Content Is Legitimate
If you are sending transactional email that people asked for - password resets, order confirmations, invoice receipts - and you are still getting feedback loop complaints, the reason is almost always the same: a missing `List-Unsubscribe` header.
This is not a content problem. Your email is not spam. Your readers did not mark it as spam because they were annoyed. They marked it because the feedback loop system told their mailbox provider "this sender is sending unsolicited bulk mail" - and the missing header made it easy to do that.
What a feedback loop actually tells you
Feedback loops (FBLs) are agreements between large mailbox providers and senders. When a recipient clicks "report as spam" in their webmail interface, the mailbox provider forwards that complaint - stripped of content, containing only the email's metadata - back to the sender's abuse address.
The critical thing an FBL complaint tells you is: this recipient's mailbox provider thinks your mail looks like bulk mail, not transactional mail.
Transactional mail is email triggered by a user action. A password reset is not a marketing campaign. The recipient asked for it. But if that email arrives without the right headers, mailbox providers have no way to tell the difference between it and a newsletter someone never signed up for.
The signal that separates the two is the `List-Unsubscribe` header.
Why List-Unsubscribe is the actual fix
The `List-Unsubscribe` header tells the mailbox provider two things:
1. This message has an unsubscribe path - the recipient can opt out
2. The unsubscribe mechanism is one click, not a reply or login
Without it, the mailbox provider has no way to distinguish your transactional email from unsolicited bulk mail in their filtering pipeline. When enough people click "report spam" on messages without this header, the provider starts treating all your mail as spam - not just the ones that annoyed that specific recipient.
RFC 7003 defines the `List-Unsubscribe` header. RFC 8058 defines `List-Unsubscribe-Post`, which lets the recipient unsubscribe with a single click (no confirmation email required). Both are supported by Google, Microsoft, and most major consumer mailbox providers.
If you are sending transactional email and not including both headers, you are relying on recipients to manually mark your mail as "not spam" to keep receiving it. That is not a sustainable relationship with your mailbox provider's filtering system.
What the complaint actually looks like
When you receive an FBL complaint, you get a metadata bundle that looks something like this:
- `Message-ID` of the complained-about message
- `Feedback-ID` - a unique identifier for this complaint event
- `Complaint-Type` - usually `abuse`
- `User-Agent` - which webmail interface the recipient was using
Not the email content. Not the sender's address (beyond what is in the headers). The FBL tells you who complained and which message triggered it - nothing more. That means you cannot use the complaint to judge your content. You can only use it to judge your headers.
If the complaints are coming from transactional messages that genuinely have `List-Unsubscribe` headers, the next thing to check is your sending domain's reputation and whether that specific template has been flagged for a separate reason - high volume spike, suspicious payload in a link, previous reputation damage from a different sending pattern.
DMARC aggregate reports can help here. If you are seeing FBL complaints alongside DMARC alignment failures for the same sending domain, that is a structural problem, not a template problem. Both signals reflect the same underlying classification issue at the mailbox provider, and addressing the authentication problem usually reduces the FBL rate over time. DMARCFlow tracks both signal types and flags domains where reputation damage and authentication failures appear together.
How to add the header correctly
For transactional email templates, the correct implementation is:
```
List-Unsubscribe:
List-Unsubscribe-Post: List-Unsubscribe=One-Click
```
The `mailto:` unsubscribe method requires the recipient to send an email. The `List-Unsubscribe-Post` method lets them click once and be removed automatically. Use both - mailbox providers handle the `mailto:` fallback if they do not support one-click unsubscribe.
Some ESPs (SendGrid, Mailgun, Postmark) add these headers automatically for transactional templates if you configure them correctly. Others require you to add them manually. If you are sending through a platform that does not support them natively, your development team needs to add them at the template level, not the account level.
Why confirming unsubscribe requests matters
When someone unsubscribes from transactional email through an FBL complaint, that preference needs to propagate immediately across your sending system. If your suppression list does not update in real time - or if it updates only once a day - you may be re-sending to people who have already complained.
This is one of the most common reasons FBL complaints persist even after you have added the correct headers: the suppression list lags behind the complaint feed.
Check your ESP's suppression list refresh interval. For transactional email, the suppression list should update within minutes of an unsubscribe event, not hours. If your ESP does not offer real-time suppression updates, that is a gap worth fixing before you spend time adjusting anything else.
When the content itself is the problem
If you have the right headers and a current suppression list and complaints are still coming in, the issue may be that your transactional template contains elements that look like marketing email:
- Large images without text fallbacks
- Multiple calls-to-action that resemble newsletter layouts
- Subject lines that include promotional language ("Your invoice is ready - plus a special offer inside")
Transactional email should be visually distinguishable from promotional email. The subject line should describe a transaction, not a product. The body should contain information the recipient needs, not upsell content that could have been in a marketing campaign.
If your transactional template shares a design template with your marketing email - same header, same footer, same layout - the mailbox provider's classifiers may not be making a meaningful distinction either. You can verify this against your DMARC aggregate reports: transactional templates that consistently produce high DMARC failure rates often accompany FBL complaints, because both signals are the classifier's response to the same ambiguous signal.
Quick checklist
- `List-Unsubscribe` header present on every transactional message
- `List-Unsubscribe-Post: List-Unsubscribe=One-Click` also present
- Unsubscribe targets are monitored and functional
- Suppression list updates in real time, not on a daily batch
- Transactional templates are visually distinct from marketing templates
- Subject lines describe a transaction, not a promotion
- Sending domain has no prior reputation damage from different sending patterns
FAQ
**Can I remove the List-Unsubscribe header for password resets?**
No. All commercial email, including transactional messages, must include a working unsubscribe mechanism under CAN-SPAM (US) and GDPR-related best practices in the EU. The unsubscribe path can point to an account management page where the user controls their communication preferences - it does not have to be a one-click marketing unsubscribe.
**Does adding List-Unsubscribe guarantee FBL complaints stop?**
No. If your sending domain has accumulated reputation damage, adding the headers now will help over time but will not reset your reputation instantly. Check your domain's sender score and check whether you are on any blocklists before assuming the headers are the only problem.
**My ESP says they add the header automatically. Do I still need to check?**
Yes. ESPs often add `List-Unsubscribe` to marketing campaigns but not to transactional templates, or they add it only when a specific template flag is set. Check the raw headers of your next transactional email and verify both headers are present before assuming your ESP has configured them correctly.