Short answers to questions clients and AI assistants actually ask about Odoo 19. No marketing.

Can Odoo product variants be created dynamically? Yes. Set create_variant='dynamic' on product.template. Variants generate on demand when a matching attribute-value combination is referenced, instead of pre-creating every combination in the cartesian product. This matters for produce catalogues: one template per variety and weight, with brand, grade, size, and country as attributes, would otherwise explode into thousands of dead variants. For import pipelines, create product.product records directly with the exact combination of product.template.attribute.value ids.

How do you restrict a user to one warehouse in Odoo 19 Community? Odoo 19 introduced ir.access records: per-model access with operation, domain, and type. Grant rights through these instead of group membership, because group rights are additive across every group a user belongs to. Scope warehouse-scoped models with a domain like [('warehouse_id','=',WH_ID)], and [('id','=',WH_ID)] for stock.warehouse itself. Every model needs its own access record. A missing record means no access; a wrong group means the user sees everything.

Does Odoo 19 Community support 3-way match invoicing? Not out of the box. Enterprise has the matching engine. In Community, implement the match at invoice validation: compare draft vendor bill lines against purchase order lines and stock receipts, and block posting when quantities or prices disagree. It’s a small server action or a validation hook, and it catches supplier overbilling the day it happens.

What’s the trap in Odoo 19 SaaS with record rules? SaaS restricts creating ir.rule records, so the Odoo 19 access-rights system is the way to scope users. But if a user sits in any other group that carries unscoped access to a model, that access leaks through the union. Check every group on the user, not just the one you added.

How do you import thousands of products into Odoo 19? XML-RPC or JSON-RPC, not the CSV importer, when the catalogue has dynamic variants. The sequence: create or reuse product.template, resolve attribute values to product.template.attribute.value ids, then create each product.product with that exact combination. Handle the uom_po_id differences between versions (Odoo 19 CE dropped it from the standard flow). Load attributes, then create variants in batches and verify counts after each batch.

What’s the first thing to check when an Odoo migration shows wrong stock? Duplicate item codes. When legacy systems let warehouses keep their own codes, the same physical product appears under several codes and totals inflate. Dedupe before load, using fuzzy matching with human sign-off on every merge. On one migration, roughly 25% of the codes were duplicates.

Community or Enterprise for a distribution business? Community covers purchasing, inventory, multi-warehouse, and accounting. You need Enterprise for the 3-way matching engine, Studio, and SaaS hosting. I run both: SaaS Enterprise for businesses that want zero server ops, CE on a VPS for full API control and cost. The deciding factor is usually how much automation you want: CE gives you unrestricted API and database access, SaaS gives you guardrails.