---
title: "Get the money-vs-outcomes report"
method: GET
path: "/reports/outcomes"
tags: ["Reports"]
---

# Get the money-vs-outcomes report

`GET /reports/outcomes`

## Request

- Base URL: `https://api.emailchaser.com/r`
- URL: `https://api.emailchaser.com/r/reports/outcomes`
- Auth: HTTP bearer

Puts spend against results for a window (since/until compare inclusively; both optional). Spend has two parts. (1) Settled credit debits from the workspace ledger, grouped by reason; in-flight reservations are excluded until they settle, credits used while Emailchaser had made the workspace's credits free are not spend and are excluded, and credits are valued at the current list price of one credit, the same per-credit price a top-up is quoted at before volume discounts, regardless of what was actually paid for them via bulk discounts or plan allowances. (2) Done-for-you order costs from each order's stored cost breakdown; orders are counted by creation time, and failed or canceled orders are excluded because their charges are unwound. Subscription (platform) fees are NOT included: the backend stores only the current subscription state, not per-window invoice history, so they cannot be attributed to a window honestly. Outcomes are sent emails, replied leads, positively-replied (interested) leads and leads marked meeting-booked in the window. costPerReply, costPerPositive and costPerMeeting divide total spend by each outcome count and are null when that count is zero. The optional campaignId narrows the OUTCOME side only - credit and order spend is workspace-level and cannot be attributed to one campaign - so per-campaign cost figures are partial attribution, not a true campaign cost.

## Query parameters

- `since` string
- `until` string
- `campaignId` integer

## Response `200`

The report

- ModelsOutcomesReportResponse
  - `campaignId` integer: CampaignID echoes the campaign filter when one was given. Only the outcome side is narrowed by it; spend stays workspace-level.
  - `costPerMeeting` number: CostPerMeeting is total spend divided by meetings, null when there are none.
  - `costPerPositive` number: CostPerPositive is total spend divided by positive replies, null when there are none.
  - `costPerReply` number: CostPerReply is total spend divided by replies, null when there are none.
  - `outcomes` ModelsOutcomesReportOutcomes
    - `meetings` integer: Meetings counts leads marked as having booked a meeting in the window.
    - `positiveReplies` integer: PositiveReplies counts leads whose reply was categorized as interested.
    - `replies` integer
    - `sent` integer
  - `since` string: Since echoes the window start, or null when the window is open-ended.
  - `spend` ModelsOutcomesReportSpend
    - `credits` integer: Credits is the total of settled credit debits in the window. In-flight reservations are excluded until they settle.
    - `creditsByReason` ModelsOutcomesReportCreditReason[]
      - `credits` integer
      - `reason` string
    - `creditsUsd` number: CreditsUsd values the spent credits at the list price per credit.
    - `dfyOrders` integer: DfyOrders is how many done-for-you orders were placed in the window (failed and canceled orders are excluded).
    - `dfyOrdersUsd` number
    - `totalUsd` number
  - `until` string: Until echoes the window end, or null when the window is open-ended.

## Other responses

- `400`: Invalid query parameter
- `401`: Unauthorized - invalid or missing API key
- `404`: Campaign not found
- `500`: Failed to build the report

---

[API](https://skmtc.dev/emailchaser/apis/emailchaser-api.md) · [All operations](https://skmtc.dev/emailchaser/apis/emailchaser-api/llms.txt) · [OpenAPI document](https://skmtc.dev/emailchaser/apis/emailchaser-api/revisions/8b114990abb7?raw)
