Skip to content

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.

MetricUnitDefinition
sentemailEmails that actually left Beeving (sent_at set). Queued and failed attempts are excluded. A contact who received three steps counts three times.
deliveredemailSent emails for which no bounce was received: the recipient server accepted them. Inbox or spam placement is not measured.
delivery_confirmedemailEmails whose delivery the sending provider reported. Only some providers report it.
bouncedemailEmails rejected by the recipient server.
opened / unique_opensemailEmails with at least one open detected by the tracking pixel. Blocked images hide opens; privacy proxies and security scanners can add some.
clicked / unique_clicksemailEmails with at least one tracked link clicked.
total_opens / total_clickseventEvery tracking event, repeated opens and clicks included.
repliedemailEmails that received a reply, automatic replies (out of office) included.
positive_repliesemailReplies 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.
unsubscribedemailEmails 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 %.
  • delivered now means "no bounce received". It used to mean "confirmed by the provider", which is now delivery_confirmed.
  • A campaign's clicked now counts clicked emails, like opened. The raw number of clicks is still in total_clicks.
  • Time series count emails by the date of their first interaction instead of counting every tracking event, and include an Emails replied series. Day labels follow the "1 Mar" format.
  • recent_campaigns and 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
json
{
  "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.total counts active contacts.
  • growth is a percentage.
  • campaigns.active is a snapshot: campaigns with the active status right now. sent_today counts emails sent since midnight UTC.
  • rates and totals cover every email sent since the first campaign.

Emails sent over time ​

GET /analytics/emails-sent?days=30

days 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.

json
{
  "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
json
{ "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=5

limit is between 1 and 20. The default is 5. Only active and completed campaigns that have sent at least one email are included.

json
{ "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 } ] }

API v1.0