> ## Documentation Index
> Fetch the complete documentation index at: https://docs.connectly.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Campaign Report

> Download a per-customer CSV breakdown of every message in a campaign sendout — delivery timestamps, engagement, button clicks, and errors 🗂️

Campaign reports give you a per-customer breakdown of every message sent in a sendout — including delivery timestamps, engagement actions, and any errors. Download the CSV from the Connectly UI or retrieve it programmatically via the [Reports API](https://docs.connectly.ai/analytics/reports-api).

## Downloading from the UI

Open your campaign in the Connectly UI, navigate to the **Analytics** tab, and click **Download CSV**. The file downloads immediately.

## Column reference

Each row represents a single customer in the sendout. Columns always appear in this order.

| Column                 | Description                                                           | Example                                                                 |
| ---------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| `customer_external_id` | Customer's external ID (typically their phone number).                | `+123456789`                                                            |
| `business_id`          | Your Connectly business UUID.                                         | `2d503e81-e270-4467-a05f-21a900efbbc1`                                  |
| `campaign_name`        | Name of the campaign.                                                 | `Test campaign`                                                         |
| `sendout_id`           | UUID of the sendout this message belongs to.                          | `d69ed06c-5385-4003-aa58-aae87f2e087e`                                  |
| `cnt_session_id`       | Connectly session identifier for this conversation.                   | `018f6423-fa75-de08-9f61-59a8526eb5c0`                                  |
| `sent_at`              | Timestamp when the message was sent.                                  | `2024-05-10 20:13:50.682000`                                            |
| `delivered_at`         | Timestamp when the message was delivered to the device.               | `2024-05-10 20:13:50.682000`                                            |
| `read_at`              | Timestamp when the message was read.                                  | `2024-05-10 20:13:50.682000`                                            |
| `opt_out_at`           | Timestamp when the customer opted out.                                | `2024-05-10 20:13:50.682000`                                            |
| `error_code`           | Error code if the message was undeliverable.                          | `131026`                                                                |
| `error_msg`            | Human-readable error description.                                     | `Message Undeliverable.`                                                |
| `button_clicks`        | JSON array of button interactions — each with `id`, `name`, and `ts`. | `{"id":"f2390b","name":"Yes","ts":"2024-07-16 12:11:03.609000"}`        |
| `link_clicks`          | JSON array of link click events — each with `id`, `name`, and `ts`.   | `{"id":"41e753","name":"Click here","ts":"2024-07-16 12:12:03.609000"}` |
| `input_variables`      | JSON object of variables injected at send time.                       | `{"name":"Ana"}`                                                        |
| `output_variables`     | JSON object of variables captured from the customer's replies.        | `{"replied":true}`                                                      |

<Note>
  Timestamp columns (`sent_at`, `delivered_at`, `read_at`, `opt_out_at`) are blank when the event hasn't occurred yet. For example, `read_at` is empty if the customer hasn't opened the message.
</Note>

## Understanding the engagement columns

**`button_clicks`** — populated when a customer taps a quick-reply or call-to-action button. Each entry records the button's `id`, display `name`, and click timestamp `ts`.

**`link_clicks`** — populated when a customer taps a tracked URL. Same structure as `button_clicks`.

**`input_variables` / `output_variables`** — only populated for campaigns using variables or automation logic. `input_variables` reflects values injected at send time; `output_variables` captures data collected from the customer's replies during the conversation flow.

## Programmatic access

To retrieve reports automatically — for example to ingest them into a data warehouse on a schedule — use the [Reports API](https://docs.connectly.ai/analytics/reports-api) or subscribe to [report webhooks](https://docs.connectly.ai/analytics/report-webhooks).
