Odoo Payment Matching & Journal Entry Problems
When paid invoices still show outstanding, the payment exists but sits unreconciled in an outstanding account — or worse, someone posted a manual journal entry straight to the receivable account, which can never auto-match an invoice. Both patterns are fixable, and preventable with two rules.
First, confirm the symptom
- Customer statement shows invoices open that were definitely paid
- Outstanding Receipts/Payments accounts keep growing
- Partner ledger has debit and credit entries that obviously belong together, unlinked
- Aged receivables report is unusable for follow-up
1. Payments parked in outstanding accounts
Register Payment posts to an Outstanding Receipts account until bank reconciliation completes the journey. Skip the bank matching step and payments live in limbo: invoice "paid", ledger unresolved.
- Review outstanding account balances monthly — they should trend to zero.
- Complete the chain: statement line ↔ payment ↔ invoice, via the bank matching view (see our bank reconciliation guide).
2. Manual journal entries hitting receivables directly
An entry typed straight against Debtors/Receivable (to "adjust" a balance) has no invoice link, no payment record, and no partner reconciliation — it just muddies the ledger. Months later nobody can explain the balance.
- Find them: filter journal items on the receivable account where the source document is a manual entry.
- Reconcile each against its invoice via partner ledger reconciliation — or reverse and redo properly (credit note / payment).
- Rule for the team: nobody posts manual entries to receivable/payable accounts. Adjustments go through documents.
3. Payments recorded in the wrong journal
Cash receipts booked in the bank journal (or vice versa), or one "Payments" journal for everything, makes both cash box and bank unreconcilable.
- One journal per real-world money location: each bank account, each cash box, each wallet/gateway.
- Retrain the billing desk: pick the journal that matches where the money actually landed.
4. Multi-currency residuals keep invoices open
USD invoice, INR payment, rates moved — a few rupees of exchange difference keeps the invoice technically open unless gain/loss posting is configured.
- Set exchange gain/loss accounts in Accounting → Settings → Default Accounts; Odoo then closes residuals automatically at matching.
- Keep currency rates current — automatic providers or a fixed weekly update ritual.
5. Lock dates ignored, history rewritten
Editing or backdating entries in closed months silently changes reports your auditor already saw — and every reconciliation done since inherits the shift.
- Set lock dates monthly (Accounting → Lock Dates): one for users, one for advisers.
- Corrections to closed periods go through dated reversal entries in the open period — never edits.
We clean receivable/payable ledgers, close the outstanding accounts, configure gain/loss and lock-date discipline — and leave your accountant a one-page monthly routine. Written fix plan first.
Frequently asked questions
Why does a paid invoice still show in aged receivables?
The payment was never reconciled with the invoice (or was posted as a manual entry). Match them in the partner ledger and the report corrects instantly.
Can old messy years be cleaned without touching audited figures?
Yes — reconciliations link existing entries without changing balances, and true corrections are posted in open periods. That is exactly how we run clean-ups.