# email.opened — Webhooks — PostFrame — EternalEngine

Fires when a recipient opens your email, detected by an invisible pixel. The payload carries the IP address and user agent with the email's ID and tags.

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

Webhook Event

# email.opened

Fires the first time the tracking pixel loads. The payload carries the IP address and user agent of the client that fetched it, so you can tell which mail client rendered the message.

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

## Engagement Detection

Tracking pixel detection

1x1 transparent pixel loaded when the email is opened — invisible to recipients

Client string

The raw user agent is included so you can identify the mail client on your side

IP address

The IP of the pixel request is included as recorded

Deduplicated

Repeat opens inside the dedup window are ignored, so one reader does not fire your endpoint repeatedly

Payload Fields

messageId

Unique message identifier

user_agent

The raw client string

ip

The IP address of the request

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

[### Open tracking How the pixel works and why opens are a signal, not a count. Open Open tracking →](https://eternalengineos.io/features/postframe/tracking/open-tracking/)[### email.clicked Fires with the destination URL. Open email.clicked →](https://eternalengineos.io/features/postframe/webhooks/email-clicked/)[### email.delivered Fires when the receiving server accepts the message. Open email.delivered →](https://eternalengineos.io/features/postframe/webhooks/email-delivered/)

Questions

## Common questions, straight answers.

What is in the email.opened payload?

The common fields — email_id, message_id, from, to, subject, status, tags, created_at — plus ip and user_agent from the request that loaded the pixel.

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
