Skip to Content

11 Odoo 19 Problems We Hit on Real Projects, and What We Do Now

Real problems from six Odoo implementations: VAT setup, stock tracking, product costs, lock dates, user access, payments, data imports and translation, with the check we now run before go-live.
October 20, 2026 by
11 Odoo 19 Problems We Hit on Real Projects, and What We Do Now

Real problems from six Odoo implementations: VAT setup, stock tracking, product costs, lock dates, user access, payments, data imports and translation, with the check we now run before go-live.

These come from six Odoo implementations: retail, electronics, trading, distribution, leasing and services. Client details are left out. Each item is something that broke, why it broke, and the check we now run before go-live.

1. Old Odoo knowledge does not work on Odoo 19

Scripts, import templates and online guides written for older versions failed on Odoo 19. Some examples we met:

  • The separate Mobile field on contacts is gone. Imports that mapped a "Mobile" column failed or dropped numbers.
  • Employee contract data moved from the old contract model to employee versions.
  • Account groups were removed, so older chart-of-accounts imports failed.
  • Search filters sent over the API must use tuples. Lists that older versions accepted now raise errors.

What we do now: check the real fields on the target version before writing any import or script, and test on that version, not on memory.

2. Products received, stock still zero

In Odoo 19 a product only tracks stock when Track Inventory is on. Products created quickly from a purchase order line came in without it. Goods were received, on-hand stayed at zero, and sales deliveries were blocked.

What we do now: check the flag on every physical product before the first receipt, and limit who can create products from purchase lines.

3. Zero cost means zero COGS

Products entered from supplier bills without a cost, or placed in a category without automated valuation, delivered at zero value. Invoices posted with no cost of goods sold, so margins looked better than they were and stock on the balance sheet was too low.

In another case the category's stock output account pointed to the interim (received) account instead of COGS. The interim balance kept growing and the P&L had no COGS line.

What we do now: no product goes live without a cost and a category with the right accounts. We run a test sale and read the journal entry before opening the system.

4. VAT that looks right but reports wrong

Two separate issues:

  • In one project the standard sales tax came in at 15%, not Oman's 5%. It had to be corrected, including the Arabic labels, before any invoice went out.
  • In another, invoices showed VAT correctly, but the VAT report printed 0.000. The tax lines had no tax grid tags, and the Odoo 19 tax report is built from those tags.

Related: the chart of accounts is applied when the company is created, based on its country. Installing the localization later does not replace a generic chart that is already there.

What we do now: set the company country and chart first, check every tax rate, and run the VAT report on test invoices before go-live.

5. The lock date does not block posting

We expected that posting into a locked period would raise an error. In Odoo 19 it does not. The entry is quietly moved to the first open date. Only the hard lock refuses the entry, and the hard lock cannot be undone.

What we do now: we test lock behaviour on a copy of the database, explain to finance teams what the soft lock really does, and never set the hard lock without a sign-off.

6. It worked for admin, not for the real user

Demos and UAT passed when run as admin. Logged in as the HR role, the same user saw far fewer document folders, no sign templates, no planned shifts (they were still in draft), and a menu that showed but would not open. The role was missing groups and record rules.

What we do now: every UAT script runs under the login of the person who will use it, not admin.

7. Small settings that stop a workflow

  • An approval category with a named approver and "manager approval" counted the same person once. The required number of approvals could never be reached, so requests could not be submitted.
  • A department-based rule on shift planning hid every open shift. Auto Plan then said "nothing to assign", the same message it shows when there are really no open shifts.

What we do now: test approvals as the requester, and check how many records the user can actually see before calling a workflow done.

8. Card, wallet and cheque payments

Odoo's default payment setup assumes the bank pays the full amount and the reference matches. In practice:

  • Card settlements arrived net of fees. Invoices stayed partly open and the fees were not recorded. Separate card journals and a reconciliation rule that books the difference to bank charges fixed it.
  • Mobile wallet transfers arrived with free-text descriptions that standard matching could not read. Matching on reference patterns, amount and date fixed most of it.
  • Post-dated cheques need their own stages (received, deposited, cleared, bounced) and a holding account, so the bank balance does not count money that has not cleared.

What we do now: map every way customers actually pay before configuring journals.

9. Legacy data imports

  • Spreadsheet dates were read as month/day instead of day/month. Any date with a day of 12 or less came in wrong without an error.
  • Contacts from several sheets had duplicates, missing names and phone numbers stuck together.
  • Subscription totals with tax did not equal the cheque amount, so automatic matching failed until unit prices used more decimals.

What we do now: imports run as a script with a dry run, clean phone numbers into one format, remove duplicates by phone, tag every imported record so it can be rolled back, and go to staging first.

10. Rules people can work around

  • Commission was calculated on totals with VAT and on invoice dates. Sales staff were paid commission on tax. It was changed to untaxed amounts on confirmed order dates.
  • The discount field was locked, but staff added a generic product line with a negative price. Locking a field in the view is not a control. The generic discount product was removed from sales.
  • A closed POS session left paid orders without journal entries, so the trial balance did not match. The fix was to re-run the closing process, not to post manual entries.

What we do now: after configuring a control, try to get around it before the client's staff do.

11. Translation and right-to-left text

  • On a bilingual online store, small edits to the English description broke the Arabic translation segments. Customers saw mixed English and Arabic text.
  • In a right-to-left language deployment, machine translation gave "Tax Included" and "Tax Excluded" the same wording. Cashiers applied the wrong tax until the terms were fixed by hand.
  • PDF reports crashed or printed broken right-to-left text until the PDF engine was replaced with the patched build and given more memory.

What we do now: a person who reads the language checks tax, payment and status terms, and we print every report in that language before go-live.

One more: clear demo data before go-live

Sample records left in the database at cut-over distorted the profit and loss and the trial balance. Staging should hold none, and any left must be removed before the first real entry.

Planning an Odoo 19 rollout?

If you are planning an Odoo 19 rollout, or your current setup shows some of these signs, I can review it with you. See how I run Odoo implementation in Oman, or get in touch.

Related

Book a Free 30-Minute Odoo Review

Planning an Odoo 19 rollout or fixing a current setup? Get a clear list of what to check.

Contact Ata Khadivi

How to Choose an Odoo Consultant in Oman: A Practical Checklist for Traders and Importers
What Oman importers, wholesalers and trading companies should check before signing an Odoo implementation contract — certification, VAT and Fawtara readiness, WPS payroll, landed costs, Tally migration and a written scope.
WhatsApp Me