Reports

Get business report summary

Changed on

The business-level performance rollup for a period: signups, new subscribers, attributed revenue and orders, engagement rates, and business-wide order and revenue totals for context. Pass compare=previous_period to add previous-period values and typed change deltas to every metric.

attributed_revenue and attributed_orders credit the email and SMS messages Privy sent, under the same last-touch rule as the rest of Privy's reporting: an order counts when the contact's most recent engagement in the 7 days before it was an email open, an email click, or an SMS click. Orders credited to a display signup are excluded, and every figure here is dated by when the crediting message was sent, not by when the order or the engagement happened. A period's attributed revenue is therefore the revenue driven by messages sent in that period, and it includes orders placed after the period closed, whenever the contact engaged later — so the newest days keep filling in for a while after the fact. The engagement counts and rates use the same send window: an open in this period on a message sent last month lands in last month.

The rates each divide by something different. open_rate is opens counted once per contact per campaign, over email deliveries — SMS messages have no opens. click_rate counts clicks the same way but per channel, over email and SMS deliveries combined. unsubscribe_rate is unsubscribe and opt-out events, not distinct contacts, over those same combined deliveries. order_rate is attributed orders over delivered messages. revenue_per_recipient divides attributed revenue by email sends only. signup_rate is display form submissions over display views, so it measures on-site capture, not messaging. signups counts form submissions on your displays, while new_subscribers counts contacts becoming subscribed to marketing on either channel from any source, so the two answer different questions and neither is de-duplicated by contact.

Periods reaching back before the account's reporting boundary (2026-07-01 for most accounts, earlier where more history was backfilled) are served whole — comparison period included — from Privy's historical rollups instead of the live reporting store. The rate formulas above still hold, but the basis differs: new subscribers, every by_channel/by_type split, and totals_context are null; attributed orders and revenue include display-credited orders and are dated by when the attribution was recorded, not by send time — so order_rate's numerator counts orders its message denominator never sent, and reads a little high for accounts with display-credited orders; and days are bucketed in US Eastern time regardless of the account's time zone. Treat comparisons that straddle the boundary as approximate, and say so.

Required scope: reports_read

get/reports/summary

Request

  • Base URL
    https://api.privy.com/v1
  • Auth
    HTTP bearer

Query parameters

period'last_7_days' | 'last_30_days' | 'last_90_days' | 'this_month' | 'last_month' | 'custom'

The date range to report over, resolved in the account's time zone. Pass custom together with start_date and end_date.

start_datestring date

Inclusive start of a custom period (ISO 8601 date). Required when period=custom, ignored otherwise.

end_datestring date

Inclusive end of a custom period (ISO 8601 date). Required when period=custom, ignored otherwise. Custom periods are capped at 366 days.

compare'previous_period'

Pass previous_period to include previous_value, change and change_type on every metric and a comparison_period block. Any other value is rejected.

Headers

Privy-Account-Idstring

Target a subaccount instead of the main connected account. Pass a subaccount id from get_account's subaccounts list. Only direct subaccounts of the connected account are reachable — omit this for the main account itself.

Response

The business's performance rollup over the resolved period.

Example response

{
  "data": {
    "period": {
      "label": "last_30_days",
      "start_date": "2026-06-21",
      "end_date": "2026-07-20"
    },
    "comparison_period": {
      "start_date": "2026-05-22",
      "end_date": "2026-06-20"
    },
    "signups": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count",
      "by_channel": {
        "email": 1050,
        "sms": 190
      }
    },
    "new_subscribers": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "signup_rate": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "attributed_revenue": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count",
      "by_channel": {
        "email": 1050,
        "sms": 190
      },
      "by_type": {
        "campaign": 190,
        "flow": 122
      }
    },
    "attributed_orders": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count",
      "by_channel": {
        "email": 1050,
        "sms": 190
      },
      "by_type": {
        "campaign": 190,
        "flow": 122
      }
    },
    "order_rate": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "average_order_value": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "revenue_per_recipient": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "open_rate": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "click_rate": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "unsubscribe_rate": {
      "value": 1240,
      "previous_value": 980,
      "change": 26.5,
      "change_type": "relative",
      "unit": "count"
    },
    "totals_context": {
      "total_orders": 890,
      "total_revenue": 52300
    }
  }
}

Changes

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new forbidden enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • warning

      added the new segment_builder_required enum value to the / response property for the response status

    • info

      endpoint added