# Export the uplift report

Exports the [uplift report](/product/statistics-and-analytics/uplift-report/), a campaign's or a journey's holdout metrics, to a CSV file, through the same task lifecycle as [message statistics export](/developer/api-reference/statistics-api/export-messages-statistics-api/#how-the-export-flow-works): call `export`, poll `status`, call `result`, then download.

<Aside type="note" title="Not the control group export">
`TASK_TYPE_EXPORT_CONTROL_GROUP` exports a control group's member list: devices and user counts. `TASK_TYPE_EXPORT_CONTROL_GROUP_ANALYTICS`, documented here, exports the uplift report's metrics instead: no member list, no device data. They're separate task types with separate arguments.
</Aside>

## Request

`POST` `https://api.pushwoosh.com/api/v2/statistics/exportMessagesStatistics/export`

Use `"type": "TASK_TYPE_EXPORT_CONTROL_GROUP_ANALYTICS"` and an `export_control_group_analytics` object instead of `export_messages_v2`. Authentication and the rest of the lifecycle (`status`, `result`, `lastTasks`, `delete`, download) work exactly as described on [message statistics export](/developer/api-reference/statistics-api/export-messages-statistics-api/).

`export_control_group_analytics` accepts:

| Name | Required | Type | Description |
|---|---|---|---|
| `application_code` | Yes | String | [Application code](/developer/api-reference/api-identifiers/#application-code). |
| `date_from` | Yes | String | Window start over the report's own timestamp, `YYYY-MM-DD` or `YYYY-MM-DD HH:MM:SS`. A date-only value expands to the start of that day. |
| `date_to` | Yes | String | Window end, same format. A date-only value expands to the end of that day. |
| `campaign` | No | String | [Campaign code](/developer/api-reference/api-identifiers/#campaign-code), exports that campaign's holdout only. Mutually exclusive with `journey`. |
| `journey` | No | String | Journey UUID, exports that journey's Holdout Split points only. Mutually exclusive with `campaign`. |

Leave both `campaign` and `journey` empty to export every campaign and every journey the application has a report for.

<Aside type="caution" title="Important">
The window can't exceed 90 days. A wider window isn't trimmed: the request fails with `400` and the message `exceeded the maximum date interval. Max interval: 90 days`. The [uplift report itself keeps 90 days](/product/statistics-and-analytics/uplift-report/#how-far-back-the-report-can-look) of rows, so a wider request couldn't return anything more anyway.
</Aside>

### Example request

```json
{
  "type": "TASK_TYPE_EXPORT_CONTROL_GROUP_ANALYTICS",
  "export_control_group_analytics": {
    "application_code": "XXXXX-XXXXX",
    "date_from": "2026-08-01",
    "date_to": "2026-08-31"
  }
}
```

`result` returns `export_control_group_analytics_result.file` and `.file_url`, the same shape as [message statistics export's `result`](/developer/api-reference/statistics-api/export-messages-statistics-api/#result).

## What's in the file

One row per campaign or per journey holdout point, per goal event. The underlying report writes a fresh row every day for the same pair, and the export keeps only the newest one, so you get the current numbers, not a history of every past run.

| Column | Description |
|---|---|
| `timestamp` | When this row was computed. |
| `owner_type` | `TYPE_CAMPAIGN` or `TYPE_JOURNEY`. |
| `owner_id` | The campaign or message code for a campaign row, the journey's UUID for a journey row. |
| `point_uuid` | The Holdout Split point's UUID for a journey row. Empty for a campaign row. |
| `event_name` | The goal event this row measures. |
| `attribution_window_seconds` | The attribution window applied, in seconds. |
| `treatment_users`, `control_users`, `treatment_conversions`, `control_conversions`, `treatment_events`, `control_events` | Raw counts behind the metrics below. |
| `uplift_pct`, `incremental_events`, `percent_of_treatment`, `z_score`, `p_value`, `confidence_pct` | Same metrics as the [uplift report](/product/statistics-and-analytics/uplift-report/#metrics-in-the-report). |
| `significance` | `TYPE_SIGNIFICANT`, `TYPE_NOT_SIGNIFICANT`, or `TYPE_NOT_ENOUGH_DATA`. |
| `revenue_tracked` | `1` if the goal event's revenue source was configured, `0` if the row is only guessing from a legacy fallback. See [Revenue in the report](/product/statistics-and-analytics/uplift-report/#revenue-in-the-report). |
| `treatment_revenue_<currency>`, `control_revenue_<currency>`, `incremental_revenue_<currency>` | Three columns per currency, lowercase currency code (for example `treatment_revenue_usd`). The file only gets columns for currencies that actually appear in the exported rows. |

<Aside type="note">
When `revenue_tracked` is `0`, every revenue cell in that row is empty, not `0.00`. A blank cell means the source wasn't configured, not that the send made no money.
</Aside>