All posts
Integrator13 min read

The Odoo UAT playbook: 42 test cases that catch real production issues before launch

Most Odoo go-lives fail in UAT for the same handful of reasons: access rights edge cases, workflow gaps at role boundaries, and reports that look right on-screen but produce wrong totals in exports. This playbook gives you a repeatable test structure and the specific scenarios that surface real bugs.

Why UAT Fails on Odoo Projects#

User acceptance testing on Odoo projects fails for a consistent set of reasons:

  • Test cases mirror the happy path only - edge cases at role boundaries are never tested
  • Testers and developers share the same user account, so access-rights bugs stay hidden
  • No one tests the full document lifecycle end-to-end (draft → confirmed → invoiced → paid → reconciled)
  • Reports and exports are "approved" visually without verifying the underlying totals
  • Multi-company environments are tested with one company only

The 42 test cases below are organized into seven modules. Each is a real scenario, not a feature check. Use separate user accounts for each role, and run every test from draft state with production-realistic data volumes.


Setup: Before You Start#

  1. Create a dedicated UAT database - not shared with development or staging.
  2. Load realistic master data: real chart of accounts, representative customers and vendors, at least one item in each product category.
  3. Create test users that mirror real roles. Minimum:

- Admin (no restrictions)

- Sales manager (sees all records in sales team)

- Salesperson (sees only own records)

- Accounting manager

- Accountant (cannot approve journal entries)

- Warehouse manager

- Warehouse user (pick/pack only)

- Portal customer (external)

  1. Disable "auto-subscribe" and "auto-follow" settings so the chatter doesn't fill up with noise during testing.
  2. Document every bug with: user account, steps to reproduce, expected vs. actual behaviour, and a screenshot.

Module 1: Sales#

#ScenarioRoleWhat to verify
1Create a quotationSalespersonCan save without required fields being bypassed
2Confirm a quotationSalespersonStatus moves to Sale Order; delivery order created automatically
3Try to delete a confirmed orderSalespersonShould be blocked (cannot delete confirmed SO)
4Apply a pricelist discountSales managerDiscount appears on PDF, correct amount on invoice line
5View another salesperson's orderSalespersonShould NOT be visible if access rules are team-scoped
6View another salesperson's orderSales managerSHOULD be visible (manager scope)
7Quotation PDFAdminNo overlapping text, all fields present, company logo visible

Common failure: Salesperson A can see Salesperson B's orders because the ir.rule was not configured for the sales team. Test this explicitly.


Module 2: Purchase#

#ScenarioRoleWhat to verify
8Create a Request for QuotationPurchase userVendor automatically populated from product vendor pricelists
9Confirm a POPurchase managerBill is created in Accounting after receipt validation
103-way matchAccounting managerBill cannot be paid above received quantity without override
11PO with multiple delivery datesPurchase userEach line ships on the correct date; backorder created for partial receipt
12Vendor bill matchingAccountantBill matched to PO without price discrepancy warning when prices match

Common failure: The "bill control" policy is set to "on ordered quantity" instead of "on received quantity" for products that need 3-way match. The policy setting is per-product-category and is easy to overlook.


Module 3: Inventory#

#ScenarioRoleWhat to verify
13Receive goodsWarehouse userStock quant updated immediately; valuation entry created if perpetual
14Pick-pack-ship flowWarehouse userEach step requires completion before the next step is available
15Backorder creationWarehouse managerPartial delivery creates backorder; original order shows both
16Inventory adjustmentWarehouse managerAdjustment creates a journal entry for the value difference
17Negative stockWarehouse userSystem allows or blocks based on configured behaviour (test both)
18FIFO lot traceabilityWarehouse userCorrect lot is assigned on delivery based on FIFO rule

Common failure: Negative stock is allowed in configuration but business rules require it blocked. Always test this with the warehouse user role, not admin - admin typically bypasses route checks.


Module 4: Accounting#

#ScenarioRoleWhat to verify
19Customer invoice lifecycleAccountantDraft → Posted → Paid; journal entries correct at each step
20Bank reconciliationAccountantStatement lines match invoices without creating duplicate entries
21Tax computationAccountantTax groups, rounding, and tax included/excluded behave as configured
22Multi-currency invoiceAccountantExchange rate applied at invoice date; currency gain/loss entry created on payment
23Lock periodAccountantCannot post to a locked period (test with date set inside locked range)
24Lock period bypassAccounting managerManager CAN post to locked period if policy allows
25Aged receivables reportAccounting managerTotals match sum of open invoice lines; no duplicates from partial payments
26Balance sheet exportAdminExcel export totals match on-screen totals

Common failure: The aged receivables report shows different totals than the account balance report due to unreconciled partial payments. This is a data issue, not a code issue, but it surfaces in UAT when realistic data is loaded.


Module 5: Custom Workflows and Approvals#

#ScenarioRoleWhat to verify
27Approval required above thresholdSalespersonOrder above configured amount goes to "To Approve" status
28Approve an orderSales managerApproval moves order to confirmed; approval audit trail visible in chatter
29Reject an orderSales managerRejection returns order to draft with a chatter note explaining why
30Automated action triggerAdminAutomated action fires on the configured trigger (e.g., status change)
31Email notificationSalespersonNotification email sent to correct recipient on trigger; no duplicate sends

Module 6: Reports and Exports#

#ScenarioRoleWhat to verify
32Sale order PDFSalespersonAll custom fields visible; no broken layout on long product names
33Invoice PDFAccountantTax breakdown, payment terms, and bank details all present
34Delivery slip PDFWarehouse userLot numbers and quantities match the actual transfer
35Excel export from list viewAdminAll columns present; no truncation; UTF-8 encoding (accents, special chars)
36Pivot report drill-downSales managerDrill-down to individual records matches the aggregated total
37Scheduled report emailAdminEmail arrives, attachment opens without error, totals match on-screen

Common failure: PDF reports look correct on-screen but break layout when the data contains very long strings (e.g., a product name over 80 characters). Test with realistic data, not short demo names.


Module 7: Security and Access Rights#

#ScenarioRoleWhat to verify
38Portal customer viewPortal userCan see own orders and invoices only; cannot access backend
39Portal customer document downloadPortal userCan download own invoice PDF; cannot download another customer's
40Admin-only menu visibilitySalespersonTechnical menus (Settings > Technical) are not visible
41Record rule bypass attemptSalespersonAttempting to access another salesperson's record via direct URL returns 404 or access denied
42Export restrictionAccountantCannot export the full customer list if the export group is not assigned

Scoring and Sign-Off#

Create a spreadsheet with all 42 test cases. For each, record:

  • Status: Pass / Fail / Blocked / N/A
  • Tester: Name and date
  • Bug ID: Link to issue tracker entry if failed

Define pass criteria before UAT starts - a common default is: no blocker bugs, no more than 5 open major bugs, all critical business flows passing. Do not sign off UAT with open blockers by labelling them "known issues to fix post-go-live" - that pattern reliably produces missed go-live dates.


ERPeek can accelerate UAT preparation by answering questions like "which ir.rules restrict access to this model?" or "what automated actions fire on sale.order write?" across any installed Odoo version and custom module set. See the contact page for a demo.

Try ERPeek on your own Odoo module - ask questions, scaffold tests, and explore your codebase in plain language.

Get started free