Generate organization statements
Build a statement of your organization's sales for a period, and download it as a PDF or a CSV file.
In the dashboard
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
Section titled Before you begin- You need the owner, admin or billing role.
- Fill in Registered address under Legal entity in the 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
Section titled What a statement coversCoritan 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
Section titled Generate a statement- In the dashboard, open the organization, then Billing, then Statements.
- Select Generate statement.
- Choose the first and last day of the period in From and To. They start on last month.
- To leave something out, tick what to keep under Revenue streams and Gateways. With nothing ticked, the statement includes every stream and every gateway.
- 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.
- Add Notes if you want them printed on the statement.
- 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
Section titled Read and download a statementSelect 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
Section titled Delete a statement- Select the bin icon in the statement's row.
- 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
Section titled 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
Section titled RelatedWith the API
Section titled With the APIAll 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:
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:
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:
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:
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 operations on this page
| Method | Path | What it does |
|---|---|---|
GET | /api/v1/orgs/{org_slug}/statements | Org list statements |
POST | /api/v1/orgs/{org_slug}/statements/generate | Org generate statement |
GET | /api/v1/orgs/{org_slug}/statements/options-catalog | Org statements options catalog |
GET | /api/v1/orgs/{org_slug}/statements/{statement_id} | Org get statement |
DELETE | /api/v1/orgs/{org_slug}/statements/{statement_id} | Org delete statement |
GET | /api/v1/orgs/{org_slug}/statements/{statement_id}/csv | Org statement CSV |
GET | /api/v1/orgs/{org_slug}/statements/{statement_id}/pdf | Org statement pdf |