Settlement Reporting
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 Settlement ID 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 All In Rate, Rate Lock ID, and when the lock was struck (Rate Lock Created At). The header Settlement Rate 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, in a custom multi-section layout: the HEADER and LINE sections carry different columns, so the file is not one uniform table. Within each section, field quoting and escaping follow RFC 4180.
- Structure: self-describing. Every row starts with a
Record Typecolumn — 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}_{SettlementEndDate:YYYYMMDD}_{ProcessingCurrency}_{SettlementID}.csv— the date token is theSettlement End Dateof the period the file covers.
Reading the name: SubMID account M1002345, settlement period ending 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:
All three are settlement-level and appear on the HEADER row only. A file covers exactly one
SubMID, so repeating them on every LINE would restate a constant.
Line fields
Each line represents one transaction. Gross is in the processing currency and is signed (+ inflow, − outflow). Initiation Amount, Processing Fee, and Net are in the settlement currency.
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 Record Type. Card-only columns, Session ID, Rate Lock Created At, 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 Settlement Rate to the gross total. The header Settlement Rate (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.
SFTP
CrissCross hosts an SFTP server. Your reports appear there shortly after each settlement is produced, and you connect and download them on your own schedule. CrissCross does not connect out to a server of yours, so there is no inbound access for you to open.
Authentication is by SSH key. You generate the key pair and send us the public half — CrissCross never needs, and will never ask for, your private key. Access is also restricted by source IP, so we need the addresses you will connect from before your account will work.
Getting set up
Generate a key pair
This writes two files: crisscross_sftp (your private key — keep it secret) and crisscross_sftp.pub (the public key).
Send us the public key
Send the contents of crisscross_sftp.pub to your CrissCross contact, through whichever channel you already use with us, naming the MID and SubMIDs it is for. It is a single line beginning ssh-ed25519.
A public key is not sensitive, so it needs no special handling. Send only the .pub file — if you are ever asked for the other one, it is not us.
Send us the IP addresses you'll connect from
We allowlist them, so a connection from anywhere else is refused before authentication is even attempted.
A short list of individual addresses is best. A CIDR range works if your connections leave from a pool, but keep it as narrow as you can — an allowlist is only worth as much as the range is specific.
Tell us before these change. An address that has not been allowlisted cannot connect at all, which looks like the server being down rather than a permissions problem.
Receive your connection details
We reply with the server address, your username, and the server’s host key fingerprint. You get one username per environment — see Sandbox and live.
What you’ll find
Each username lands directly in its own directory, holding that environment’s settlement reports. You cannot see anything above it, and no other merchant can see yours.
File names follow the convention described under The settlement report file, so the SubMID, period end date, processing currency, and Settlement ID are all readable without opening the file.
A file is complete the moment it appears in the listing — there is no partially written state, and no temporary extension to filter out. If you can see it, you can download it.
Downloading
Access is read-only. You can list and download; you cannot delete, rename, or move files, so the common download-then-delete and move-to-processed patterns will fail.
Track what you have already processed by file name instead. A Settlement ID is unique and never reused, so a file name you have already seen is a settlement you have already handled. Files remain available after you download them, which also means you can re-fetch any past settlement at any time without asking us to resend it.
Sandbox and live
Sandbox and live reports are delivered to separate accounts, never the same directory. You receive one username per environment:
Each key you send us can be enrolled against either or both. Keeping them separate means a sandbox file can never be picked up by a process reconciling real money.
Timing
A report appears within a minute or two of its settlement being produced. That settlement’s transaction.settled webhooks are sent at the moment of production, so they arrive before the file is there — treat them as the earliest point worth looking, not as confirmation that the report has landed. A connection made the instant the first webhook arrives can legitimately find an empty directory, so retry for a few minutes before treating the report as missing.
If you would rather not track webhooks, connecting on a schedule works just as well — reports stay in the directory, so nothing is lost by checking late. Settlements are only produced when there is activity, so a cycle with no in-scope transactions leaves nothing new to collect.
Host key changes
Pin the fingerprint we give you. We will contact you in advance if it ever has to change. A fingerprint that changes without notice should be treated as a failed connection, not accepted — tell us instead.
API pull
When a settlement is produced, you’ll receive a transaction.settled webhook for each transaction it covers. The endpoints below retrieve the settlement itself — call them in response to those events, or poll on your own schedule:
There is currently no settlement-level webhook — nothing fires once per settlement batch, on either channel. To pick up settlements one at a time rather than one event per transaction, check for new ones on your own schedule: either list the SFTP directory or poll GET /settlements.
The settlement API is being rolled out per merchant. If you need programmatic access or SFTP delivery configured for a SubMID, contact [email protected].