Email observability: the complete guide for developers
Your API returns 202 Accepted, but did the email reach the inbox? Learn how email observability gives you full visibility into delivery, bounces, complaints, and engagement so you can debug issues in minutes instead of days.
Your email API returns 202 Accepted. The password reset email is "sent." But your user is staring at an empty inbox, locked out of their account, about to open a support ticket.
Between sent and received, there are bounces, spam filters, throttling, authentication failures, and reputation-based filtering. Without observability, you only learn about delivery problems when users complain. By then, the damage is done.
This guide covers what email observability is, which metrics matter, how to set up monitoring that actually helps you debug issues, and how to build automated responses that protect your sender reputation.
What email observability means (and what it does not)
Most email platforms give you two data points: sent and failed. That is basic monitoring, not observability.
Email observability means having full visibility into the lifecycle of every email you send:
- Was it accepted by the recipient's mail server?
- Did it bounce, and if so, was it permanent or temporary?
- Did the recipient open it or click a link?
- Did someone mark it as spam?
- What was the API request that triggered the send, and what response did the server return?
The difference matters. Monitoring tells you something broke. Observability tells you what broke, where, and why, with enough context to fix it in minutes instead of days.
Why observability matters for transactional emails
Transactional emails carry direct business impact. Every undelivered email is a concrete problem:
| Email type | What happens when it fails |
|---|---|
| Password reset | User locked out, support ticket opened |
| Order confirmation | Customer anxiety, "where is my order?" calls |
| Account verification | User cannot complete onboarding, churns |
| Invoice / receipt | Compliance risk, payment disputes |
| Two-factor auth | User cannot log in, workflow blocked |
These are not marketing emails where a 20% open rate is acceptable. Transactional emails have a delivery expectation close to 100%. When they fail silently, you lose users and trust.
The hidden cost of flying blind
Without observability, problems compound silently:
- A batch of invalid email addresses enters your system through a buggy signup flow
- Bounce rate climbs over several days, but nobody notices
- Sender reputation degrades as email providers see consistent bounces from your domain
- Legitimate emails start landing in spam for all your users, not just the invalid ones
- Users stop receiving critical emails like password resets and order confirmations
- Support tickets spike, but the root cause is not obvious because you have no delivery data
By the time you realize the problem, your sender reputation may take weeks to recover. A real-time observability system catches step 2, before the cascade begins.
The metrics that matter
Not all email metrics are equally important. Focus on these four, in this order.
Delivery rate
The percentage of emails successfully accepted by recipient mail servers. This is your primary health indicator.
Healthy threshold: above 95%
A delivery rate below 95% signals a systemic issue with your sending domain, your email content, or the quality of your recipient list. Track this metric as a trend line over 7 and 30 days. A single day's data can be misleading, but a downward trend over a week demands investigation.
Bounce rate
The percentage of emails that could not be delivered. Bounces fall into two categories:
Hard bounces (permanent): The email address does not exist, the domain is invalid, or the server permanently rejects the message. These addresses should be suppressed immediately to prevent future sends.
Soft bounces (transient): The mailbox is full, the server is temporarily unavailable, or the message was throttled. These may succeed on retry.
Critical threshold: 4%
Exceeding 4% puts your sending domain at risk. Consequences include reduced deliverability across all your emails, domain suspension, or permanent account restrictions from your email infrastructure provider.
Common bounce reasons and what they tell you:
| Reason | What it means | Action |
|---|---|---|
NoEmail | Address does not exist | Suppress immediately, review signup validation |
MailboxFull | Recipient's inbox is full | Retry later, suppress after repeated failures |
ContentRejected | Content flagged by receiving server | Review email content and authentication |
Suppressed | Address on suppression list | Already handled, verify suppression list is working |
MessageTooLarge | Email exceeds size limits | Reduce attachment size or use hosted links |
Complaint rate
The percentage of delivered emails that recipients marked as spam. This is the most sensitive metric. When someone clicks "Report spam," it generates a complaint that email providers weigh heavily.
Critical threshold: 0.08%
That is less than 1 complaint per 1,250 delivered emails. The threshold is strict because complaints are the strongest negative signal to mailbox providers. Exceeding it can result in your emails being routed to spam folders for all recipients, not just the one who complained.
Complaint feedback types tell you why:
abuse: Recipient considers the email unwantedfraud: Recipient believes the email is a phishing attemptauth-failure: Email failed SPF, DKIM, or DMARC authenticationnot-spam: Recipient reversed a previous spam report
If you see auth-failure complaints, your email authentication is misconfigured. Check your DKIM, SPF, and DMARC setup.
Engagement metrics
Open rates and click rates measure whether recipients interact with your emails. While they do not directly affect deliverability thresholds, they are signals that email providers use to decide inbox placement.
Consistently low open rates across all email types may indicate that your emails are being filtered to spam. Low open rates for a specific email type suggest a subject line or content problem.
Beyond metrics: per-email event timelines
Aggregate metrics tell you the health of your email system. But when a specific user reports "I never got my password reset email," you need to trace the lifecycle of that individual email.
A per-email event timeline shows every state transition for a single message:
1Email abc-1232├─ 10:42:01.037 API request received3├─ 10:42:01.142 Accepted for delivery4├─ 10:42:01.384 Sent to recipient server5├─ 10:42:01.891 Delivered to inbox6├─ 10:43:12.390 Opened7└─ 10:43:15.712 Link clicked (https://yourapp.com/reset?token=...)8
From API request to inbox in 854ms. That is the level of granularity you need to understand your email pipeline.
Or when something goes wrong:
1Email def-4562├─ 10:42:01.037 API request received3├─ 10:42:01.142 Accepted for delivery4├─ 10:42:01.384 Sent to recipient server5└─ 10:42:01.826 Bounced (permanent) - NoEmail6
This level of detail transforms debugging from guesswork into a 30-second lookup. Instead of asking "did we send it?", you can answer "we sent it, it was delivered at 10:42:01.891, and the user opened it at 10:43:12."
With Nuntly's observability dashboard, every email has this timeline available. No premium tier required, no extra configuration. You search by email ID, recipient address, or subject line, and see the full event history.
Deep-stack observability
Basic email monitoring tracks delivery events. Deep-stack observability covers every layer of your email system:
1. API logs
Every API request your application makes to send an email is logged with the full request payload, response, status code, and latency. When a developer asks "did my code actually call the send endpoint?", the answer is in the API logs.
This is critical for debugging integration issues. If your application sends a malformed request, you see the exact payload and the error response without needing to reproduce the issue locally.
2. Delivery tracking
The core email pipeline: sent, delivered, bounced, deferred. Track delivery rates by domain, by email type, and over time windows.
3. Email flow visualization
A Sankey diagram showing how emails move through each stage:
1Sent (10,000) → Delivered (9,750) → Opened (4,200) → Clicked (1,100)2 → Bounced (180)3 → Complained (12)4 → Deferred (58)5
This visual makes it immediately obvious where emails drop off. If the delivered-to-opened ratio is unusually low, your emails may be landing in spam despite being "delivered."
4. Webhook event logs
When you send email events to your application via webhooks, you need visibility into the webhook delivery itself. Did your endpoint receive the event? Did it respond with a 200? If it failed, what was the response?
Webhook event logs with replay capability mean you never lose an event. If your endpoint was down for 10 minutes, you can replay the missed events after it recovers.
5. API throughput and latency
Monitor your sending volume and API response times over time. A sudden spike in latency may indicate rate limiting. A drop in volume may signal an application bug preventing emails from being queued.
Nuntly provides all five layers in a single dashboard, across all plans. No external monitoring tool required.
Practical implementation with the Nuntly SDK
Here is how to send an email with tags for filtering in the observability dashboard:
1const { data, error } = await nuntly.emails.send({2 from: 'notifications@yourapp.com',3 to: 'user@example.com',4 subject: 'Reset your password',5 html: '<p>Click the link below to reset your password.</p>',6 tags: [7 { name: 'type', value: 'password-reset' },8 { name: 'environment', value: 'production' },9 ],10});1112if (data) {13 console.log('Email sent', { emailId: data.id });14}1516if (error) {17 console.error('Send failed', { error: error.message });18}19
The tags array lets you filter and segment your observability data. In the dashboard, you can view delivery metrics specifically for password-reset emails, or compare production vs staging environments.
The data.id is the email's unique identifier. Use it to look up the full event timeline in the dashboard or correlate with webhook events in your application logs.
Automating responses with webhooks
Observability is not just about looking at dashboards. It is about building automated systems that react to email events in real time.
Configure a webhook to receive events and handle them in your application:
1app.post('/webhooks/email-events', async (c) => {2 const event = await c.req.json();34 switch (event.type) {5 case 'bounced':6 if (event.data.bounceType === 'permanent') {7 // Suppress the address to protect sender reputation8 await db.update(users).set({ emailStatus: 'invalid' }).where(eq(users.email, event.data.recipient));9 }10 break;1112 case 'complained':13 // Flag the user and alert the team14 await db.update(users).set({ emailStatus: 'complained' }).where(eq(users.email, event.data.recipient));1516 await alertTeam('Spam complaint received', {17 recipient: event.data.recipient,18 emailId: event.emailId,19 });20 break;21 }2223 return c.json({ received: true }, 200);24});25
With this setup, hard bounces automatically suppress future sends to invalid addresses, and complaints trigger team alerts before the complaint rate reaches dangerous levels.
Ship emails, not infrastructure
Free plan available. No credit card required.
Start sending freeThe 30-day retention advantage
Imagine this scenario: a user contacts support on Thursday saying they did not receive an invoice sent 12 days ago. Your support team needs to investigate.
With 3-day log retention (common on many platforms), that data is gone. The support team has no way to verify whether the email was sent, delivered, bounced, or filtered. The conversation becomes "we sent it, please check your spam folder" with no evidence either way.
With 30-day log retention, the support team searches for the user's email address and sees the full event timeline from 12 days ago. The email was delivered, opened 3 times, and a link was clicked. The user received it. Issue resolved in under a minute.
Nuntly retains all email event data for 30 days on every plan. No data loss, no upsell for longer retention. When a delivery dispute arises, you have the data to resolve it.
Setting up alerts and thresholds
Dashboards are useful when you are looking at them. Alerts catch problems when you are not. Configure threshold-based alerts for these metrics:
| Metric | Warning | Action required |
|---|---|---|
| Delivery rate | Below 97% | Below 95% |
| Bounce rate | Above 2% | Above 4% |
| Complaint rate | Above 0.05% | Above 0.08% |
| Send volume | 50% above/below baseline | 80% above/below baseline |
Volume anomalies deserve attention too. A sudden drop in send volume may indicate an application bug that prevents emails from being sent. A sudden spike may indicate an abuse scenario or a misconfigured batch job.
Building a monitoring routine
Tools alone are not enough. A monitoring routine turns observability into consistent action:
- Daily (under 1 minute): Check the dashboard for anomalies. Look at delivery rate, bounce rate, and complaint rate. If all three are within thresholds, move on.
- Weekly: Review 7-day trend lines. Look for gradual degradation that daily checks might miss. Compare metrics by email type to spot problems with specific templates.
- On alert: Investigate immediately. Check the event timeline for affected emails, identify the root cause, and take corrective action before the problem compounds.
- Monthly: Audit overall email health. Review your suppression list size, check domain authentication status, and compare engagement metrics across email types.
Debugging a real delivery issue: step by step
Here is how observability turns a vague "emails are not working" report into a resolved incident:
Step 1: Check aggregate metrics. The dashboard shows bounce rate spiked from 1.2% to 6.8% in the last 4 hours.
Step 2: Filter by bounce type. Hard bounces increased significantly. Soft bounces are unchanged.
Step 3: Filter by email type. The spike is isolated to account-verification emails. Other email types are unaffected.
Step 4: Inspect individual bounces. The event timelines show bounce reason NoEmail for addresses at a specific domain pattern. The addresses look auto-generated.
Step 5: Identify root cause. A bot is submitting fake email addresses through the signup form. The verification emails to these addresses are bouncing.
Step 6: Fix and verify. Add CAPTCHA to the signup form and rate limiting on the verification endpoint. Monitor the bounce rate as it returns to normal over the next few hours.
Without observability, this scenario plays out differently: the bounce rate climbs silently for days until the email infrastructure provider suspends your domain. Recovery takes weeks instead of hours.
How to reduce bounces and complaints
Observability shows you the problem. Here is how to fix the most common issues:
Reducing bounces:
- Validate email addresses at signup with format and domain checks
- Suppress hard-bounced addresses immediately and permanently
- Use double opt-in for new accounts to verify address ownership
- Monitor bounce patterns by type and reason to catch systemic issues early
Reducing complaints:
- Only send expected, transactional emails that the user triggered
- Use a recognizable sender name and
fromaddress - Ensure proper email authentication (DKIM, SPF, and DMARC)
- Never send marketing content disguised as transactional emails
- Include clear unsubscribe links where appropriate
Start monitoring your emails
Transactional emails are too important to send without visibility. Every undelivered password reset, every bounced invoice, and every spam complaint has a real cost.
Nuntly gives you full observability out of the box: per-email event timelines, API logs, delivery dashboards, webhook event tracking with replay, and 30 days of retention on every plan. No configuration needed, no premium tier required.
"Observability is gamechanging."
Ship emails, not infrastructure
Free plan available. No credit card required.
Start sending free