Integraties

Odoo: automating purchase orders via XML-RPC

Connect OrderPilot to Odoo (Community or Enterprise) via XML-RPC. Covers partner matching, product cross-references, taxes, and the purchase.order creation flow.

Published 20 April 2026 · 4 min read Odoo ERP open-source EU

Odoo is one of the fastest-growing mid-market ERPs in Europe and a common choice for young trading firms, SaaS startups, and wholesalers who want to avoid the strict licensing model of SAP or Microsoft. OrderPilot’s Odoo connector supports both Odoo Enterprise and Odoo Community via XML-RPC.

What makes Odoo different

Odoo does not have a polished REST API like Exact or Business Central. The primary integration path is XML-RPC (standard) or JSON-RPC. Newer Odoo versions (16+) have a limited REST layer, but XML-RPC remains the most complete and reliable option.

OrderPilot’s connector speaks XML-RPC natively. No extra middleware, no custom modules required.

Connector architecture

Flow:

  1. Credentials — You configure a dedicated technical user in Odoo with permissions on the Purchase, Inventory, and Accounting modules.
  2. Database selection — Odoo supports multiple databases per instance. OrderPilot connects to one database; for multi-tenant setups you can configure multiple connections.
  3. Sync + writeres.partner (vendors), product.product (items), account.tax (VAT codes) are synced nightly. Validated POs are created via purchase.order.create().

Vendor matching

Odoo’s res.partner table combines vendors and customers. OrderPilot filters on supplier_rank > 0 and matches incoming POs by:

  1. Email domain (field email)
  2. VAT number (vat)
  3. Commercial register number (in ref or a custom field)
  4. Name fuzzy match (review required)

Odoo allows multiple contacts under a single vendor (parent entity + child contacts). OrderPilot links the PO to the top-level vendor, not to an individual contact.

Product matching

Odoo’s product.product model has both default_code (internal SKU) and barcode. Many customers also use product.supplierinfo for supplier-specific product cross-references (e.g. your SKU “WIDGET-001” = supplier’s “A-1234”).

OrderPilot matches in this order:

  1. product.supplierinfo match on product_code for the specific supplier
  2. Exact default_code or barcode
  3. Fuzzy match on name + description

Unmatched items go to the review queue. OrderPilot never auto-creates products; master-data decisions stay with your team.

VAT and fiscal positions

Odoo’s VAT system is built around account.tax records and account.fiscal.position for intra-EU / non-EU scenarios. OrderPilot derives the correct tax from:

  • Purchase taxes (supplier_taxes_id on the product) — default VAT rule
  • Fiscal position of the vendor (intra-EU → reverse-charge; non-EU → VAT-exempt)
  • Manual override per product line if the PO requires a non-default VAT treatment

For Dutch customers we configure the NL VAT codes (21%, 9%, 0%, reverse-charge, margin scheme) by default during onboarding.

PO creation

A validated PO is created via XML-RPC:

# Pseudo-code — OrderPilot's connector does this via XML-RPC
models.execute_kw(db, uid, pwd,
    'purchase.order', 'create', [{
        'partner_id': supplier_id,
        'date_order': '2026-04-20 10:00:00',
        'date_planned': '2026-04-28 10:00:00',
        'order_line': [
            (0, 0, {
                'product_id': product_id,
                'name': 'Item description',
                'product_qty': 10.0,
                'price_unit': 129.50,
                'taxes_id': [(6, 0, [tax_id])],
                'date_planned': '2026-04-28 10:00:00',
            }),
        ],
    }]
)

The PO is created in draft state. Confirmation (to purchase state) is done by the customer in Odoo — this aligns with Odoo’s workflow convention and respects the approvals already configured in your Odoo setup.

Idempotency

OrderPilot stores the Odoo id per PO. On retry we check for existence via search_read before creating again. Extra safety: we set a client_order_ref (Odoo’s standard field for external reference) equal to our own OrderPilot PO id, so dedup is also visible manually inside Odoo.

Custom modules and fields

Odoo’s biggest strength is also its biggest implementation quirk: custom modules. If your Odoo instance has custom fields on purchase.order or purchase.order.line, we can map them — that’s an onboarding conversation. We support both standard Odoo fields and Studio-custom fields.

Community vs Enterprise

OrderPilot works with both:

  • Odoo Enterprise — Full support. All standard and Studio modules.
  • Odoo Community — Full support on the purchase flow. Some workflow features (approvals, advanced) require Enterprise modules.
  • Odoo.sh hosted — Works identically to on-prem or self-hosted. Valid SSL certs + correct credentials are sufficient.
  • Odoo Online (SaaS) — Works; note that SSO and 2FA must be disabled on the technical user for XML-RPC compatibility.

What you don’t get

  • No automatic product creation. Unknown items go to review, they are not silently added.
  • No invoice matching from the PO connector. That’s OrderPilot’s invoice module.
  • No support for Odoo 10 and earlier. Version 12+ is supported. For 10-11 an adapter project is needed.

FAQ

Does this work with multiple companies in one Odoo? Yes. Odoo’s multi-company is recognized; per OrderPilot workspace you pick which company is default, with optional rules for allocating to other companies.

What if I have a custom purchase-approval flow? We create the PO in draft. Your Odoo workflow (approval required, manager review, etc.) stays unchanged. OrderPilot respects Odoo’s existing permissions.

How long does implementation take? Standard: 1-2 business days. Custom modules or many Studio fields: 3-5 days.