What Are Email Feedback Loops?
When a recipient clicks 'This is spam' in their email client, the ISP does not just move the message to the spam folder — many ISPs also forward a copy of the complaint back to the sender through a mechanism called a Feedback Loop (FBL).
FBLs create a direct channel from ISPs to legitimate senders, allowing you to automatically remove complainers from your mailing list before they cause further damage to your sender reputation. Without FBL registration, you have no visibility into who is marking your mail as spam.
The ARF Format (RFC 5965)
Feedback loop messages use the Abuse Reporting Format (ARF), defined in RFC 5965. An ARF message is a MIME multipart email with three parts:
- Human-readable explanation — describes the complaint
- Machine-readable report — structured fields including
Feedback-Type,User-Agent,Version, andOriginal-Rcpt-To(the recipient address) - Original message — the email that triggered the complaint (may be redacted)
Content-Type: multipart/report; report-type=feedback-report;
boundary="==boundary==12345"
--==boundary==12345
Content-Type: text/plain
This is a spam report.
--==boundary==12345
Content-Type: message/feedback-report
Feedback-Type: abuse
User-Agent: Yahoo!-Mail-Feedback/2.0
Version: 1
Original-Rcpt-To: [email protected]
Arrival-Date: Mon, 25 Feb 2026 10:30:00 +0000
--==boundary==12345
Content-Type: message/rfc822
[Original message headers, body may be redacted]
--==boundary==12345--
Setting Up FBL with Major Providers
Each ISP runs its own FBL program with different registration requirements:
Gmail — Google Postmaster Tools
Gmail does not offer a traditional FBL. Instead, Google provides aggregate spam rate data via Google Postmaster Tools (postmaster.google.com). You can see your domain's spam rate percentage but not individual complaint details.
# To register:
# 1. Go to https://postmaster.google.com
# 2. Add your domain
# 3. Verify ownership via DNS TXT record
# 4. Monitor 'Spam Rate' dashboard — keep below 0.08%
Gmail enforces a 0.1% spam rate threshold for bulk senders (>5,000 messages/day). Exceeding this threshold results in temporary blocking.
Microsoft — JMRP and SNDS
Microsoft operates two complementary programs:
JMRP (Junk Mail Reporting Program): Sends individual ARF complaint reports to your registered email address for every spam complaint from Outlook/Hotmail users.
SNDS (Smart Network Data Services): Provides aggregate data per IP including message count, spam rate, and filter disposition.
Registration: https://sendersupport.olc.protection.outlook.com/pm/default.aspx
Requirements: Valid postmaster@ or abuse@ address at your sending domain
FBL delivery: To the email address registered for your sending IP range
Yahoo — CFL (Complaint Feedback Loop)
Yahoo's CFL sends ARF reports for each spam complaint from Yahoo Mail users. Yahoo is one of the few major ISPs still sending individual complaint reports.
Registration: https://senders.yahooinc.com/
Requirements:
- DKIM signing required
- Valid abuse@ address at your sending domain
- Sending at least 100 messages/day to Yahoo addresses
Other ISPs
| ISP | Program | Notes |
|---|---|---|
| Comcast | Feedback Loop | comcast.net senders, requires SPF |
| Fastmail | — | No public FBL program |
| Apple | Postmaster | Focus on SPF/DKIM/DMARC |
| SpamCop | SRS/SCBL | Free complaint-based blocklist |
Processing FBL Complaints
Registering for FBLs is only useful if you actually process the reports. The core workflow is:
Automatic Unsubscription
The most important step: automatically unsubscribe every complainer. This is both a legal requirement under CAN-SPAM and an operational necessity.
import email
import email.policy
def parse_arf_report(raw_message: bytes) -> str | None:
"""Extract the original recipient from an ARF complaint."""
msg = email.message_from_bytes(raw_message, policy=email.policy.default)
for part in msg.walk():
if part.get_content_type() == "message/feedback-report":
payload = part.get_payload(decode=True)
if payload:
for line in payload.decode().splitlines():
if line.lower().startswith("original-rcpt-to:"):
return line.split(":", 1)[1].strip()
return None
def handle_fbl_complaint(raw_message: bytes) -> None:
recipient = parse_arf_report(raw_message)
if recipient:
unsubscribe_from_all_lists(recipient)
log_complaint(recipient, source="fbl")
Complaint Rate Monitoring
Track complaint rates over time. Alert on sudden spikes:
# Complaint rate formula:
# complaint_rate = complaints_in_period / messages_delivered_in_period
# Alert thresholds:
COMPLAINT_RATE_WARNING = 0.0005 # 0.05% — investigate
COMPLAINT_RATE_CRITICAL = 0.001 # 0.10% — pause sending
What to Do With Complaint Data
Beyond automatic unsubscription, analyze complaint patterns:
- Spike after specific campaign → that campaign content or segment was problematic
- Geographic clustering → content may be inappropriate for that region
- Time-based pattern → sending frequency may be too high
- Specific list segment → that segment is unengaged and should be suppressed
Reducing Complaints
FBL processing is reactive. Here are proactive measures that reduce complaint rates:
Implement List-Unsubscribe
The List-Unsubscribe header lets users unsubscribe directly from their mail client without clicking spam. Gmail shows an 'Unsubscribe' link next to the sender name for any message with this header. This directly reduces spam button clicks:
List-Unsubscribe: <https://example.com/unsubscribe?token=abc123>, <mailto:[email protected]?subject=unsubscribe>
List-Unsubscribe-Post: List-Unsubscribe=One-Click
The List-Unsubscribe-Post header (RFC 8058) enables one-click unsubscription — clicking the link in Gmail's UI sends a POST request directly to your URL, with no intermediate page required. Google requires this for bulk senders since 2024.
Set Accurate Expectations
Complaints often come from subscribers who forgot they opted in, or who did not expect the frequency or content type they are receiving. At signup:
- Clearly state the email frequency ("We send once a week")
- Confirm what topics you will cover
- Send a welcome email immediately after signup
Frequency Management
Over-sending is the primary driver of spam complaints. Respect engagement signals:
# Simple engagement-based frequency cap:
def should_send_to_subscriber(subscriber) -> bool:
days_since_last_open = subscriber.days_since_last_open()
if days_since_last_open > 180:
# Unengaged for 6 months — move to suppression
return False
if days_since_last_open > 90:
# Limit to monthly sends only
return subscriber.days_since_last_email() >= 30
return True
Summary
Email feedback loops are a fundamental tool for protecting your sender reputation. Register with every ISP that offers FBL access, build automated complaint processing to instantly unsubscribe complainers, and use complaint data to diagnose list quality and content issues before they become deliverability crises.