# email.complained — Webhooks — PostFrame — EternalEngine

Fires when a recipient marks your email as spam, captured via ISP feedback loops. The recipient is auto-suppressed to protect your reputation.

[Back to Webhooks](https://eternalengineos.io/features/postframe/webhooks/)

Webhook Event

# email.complained

Fires when a recipient marks your email as spam. The provider's complaint notification is verified, the address is suppressed immediately, and the feedback type and provider are sent to your endpoint.

[Start free](https://app.eternalengineos.io/signup?plan=free&interval=annual)[All webhook events](https://eternalengineos.io/features/postframe/webhooks/)

## Complaint Handling

Feedback loops via the provider

Complaints arrive as provider notifications whose signature PostFrame verifies before acting

Automatic suppression

The complaining recipient is immediately added to your suppression list — no manual action needed

Complaint-rate pause

Your complaint rate over 24 hours is checked against a threshold (0.1% by default); above it, sending pauses

Tags for attribution

The email's tags ride on every event so you can attribute the complaint to a kind of send

Payload Fields

recipient

Who complained

complaint_feedback_type

The feedback type the mailbox provider reported, e.g. abuse

provider

Which provider relayed the complaint

tags

The email's tags, for attribution. Every event also carries data.email_id, message_id, from, to, subject, status, tags and created_at

## Keep exploring PostFrame

[### Complaint handling Immediate suppression and the 0.1% rate pause. Open Complaint handling →](https://eternalengineos.io/features/postframe/tracking/complaint-handling/)[### email.bounced Fires when the receiving server refuses the message. Open email.bounced →](https://eternalengineos.io/features/postframe/webhooks/email-bounced/)[### email.unsubscribed Fires on one-click or link unsubscribe. Open email.unsubscribed →](https://eternalengineos.io/features/postframe/webhooks/email-unsubscribed/)

Questions

## Common questions, straight answers.

What is in the email.complained payload?

The common fields — email_id, message_id, from, to, subject, status, tags, created_at — plus complaint_feedback_type (for example abuse) and the provider name.

How do I verify the webhook came from PostFrame?

Every delivery carries an X-PostFrame-Signature header of the form v1=. It is an HMAC-SHA256 of "." using the endpoint's signing secret, which you can rotate from the dashboard at any time.

What happens if my endpoint is down?

PostFrame retries five times with exponential backoff — 10, 20, 40, 80 and 160 seconds — and records every attempt, with the HTTP status and timing, in the endpoint's delivery log.

Can I try the endpoint before real traffic arrives?

Yes. Each webhook endpoint has a Test action that sends a sample event to your URL. Emails sent in test mode never dispatch webhooks, so your integration tests do not fire production hooks.

## Run your business from one place.

Five plans, seventeen launch apps, one dashboard. Set up in under 5 minutes — change tiers any time.

[Start free$0 forever &bull; No card &bull; Upgrade any time](https://app.eternalengineos.io/signup?plan=free&interval=annual)[Talk to Sales](https://eternalengineos.io/contact/)

From $0 · Basic $9.95/mo · Save 20% on annual billing · Upgrade or downgrade any time
