CLIENT: Verdane Marché🇫🇷France

Contrepoint - Three-Way Reconciliation Engine for Orders, PSP Payouts and Bank Lines

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.

Scope of Work
Product design, UI build and clickable demo
Industry
Payments / Reconciliation Engine
FinTechEnterprise
Compliance & Certifications
EBICS and ISO 20022 (camt.053)CFONB 120SEPA SCT and SDDPlan Comptable GénéralFEC (LPF L47 A)Code de commerce L123-22GDPRPCI DSS (out of scope)

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.

Impact

5 Screens
Clickable end to end

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.

4 Stages
Of versioned matching rules

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.

10 Types
Of exception, each with its own help

Fee difference, missing payout, duplicate, FX difference, refund or chargeback netted, unknown bank credit, unapplied SEPA transfer, R-transaction, short payment and timing.

22 Exceptions
Realistic demo data

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.

The Problem

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.

Our Solution

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.

The Challenge: Thousands of Payments, a Few Dozen Payouts

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.

Payouts Arrive Net

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.

Every Source Speaks Its Own Format

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.

Money That Comes Back Later

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.

A Trail the Auditors Can Follow

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.

Our Approach: From Settlement Rules to a Clickable Engine

01

Spec and Rules Research

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.

02

Clickable Demo on a Production UI Kit

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.

03

What a Production Build Adds

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.

Why It Works: Every Match Explains Itself

Three Legs Side by Side

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.

Suggestions Show Their Reason

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.

Exceptions as a Worked Queue

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.

From Order to Ledger in One Page

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.

Related case studies

View all: Payments
Logo
Oceanlab

Enterprise Software Engineering - Human + AI

Languages

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