Home / Odoo Problems / Accounting
Odoo Accounting

Odoo Payment Matching & Journal Entry Problems

By Odoobots ERP TeamUpdated September 20266 min readApplies to Odoo 14–19
TL;DR

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.

Fix
  1. Review outstanding account balances monthly — they should trend to zero.
  2. 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.

Fix
  1. Find them: filter journal items on the receivable account where the source document is a manual entry.
  2. Reconcile each against its invoice via partner ledger reconciliation — or reverse and redo properly (credit note / payment).
  3. Rule for the team: nobody posts manual entries to receivable/payable accounts. Adjustments go through documents.
Odoo journal entries list showing posted accounting moves
Accounting → Journal Entries: every mystery balance traces to a document here. Manual entries against control accounts are the ones that never reconcile.

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.

Fix
  1. One journal per real-world money location: each bank account, each cash box, each wallet/gateway.
  2. 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.

Fix
  1. Set exchange gain/loss accounts in Accounting → Settings → Default Accounts; Odoo then closes residuals automatically at matching.
  2. Keep currency rates current — automatic providers or a fixed weekly update ritual.
Odoo currencies configuration screen with exchange rates
Currencies & rates: stale rates create phantom gains and losses. Automate the update — then exchange differences become boring, as they should be.

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.

Fix
  1. Set lock dates monthly (Accounting → Lock Dates): one for users, one for advisers.
  2. Corrections to closed periods go through dated reversal entries in the open period — never edits.
Partner ledgers a mystery novel?

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.

Get a ledger clean-up or WhatsApp +91 98414 81435

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.