Analytics
These endpoints return workspace-wide metrics. All of them require analytics:read. For per-campaign metrics, see campaign stats.
Metric definitions
The API, the dashboard, the campaign pages, the inbox, the contact page and Fold share these definitions.
| Metric | Unit | Definition |
|---|---|---|
sent | Emails that actually left Beeving (sent_at set). Queued and failed attempts are excluded. A contact who received three steps counts three times. | |
delivered | Sent emails for which no bounce was received: the recipient server accepted them. Inbox or spam placement is not measured. | |
delivery_confirmed | Emails whose delivery the sending provider reported. Only some providers report it. | |
bounced | Emails rejected by the recipient server. | |
opened / unique_opens | Emails with at least one open detected by the tracking pixel. Blocked images hide opens; privacy proxies and security scanners can add some. | |
clicked / unique_clicks | Emails with at least one tracked link clicked. | |
total_opens / total_clicks | event | Every tracking event, repeated opens and clicks included. |
replied | Emails that received a reply, automatic replies (out of office) included. | |
positive_replies | Replies classified as positive by the AI. This is interest expressed in a reply, not a sale or a meeting. unclassified_replies are not classified yet. | |
unsubscribed | Emails whose unsubscribe link was used. |
Every rate is a percentage of sent in the same scope, rounded to one decimal place. The only exception is click_through_rate (clicked / opened). A rate is 0 when nothing was sent: check sent before reading it as a real 0 %.
Interactions belong to the email they answer. Totals filtered by period count the emails sent in the period, with all their interactions, even later ones. Time series place each send and each first open, click or reply on the day it happened, so a late reply to an older email appears on the day it arrived. Days are in the application timezone (UTC).
Changes in October 2026
Recorded events are unchanged. Only the way they are counted changed:
- Queued and failed attempts no longer count as sent, so rates can rise slightly.
- Campaign rates now use the emails sent as their base, as the dashboard already did. Before, they used emails confirmed as delivered by the provider. That base was often empty, which showed 0 %.
deliverednow means "no bounce received". It used to mean "confirmed by the provider", which is nowdelivery_confirmed.- A campaign's
clickednow counts clicked emails, likeopened. The raw number of clicks is still intotal_clicks. - Time series count emails by the date of their first interaction instead of counting every tracking event, and include an
Emails repliedseries. Day labels follow the "1 Mar" format. recent_campaignsand the campaign stats CSV export return the real sent, opened and clicked counts. They used to stay at 0.- The contact page no longer counts queued and failed attempts as sent, and shows a dash instead of 0 % when no email was sent to the contact.
Dashboard
GET /analytics/dashboard{
"data": {
"contacts": { "total": 4820, "growth": 12.5 },
"campaigns": { "active": 3, "sent_today": 412 },
"rates": { "open": 48.2, "click": 9.1, "reply": 4.3 },
"totals": { "sent": 21000, "opened": 10122, "clicked": 1911, "replied": 903 },
"recent_campaigns": [
{ "id": 12, "name": "Q2 outbound", "status": "active", "sent": 180, "opened": 92, "clicked": 31, "replied": 12, "open_rate": 51.1, "click_rate": 17.2, "reply_rate": 6.7, "created_at": "..." }
]
}
}contacts.totalcounts active contacts.growthis a percentage.campaigns.activeis a snapshot: campaigns with theactivestatus right now.sent_todaycounts emails sent since midnight UTC.ratesandtotalscover every email sent since the first campaign.
Emails sent over time
GET /analytics/emails-sent?days=30days is between 1 and 90. The default is 30. The period is the last days days, today included. Each series counts emails: sent on that day, or opened, clicked or replied for the first time on that day.
{
"data": {
"categories": ["1 Mar", "2 Mar"],
"series": [
{ "name": "Emails sent", "data": [120, 98] },
{ "name": "Emails opened", "data": [54, 61] },
{ "name": "Emails clicked", "data": [8, 11] },
{ "name": "Emails replied", "data": [3, 5] }
]
}
}The response is ready to plug into most chart libraries, such as ApexCharts or Chart.js.
Performance
GET /analytics/performance{ "data": { "rates": { "open": 48.2, "click": 9.1, "reply": 4.3 }, "totals": { "sent": 21000, "opened": 10122, "clicked": 1911, "replied": 903 } } }Top campaigns
GET /analytics/top-campaigns?limit=5limit is between 1 and 20. The default is 5. Only active and completed campaigns that have sent at least one email are included.
{ "data": [ { "id": 12, "name": "Q2 outbound", "sent": 180, "opened": 92, "clicked": 31, "replied": 12, "open_rate": 51.1, "click_rate": 17.2, "reply_rate": 6.7 } ] }