Oplify

FreeSales

PO Guard

Odoo only spots a duplicate order when the contact, the reference, the date and the source all match. Your customers' PO numbers don't play by those rules.PO Guard makes Odoo's own duplicate warning understand customer POs, and stops a duplicate from being confirmed by accident. Free and open source.

settings to configure — install and it works
0
added to Odoo, everything else is native
1 field
free and open source (LGPL-3)
€ 0

How PO Guard works

  1. 1

    Enter the customer's PO in Customer Reference, as always

  2. 2

    Odoo's duplicate warning now recognises the same PO across contacts and formatting

  3. 3

    A salesperson can't confirm the duplicate — the message names the existing order

  4. 4

    A sales administrator can, and the bypass is logged in the chatter

Odoo's warning, made smarter

PO-45008731 for ACME NV and PO 45008731 for ACME's purchasing contact are the same customer PO. PO Guard ignores case, spaces and separators (keeping slashes), and compares orders at the level of the commercial customer, so every contact of the same company is covered. The result simply shows up in Odoo's existing "this order might be a duplicate of" warning, already while you type the reference.

Accidental confirmations, blocked

The native warning is only a hint; PO Guard adds a real guard. Confirming a quotation whose customer PO is already used on another non-cancelled order of the same customer is blocked with a clear message naming the existing order. Drafts can always be saved, cancelled orders never count, and the check also runs for confirmations made through the API or imports.

Key features

  • Uses what Odoo already has

    The Customer Reference field, the native duplicate detection and the native warning banner. PO Guard extends them; it never replaces them or rewrites your data. One stored technical field is all it adds.

  • Deterministic matching

    PO-12345, PO 12345, po12345, PO_12345 and PO.12345 match. PO-12/345 does not. No fuzzy matching, no AI, no surprises.

  • Commercial customer, multi-company safe

    Contacts of the same company are compared together. Different customers and different companies may reuse the same PO number, so nothing is flagged that shouldn't be.

  • Small enough to audit

    A single model extension, a security group and an automated test suite covering every scenario. LGPL-3, no external service, no configuration screen.

Intentional duplicates, on record

Sometimes a second order on the same PO is exactly what the customer wants. Sales administrators, or anyone in the Allow Duplicate Customer PO group, can confirm anyway. PO Guard writes a note in the chatter with the reference, the matching orders and who confirmed, so the decision is never a mystery later.

FAQ

What does PO Guard depend on?

Only Sales (sale_management). It works on Odoo 18 and Odoo 19, Community and Enterprise.

Does it change the Customer Reference I typed?

No. The text you enter is kept exactly as is. PO Guard stores a normalised copy in a technical field purely for comparison.

Does it require a customer reference on every order?

No. Orders without a reference are simply not checked. Odoo's own duplicate detection keeps working as before.

Who can confirm an intentional duplicate?

Members of the group PO Guard / Allow Duplicate Customer PO. Sales administrators are members by default; you can add anyone else from their user form. Every bypass is logged in the chatter.

Is it really free?

Yes. PO Guard is published under the LGPL-3 license on the Odoo App Store, like our other modules, so you get it from one trusted place.

Stop the double PO before it ships

Install PO Guard and let Odoo's duplicate warning finally understand customer PO numbers. Free, native, no configuration.