# Reading remittance reports

There are two surfaces to look at when you want to see what's been collected, what fees were taken, and what's been disbursed to you.

1. **Monthly statements** — a PDF generated on the first of each month for the prior period. Lists ledger activity, collections, and disbursements at the period level.
2. **The remittance ledger** — a per-payment row for every successful debtor payment, with the snapshotted contingency rate, the fee, the net amount, the Stripe Transfer id (if disbursed), and the disbursement status.

There is no per-payout email or per-payout CSV today. CSV is available on demand through the async exports endpoint described below.

## Monthly statements

Find them in the dashboard at **Statements**. Each row lists the period, total collected, and total paid out, with a per-row download button. The download is a short-lived (1 hour) signed URL — your browser opens the PDF directly from storage.

### Anatomy of a monthly statement

The PDF carries:

**Header**

* The period (e.g. "May 2026").
* Your business name and the period boundaries.
* A SHA-256 audit hash over the canonical period metadata so you can verify a stored copy against the dashboard later.

**Summary**

| Field           | Meaning                                                            |
| --------------- | ------------------------------------------------------------------ |
| Opening balance | Trust-ledger balance immediately before the period start           |
| Total collected | Sum of `payment_in` ledger credits during the period               |
| Total fees      | Sum of `fee_out` debits (the contingency we took)                  |
| Total paid out  | Sum of `payout_out` debits (disbursements completed)               |
| Adjustments     | Signed sum of any `adjustment` entries (e.g. chargeback reversals) |
| Closing balance | Opening balance + collected − fees − paid out + adjustments        |

**Collections table**

One row per successful debtor payment during the period.

| Column  | Meaning                                         |
| ------- | ----------------------------------------------- |
| Date    | The date the payment cleared                    |
| Debtor  | The debtor company name                         |
| Invoice | The invoice number from your original placement |
| Method  | ACH, card, etc. (as reported by Stripe)         |
| Amount  | Gross payment amount                            |

**Disbursements table**

One row per `paid` Remittance during the period. `pending`, `processing`, `failed`, and `manual_required` rows are intentionally excluded — only money that actually reached your bank during the period appears here.

| Column     | Meaning                                                   |
| ---------- | --------------------------------------------------------- |
| Paid On    | The `paid_at` timestamp on the Remittance                 |
| Debtor     | The debtor whose payment funded this disbursement         |
| Recovered  | The gross debtor payment that this disbursement settles   |
| Fee        | The contingency fee we took on this payment               |
| Net Payout | Amount transferred to your bank                           |
| Method     | "Stripe Connect" (auto) or "Manual ACH" (operator-driven) |

**Ledger activity table**

Every trust-ledger entry whose `occurred_at` is in the period. Useful for tying out the summary totals.

| Column        | Meaning                                                |
| ------------- | ------------------------------------------------------ |
| Date          | Entry timestamp                                        |
| Type          | `payment_in`, `payout_out`, `fee_out`, or `adjustment` |
| Amount        | Signed cents amount                                    |
| Balance After | Running trust-ledger balance after this entry          |

## The remittance ledger

Every successful debtor payment creates a `Remittance` row. You can list them through the API:

* `GET /v1/creditors/me/remittances` — your full remittance ledger, paginated, filterable by `status` and date range. Returns aggregates (total recovered, total fees, total net) across the filtered set.
* `GET /v1/placements/{placement_id}/remittance` — every remittance row for one placement.

Each row carries:

| Field                               | Meaning                                                                                       |
| ----------------------------------- | --------------------------------------------------------------------------------------------- |
| `recovered_amount`                  | The gross debtor payment                                                                      |
| `fee_amount`                        | The contingency fee — snapshotted at the rate in force when this row was created              |
| `net_remit_amount`                  | `recovered_amount − fee_amount`; this is the amount the Stripe Transfer (or manual ACH) moves |
| `currency`                          | ISO 4217, defaults to USD                                                                     |
| `status`                            | `pending`, `processing`, `paid`, `failed`, `manual_required`, or `reversed`                   |
| `stripe_transfer_id`                | The `tr_*` id once Stripe Connect has actually moved money. NULL on the manual ACH path.      |
| `failure_reason`                    | Populated when status is `failed`                                                             |
| `paid_at`                           | When the row reached a terminal `paid` state                                                  |
| `metadata.contingency_pct_snapshot` | The percentage applied to this row, preserved even if your contingency rate is later changed  |

The contingency rate is captured **point-in-time** for every Remittance. A later edit to your rate never retroactively changes historic payouts.

## Downloading the data as CSV

Use the async exports API to pull a CSV of your remittance ledger:

`POST /v1/exports` with body `{"kind": "remittances", "params": {...}}`. The worker renders the CSV to storage and the response polls to a signed download URL when ready. Other export kinds: `placements`, `payments`, `ledger_entries`.

The remittances CSV columns:

`id`, `creditor_id`, `placement_id`, `payment_attempt_id`, `recovered_amount`, `fee_amount`, `net_remit_amount`, `currency`, `status`, `stripe_transfer_id`, `failure_reason`, `disbursement_hold_until`, `paid_at`, `created_at`, `updated_at`.

In the dashboard, exports are launched from the **Export** button on the Overview page.

## Reversals (chargebacks)

When a Stripe `transfer.reversed` webhook fires (or an operator records a manual claw-back), we mint a **new** Remittance row rather than mutating the original:

* The original `paid` row stays as an immutable record of the forward transfer.
* The reversal row has `status='reversed'`, `parent_remittance_id` pointing at the original, and **negative** `recovered_amount`, `fee_amount`, and `net_remit_amount`.
* A trust-ledger `adjustment` entry rebalances your account.

The placement does not automatically reopen on reversal. Operator triage drives any next steps.

## How to verify a statement

Suggested verification sequence:

1. **Spot-check the collections table** against the placement detail page in the dashboard. The payment date and amount should match.
2. **Tie the disbursements table to your bank.** Each row's net payout should appear on your bank statement around its `paid_at` date (less Stripe Connect processing time).
3. **Reconcile the summary.** `opening_balance + total_collected − total_fees − total_paid_out + adjustments` should equal `closing_balance`.
4. **Verify the audit hash** in the footer matches what the dashboard shows — confirms you have an unaltered copy of the statement.

## Downloading historical statements

From the dashboard: **Statements**. The list shows every month for which a statement has been generated. The signed download URL is regenerated each time you click Download, so a stale link is fine — just request a fresh one.

## TODO

* Screenshot: Statements page row with download button.
* Screenshot: PDF sample (collections / disbursements / ledger tables).
* Screenshot: Export button kind selector on the Overview page.

***

Last reviewed: 2026-05-12 by Finance Lead.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.moderncollections.io/for-creditor-partners/creditor-finance/reading-remittance-reports.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
