Payment Matching Issues in Odoo
When payments cannot be matched to invoices during reconciliation:
Issues:
- Payment appears in bank but won't match to any invoice
- "No match found" in bank reconciliation view
- Payment matched to wrong invoice
- Partial payment won't reconcile
- Multi-currency payment matching fails
- Overpayment creates negative balance instead of credit noteFix 1: Partner Mismatch
The most common cause — the payment and invoice have different partners:
# The payment was received from "John Smith" but the invoice is for "John Smith LLC"
# Check partner on both:
# Invoice: Accounting > Invoices > open invoice > check Customer field
# Payment: Accounting > Payments > open payment > check Partner field
# Fix: Edit the payment's partner to match the invoice's partner
# Or merge the duplicate partners:
# Contacts > select both > Action > Merge
# In bank reconciliation:
# If the partner detected from bank data is wrong,
# manually change the partner in the reconciliation widgetFix 2: Amount Mismatch
# Invoice: $1,000.00 | Payment: $999.50
# Odoo won't auto-match if amounts differ
# Option 1: Partial reconciliation
# In the reconciliation widget, match the payment to the invoice
# Click "Partial Reconcile" to keep $0.50 as outstanding
# Option 2: Write-off the difference
# In reconciliation, click the payment and invoice
# Add a write-off line for $0.50 to an expense account
# (e.g., "Bank Charges" or "Rounding Differences")
# Option 3: Payment discount
# If the customer took an early payment discount
# Use the discount write-off accountFix 3: Account Type Mismatch
# Payment and invoice must use the same receivable/payable account
# Check:
sudo -u postgres psql -d mydb -c "
SELECT aml.id, am.name, aa.code, aa.name as account_name,
aml.debit, aml.credit, aml.amount_residual
FROM account_move_line aml
JOIN account_move am ON aml.move_id = am.id
JOIN account_account aa ON aml.account_id = aa.id
WHERE aml.partner_id = PARTNER_ID
AND aa.account_type = 'asset_receivable'
AND aml.reconciled = false;
"
# If the invoice uses account 1200 but payment uses 1201:
# They cannot reconcile because they're on different accounts
# Fix: Ensure both use the partner's default receivable accountFix 4: Already Partially Reconciled
# A payment may be partially reconciled with another entry
# Check if the payment has remaining amount:
# Open the payment > check "Outstanding amount"
# If it shows $0, the payment is fully reconciled elsewhere
# Find what it's reconciled with:
sudo -u postgres psql -d mydb -c "
SELECT apr.id, aml.id as line_id, am.name, aml.debit, aml.credit
FROM account_partial_reconcile apr
JOIN account_move_line aml ON (aml.id = apr.debit_move_id OR aml.id = apr.credit_move_id)
JOIN account_move am ON aml.move_id = am.id
WHERE apr.debit_move_id = PAYMENT_LINE_ID
OR apr.credit_move_id = PAYMENT_LINE_ID;
"
# Fix: Unreconcile the wrong match, then reconcile correctlyFix 5: Multi-Currency Matching
# Currency mismatches prevent automatic matching
# Invoice in EUR, payment in USD — cannot auto-match
# Odoo needs a rate to convert
# Fix:
# 1. Ensure exchange rates are updated
# Accounting > Configuration > Currencies > Update rates
# 2. For manual matching with rate:
# In reconciliation widget, the exchange difference
# is automatically posted to the Exchange Rate account
# 3. Configure exchange rate accounts:
# Accounting > Configuration > Settings
# Income Exchange Rate Account / Expense Exchange Rate AccountFix 6: Bank Statement Line Reconciliation
# In the bank reconciliation view:
# 1. Open Accounting > Bank > Bank Statement
# 2. Find the unmatched line
# 3. The right panel shows matching suggestions
# If no suggestions appear:
# - Check the partner is correctly identified
# - Check the amount matches (or close enough)
# - Check the date is reasonable
# - Click "Manual" tab to search for entries manually
# Matching tolerance:
# Settings > Reconciliation Models
# Create a model for common patterns (e.g., bank fees)
# Set tolerance amounts for automatic matchingFix 7: Reconciliation Models
# Create rules for recurring bank patterns:
# Accounting > Configuration > Reconciliation Models
# Example: Automatic bank fee deduction
# Name: Bank Fees
# Type: Write-off
# Rule: Bank statement label contains "FEE" or "CHARGE"
# Account: 6500 - Bank Charges
# This automatically creates write-off entries for bank feesPrevention
DeployMonkey's AI agent configures reconciliation models for common banking patterns and monitors unmatched payments. Automatic partner detection and matching suggestions reduce manual reconciliation effort.