Payment Reconciliation Engine for a French Online Marketplace
Designed and built a clickable reconciliation engine for a Lyon-based marketplace group paid through Adyen, Stripe, PayPal and SEPA: it matches orders to PSP transactions, payouts and bank statement lines, explains every suggestion, turns what is left into a worked exceptions queue and traces each match to the journal entries it posts.
Most of our work is under NDA. Per agreement, we can share the work but not the company details - all names and identifying information shown here have been changed.
Dashboard, three-column matching workspace with match tray, exceptions queue, exception detail and match group detail. Every exception and match group in the demo opens its own page.
Order to PSP, PSP transactions to payout, payout to bank line, and direct bank to ledger for SEPA transfers and direct debits. Each suggestion names its rule and version, such as P2B-02 v5, with a confidence score.
Fee difference, missing payout, duplicate, FX difference, refund or chargeback netted, unknown bank credit, unapplied SEPA transfer, R-transaction, short payment and timing.
Across 3 legal entities, with 8 staff users, 7 sources, 9 payouts, 13 order and ledger rows, 13 PSP transactions, 10 bank lines, 14 match suggestions and 6 match groups.
Verdane Marché takes about 38,000 payments a day, worth roughly EUR 2.1 million, but its bank accounts see only around 60 net payouts from its PSPs. The finance team reconciled them in spreadsheets, downloading PSP reports by hand and pasting CFONB statements into Excel. Close took 11 working days, the suspense account carried EUR 640,000 of unexplained differences at year end, and the statutory auditors raised a management letter point about the missing trail from order to bank.
Contrepoint pulls in every order and ledger entry, every PSP transaction and payout, and every bank statement line, matches them three ways with versioned rules, turns what is left into an exceptions queue with an owner and an age, and produces the journal entries for the ERP, so each payout can be traced from the orders behind it to the bank line and the ledger.
A marketplace paid by card, Apple Pay, PayPal, SEPA transfer and SEPA direct debit through three PSPs and two French banks never sees one payment arrive as one bank line. Every payout is a net sum that has to be taken apart before it can be matched.
Each PSP pays out gross captures minus processing fees, interchange and scheme fees, refunds, chargebacks and reserve movements. Nobody could say how much the PSPs had really charged, or whether a missing payout was a timing difference or money lost.
Banks deliver camt.053 and CFONB 120 statements over EBICS, Adyen sends settlement details, Stripe balance transactions and PayPal STL reports. SEPA transfer references are often missing or mistyped, so the order number cannot always be read from the bank line.
SEPA direct debits can return as R-transactions with reason codes such as AM04 or MD06, and under SDD Core a payer can ask for a refund for 8 weeks, or 13 months if unauthorised. A matched collection can be reversed long after it was booked.
Entries follow the Plan Comptable Général, closed periods can only be reversed in a later one, and the ERP's FEC needs the matching fields filled. Every match, write-off and posting has to show who or which rule did it, when and why.
Mapped 8 user roles, from reconciliation analyst to a read-only statutory auditor, 31 screens and the data model for sources, import runs, normalised records, payouts and their components, versioned match rules, match groups, exceptions, write-offs and journal entries. Wrote down the rules the design follows: EBICS and ISO 20022 statements, CFONB 120, SEPA R-transactions, PSP settlement reports, PCG accounts, FEC fields, 10-year retention, GDPR and staying out of PCI DSS scope.
Built 5 key screens on a production dashboard kit: the dashboard with match-rate KPIs, sources ingested today, unmatched value by age and payouts expected against received; the matching workspace with suggestions, payout view and a match tray; the exceptions queue and exception detail; and the match group detail with its chain, difference breakdown and journal entries. All actions run on local state.
Bank statements over EBICS from banks such as BNP Paribas and Société Générale, Adyen, Stripe and PayPal reports, the order system, ECB reference rates, and journal posting to an ERP such as SAP S/4HANA, Sage, Pennylane or Cegid. Single sign-on with Microsoft Entra ID, approval limits per role, a hash-chained audit trail, and the ingest, rules, journal, period close, reports, FEC export and auditor pack screens.
Orders and ledger, PSP transactions and bank lines sit in three columns. The match tray shows the sum of each leg, the difference, the cardinality and the tolerance that applies, and previews the adjustment line before anything is booked.
Each suggestion carries a confidence score and the rule behind it, and bulk accept only takes those at 95 or more. Rejected candidates keep their reason, such as "amount differs by EUR 2.40, over tolerance EUR 0.50", and manual matches above the analyst's limit wait for an approver.
Tabs for mine, unassigned, all and awaiting approval, priority by value, and age that turns amber after 3 business days and red after 7. Waiting on the PSP or bank pauses the clock, and each type brings its own help: contracted against charged fees, PSP rate against ECB rate, or the SEPA reason code.
A match group shows the chain from orders through PSP transactions and payout to the bank line, a difference breakdown that must reach zero, and the PCG entries it posts: a EUR 48,210.35 Stripe payout debits 512100 and 627100 for EUR 612.40 fees and credits 467200 for EUR 48,822.75.

Designed and built a clickable merchant onboarding and KYB console for a CBN-licensed payment gateway in Lagos: an applications queue, a case review that checks CAC, BVN, NIN, liveness and the settlement account name in one place, an underwriting workbench with an explainable risk score, limits and rolling reserves, and four-eyes approvals bound to each approver's mandate.

Designed and built a clickable ops console for a Manila remittance company paying out PHP to the families of overseas Filipino workers: a live view of today's flows across 4 corridors, a transfers monitor with SLA timers, a full transfer record, compliance holds with a tipping-off check, and FX margins priced per corridor, payout method and amount band.
Enterprise Software Engineering - Human + AI
Contact Us
© 2026 - Copyright. All Rights reserved Oceanlab
Location
Global Headquarters
21 Merchant Road, 3rd Floor, Singapore 058267
Main corporate office and leadership operations
North America Office
548 Market Street, PMB 12345, San Francisco, CA 94104
Client operations and business development
India Office
402 Shivalik Shilp II, SG Highway, Ahmedabad 380015
Engineering and delivery center
Enterprise Software Engineering - Human + AI
Contact Us
Locations
Global Headquarters
21 Merchant Road, 3rd Floor, Singapore 058267
Main corporate office and leadership operations
North America Office
548 Market Street, PMB 12345, San Francisco, CA 94104
Client operations and business development
India Office
402 Shivalik Shilp II, SG Highway, Ahmedabad 380015
Engineering and delivery center
© 2026 - Copyright. All Rights reserved Oceanlab