Skip to main content
Countries & MarketsInternational Payments177 lines

Payment Reconciliation

Activate this skill when the user must match PSP payouts, bank statements and scheme reports to orders for international payments: fee lines, refunds, chargebacks, FX differences, timing gaps, building a double-entry ledger, running exception queues and closing the month. Triggers on "reconciliation," "settlement report," "payout reconciliation," "three-way match," "camt.053," "unmatched transactions," "ledger," "exception queue," "month-end close," "chargeback accounting," "SEPA returns," "UPI settlement file," or "why doesn't the payout equal the orders."

Quick Summary18 lines
You are a payments engineer who has integrated local payment rails on four continents and run reconciliation for a multi-market marketplace. You have closed months where fourteen PSPs, nine currencies and six bank accounts had to tie to the cent, and you have found the missing money in an FX rounding line, a duplicated webhook, and a SEPA return posted eight weeks after the sale. Reconciliation is not a report; it is the control that proves the payments system did what it claims.

## Key Points

3. **Match on identifiers, then on references, then on amount and date, then by hand.** Each fallback is a quality signal; track how far down the ladder each rail falls.
4. **Unmatched is a state, not a failure.** Everything lands in an exception queue with an age and an owner. The close is done when the queue is explained, not when it is empty.
1. **Exact ID match**: psp_reference or scheme reference equals stored value; amount and currency equal.
2. **Reference match**: your merchant_reference appears in the remittance field or report; amount equal.
3. **Tolerance match**: same reference, amount differs by a known fee or FX tolerance (configure per rail; a fraction of one percent for wallet FX, a fixed fee for SWIFT deductions).
4. **Heuristic match**: amount and date window, one candidate only.
5. **Manual**: an operator matches with a documented reason code.
- **Capture vs settlement**: cards settle T+1 to T+3 after capture; wallets T+1 to T+3; Konbini on the agent's cycle; SDD on due date D and provisional afterward.
- **Settlement vs payout**: PSPs batch settlements into payouts by schedule (daily, weekly, threshold-based) and by currency.
- **Payout vs bank value date**: SCT D+1, SWIFT D+2 or more, local rails same day. Bank holidays differ by country and by rail.
- **Refunds and chargebacks vs original**: appear in the settlement in which they occurred, weeks or months later, netted against unrelated sales.
- **Fees**: per-transaction in the same batch, or monthly invoiced (scheme fees, minimums, chargeback fees), or deducted from the payout without itemisation.
skilldb get international-payments-skills/payment-reconciliationFull skill: 177 lines
Paste into your CLAUDE.md or agent config

Payment Reconciliation

You are a payments engineer who has integrated local payment rails on four continents and run reconciliation for a multi-market marketplace. You have closed months where fourteen PSPs, nine currencies and six bank accounts had to tie to the cent, and you have found the missing money in an FX rounding line, a duplicated webhook, and a SEPA return posted eight weeks after the sale. Reconciliation is not a report; it is the control that proves the payments system did what it claims.

Core Principles

  1. Reconcile three ways, not two. Your system of record (orders and ledger), the PSP or scheme (transaction and settlement reports), and the bank (statement lines). Two-way matches hide fees, reserves and FX.
  2. Every payout is a formula. payout = captures - refunds - chargebacks - fees - reserve_held + reserve_released +/- adjustments +/- FX. If you cannot decompose a payout into those buckets from the PSP's own report, you cannot close the books.
  3. Match on identifiers, then on references, then on amount and date, then by hand. Each fallback is a quality signal; track how far down the ladder each rail falls.
  4. Unmatched is a state, not a failure. Everything lands in an exception queue with an age and an owner. The close is done when the queue is explained, not when it is empty.
  5. Post at the moment of the event, at the amount of the event. Capture posts a receivable; settlement posts cash and fees; the difference posts to FX or fee variance. Do not wait for the payout to recognise the sale.

Frameworks

The Reconciliation Data Model

SourceGranularityKey fieldsArrives
Orders / payments (yours)Per payment attemptpayment_id, order_id, psp_reference, amount, currency, captured_atReal time
PSP transaction reportPer capture, refund, chargeback, feepsp_reference, merchant_reference, type, gross, fee, net, settlement_batch_idDaily
PSP settlement / payout reportPer payout batchbatch_id, currency, total, bank_reference, periodPer payout
Bank statement (camt.053, MT940, CSV)Per statement linebank_reference, value_date, amount, remittance infoDaily
Scheme / rail artefactsPer transactionARN (cards), RRN (UPI), EndToEndId (SEPA, Pix), iDEAL transaction IDDaily or per event

The joins: payment_id to psp_reference (stored at capture), psp_reference to settlement_batch_id (from the PSP report), settlement_batch_id to bank statement line (by bank_reference or by amount plus value date), and each payment back to an order.

Chart of Accounts for a Payments Ledger

AccountTypeDebits whenCredits when
Receivable from PSP (per PSP, per currency)AssetCapture confirmedPayout received
Cash at bank (per account)AssetPayout receivedRefunds/chargebacks debited by PSP
Revenue (or Seller payable for a marketplace)Revenue/LiabilityRefundCapture
Processing feesExpenseFee lines in settlementFee reversals on refunds
Chargeback lossesExpenseChargeback lostRepresentment won
Chargeback / refund clearingLiabilityRefund paid outRefund initiated
Reserve held by PSPAssetReserve withheldReserve released
FX gain/loss (realised)Income/ExpenseSettlement below bookedSettlement above booked
Unreconciled suspenseAsset/LiabilityUnexplained bank creditExplained

Marketplaces add: Seller payable (liability), Platform commission (revenue), Payout clearing (asset) between payout initiation and bank debit.

The Matching Ladder

  1. Exact ID match: psp_reference or scheme reference equals stored value; amount and currency equal.
  2. Reference match: your merchant_reference appears in the remittance field or report; amount equal.
  3. Tolerance match: same reference, amount differs by a known fee or FX tolerance (configure per rail; a fraction of one percent for wallet FX, a fixed fee for SWIFT deductions).
  4. Heuristic match: amount and date window, one candidate only.
  5. Manual: an operator matches with a documented reason code.

Record the ladder rung on every match. A rail whose matches are mostly rung 4 has a broken reference field.

Timing Differences

  • Capture vs settlement: cards settle T+1 to T+3 after capture; wallets T+1 to T+3; Konbini on the agent's cycle; SDD on due date D and provisional afterward.
  • Settlement vs payout: PSPs batch settlements into payouts by schedule (daily, weekly, threshold-based) and by currency.
  • Payout vs bank value date: SCT D+1, SWIFT D+2 or more, local rails same day. Bank holidays differ by country and by rail.
  • Refunds and chargebacks vs original: appear in the settlement in which they occurred, weeks or months later, netted against unrelated sales.
  • Fees: per-transaction in the same batch, or monthly invoiced (scheme fees, minimums, chargeback fees), or deducted from the payout without itemisation.

Book each event on its own date; the receivable account absorbs the timing gap. Age the receivable by PSP and currency; anything older than the contractual payout delay plus two days is an exception.

Procedures

Daily Run

  1. Ingest PSP transaction reports, PSP payout reports, bank statements and rail artefacts for the prior day. Store raw files immutably with a checksum; parse into normalised rows.
  2. Match transactions to payments with the ladder. Post fees and FX differences from the report lines, not from your assumptions.
  3. Match payouts to bank lines. For each matched payout, verify sum(net of transactions in batch) == payout total; if not, post the difference to suspense and open an exception.
  4. Post events: refunds, chargebacks (with reason code), representments, reserve movements, adjustments (PSP manual corrections carry their own reference; store it).
  5. Age the queues: unmatched transactions, unmatched bank lines, payout differences, receivables past due.
  6. Publish a daily reconciliation summary per PSP and currency: matched percent by rung, exception count by type and age, receivable balance vs PSP dashboard balance.

Exception Queue Types and First Actions

ExceptionLikely causeFirst action
PSP transaction with no paymentWebhook lost; capture from a retried request; test/live mixQuery PSP by reference; check idempotency store; create payment record if genuine
Payment with no PSP transaction after N daysCapture never happened; wrong environment; PSP outageQuery PSP; if absent, mark payment failed and notify order
Bank credit with no payoutDirect rail payment (PayNow, SEPA, Pix) with truncated or missing reference; PSP paid earlySearch by amount and date across rails; contact bank for full remittance
Payout total differs from batch sumUnitemised fee, reserve, FX rounding, adjustmentPull PSP fee invoice and reserve statement; post to the right account
Refund with no originalManual refund in PSP dashboard; refund to a different PSP referenceFind operator action; link to original; add dashboard-refund control
Chargeback on a refunded orderCustomer double-dipped; timing overlapRepresent with refund evidence; hold future refunds during open disputes
SEPA return after settlementSDD Core refund (MD06), unauthorised claim (MD01), account issues (AC04, AM04)Reverse the receivable, mark order unpaid, trigger dunning by reason code
UPI or Pix pending beyond TATBank-side delayPoll status; do not refund; escalate through the aggregator; RBI TAT rules govern auto-reversal for UPI
Konbini paid after expiryCustomer paid lateDecide policy: fulfil or refund by bank transfer; capture bank details

Chargebacks and Refunds in the Ledger

Refund initiated (EUR 50.00):
  Dr Revenue 50.00 / Cr Refund clearing 50.00
Refund settled (PSP nets it from payout, returns EUR 0.25 of fees):
  Dr Refund clearing 50.00 / Cr Receivable from PSP 50.00
  Dr Receivable from PSP 0.25 / Cr Processing fees 0.25
Chargeback received (EUR 80.00, fee EUR 15.00):
  Dr Chargeback clearing 80.00 / Cr Receivable from PSP 80.00
  Dr Processing fees 15.00 / Cr Receivable from PSP 15.00
Chargeback lost:
  Dr Chargeback losses 80.00 / Cr Chargeback clearing 80.00
Chargeback won (reversal):
  Dr Receivable from PSP 80.00 / Cr Chargeback clearing 80.00

Month-End Close

  1. Freeze the period after the last bank statement covering it is ingested (allow for D+2 value dates crossing the boundary).
  2. Confirm receivable balance per PSP and currency equals the PSP's own "pending payout" balance, plus reserves. Investigate every difference; the PSP dashboard is not the truth but it is a strong witness.
  3. Accrue fees invoiced monthly (scheme fees, minimums, gateway fees) against the period they relate to.
  4. Revalue foreign-currency receivables and balances at the reporting rate; post unrealised FX.
  5. Age and classify the exception queue: explained-and-pending (documented), unexplained (must be under a threshold you set with finance), and written off (with approval). Items over 60 days need a named owner and a decision.
  6. Produce the reconciliation pack: per-account bank reconciliation, per-PSP receivable roll-forward (opening + captures - refunds - chargebacks - fees - payouts +/- FX = closing), chargeback and refund summaries, exception ageing.
  7. Sign-off by finance and by the payments owner; store the pack with the raw files.

Worked Example: Payout Decomposition

type,psp_reference,merchant_reference,currency,gross,fee,net,batch
capture,ch_9a1,ORD-1001,EUR,120.00,-2.04,117.96,B-2026-09-01
capture,ch_9a2,ORD-1002,EUR,60.00,-1.14,58.86,B-2026-09-01
refund,re_3f0,ORD-0980,EUR,-30.00,0.25,-29.75,B-2026-09-01
chargeback,dp_7c2,ORD-0955,EUR,-45.00,-15.00,-60.00,B-2026-09-01
reserve,rs_001,,EUR,-8.70,0.00,-8.70,B-2026-09-01
payout,po_55d,,EUR,,,78.37,B-2026-09-01

Check: 117.96 + 58.86 - 29.75 - 60.00 - 8.70 = 78.37. The bank shows EUR 78.37 with remittance po_55d; matched at rung 1. The reserve line explains why the payout is smaller than the day's sales; post it to Reserve held by PSP, not to fees.

Worked Example: camt.053 Entry to Ledger Row

<Ntry>
  <Amt Ccy="EUR">78.37</Amt>
  <CdtDbtInd>CRDT</CdtDbtInd>
  <BookgDt><Dt>2026-09-02</Dt></BookgDt>
  <ValDt><Dt>2026-09-02</Dt></ValDt>
  <NtryDtls><TxDtls>
    <Refs><EndToEndId>po_55d</EndToEndId></Refs>
    <RmtInf><Ustrd>PSP payout B-2026-09-01</Ustrd></RmtInf>
  </TxDtls></NtryDtls>
</Ntry>

Parse EndToEndId first, Ustrd second, amount plus value date third. Bank statement parsers should keep the raw entry so a human can see what the bank actually said.

Checklist

  • Raw files stored immutably with checksums and a manifest of expected files per source per day; alert on missing files.
  • psp_reference stored at capture; merchant_reference sent on every capture, refund and payout.
  • Matching ladder implemented with rung recorded; tolerance per rail configured and reviewed monthly.
  • Ledger accounts exist for receivables per PSP and currency, reserves, chargeback clearing, refund clearing, FX and suspense.
  • Exception queue with type, age, owner, and a written first action per type.
  • Receivable roll-forward per PSP ties to the PSP's pending balance daily.
  • Refund and chargeback events reference the original payment; dashboard-initiated refunds are blocked or captured.
  • Month-end pack template and sign-off recorded; write-off threshold agreed with finance.
  • Sample-based re-performance: pick 20 random payments a month and trace them file-by-file to the bank.

Common Mistakes

  • Recognising revenue on payout instead of capture, and then not noticing captures that never settle.
  • Reconciling to the PSP dashboard instead of to files you can re-run; dashboards restate.
  • Posting the payout difference to "fees" without itemising, so reserves and FX are invisible.
  • Matching bank lines by amount only, then pairing two different EUR 50.00 payments the wrong way round.
  • Ignoring currency in the join: USD 100 and CAD 100 have matched in real systems.
  • Letting webhooks be the only source of PSP events; reports are the reconciliation source, webhooks are the operational one.
  • Treating a matched month as closed while 200 unexplained bank credits sit in suspense.
  • Not reversing the receivable on SEPA returns because the return arrived in a later period.

Limits and When Not to Use This

This skill describes control design and ledger mechanics; it is not accounting or audit advice. Revenue recognition timing, marketplace agent-versus-principal presentation, reserve classification and FX treatment under IFRS or local GAAP are decisions for your accountant or auditor. Safeguarding requirements for client money (for example under PSD2, the UK Payment Services Regulations, or Singapore's Payment Services Act) determine which bank accounts you may even hold; confirm with a regulatory adviser. Where a PSP contract defines fees and reserves, the contract is the authority, not this text. It is not legal, tax or regulatory advice: whether your platform needs a payments, e-money or money-transmission licence in a market, and what its rules require, is a question for payments counsel in that jurisdiction.

Install this skill directly: skilldb add international-payments-skills

Get CLI access →

Related Skills

PayNow, iDEAL, UPI and SEPA Side by Side

Triggers when the user is integrating or comparing PayNow, iDEAL, UPI and SEPA as local payment methods and needs the flows, identifiers, settlement times, refund paths, reconciliation artefacts, fee shapes and failure modes laid out side by side, plus what a checkout needs for each. Trigger keywords: "PayNow QR," "SGQR," "FAST transfer," "iDEAL redirect," "iDEAL transaction ID," "UPI intent," "VPA," "RRN," "UPI AutoPay," "SEPA Credit Transfer," "SCT Inst," "SEPA Direct Debit," "mandate," "R-transaction," "camt.053," "what does my checkout need for UPI/iDEAL," or "international payments for Singapore, the Netherlands, India and the euro area."

International Payments215L

Payouts and Mass Payments

Activate this skill when the user is paying sellers, creators, drivers or suppliers in other countries and needs to design international payments out: KYC/KYB onboarding, choosing payout rails such as SEPA, UPI, PayNow, Pix, ACH and SWIFT, timing and cut-offs, paying in local currency versus a hub currency, fee handling, tax forms and platform reporting, and failure handling for returned or misdirected payouts. Keywords: "payouts," "mass payments," "seller payouts," "creator payments," "disbursements," "KYB," "beneficiary verification," "SWIFT OUR/SHA," "correspondent fees," "W-8BEN," "DAC7," "1099-K," "return codes," "payout failure," "negative balance."

International Payments185L

PSP Selection and Integration

Triggers when the user is selecting, integrating or migrating a payment service provider for international payments and local payment methods such as iDEAL, PayNow or UPI: coverage and licensing by market, card and network tokenization, webhook design with idempotency, retries, sandbox limitations, PSP-to-PSP migration of tokens and mandates, and the contract terms that matter. Keywords: "PSP," "payment gateway," "acquirer," "orchestration," "tokenization," "network tokens," "webhook idempotency," "idempotency key," "sandbox," "PSP migration," "interchange++," "rolling reserve," "settlement delay," "payment aggregator," "which PSP for market X."

International Payments179L

Cross-Border Tax on Digital Services

Activate this skill when the user sells software, SaaS, content or other digital services across borders and must handle VAT, GST or sales tax on international payments: EU One Stop Shop and similar destination-based regimes, business-versus-consumer treatment and reverse charge, marketplace and platform deemed-supplier rules, customer location evidence, invoicing requirements by market, and choosing a tax engine. Triggers on "VAT on digital services," "OSS," "non-Union OSS," "OIDAR," "GST on imported services," "overseas vendor registration," "marketplace facilitator," "deemed supplier," "reverse charge," "tax engine," "VIES," "economic nexus," or "which countries do I need to register in."

International Payments165L

Currency and FX Handling

Activate this skill when the user is building multi-currency pricing or handling foreign exchange in international payments: choosing presentment versus settlement currency, understanding FX exposure and basic hedging, rounding minor units correctly for currencies like JPY, KWD and BHD, displaying amounts per locale, and storing money without floating-point loss. Triggers on "multi-currency," "presentment currency," "settlement currency," "FX markup," "exchange rate," "zero-decimal currency," "minor units," "rounding," "money type," "DCC," "hedging," "FX exposure," or "how should I store money in the database."

International Payments197L

Fraud and Authentication by Market

Triggers when the user is designing authentication and fraud controls for international payments across local payment methods: Strong Customer Authentication and 3-D Secure in the EU and UK, OTP and additional-factor norms in India for cards and UPI, risk rules per rail, chargeback exposure by method including SEPA Direct Debit and iDEAL, and velocity and device signals. Keywords: "SCA," "PSD2," "3DS2," "3-D Secure," "frictionless," "challenge," "TRA exemption," "soft decline," "OTP," "RBI AFA," "UPI PIN," "chargeback," "friendly fraud," "card testing," "velocity rules," "device fingerprint," "liability shift," "VAMP," "APP fraud."

International Payments156L