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."
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 linesPayment 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
- 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.
- 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. - 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.
- 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.
- 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
| Source | Granularity | Key fields | Arrives |
|---|---|---|---|
| Orders / payments (yours) | Per payment attempt | payment_id, order_id, psp_reference, amount, currency, captured_at | Real time |
| PSP transaction report | Per capture, refund, chargeback, fee | psp_reference, merchant_reference, type, gross, fee, net, settlement_batch_id | Daily |
| PSP settlement / payout report | Per payout batch | batch_id, currency, total, bank_reference, period | Per payout |
| Bank statement (camt.053, MT940, CSV) | Per statement line | bank_reference, value_date, amount, remittance info | Daily |
| Scheme / rail artefacts | Per transaction | ARN (cards), RRN (UPI), EndToEndId (SEPA, Pix), iDEAL transaction ID | Daily 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
| Account | Type | Debits when | Credits when |
|---|---|---|---|
| Receivable from PSP (per PSP, per currency) | Asset | Capture confirmed | Payout received |
| Cash at bank (per account) | Asset | Payout received | Refunds/chargebacks debited by PSP |
| Revenue (or Seller payable for a marketplace) | Revenue/Liability | Refund | Capture |
| Processing fees | Expense | Fee lines in settlement | Fee reversals on refunds |
| Chargeback losses | Expense | Chargeback lost | Representment won |
| Chargeback / refund clearing | Liability | Refund paid out | Refund initiated |
| Reserve held by PSP | Asset | Reserve withheld | Reserve released |
| FX gain/loss (realised) | Income/Expense | Settlement below booked | Settlement above booked |
| Unreconciled suspense | Asset/Liability | Unexplained bank credit | Explained |
Marketplaces add: Seller payable (liability), Platform commission (revenue), Payout clearing (asset) between payout initiation and bank debit.
The Matching Ladder
- Exact ID match: psp_reference or scheme reference equals stored value; amount and currency equal.
- Reference match: your merchant_reference appears in the remittance field or report; amount equal.
- 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).
- Heuristic match: amount and date window, one candidate only.
- 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
- 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.
- Match transactions to payments with the ladder. Post fees and FX differences from the report lines, not from your assumptions.
- 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. - Post events: refunds, chargebacks (with reason code), representments, reserve movements, adjustments (PSP manual corrections carry their own reference; store it).
- Age the queues: unmatched transactions, unmatched bank lines, payout differences, receivables past due.
- 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
| Exception | Likely cause | First action |
|---|---|---|
| PSP transaction with no payment | Webhook lost; capture from a retried request; test/live mix | Query PSP by reference; check idempotency store; create payment record if genuine |
| Payment with no PSP transaction after N days | Capture never happened; wrong environment; PSP outage | Query PSP; if absent, mark payment failed and notify order |
| Bank credit with no payout | Direct rail payment (PayNow, SEPA, Pix) with truncated or missing reference; PSP paid early | Search by amount and date across rails; contact bank for full remittance |
| Payout total differs from batch sum | Unitemised fee, reserve, FX rounding, adjustment | Pull PSP fee invoice and reserve statement; post to the right account |
| Refund with no original | Manual refund in PSP dashboard; refund to a different PSP reference | Find operator action; link to original; add dashboard-refund control |
| Chargeback on a refunded order | Customer double-dipped; timing overlap | Represent with refund evidence; hold future refunds during open disputes |
| SEPA return after settlement | SDD 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 TAT | Bank-side delay | Poll status; do not refund; escalate through the aggregator; RBI TAT rules govern auto-reversal for UPI |
| Konbini paid after expiry | Customer paid late | Decide 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
- Freeze the period after the last bank statement covering it is ingested (allow for D+2 value dates crossing the boundary).
- 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.
- Accrue fees invoiced monthly (scheme fees, minimums, gateway fees) against the period they relate to.
- Revalue foreign-currency receivables and balances at the reporting rate; post unrealised FX.
- 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.
- 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.
- 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
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."
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."
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."
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."
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."
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."