# Generate organization statements

> Build a statement of your organization's sales for a period, and download it as a PDF or a CSV file.

Source: https://docs.coritan.com/organizations/billing/statements/

In the dashboard:

- /dashboard/organizations/…/billing/statements: https://www.coritan.com/dashboard/organizations

A statement is a frozen summary of what your customers paid through Coritan's payment gateways in a period: the charges, the refunds and the gateway fees, with every payment as a line item. Coritan stamps each statement with a *content hash*, so your accountant can confirm that a copy still matches the figures Coritan holds.

## Before you begin

- You need the owner, admin or billing role.
- Fill in **Registered address** under **Legal entity** in the [Settings](/organizations/settings/) tab. The statement names your organization as its issuer and cannot be generated without an address. It prints **Legal name**, or **Trading name** when that is empty, or the organization's name.

## What a statement covers

Coritan reads the payments from its payment gateways when you generate the statement, and keeps those that belong to your organization. Sales your own PayNow store takes are not in it. The payments fall into four *streams*:

| Stream | What it holds |
| --- | --- |
| Gateway charges | Payments your customers made. |
| Gateway refunds | Money returned to your customers. |
| Gateway fees | What the payment gateways charged to process the payments and refunds. |
| Gateway transfers received | Money the gateway moved to your organization's Stripe Connect account. The statement shows it for information and leaves it out of the net. |

The net is the charges less the refunds and the fees. The statement shows the refunds and the fees together as its deductions. Dates are in UTC.

When your customers paid in more than one currency, the statement's currency reads `MIXED` and its top-level totals add the amounts without converting them. Use the totals for each currency in the PDF for your accounts.

## Generate a statement

1. In the [dashboard](https://www.coritan.com/dashboard/organizations), open the organization, then **Billing**, then **Statements**.
2. Select **Generate statement**.
3. Choose the first and last day of the period in **From** and **To**. They start on last month.
4. To leave something out, tick what to keep under **Revenue streams** and **Gateways**. With nothing ticked, the statement includes every stream and every gateway.
5. Under **Attribute payments to this organization by**, choose how Coritan tells that a payment is yours. The default counts a payment that names your organization or that went to your Stripe Connect account. The other two options use only one of those tests.
6. Add **Notes** if you want them printed on the statement.
7. Select **Generate statement**. The new statement opens.

If a statement for the same period and options already exists, you get that one back. To build a fresh one, for example after a late refund, tick **Force a new statement**.

## Read and download a statement

Select a statement in the list to open it. It shows the **Period**, the **Issuer**, the **Gross** amount, the **Refunds**, the **Deductions**, the **Net** amount, the number of **Line items**, when it was **Generated**, and the line items with their **Date**, **Description**, **Gross**, **Fee** and **Net**.

To download a statement, select **PDF** or **CSV** in its row. The PDF ends with an attestation that quotes the content hash. When the payments span more than one currency or gateway, it adds the totals for each. It prints the first 80 line items and says when there are more; the CSV holds all of them.

The content hash changes when any figure on the statement changes. To check a copy, compare the hash printed on it with the **Content hash** in the dashboard.

## Delete a statement

1. Select the bin icon in the statement's row.
2. Type the statement number to confirm, then select **Delete statement**.

Deleting a statement removes it for good. You can generate one for the same period again afterwards.

## Troubleshooting

"Organization legal profile incomplete: set registered_address"
: Fill in **Registered address** under **Legal entity** in the **Settings** tab.

"Failed to fetch payment-gateway ledger"
: A payment gateway did not answer. Try again later. Unticking that gateway under **Gateways** lets you generate the statement, but it then leaves out every payment the gateway took.

The statement has an older date than expected
: A statement for the same period and options already existed, and Coritan returned it. Tick **Force a new statement**.

## Related

- [Organization billing](/organizations/billing/)
- [Track your payouts](/organizations/billing/payouts/)
- [Change organization settings](/organizations/settings/)

## With the API

All statement routes take a member's access token with the owner, admin or billing role.

Read which streams, gateways and attribution modes you can choose:

```bash
curl "https://api.coritan.com/api/v1/orgs/acme/statements/options-catalog" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

The answer lists `streams`, `ledger_types`, `gateways` (each with a `name` and a `display_name`), `org_attribution_modes` and the `defaults`.

Generate a statement. `period_start` and `period_end` are ISO 8601 times, and the end is exclusive, so this covers August:

```bash
curl -X POST "https://api.coritan.com/api/v1/orgs/acme/statements/generate" \
  -H "Authorization: Bearer $CORITAN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "period_start": "2026-08-01T00:00:00Z",
    "period_end": "2026-09-01T00:00:00Z",
    "notes": "August sales",
    "options": {"include": {"streams": ["gateway_charges", "gateway_refunds", "gateway_fees"]}}
  }'
```

`force` set to `true` builds a new statement even when one with the same period and options exists. `options.include` narrows what the statement reads:

| Field | Effect |
| --- | --- |
| `streams` | The streams to keep: `gateway_charges`, `gateway_refunds`, `gateway_fees`, `gateway_transfers_received`. |
| `gateway_names` | The gateways to read, by `name` from the catalogue. |
| `ledger_types` | The gateway entries to read: `charge`, `refund`, `fee`, `adjustment`, `transfer`, `payout`, `other`. |
| `currencies` | Three-letter currency codes to keep. |
| `min_abs_amount_cents` | Leaves out entries smaller than this amount, in cents. |
| `exclude_zero_fee` | `true` leaves out entries with no fee. |
| `org_attribution` | `metadata_or_connect` (the default), `metadata_only` or `connect_only`. |

Leave a field out, or send `null`, to include everything; an empty list is refused. `options.presentation` turns parts of the files off: `include_summary`, `include_streams_table`, `include_by_currency`, `include_by_gateway`, `include_line_items` and `include_attestation` are `true` by default, `max_pdf_line_items` caps the lines the PDF prints, and `csv_include_line_items` controls the lines in the CSV.

The answer is the statement, with `id`, `statement_number`, `currency`, `totals` (`gross`, `refunds`, `fees`, `deductions`, `net`, `by_currency`, `by_gateway` and more), `line_items`, `content_hash` and `options`.

List statements, newest first, with `limit` (50 by default, at most 200) and `offset`. The answer has `statements`, `total`, `limit` and `offset`:

```bash
curl "https://api.coritan.com/api/v1/orgs/acme/statements?limit=12" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

Read one statement with `GET /api/v1/orgs/acme/statements/{statement_id}`, and download it:

```bash
curl -OJ "https://api.coritan.com/api/v1/orgs/acme/statements/42/pdf" \
  -H "Authorization: Bearer $CORITAN_TOKEN"
```

Use `/csv` in place of `/pdf` for the CSV file. Both downloads carry the content hash in an `X-Content-Hash` header. `DELETE /api/v1/orgs/acme/statements/{statement_id}` deletes a statement and answers `204`.

A period whose end is not after its start, an unknown stream or gateway, and a missing registered address answer `400` with the reason. A gateway that does not answer gives `502`.

## API

- `GET /api/v1/orgs/{org_slug}/statements`: Org list statements (https://docs.coritan.com/api/reference/organizations/billing-payouts/statements/#op-get-api-v1-orgs-org-slug-statements)
- `POST /api/v1/orgs/{org_slug}/statements/generate`: Org generate statement (https://docs.coritan.com/api/reference/organizations/billing-payouts/statements/#op-post-api-v1-orgs-org-slug-statements-generate)
- `GET /api/v1/orgs/{org_slug}/statements/options-catalog`: Org statements options catalog (https://docs.coritan.com/api/reference/organizations/billing-payouts/statements/#op-get-api-v1-orgs-org-slug-statements-options-catalog)
- `GET /api/v1/orgs/{org_slug}/statements/{statement_id}`: Org get statement (https://docs.coritan.com/api/reference/organizations/billing-payouts/statements/#op-get-api-v1-orgs-org-slug-statements-statement-id)
- `DELETE /api/v1/orgs/{org_slug}/statements/{statement_id}`: Org delete statement (https://docs.coritan.com/api/reference/organizations/billing-payouts/statements/#op-delete-api-v1-orgs-org-slug-statements-statement-id)
- `GET /api/v1/orgs/{org_slug}/statements/{statement_id}/csv`: Org statement CSV (https://docs.coritan.com/api/reference/organizations/billing-payouts/statements/#op-get-api-v1-orgs-org-slug-statements-statement-id-csv)
- `GET /api/v1/orgs/{org_slug}/statements/{statement_id}/pdf`: Org statement pdf (https://docs.coritan.com/api/reference/organizations/billing-payouts/statements/#op-get-api-v1-orgs-org-slug-statements-statement-id-pdf)
