The Problem
You registered a payment against an invoice, but the invoice still shows as unpaid. Or the payment shows in the bank statement but will not match with the invoice. Payment reconciliation issues are among the most stressful accounting problems because they affect your cash flow reports and aging balances.
Common Symptoms
- Invoice shows "In Payment" but never changes to "Paid"
- Payment registered but invoice balance unchanged
- Bank statement line will not match with existing payment
- Partial payment creates wrong residual amount
- "No matching entry found" during bank reconciliation
- Credit note not offsetting the original invoice
How Odoo Reconciliation Works
Odoo reconciliation matches debit and credit journal items on the same account. For a customer payment to reconcile with an invoice:
- The invoice creates a debit on Account Receivable (e.g., $1,000 debit)
- The payment creates a credit on Account Receivable (e.g., $1,000 credit)
- When these two journal items are reconciled, they cancel out and the invoice is marked as Paid
If any of these steps fail, reconciliation breaks.
Causes and Fixes
1. Different Receivable/Payable Accounts
The most common cause. The invoice uses one receivable account and the payment uses another.
Check:
# In Odoo shell:
invoice = env['account.move'].browse(invoice_id)
payment = env['account.payment'].browse(payment_id)
inv_receivable = invoice.line_ids.filtered(
lambda l: l.account_id.account_type == 'asset_receivable'
)
pay_receivable = payment.move_id.line_ids.filtered(
lambda l: l.account_id.account_type == 'asset_receivable'
)
print(f"Invoice account: {inv_receivable.account_id.code}")
print(f"Payment account: {pay_receivable.account_id.code}")Fix: Ensure both use the same receivable account. Check the partner's default receivable account (Contacts > Accounting tab) and the payment journal's settings.
2. Different Partners
Reconciliation requires the same partner on both the invoice and payment journal items. If the payment was registered for a different partner or contact, it will not match.
Fix: Check that the payment's partner matches the invoice's partner. Watch out for child contacts vs. parent companies — use the commercial partner.
3. Different Currencies
An invoice in EUR and a payment in USD will not auto-reconcile. Multi-currency reconciliation requires exchange rate handling.
Fix:
- Ensure the payment currency matches the invoice currency
- If using different currencies, set up proper exchange rate journals
- Check Accounting > Configuration > Settings > Currency Exchange Journal
4. Payment Not Posted
A draft payment has no journal entry and cannot reconcile with anything.
Fix: Go to the payment and click "Confirm" to post it. Check if the payment journal requires approval.
5. Bank Statement Not Validated
Bank reconciliation creates the payment, but if the bank statement is not validated, the entries may not be posted.
Fix: Go to Accounting > Bank Statements > find the statement > Validate.
6. Rounding Difference
A payment of $99.99 against an invoice of $100.00 leaves a $0.01 residual. The invoice stays partially paid.
Fix: Use the write-off option during reconciliation:
- Go to Accounting > Reconciliation
- Find the items to reconcile
- Click "Manual Reconciliation"
- If there is a small difference, check "Allow write-off"
- Select a write-off account (e.g., Exchange Difference or Rounding)
7. Already Reconciled Items
If a journal item is already fully reconciled with another entry, it cannot be reconciled again.
Check:
# Find reconciliation status:
SELECT aml.id, aml.debit, aml.credit, aml.amount_residual,
aml.reconciled, apr.id as reconcile_id
FROM account_move_line aml
LEFT JOIN account_partial_reconcile apr
ON apr.debit_move_id = aml.id OR apr.credit_move_id = aml.id
WHERE aml.move_id = invoice_move_id;Fix: Unreconcile the wrong match first: open the journal entry > find the reconciled line > click the reconciliation mark to remove it.
8. Batch Payment Issues
Batch payments sometimes create a single journal entry for multiple invoices. If one invoice in the batch has issues, the entire batch fails to reconcile.
Fix: Split the batch payment and reconcile individually.
Manual Reconciliation Steps
- Go to Accounting > Accounting > Reconciliation
- Select the account (e.g., Accounts Receivable)
- Filter by partner if needed
- Select the matching debit (invoice) and credit (payment) lines
- Click Reconcile
- If amounts differ, use the write-off option
Debugging Reconciliation
# Check unreconciled items for a partner:
SELECT aml.id, am.name as entry, aml.debit, aml.credit,
aml.amount_residual, aa.code as account
FROM account_move_line aml
JOIN account_move am ON am.id = aml.move_id
JOIN account_account aa ON aa.id = aml.account_id
WHERE aml.partner_id = partner_id
AND aa.account_type IN ('asset_receivable', 'liability_payable')
AND aml.reconciled = false
AND am.state = 'posted'
ORDER BY aml.date;Prevention
- Use consistent receivable/payable accounts across partners
- Register payments directly from the invoice (Register Payment button)
- Set up automatic reconciliation rules for bank statements
- Always post payments before attempting reconciliation
- For multi-currency, ensure exchange rates are up to date