Web3 Close

Follow the money. Keep the exception open.

A complete example close pack. Start with one receipt, follow its invoice and payout to the bank, then inspect the missing-rate exception. No sign-up or file upload.

One receipt, all the way to the bank

Example records, with fictional names, wallets, amounts, references and exchange rates. This is not accounting or tax advice.

INV-0102: the processor received GBP 1,000.00, kept a GBP 15.00 fee and paid out GBP 985.00. Processor row 2 names the invoice and payout po_MADEUP_0001. Ledger rows 6–7 identify the invoice; rows 8–10 record its receipt. Bank row 2 carries PRT-MADEUP-0001 and GBP 985.00. Matches M6 and M10 below retain those links.

INV-0108 stays unresolved. The USDC/GBP rate for 24 September is absent from the supplied rate table. Exception E2 leaves the receipt unsupported; no rate is supplied and no conversion is forced. Ask the provider for the stated rate, source and date before a reviewer decides how to proceed.

The complete worked pack

MONTH-END RECONCILIATION PACK

Entity: Saltmarsh Example Ltd Period: 1 September 2026 to 30 September 2026 Currency of the ledger: GBP

Every name, address, reference, amount and rate in this folder is made up. No real company, person, wallet or transaction is described. The addresses and transaction references hold letters that cannot occur in a real one. Only the column names are real: they are the ones each provider publishes.

A pack is working papers for the practice. It is not accounts, an audit, or accounting or tax advice. The two lines at its end are for the practice. Each match rests on a rule that is written out and on rows that can be opened. No pair is accepted because two figures are close. Each row of each file is in one place only: a match, an exception, a repeat set aside, a row not covered, or an invoice.

1. THE FILES THIS PACK RESTS ON

exchange-kraken-ledgers.csv Kraken, ledger history export. Rows of data: 2. sha256 32277d85f78e45d087963cafd9f9d4f662817659a2ceec3380085d97ebd77c53

chain-treasury-wallet.csv Etherscan, ERC-20 token transfers of an address. Rows of data: 6. sha256 7aaa5e048cfbca799be4a6d206299b73b9f0c31f41f9776bfde33e80efc9977e

chain-operations-wallet.csv Etherscan, ERC-20 token transfers of an address. Rows of data: 2. sha256 f3ab3163dfb0a97ecaee5081de91a6297f020a6c2f3a6b3ce9c4c44dc1a3f306

processor-payout-reconciliation.csv Stripe, itemised payout reconciliation report. Rows of data: 4. Stated for this file: time zone UTC. sha256 fb8d5c76b24e5055593de593724be3015b93d6f9a75232454cf401fe3c855262

bank-statement.csv Xero, bank statement import template. Rows of data: 3. Stated for this file: dates written DD/MM/YYYY, currency GBP. sha256 875fa61f652381b134845e53ab7b45968457c1cfddbcf78adcc3ef8037c4144b

ledger-journals.csv Xero, journals. Rows of data: 39. Stated for this file: currency GBP. sha256 ac7e79a317c4e784157c469dc8118b6048cad0f97dbdce9fdafb0094211434e0

rates.csv, the rates given for this close. Lines: 3. sha256 fae95b542b98b13a69723be826f8221e417177843d51ee7b810564f23d44d77e 2026-09-03, USDC/GBP, 0.79. Source as given: Made up for these cases. In a real close the practice names the source of its rates and that name is recorded here. 2026-09-10, USDC/GBP, 0.80. Source as given: Made up for these cases. In a real close the practice names the source of its rates and that name is recorded here. 2026-09-17, EURC/GBP, 0.86. Source as given: Made up for these cases. In a real close the practice names the source of its rates and that name is recorded here.

Given for this close and read from no file: An address the client lists as its own: 0xMADEUPEXCHANGEDEPOSIT0000000000000000001 (exchange deposit address). In the Stripe report, the column the client uses for the invoice number: payment_metadata[ledger_invoice].

2. TOTALS BY FILE AND ASSET A total is the sum of the file's rows in one asset, and its five parts add up to it. For a wallet it is what came in less what went out; for the processor it is the gross; for the ledger it is the debits.

exchange-kraken-ledgers.csv, USDC, 2 rows: 6000.000000 in matches 0.000000; in exceptions 3000.000000; repeats set aside 3000.000000; not covered 0.000000; invoices 0.000000

chain-treasury-wallet.csv, USDC, 5 rows: 11750.000000 in matches 9500.000000; in exceptions 2250.000000; repeats set aside 0.000000; not covered 0.000000; invoices 0.000000

chain-treasury-wallet.csv, EURC, 1 row: 5000.000000 in matches 5000.000000; in exceptions 0.000000; repeats set aside 0.000000; not covered 0.000000; invoices 0.000000

chain-operations-wallet.csv, USDC, 2 rows: 0.000000 in matches 0.000000; in exceptions 0.000000; repeats set aside 0.000000; not covered 0.000000; invoices 0.000000

processor-payout-reconciliation.csv, GBP, 4 rows: 2650.00 in matches 2650.00; in exceptions 0.00; repeats set aside 0.00; not covered 0.00; invoices 0.00

bank-statement.csv, GBP, 3 rows: 1176.00 in matches 1426.00; in exceptions 0.00; repeats set aside 0.00; not covered -250.00; invoices 0.00

ledger-journals.csv, GBP, 39 rows: 38810.00 in matches 17150.00; in exceptions 1280.00; repeats set aside 0.00; not covered 100.00; invoices 20280.00

3. MATCHES (11)

M1 receipt at stated rate A transfer received on the chain, the ledger receipt that quotes its transaction, and the invoice that receipt names. The token amount times the rate given for that day and pair equals the receipt exactly. Rows: chain-treasury-wallet.csv row 2; ledger-journals.csv rows 4 and 5. Points at: ledger-journals.csv rows 2 and 3. Figures: invoice INV-0101; asset USDC; received 10000.000000; pair USDC/GBP; rate 0.79; rate date 2026-09-03; rate source Made up for these cases. In a real close the practice names the source of its rates and that name is recorded here; converted 7900.00; ledger 7900.00; hash 0xMADEUPTX0001; invoice total 7900.00; invoice open 0.00.

M2 receipt at stated rate A transfer received on the chain, the ledger receipt that quotes its transaction, and the invoice that receipt names. The token amount times the rate given for that day and pair equals the receipt exactly. Rows: chain-treasury-wallet.csv row 3; ledger-journals.csv rows 13 and 14. Points at: ledger-journals.csv rows 11 and 12. Figures: invoice INV-0103; asset USDC; received 2500.000000; pair USDC/GBP; rate 0.80; rate date 2026-09-10; rate source Made up for these cases. In a real close the practice names the source of its rates and that name is recorded here; converted 2000.00; ledger 2000.00; hash 0xMADEUPTX0002; invoice total 4000.00; invoice open 2000.00.

M3 own transfer A transfer whose sender and receiver are both the entity's. It is not a receipt. Rows: chain-treasury-wallet.csv row 4; chain-operations-wallet.csv row 2. Figures: asset USDC; amount 3000.000000; hash 0xMADEUPTX0003; date 2026-09-15; basis both wallets are in this pack, and the same transfer is in each export.

M4 receipt at stated rate A transfer received on the chain, the ledger receipt that quotes its transaction, and the invoice that receipt names. The token amount times the rate given for that day and pair equals the receipt exactly. Rows: chain-treasury-wallet.csv row 5; ledger-journals.csv rows 24 and 25. Points at: ledger-journals.csv rows 22 and 23. Figures: invoice INV-0105; asset EURC; received 5000.000000; pair EURC/GBP; rate 0.86; rate date 2026-09-17; rate source Made up for these cases. In a real close the practice names the source of its rates and that name is recorded here; converted 4300.00; ledger 4300.00; hash 0xMADEUPTX0004; invoice total 4300.00; invoice open 0.00.

M5 own transfer A transfer whose sender and receiver are both the entity's. It is not a receipt. Rows: chain-operations-wallet.csv row 3. Figures: asset USDC; amount 3000.000000; hash 0xMADEUPTX0007; date 2026-09-16; basis the receiving address is on the client's list of its own addresses (exchange deposit address).

M6 processor charge to invoice A processor payment and the ledger receipt and invoice with the same invoice number. The gross equals the receipt; the net is the gross less the fee. Rows: processor-payout-reconciliation.csv row 2; ledger-journals.csv rows 8, 9 and 10. Points at: ledger-journals.csv rows 6 and 7. Figures: invoice INV-0102; gross 1000.00; fee 15.00; net 985.00; payout po_MADEUP_0001; identifier txn_MADEUP_0001; ledger 1000.00; charge ch_MADEUP_0001; invoice total 1000.00; invoice open 0.00.

M7 processor charge to invoice A processor payment and the ledger receipt and invoice with the same invoice number. The gross equals the receipt; the net is the gross less the fee. Rows: processor-payout-reconciliation.csv row 3; ledger-journals.csv rows 17, 18 and 19. Points at: ledger-journals.csv rows 15 and 16. Figures: invoice INV-0104; gross 600.00; fee 9.00; net 591.00; payout po_MADEUP_0002; identifier txn_MADEUP_0002; ledger 600.00; charge ch_MADEUP_0002; invoice total 600.00; invoice open 0.00.

M8 refund A processor refund, the payment it reverses by the provider's own identifier, and the ledger credit note with the same invoice number and amount. Rows: processor-payout-reconciliation.csv row 4; ledger-journals.csv rows 20 and 21. Points at: processor-payout-reconciliation.csv row 3. Figures: invoice INV-0104; refund -150.00; original charge ch_MADEUP_0002; original gross 600.00; payout po_MADEUP_0002; identifier txn_MADEUP_0003; ledger credit 150.00.

M9 processor charge to invoice A processor payment and the ledger receipt and invoice with the same invoice number. The gross equals the receipt; the net is the gross less the fee. Rows: processor-payout-reconciliation.csv row 5; ledger-journals.csv rows 36, 37 and 38. Points at: ledger-journals.csv rows 34 and 35. Figures: invoice INV-0106; gross 1200.00; fee 18.00; net 1182.00; payout po_MADEUP_0003; identifier txn_MADEUP_0004; ledger 1200.00; charge ch_MADEUP_0003; invoice total 1200.00; invoice open 0.00.

M10 payout to bank A processor payout and the bank line that carries its reference. The line equals the net of the payout's rows. Rows: bank-statement.csv row 2. Points at: processor-payout-reconciliation.csv row 2. Figures: payout po_MADEUP_0001; reference PRT-MADEUP-0001; net 985.00; fees kept 15.00; expected 2026-09-08; bank 985.00; bank date 2026-09-08.

M11 payout to bank A processor payout and the bank line that carries its reference. The line equals the net of the payout's rows. Rows: bank-statement.csv row 3. Points at: processor-payout-reconciliation.csv rows 3 and 4. Figures: payout po_MADEUP_0002; reference PRT-MADEUP-0002; net 441.00; fees kept 9.00; expected 2026-09-16; bank 441.00; bank date 2026-09-16.

4. EXCEPTIONS (6)

E1 source row without ledger entry A row in a source file that no ledger entry answers to. No receipt in the ledger quotes this transaction. Rows: chain-treasury-wallet.csv row 6. Figures: asset USDC; amount 1250.000000; hash 0xMADEUPTX0005; date 2026-09-22.

E2 no rate given A receipt in another asset on a day for which the rate table gives no rate for that pair. Nothing is converted. The rate table has no line for USDC/GBP on 2026-09-24. The receipt stands as the ledger has it, unsupported. Rows: chain-treasury-wallet.csv row 7; ledger-journals.csv rows 32 and 33. Points at: ledger-journals.csv rows 30 and 31. Figures: invoice INV-0108; asset USDC; amount 1000.000000; pair USDC/GBP; date 2026-09-24; ledger 780.00; hash 0xMADEUPTX0006.

E3 timing difference A payout made in the period and due at the bank after it ends. No bank line in this period carries its reference, and none is expected to. Rows: none of its own. Points at: processor-payout-reconciliation.csv row 5. Figures: payout po_MADEUP_0003; reference PRT-MADEUP-0003; net 1182.00; fees kept 18.00; expected 2026-10-02; period end 2026-09-30.

E4 duplicate row The file gives the same identifier twice. The second row is set aside and counted in no total but its own. Every cell of the two rows is the same. Rows: exchange-kraken-ledgers.csv row 3. Points at: exchange-kraken-ledgers.csv row 2. Figures: asset USDC; amount 3000.000000; identifier LMADEUP-000001; same in every cell yes.

E5 no shared field A row that shares no field with the row it probably belongs to. The pair is put to the reviewer and not accepted. It is proposed because the deposit and the transfer it points at are the same asset and the same amount, a day apart or less. Rows: exchange-kraken-ledgers.csv row 2. Points at: chain-operations-wallet.csv row 3. Figures: asset USDC; amount 3000.000000; identifier LMADEUP-000001; date 2026-09-16; transfer date 2026-09-16; sent to exchange deposit address.

E6 ledger entry without source row A receipt or credit note in the ledger that no row of any source file supports. Here it is a receipt on invoice INV-0107. Rows: ledger-journals.csv rows 28 and 29. Points at: ledger-journals.csv rows 26 and 27. Figures: invoice INV-0107; amount 500.00; kind receipt; date 2026-09-21.

5. ROWS NOT COVERED (2)

N1 not covered No rule of this pack reaches this line. Of the bank statement it covers the processor's payouts and nothing else. Rows: bank-statement.csv row 4. Figures: date 2026-09-20; amount -250.00; payee Example Supplies; description '=HYPERLINK("http://example.invalid","card purchase"); reference none.

N2 not covered A journal of this kind is outside this pack. Of the ledger it covers invoices, receipts on them and credit notes. Rows: ledger-journals.csv rows 39 and 40. Figures: kind MANJOURNAL; reference none; amount 100.00; date 2026-09-30.

6. INVOICES IN THE LEDGER (8)

INV-0101: total 7900.00; received by the ledger 7900.00; of that, supported by a match 7900.00; credited 0.00; open by the ledger at the period end 0.00; settled. ledger-journals.csv rows 2 and 3. INV-0102: total 1000.00; received by the ledger 1000.00; of that, supported by a match 1000.00; credited 0.00; open by the ledger at the period end 0.00; settled. ledger-journals.csv rows 6 and 7. INV-0103: total 4000.00; received by the ledger 2000.00; of that, supported by a match 2000.00; credited 0.00; open by the ledger at the period end 2000.00; part paid. ledger-journals.csv rows 11 and 12. INV-0104: total 600.00; received by the ledger 600.00; of that, supported by a match 600.00; credited 150.00; open by the ledger at the period end 0.00; settled. ledger-journals.csv rows 15 and 16. INV-0105: total 4300.00; received by the ledger 4300.00; of that, supported by a match 4300.00; credited 0.00; open by the ledger at the period end 0.00; settled. ledger-journals.csv rows 22 and 23. INV-0107: total 500.00; received by the ledger 500.00; of that, supported by a match 0.00; credited 0.00; open by the ledger at the period end 0.00; a receipt on it is not supported by a match. ledger-journals.csv rows 26 and 27. INV-0108: total 780.00; received by the ledger 780.00; of that, supported by a match 0.00; credited 0.00; open by the ledger at the period end 0.00; a receipt on it is not supported by a match. ledger-journals.csv rows 30 and 31. INV-0106: total 1200.00; received by the ledger 1200.00; of that, supported by a match 1200.00; credited 0.00; open by the ledger at the period end 0.00; settled. ledger-journals.csv rows 34 and 35.

7. PAYOUTS (3)

The processor's own figures in GBP: gross 2650.00, fees 42.00, net 2608.00. po_MADEUP_0001: net 985.00; fees kept 15.00; due 2026-09-08; at the bank, bank-statement.csv row 2. po_MADEUP_0002: net 441.00; fees kept 9.00; due 2026-09-16; at the bank, bank-statement.csv row 3. po_MADEUP_0003: net 1182.00; fees kept 18.00; due 2026-10-02; due after the period end; no bank line in this period.

8. WHAT THIS PACK DOES NOT DO

- No rate is supplied and no figure is rounded. A transfer at the rate given has to equal the ledger's receipt to the last digit, or it is an exception. A practice's own rounding rule is not applied, because none has been given. - A rate is looked up for the day of the transfer in UTC. Another basis would have to be given. - A chain file's identifier names the transaction. Two transfers inside one transaction cannot be told apart, so a repeat in a chain file is not looked for. - A token is known by its symbol. A close in which two contracts carry one symbol is refused. - A receipt is tied to a transfer only where the ledger entry quotes the transaction. Where it does not, both sides are exceptions. - Every receipt in the ledger is expected to be supported by a file of the pack. A ledger that also holds receipts paid straight into the bank needs the accounts in scope named, and the pack does not take that list yet. - Of the bank statement the pack covers the processor's payouts. Of the exchange it covers deposits from the entity's own wallets. Of the ledger it covers invoices, receipts on them and credit notes. The rest is listed as not covered. - Fees are shown as the files give them. None is checked against a price list, and network fees are not read. - Nothing in this pack says how an item is treated in the accounts.

9. REVIEW AND APPROVAL

An approval names the checksums above. A file that changes has a different checksum, and the approval no longer covers it.

Reviewed by (practice): ______________________________ Date: ______________ Approved by (practice, a different person): ______________________________ Date: ______________

Use it alongside your exports

Follow the row references and compare the named fields with your own export headers. The five-field list explains what each source needs. No client names, balances or transactions are needed to read either page.

The example has no accountant approval. Its review and approval lines are blank. Accounting treatment stays with the practice accountant; a changed source file needs a fresh review. Web3 Close posts nothing to a ledger, makes no payments and certifies nothing for audit.

Open the field list

The seven source files

Open each file to follow the row references in the pack. The header is row 1; the rows below it are the data.

Example source files
FileData rowsSHA-256
bank-statement.csv3875fa61f652381b134845e53ab7b45968457c1cfddbcf78adcc3ef8037c4144b
chain-operations-wallet.csv2f3ab3163dfb0a97ecaee5081de91a6297f020a6c2f3a6b3ce9c4c44dc1a3f306
chain-treasury-wallet.csv67aaa5e048cfbca799be4a6d206299b73b9f0c31f41f9776bfde33e80efc9977e
exchange-kraken-ledgers.csv232277d85f78e45d087963cafd9f9d4f662817659a2ceec3380085d97ebd77c53
ledger-journals.csv39ac7e79a317c4e784157c469dc8118b6048cad0f97dbdce9fdafb0094211434e0
processor-payout-reconciliation.csv4fb8d5c76b24e5055593de593724be3015b93d6f9a75232454cf401fe3c855262
rates.csv3fae95b542b98b13a69723be826f8221e417177843d51ee7b810564f23d44d77e