Settlement Reporting
Reconcile settled funds to source transactions with per-SubMID settlement reports, delivered via API or SFTP
CrissCross produces a structured settlement report at the time of each settlement, delivered alongside the wire. Every report ties one bank credit you receive back to the individual transactions — collections, refunds, payouts, fees, FX, and adjustments — that produced it, so you can reconcile against your own ledger.
The reporting model is built on one guarantee:
One file = one SubMID = one settlement = one wire.
Each settlement produces exactly one report, sharing a single SettlementID with the wire it accompanies. There is no wire without a file, and no file without a wire.
Settlement reports are available through two delivery channels — API and SFTP — and you choose which one per SubMID. See Delivery channels.
MID and SubMID
Settlement is organised around a two-level merchant hierarchy. Understanding it is the key to reading a settlement report, because every report is scoped to a single SubMID.
A single MID typically has several SubMIDs — one per currency it collects in:
Because a SubMID is scoped to one processing currency, settlement always happens per SubMID: AcmeKES and AcmeNGN settle separately, each on its own schedule, each producing a distinct file and wire.
Each SubMID carries an account code (for example M1002345) that appears in the file name and in the file’s Merchant Account field. See How MID and SubMID appear in the file.
How settlement works
The settlement engine runs on each SubMID’s configured cadence (its settlement delay, e.g. T+2, is a per-SubMID property). For each cycle:
Batch transactions
Collect every transaction for the SubMID since the last settlement event that is in scope for this cycle.
Compute net
Apply the rolling net model (below) to derive the settlement amount in the processing currency.
Apply the FX rate
Convert each transaction into the settlement currency (typically USD) at its all-in rate — the mid-market rate plus the agreed spread. When a transaction was priced by a rate lock it settles at that locked rate, so lines in one file can carry different rates; each line records its AllInRate, RateLockId, and when the lock was struck (RateLockCreatedAt). The header AllInRate is the amount-weighted average of these per-line rates across the settlement.
Settlements are only produced when there is activity. A cycle with no in-scope transactions generates no file and no wire.
The settlement model
The net settlement amount is a rolling net, computed per SubMID per cycle:
Fees are netted internally on both inflows and outflows:
- Collections — the customer pays
Gross.Net = Gross − Fee, and you receiveNet. - Refunds / payouts — the customer or beneficiary receives the full requested amount; the fee is an additional deduction from your balance.
Grossis shown negative,Feepositive, andNet = Gross − Fee.
Each line carries its gross in the processing currency and its net already converted to the settlement currency at that transaction’s all-in rate — so the sum of the line Net values equals the header Net Settlement Amount, and the wire, with no further conversion. In the totals, Gross Total is in the processing currency while Fees Total and Net Settlement Amount are in the settlement currency; each total names its own currency.
The settlement report file
- Format: CSV, UTF-8, RFC 4180.
- Structure: self-describing. Every row starts with a
RecordTypecolumn — a settlement-level HEADER row followed by N transaction LINE rows. Each section is preceded by its own field-name row, so the file can be parsed without an external schema. - Naming:
{SubMID}_{SettlementDate:YYYYMMDD}_{ProcessingCurrency}_{SettlementID}.csv
Reading the name: SubMID account M1002345, settled on 2026-04-16, processing currency NGN, settlement STL000123456.
Header fields
Every header field describes the settlement as a whole. Monetary totals are in the settlement currency.
How MID and SubMID appear in the file
The two-level hierarchy maps onto the file’s columns as follows:
Line fields
Each line represents one transaction. Monetary amounts are in the processing currency and are signed (+ inflow, − outflow).
Transaction types
Transaction statuses
AUTHORISED, CAPTURED, SALE, SETTLED, REVERSED, REFUNDED, RETURNED. Lines in a settlement file are typically in a terminal state.
Example file
An abbreviated report for SubMID AcmeNGN (M1002345), settling NGN → USD. Gross is in the processing currency (NGN); the Net, fees, and totals are in the settlement currency (USD). Every row is tagged with RecordType. Card-only columns, SessionID, RateLockCreatedAt, MidRateSource, and other fields are present in the real file but omitted here for readability.
Reconciliation check: the line Net values are already in the settlement currency, so they sum directly — 92.57 + 52.70 − 32.02 = 113.25 USD — to the Net Settlement Amount, the exact amount of the wire. Because each line settles at its own locked rate (the refund here used 1563, the collections 1580), you reconcile by summing the per-line Net, not by applying the header AllInRate to the gross total. The header AllInRate (1577.02) is the amount-weighted average of the line rates, so it sits between them and won’t reproduce any single line exactly.
Delivery channels
Reports are available through two channels, configured per SubMID with one channel designated as primary.
CrissCross uploads the file to your SFTP location at settlement time. Best for finance teams that consume files rather than call an API.
Use the settlement.created webhook as your trigger, then pull the settlement — as JSON or as the CSV file — from the API.
SFTP push
CrissCross uploads the report to your configured SFTP directory as soon as the settlement is produced. To avoid partial reads, files are written with a .processing extension and atomically renamed to .csv only once the upload is complete — so a file appearing with its final .csv name is guaranteed to be whole.
API pull
Subscribe to the settlement.created webhook and use it as the signal that a new settlement is ready, then retrieve it via the settlement endpoints:
The settlement.created webhook fires when a settlement becomes available. Its payload carries enough to route and fetch the report:
The settlement API and settlement.created webhook are being rolled out per merchant. If you need programmatic access or SFTP delivery configured for a SubMID, contact [email protected].