ml-connector
OdooProcurify

Odoo and Procurify integration

Odoo runs your accounting and inventory. Procurify manages procurement and vendor invoices. Connecting them keeps your purchasing ledger and vendor records synchronized without re-keying. New purchase orders and requisitions in Procurify flow into Odoo's accounting module, mapped to the correct vendor master and cost codes, so month-end close sees all procurement activity in one place. ml-connector handles the different API models on each side and moves the data on a schedule tied to your procurement cycle.

How Odoo works

Procurify exposes vendors, purchase orders, requisitions, bills, account codes, departments, locations, and currencies through a REST JSON API at https://<customer-domain>.procurify.com. Every call requires OAuth 2.0 client credentials (client ID and secret) and a 24-hour access token, refreshed on each API request. The API supports read-only access to purchase orders and requisitions via time-based polling with date-range filters on last_modified and po_created_date; order items and payments are read-only endpoints. Procurify does not support webhooks or push notifications, so procurement records are retrieved by polling.

How Procurify works

Odoo exposes purchase orders, suppliers, GL accounts, cost centers, invoices, and products through XML-RPC or JSON-2 REST APIs (JSON-2 preferred for new integrations). Authentication uses an API key paired with a username, passed as a Bearer token in the Authorization header for JSON-2 or included in every XML-RPC call. Odoo Online requires a custom pricing plan for external API access; self-hosted and Odoo.sh editions have no restrictions. Odoo polling with write_date filters and high-water-mark timestamps is recommended for production. Outgoing webhooks are available only on Enterprise Edition with Studio, so inbound polling is the standard integration pattern.

What moves between them

Procurify purchase orders, requisitions, and vendor records flow into Odoo's purchase order and supplier modules on a schedule you define. ml-connector reads Procurify vendors and maps them to Odoo res.partner records (supplier type); Procurify order items are mapped to Odoo product.product catalog entries. When a bill is recorded in Procurify, ml-connector creates a corresponding account.move (supplier invoice) in Odoo's accounting module, allocated to the GL account and cost center that matches the Procurify account code. Odoo does not push data back to Procurify, so the sync is unidirectional from procurement into accounting.

How ml-connector handles it

ml-connector stores both credential sets encrypted and refreshes the Procurify OAuth 2.0 token every 23 hours (before the 24-hour expiry) to keep requests from failing mid-sync. On the Odoo side, it uses the API key and JSON-2 transport (or XML-RPC for older instances) and respects the integration user's record-level access rules in Odoo, so only vendors and GL accounts visible to that user are synced. Procurify's API is read-only for purchase orders and bills, so ml-connector never writes procurement data back to Procurify. Because both systems use date-range polling, ml-connector maintains high-water-mark timestamps for po_created_date and last_modified on the Procurify side and write_date on the Odoo side, retrieving only records changed since the last run. Vendor names, GL codes, and department names are mapped first, so every bill written to Odoo references a supplier and GL account that already exists. If a Procurify record references a vendor or GL code not found in Odoo, the bill is held in a quarantine queue for manual review and retry, with a full audit entry logged so no data is lost.

A real-world example

A mid-sized manufacturing company runs Odoo Online for accounting and inventory and deployed Procurify to decentralize purchase request approvals across five regional plants. Before the integration, finance received Procurify purchase orders and bills via email each week, then manually entered them into Odoo to keep the AP ledger and vendor master synchronized. This created duplicate entry errors, late invoice recognition, and month-end disputes over which system was the source of truth. With Procurify and Odoo connected, every approved purchase order and bill syncs into Odoo's accounting ledger automatically, mapped to the correct plant cost center and vendor record. Finance sees all procurement activity in Odoo's AP aging, invoice matching is automatic, and regional plants retain control of their approvals in Procurify without duplicating entry work.

What you can do

  • Sync Procurify purchase orders, requisitions, and bills into Odoo's purchase and accounting modules on a schedule you control.
  • Map Procurify vendors to Odoo supplier records and Procurify order items to Odoo product catalogs automatically.
  • Allocate every bill to the correct Odoo GL account and cost center based on Procurify account codes and department assignments.
  • Authenticate Procurify with OAuth 2.0 client credentials and Odoo with API key authentication, refreshing tokens and managing session expiry.
  • Hold unmapped bills in a quarantine queue with audit trails for manual review and replay without data loss.

Questions

Does ml-connector write purchase orders back to Procurify?
No. Procurify's API is read-only for purchase orders, requisitions, and bills, so ml-connector syncs data only from Procurify into Odoo. Odoo is the target system for all procurement records; Procurify remains the source of truth for purchase request approvals and vendor negotiations.
How does the integration handle vendors and GL codes that do not exist in Odoo?
ml-connector maps Procurify vendors to Odoo res.partner records and Procurify account codes to Odoo account.account entries before writing bills. If a vendor or GL account is missing, the bill is held in a quarantine queue with a full audit entry, so you can review the mismatch, create the missing record in Odoo, and replay the bill without losing any data.
Which Odoo editions support this integration?
Odoo Online requires a custom pricing plan for external API access; Odoo.sh and self-hosted editions have no API restrictions. The integration uses JSON-2 REST (preferred) or XML-RPC and works with Odoo 14 and later. Odoo Online users must have a password set by an admin before API authentication can succeed.

Related integrations

Connect Odoo and Procurify

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started