Live Tail
Watch every send, delivery, bounce, open, click, and complaint stream into your dashboard in real time. Like tail -f for email.
What it does
#When an email moves through any state — queued, sending, sent, delivered, opened, clicked, bounced, complained, unsubscribed, delivery delayed, suppressed, retrying, failed — Live Tail pushes the event to your browser within ~500ms over a long-lived Server-Sent Events (SSE) connection. Filters apply server-side, so you only receive what you care about.
The last 60 seconds of events are replayed when you connect, so you never stare at an empty screen on a quiet account.
Availability
#| Plan | Live Tail |
|---|---|
| Free | Not included |
| Starter | Not included |
| Growth | Included |
| Scale | Included |
Up to 5 concurrent live sessions per account. Free and Starter accounts can still use the standard /logs page with page-by-page navigation.
Using it from the dashboard
#- Open
/logsin the dashboard. - Click the Live toggle in the top-right of the page. The pulsing green dot confirms the stream is open.
- Apply filters (event type chips, search box) — they are sent server-side, so only matching events stream down.
- Toggle Live off to return to paginated history; toggle on to resume streaming.
Connecting from your own client
#The endpoint is a standard SSE feed. Any EventSource-compatible client works, including curl.
Endpoint: GET /api/dashboard/logs/stream
Auth: session cookie (the same one the dashboard uses). API-key auth and a dedicated public endpoint are on the roadmap.
Query parameters:
eventType— limit to a single type (queued,sending,sent,delivered,opened,clicked,bounced,complained,unsubscribed,delivery_delayed,suppressed,received,retrying,failed)search— substring match against recipient, sender, or subject
From the browser:
const es = new EventSource("/api/dashboard/logs/stream?eventType=bounced");
es.addEventListener("ready", () => console.log("connected"));
es.addEventListener("replay", (e) => console.log("replay:", JSON.parse(e.data)));
es.onmessage = (e) => console.log("event:", JSON.parse(e.data));
es.onerror = () => console.warn("reconnecting...");Event payload
#Each event arrives as JSON in the SSE data: line:
{
"id": "evt_01HW...",
"emailId": "em_01HW...",
"userId": "usr_01HW...",
"eventType": "bounced",
"metadata": {
"bounceType": "Permanent",
"bounceSubType": "General",
"diagnosticCode": "smtp; 550 5.1.1 user unknown",
"reportingMTA": "dsn; b.mx.example.com"
},
"createdAt": "2026-05-02T20:43:11.221Z",
"email": {
"fromAddress": "[email protected]",
"toAddresses": ["[email protected]"],
"subject": "Order shipped",
"status": "bounced"
}
}Event names emitted on the SSE stream
#ready— fired once on connect.replay— replay of the last 60s of events on connect.message— every live event after connect (default SSE event type).
Limits and behaviour
#- Up to 5 concurrent live sessions per account. A 6th connection returns
429. - Heartbeat every 25 seconds keeps the connection alive through proxies. Standard SSE comment line.
- Auto-reconnect is built into the browser
EventSourceAPI. The dashboard surfaces a "Reconnecting…" state on transient errors. - Free and Starter accounts hitting this endpoint receive
403 Forbidden.