ml-connector
OdooServiceNow

Odoo and ServiceNow integration

Odoo runs your core accounting, purchasing, and inventory. ServiceNow runs your procurement and accounts payable operations. Connecting them keeps your PO records and invoice data synchronized across both systems without manual re-entry. Purchase orders created in Odoo flow into ServiceNow's procurement module, invoice records post into accounts payable with the correct cost center and general ledger account, and cost center master data stays aligned in both directions. ml-connector manages the different API transports and keeps a full audit trail of every record that moves.

How Odoo works

Odoo exposes purchase orders, invoices, payments, accounts, cost centers, employees, and invoice line items through XML-RPC over HTTP POST (all editions) or JSON-2 over HTTP POST (Odoo 19+). Authentication uses an API key paired with a username, obtained once at startup and included in every subsequent call. Odoo has no native outgoing webhooks for external integrations in base editions, so external systems must poll for changes using a write_date timestamp filter on search_read queries. External API access requires the Custom pricing plan.

How ServiceNow works

ServiceNow exposes accounts payable invoices, purchase orders, cost centers, suppliers, and general ledger accounts through REST API endpoints on a per-instance subdomain. Authentication uses OAuth 2.0 Client Credentials (service account) or Basic Auth (username and password). ServiceNow has no built-in outbound webhook registration system, so ml-connector polls the platform API on a schedule. The Source-to-Pay Operations suite is a licensed module, and all API calls must be made with a user account that holds the required S2P and procurement module roles.

What moves between them

The main flow moves from Odoo into ServiceNow. Purchase orders and supplier invoices created in Odoo are read by polling on a regular schedule and posted into ServiceNow's Source-to-Pay staging tables for further processing and approval workflows. Cost centers are synchronized bidirectionally so procurement allocations in ServiceNow reference valid Odoo cost dimensions. Payments and GL postings stay read-only in ServiceNow, so ml-connector does not write financial entries back to payroll or general ledger.

How ml-connector handles it

ml-connector stores Odoo API credentials (key and username) and ServiceNow OAuth Client Credentials encrypted, and refreshes the ServiceNow token when a call returns 401. On the Odoo side, it passes the API key as a Bearer token in the Authorization header for JSON-2 calls, or includes it with the XML-RPC call for older editions. Because both systems are pull-only from ml-connector's perspective, it polls on a schedule using Odoo's write_date high-water-mark to find new or changed purchase orders and invoices. Before posting into ServiceNow, it maps Odoo cost center and account fields to matching ServiceNow dimensions and validates that they exist in the target instance. ServiceNow rate-limits API calls and returns HTTP 429, so ml-connector backs off and retries, and every record carries audit metadata so a failed post can be replayed without duplication.

A real-world example

A mid-sized distributor runs Odoo for accounting, purchasing, and inventory across three regional warehouses. They also run ServiceNow for procurement approvals and accounts payable operations to enforce a three-way match (PO, receipt, invoice) before payment. Before the integration, the procurement team received purchase orders from Odoo via email exports and re-entered them into ServiceNow by hand, then matched incoming invoices manually by PO number. With Odoo and ServiceNow connected, every purchase order flows automatically from Odoo into ServiceNow with the correct supplier, cost center, and line items, and incoming invoices are matched and routed for approval without manual data entry. Three-way matching starts with clean, synchronized data.

What you can do

  • Sync purchase orders from Odoo to ServiceNow on a regular schedule, preserving supplier, cost center, and line item detail.
  • Post accounts payable invoices from Odoo into ServiceNow staging with correct GL account and cost center mapping.
  • Authenticate Odoo with API key over JSON-2 or XML-RPC and ServiceNow with OAuth 2.0 Client Credentials.
  • Map Odoo cost centers and accounts to ServiceNow dimensions, validating existence before posting.
  • Poll Odoo using write_date high-water-mark, handle ServiceNow 429 rate limits, and replay failed records from a full audit trail.

Questions

Which direction does data move between Odoo and ServiceNow?
The main flow is Odoo into ServiceNow. Purchase orders and invoices move from Odoo into ServiceNow's Source-to-Pay staging tables for procurement and accounts payable processing. Cost centers are synchronized bidirectionally to keep both systems aligned on valid dimensions. GL postings stay read-only in ServiceNow.
How does ml-connector handle Odoo's two different API transports?
ml-connector supports both XML-RPC (available on all Odoo editions) and JSON-2 (Odoo 19+). It stores the Odoo API key encrypted and includes it in every call, either as a Bearer token in the Authorization header for JSON-2, or as part of the XML-RPC method call for older versions. The transport is selected per customer based on their Odoo version.
What happens if ServiceNow's API returns a 429 rate limit error?
ml-connector detects HTTP 429 responses, backs off with exponential delay, and retries the request automatically. Every record is tracked in the audit log, so if a retry ultimately fails, the record can be manually replayed without creating duplicates or orphaning data in either system.

Related integrations

Connect Odoo and ServiceNow

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

Get started