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:
- Before you start
- Reconciliation statuses
- How payments are reconciled
- Reconciling payments in the dashboard
- Handling reconciliation webhooks
- 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 applicationReconciliation 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 tab | API status | Meaning |
|---|---|---|
| Outstanding | OUTSTANDING | Not yet confirmed as received in your account. |
| Received | RECONCILED | Confirmed as received, by Lean or by someone on your team. |
| Unreceived | UNRECEIVED | Someone on your team has confirmed the money didn't arrive. |
The payment status doesn't changeReconciliation never changes the payment's own
status, which staysACCEPTED_BY_BANKorPENDING. Usereconciliation.statusto 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
- On the Outstanding tab, click a payment. The Match payments page opens.
- On the left, Payment details shows the payment. On the right, Deposits lists candidate deposits from your account.
- 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.
- 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.
- On the Match payments page, click ⋯ next to Reconcile payment.
- Choose Reconcile with reference.
- 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.
- Tick the payments you've confirmed as received.
- 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:
- Open the payment from the Outstanding tab.
- 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.
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:
- Identify the payment: Use
payment_idorpayment_intent_idto find the payment in your system. You can also usepayment_descriptionif you've stored your own reference as the payment description. - Check the status: Read the
statusfield in the webhook payload to determine whether the payment has been received. - Update your records: Compare the incoming status with the payment's current reconciliation status and update your records accordingly.
- Take the appropriate action: Use the reconciliation status to decide whether to release funds, goods or services, or whether further action is needed.
| Reconciliation status | Recommended action |
|---|---|
OUTSTANDING | Payment not yet confirmed as received. Keep it pending until reconciliation is complete. |
RECONCILED | Payment confirmed as received. You can proceed with releasing funds, goods or services, subject to your own business checks. |
UNRECEIVED | Payment 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_BANKorPENDINGhas not necessarily reached your account. If you require confirmation that funds have arrived, wait until the reconciliation status isRECONCILEDbefore 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:
- Use
payment_idtogether withstatusto identify repeated reconciliation updates. - Compare the incoming status with the status already recorded for that payment.
- If the status hasn't changed, avoid repeating actions you've already completed.
- If the status has changed, update your records and take the appropriate action.
- Return HTTP
200to 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 changeA payment may move from
UNRECEIVEDback toOUTSTANDINGand later toRECONCILED. 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 amountOccasionally the amount that arrives is slightly lower than the amount paid.
payment.amountis the amount the customer paid, whilepayment.reconciliation.amount(theamountin 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.
Updated 5 days ago
