How to use Reconciliation

When a customer pays you through Lean, the payment is accepted by their bank. Reconciliation is how you confirm that the money then arrived in your bank account.

Lean tracks this for every payment. Each one gets a reconciliation status: Outstanding, Received or Unreceived. Lean automatically marks payments as received for you where we're able to detect a full match, however some payments may require manual reconciliation which can be done within the Lean Dashboard. Each time the status changes, Lean sends your system a webhook, so your records stay in step.

This guide covers:

  1. Before you start
  2. Reconciliation statuses
  3. How payments are reconciled
  4. Reconciling payments in the dashboard
  5. Handling reconciliation webhooks
  6. Checking reconciliation status through the API

Before you start

Talk to your Lean contact

Reconciliation is set up together with Lean. Tell your Lean point of contact that you'd like to use it, and which bank account you receive payments into. They'll arrange a call to:

  • confirm whether your bank supports automatic deposit retrieval
  • connect your collection account to Lean
  • agree whether matched payments should be reconciled automatically
🚧

One collection account per application

Reconciliation works with one destination account. If you receive payments into several bank accounts, or into several sub-accounts of one account (for example one in AED and one in USD), choose one to use with reconciliation.

Use a unique payment description

Lean sends the description you set on the payment intent to the bank as the payment reference. It usually appears on your bank statement next to the deposit, which makes matching fast and accurate. For each payment:

  • keep the description to 12 characters or fewer
  • make it unique
  • store it against the payment in your own system

Who can reconcile

Team members need the View reconciliation permission to see the reconciliation tabs, and Reconcile payments to change a payment's status. Owner, Admin and Finance roles include both by default. Your dashboard admin can grant them to other users under Manage team.


Reconciliation statuses

When the bank reports a payment as ACCEPTED_BY_BANK or PENDING, Lean creates a reconciliation record for it. Its status starts as Outstanding.

Dashboard tabAPI statusMeaning
OutstandingOUTSTANDINGNot yet confirmed as received in your account.
ReceivedRECONCILEDConfirmed as received, by Lean or by someone on your team.
UnreceivedUNRECEIVEDSomeone on your team has confirmed the money didn't arrive.
📘

The payment status doesn't change

Reconciliation never changes the payment's own status, which stays ACCEPTED_BY_BANK or PENDING. Use reconciliation.status to tell whether a payment has been received.


How payments are reconciled

There are three ways a payment can move from Outstanding to Received.

1. Manually

Someone on your team compares the payment with your bank statement and marks it as received in the dashboard. They can add a reconciliation reference, such as your bank's transaction ID. No bank connection is needed.

2. Matched deposits

Lean reads deposits from your connected collection account. It suggests matches using transaction references, confirmation codes, account details, dates and amounts. Your team reviews the suggestions and confirms each match in the dashboard. Click Refresh deposits to fetch the latest deposits at any time.

3. Automatically

Lean fetches deposits from your bank continuously, and marks payments that match a single deposit as received without anyone needing to act. These payments are labelled Auto-reconciled. Anything Lean can't match with confidence stays Outstanding for your team to review.

🚧

Automatic reconciliation isn't available for every bank. Your Lean contact can confirm whether your bank is supported.


Reconciling payments in the dashboard

In the Application Dashboard, go to Transactions → Payments. The Outstanding, Received and Unreceived tabs show your payments in each reconciliation status.

The Outstanding tab

The Outstanding tab lists every payment waiting to be reconciled.

For each payment you'll see:

  • Amount, and how many of your deposits match it
  • Sender bank
  • Customer name and IBAN
  • Description, with the bank's transaction reference underneath. This is usually the reference that appears on your bank statement.
  • Last update

Use Filters to narrow the list by bank, payment status, amount or date. Use Export to download the filtered list as a CSV.

Getting the latest deposits

If your collection account is connected, the bar above the table shows when deposits were last fetched.

The deposit controls show when deposits were last updated, a Refresh deposits button and the connected account

  • Click Refresh deposits to fetch new deposits from your bank. Lean updates the match counts when it's done.
  • If you see Connection expired, click Reconnect in Your accounts and sign in to your bank again. See Keeping your bank connection active.

Matching a payment to a deposit

  1. On the Outstanding tab, click a payment. The Match payments page opens.
  2. On the left, Payment details shows the payment. On the right, Deposits lists candidate deposits from your account.
  3. Select the deposit that corresponds to the payment. Payment details that agree with the deposit, such as the amount and customer name, are tagged Likely match.
  4. Click Reconcile payment.

The payment moves to the Received tab, and Lean sends a payment.reconciliation.updated webhook with status RECONCILED.

Reconciling without a deposit

If there's no matching deposit to select, for example because your account isn't connected or the deposit hasn't been fetched yet, you can still reconcile the payment against your own records.

  1. On the Match payments page, click ⋯ next to Reconcile payment.
  2. Choose Reconcile with reference.
  1. Enter a Reconciliation reference and click Submit. We recommend your bank's identifier for the deposit, or your own accounting reference.

Reconciling several payments at once

You can reconcile several payments in one step from the Outstanding tab.

  1. Tick the payments you've confirmed as received.
  2. Click Reconcile in the bar at the bottom of the page.

If you tick a single payment, you can also type a Reconciliation reference before clicking Reconcile:


📘

A reference can only be added when one payment is selected. If you reconcile without a reference, you'll be asked to confirm.

Marking a payment as unreceived

Occasionally, a payment accepted by the customer's bank never arrives in your account. To record this:

  1. Open the payment from the Outstanding tab.
  2. Click ⋯, then Mark as unreceived.

The payment moves to the Unreceived tab, and Lean sends a webhook with status UNRECEIVED. Make sure your system handles this case, for example by not releasing goods or services.

❗️

Mark as unreceived takes effect straight away, with no confirmation step.

Reviewing received payments

The Received tab lists every reconciled payment. The Reconciliation column shows how each was reconciled:

  • Auto-reconciled: matched automatically by Lean
  • a team member's name: reconciled by that person in the dashboard
  • the reconciliation reference, where one was recorded

The Received tab showing an auto-reconciled payment and payments reconciled by a team member

Click any payment to see its details, including Reconciled on and Reconciled by.

Correcting a mistake

If a payment was marked Unreceived by mistake, open the Unreceived tab and click ⋮ on the payment. Then choose Move to outstanding.

The payment returns to Outstanding, and Lean sends a webhook with status OUTSTANDING. Make sure your system can undo anything it did when it first received the UNRECEIVED update.

📘

Only payments that a team member marked as unreceived can be moved back from this tab. If a payment was received by mistake, contact your Lean point of contact.

Keeping your bank connection active

Your connected collection account appears under Your accounts. To open it, click your application name at the top of the sidebar, then Your app banks.

Accounts used for reconciliation have a blue Reconciliation badge. Banks periodically ask you to re-authorise access. When that happens, the account shows Not receiving deposits. Click Reconnect and sign in to your bank to resume fetching deposits.


Handling reconciliation webhook

Lean sends a payment.reconciliation.updated webhook whenever a payment's reconciliation status changes. This happens whether the payment is reconciled automatically, by your team in the dashboard, or through the API.

You can use these webhooks to keep your records up to date and determine when to release funds, goods or services to your customers.

Webhooks are sent to the endpoint you've configured under Development → Webhooks.

How to handle reconciliation updates

When you receive a reconciliation webhook:

  1. Identify the payment: Use payment_id or payment_intent_id to find the payment in your system. You can also use payment_description if you've stored your own reference as the payment description.
  2. Check the status: Read the status field in the webhook payload to determine whether the payment has been received.
  3. Update your records: Compare the incoming status with the payment's current reconciliation status and update your records accordingly.
  4. Take the appropriate action: Use the reconciliation status to decide whether to release funds, goods or services, or whether further action is needed.
Reconciliation statusRecommended action
OUTSTANDINGPayment not yet confirmed as received. Keep it pending until reconciliation is complete.
RECONCILEDPayment confirmed as received. You can proceed with releasing funds, goods or services, subject to your own business checks.
UNRECEIVEDPayment confirmed as not received. Don't release funds, goods or services. Review the payment and take any necessary follow-up action.
📘

When should you release funds?

A payment with status ACCEPTED_BY_BANK or PENDING has not necessarily reached your account. If you require confirmation that funds have arrived, wait until the reconciliation status is RECONCILED before releasing funds, goods or services.

Handling retries and duplicate events

Lean webhooks may be delivered more than once. Your system should handle duplicate events without triggering the same action multiple times.

To prevent duplicate processing:

  1. Use payment_id together with status to identify repeated reconciliation updates.
  2. Compare the incoming status with the status already recorded for that payment.
  3. If the status hasn't changed, avoid repeating actions you've already completed.
  4. If the status has changed, update your records and take the appropriate action.
  5. Return HTTP 200 to acknowledge successful receipt and handling of the webhook.

Don't rely solely on event_id to detect duplicates. The same reconciliation update may occasionally be delivered with a different event_id. Instead, use the combination of payment_id and status to recognise repeated updates.

For example, if you've already processed a RECONCILED webhook and released funds for a payment, receiving another RECONCILED webhook should not trigger a second release. Always check whether the release has already been completed.

📘

Reconciliation statuses can change

A payment may move from UNRECEIVED back to OUTSTANDING and later to RECONCILED. Make sure your system can handle these changes.

If you receive an unexpected or potentially outdated webhook, check the payment's latest reconciliation status through the API before taking action.

For more information about webhook delivery and retries, see the Webhooks Guide.

Webhook payload examples

Payment received

Sent when a payment is marked as received, either automatically or manually.

{
  "payload": {
    "payment_id": "5ca5b15c-33d5-437f-b2cb-03e48586b8f8",
    "payment_intent_id": "0ddd6590-3f7f-4c62-902f-18e6560c443c",
    "payment_description": "1b180ef839f4",
    "status": "RECONCILED",
    "reference": "ENBD/100218532",
    "amount": 1500.00,
    "currency": "AED"
  },
  "type": "payment.reconciliation.updated",
  "message": "A payment reconciliation object has been updated.",
  "timestamp": "2022-06-22T14:06:13.375317Z",
  "event_id": "2d72dfe2-8306-491c-be83-b4fe278e4081"
}
📘

The received amount can differ from the payment amount

Occasionally the amount that arrives is slightly lower than the amount paid. payment.amount is the amount the customer paid, while payment.reconciliation.amount (the amount in this webhook) is what was received in your account.

Payment not received

Sent when your team marks a payment as unreceived.

{
  "payload": {
    "payment_id": "7eeb8b76-17d8-408b-995a-84a7847885f0",
    "payment_intent_id": "ba03048e-cbfb-4e51-87b8-01ba77d55d0b",
    "payment_description": "ae5fd7d6db0e",
    "status": "UNRECEIVED"
  },
  "type": "payment.reconciliation.updated",
  "message": "A payment reconciliation object has been updated.",
  "timestamp": "2022-06-22T14:03:08.602434Z",
  "event_id": "160249de-0fa7-4917-8c2d-62a59acadf22"
}

Payment moved back to outstanding

Sent when a payment is moved back to Outstanding after being marked Unreceived. Your system should update the payment's status and handle any earlier actions that need to be reversed.

{
  "payload": {
    "payment_id": "8bfa816c-1c23-4ae4-abaf-2d1b28f86e43",
    "payment_intent_id": "d1378506-855b-4f4a-8861-dad707f8c52b",
    "payment_description": "8b7cac57d130",
    "status": "OUTSTANDING"
  },
  "type": "payment.reconciliation.updated",
  "message": "A payment reconciliation object has been updated.",
  "timestamp": "2022-06-22T11:17:10.837412Z",
  "event_id": "8c4ce46c-abc7-4d43-aad0-0b1f2f692ef9"
}

Checking reconciliation status through the API

You can also read reconciliation details directly:

  • A single payment: see the Get payment API reference.
  • A list of payments with their reconciliation details: see the Get list of payments API reference.







Did this page help you?