Emails::Broadcast

Fetch Email Broadcast Stats

Changed on

Delivery progress, engagement and revenue for one email broadcast, the same numbers as the broadcast's page in the ClickFunnels dashboard.

The numbers cover the broadcast's send window, returned as timerange: from when sending began until two weeks after it completed, or until now while it has not completed, capped at 90 days after sending began. A broadcast that has not started sending reports the last 90 days, with every number zero. There are no timerange parameters; the timerange_start and timerange_end parameters of the funnel and page stats endpoints are refused with a 422 rather than silently ignored.

Counts are unique contacts, except opened and clicked, which count every event. Rates are whole percentages (0-100) of the audience (progress.total), rounded to the nearest integer, so a share under 0.5% reads 0 next to a non-zero count; the counts are authoritative. click_to_open_rate is unique clicks over unique opens. Revenue is attributed to the broadcast when the buyer reached the order through one of its links, summed across every send of the broadcast. Only live-mode transactions in the workspace currency are counted (a workspace with no currency set has nothing to filter on, so currency is null and every currency is summed); test-mode orders are excluded.

progress.total is the audience size recorded when the broadcast sent, summed over every send of the broadcast, and is null before the first send has run. Stats are cached for a few minutes while a broadcast is sending and longer once it has completed.

The split-test variants and the winner are on the broadcast record itself (GET /api/v2/emails/broadcasts/{id}). Add expand[]=variants for each variant's numbers: recipients, bounces, unique clicks, unsubscribes and spam complaints, reported separately for the split test and for the winner's send to the rest of the audience, so variants are compared on the test alone. Only the open pixel identifies a variant, so these are derived from the record of which contacts were sent which variant. That record is removed 30 days after the broadcast completes, and from then on test and winner_send are null; read them once the two-week stats window has closed and within 30 days of completion. Expanding variants can take a few seconds on a large broadcast the first time; the result is cached like the other numbers.

get/emails/broadcasts/{broadcast_id}/stats

Request

Path parameters

broadcast_idstring required

Query parameters

expand[]string[]

Expand additional data in the response. Use expand[]=variants to include a variants array with each split-test variant's numbers, split into the test and the winner's send.

Response

OK

currencystring nullable

ISO 4217 currency code for all monetary values (e.g. USD, EUR). null when the workspace has no currency set; revenue then sums every currency the broadcast's orders were paid in.

Example response

{
  "broadcast": {
    "id": 1,
    "public_id": "GhIjKl",
    "name": "Weekly Newsletter"
  },
  "currency": "USD",
  "timerange": {
    "from": "2026-08-01T10:00:00Z",
    "to": "2026-08-15T12:00:00Z"
  },
  "progress": {
    "total": 1000,
    "queued": 0,
    "processing": 0,
    "sent": 985,
    "failed": 3
  },
  "performance": {
    "delivered": 985,
    "bounced": 12,
    "opened": 610,
    "unique_opens": 402,
    "clicked": 95,
    "unique_clicks": 81,
    "unsubscribed": 4,
    "spam_complaints": 1,
    "open_rate": 40,
    "click_rate": 8,
    "click_to_open_rate": 20,
    "bounce_rate": 1,
    "unsubscribe_rate": 0
  },
  "revenue": {
    "total": "1234.50",
    "orders_count": 17,
    "per_recipient": "1.23",
    "per_unique_open": "3.07",
    "per_unique_click": "15.24"
  },
  "variants": [
    {
      "subject": "You're not selling to their brain",
      "preheadline": "Read this before your next launch",
      "main": true,
      "winner": true,
      "test": {
        "recipients": 300,
        "bounced": 3,
        "unique_clicks": 30,
        "unsubscribed": 1,
        "spam_complaints": 0
      },
      "winner_send": {
        "recipients": 400,
        "bounced": 6,
        "unique_clicks": 31,
        "unsubscribed": 2,
        "spam_complaints": 1
      }
    },
    {
      "subject": "People buy first and explain later",
      "preheadline": "The decision happens before the reasons",
      "main": false,
      "winner": false,
      "test": {
        "recipients": 300,
        "bounced": 3,
        "unique_clicks": 20,
        "unsubscribed": 1,
        "spam_complaints": 0
      },
      "winner_send": null
    }
  ]
}

Changes