ml-connector
OdooSnowflake

Odoo and Snowflake integration

Odoo runs your accounting, purchasing, and inventory. Snowflake stores your financial data for analytics and reporting. Connecting the two lets finance teams load invoices, purchase orders, GL accounts, and payments directly into Snowflake for consolidated analytics, month-end reconciliation, and audit trails. ml-connector handles the different authentication methods on each side and keeps your warehouse synchronized with your ERP.

How Odoo works

Odoo exposes accounting, purchasing, HR, and inventory records through XML-RPC and JSON-2 APIs over HTTP POST to tenant-specific base URLs. Authentication uses an API key paired with a username, obtained via an initial authenticate call in XML-RPC or passed as a Bearer token in JSON-2. Key entities include invoices, purchase orders, GL accounts, payments, cost centers, products, and employees. Because Odoo has no production-grade webhook system, records are read by polling with a high-water-mark timestamp on the write_date field to pick up only the newest changes. External API access requires Odoo's Custom pricing plan.

How Snowflake works

Snowflake is a cloud data warehouse accessed via REST APIs using Key Pair Authentication (RSA private key and JWT token) or long-lived Programmatic Access Tokens. All finance objects are user-defined tables, so tables for invoices, purchase orders, GL accounts, and other ERP records are created ahead of time with the structure needed for your integration. Snowflake is pull-only, meaning ml-connector reads from it to validate schemas and can query existing data, but Snowflake sends no webhooks to external systems. Data is inserted via REST API calls, and Snowflake Streams can capture changes if native change data capture is needed.

What moves between them

The flow is unidirectional from Odoo into Snowflake. ml-connector polls Odoo for invoices, purchase orders, GL accounts, payments, and other accounting records on a schedule you control, typically aligned with your accounting close cycle. Each record is written into the corresponding Snowflake table for historical storage and analytics. GL account hierarchies and cost dimensions are also synced so Snowflake tables can be queried for period close reconciliation.

How ml-connector handles it

ml-connector stores the Odoo API key encrypted and authenticates to Odoo using JSON-2 with the Bearer token header, checking the write_date on each record to poll efficiently without scanning the entire table. On the Snowflake side, it uses Key Pair Authentication with an RSA private key and JWT token, and executes REST API calls to insert records into the warehouse tables. The Snowflake warehouse must have AUTO_RESUME enabled so queries do not fail, and the connector respects Snowflake's case sensitivity rules for unquoted identifiers. If a Snowflake query returns HTTP 429 (rate limit), ml-connector backs off exponentially and retries. Because Odoo API access is restricted to the authenticated user's record permissions, ml-connector uses a dedicated Odoo user with access to the accounting entities needed. Every record carries an audit trail and can be replayed if a downstream insert fails.

A real-world example

A growing e-commerce company runs Odoo Online for accounting, purchasing, and inventory across multiple warehouses and product lines. The finance team needs visibility into spending patterns, GL reconciliation by cost center, and supplier performance analytics. Before the integration, accountants exported purchase orders and invoices from Odoo every week and loaded them manually into Snowflake, then ran ad-hoc SQL queries to reconcile supplier invoices against purchase orders and GL postings. With Odoo and Snowflake connected, each purchase order, invoice, and GL posting flows directly into Snowflake on a daily schedule, and the team runs dashboards and SQL queries on fresh data. Month-end close now includes a pre-reconciled GL and vendor liability account.

What you can do

  • Pull invoices, purchase orders, and GL accounts from Odoo and load them into Snowflake tables on a polling schedule aligned with your accounting cycle.
  • Authenticate to Odoo with API key and username, and to Snowflake with Key Pair Authentication or token, handling credential encryption and JWT refresh.
  • Map Odoo GL accounts and cost centers to Snowflake dimensions so finance queries can slice by department, project, and warehouse.
  • Detect only new or changed records in Odoo using the write_date timestamp, avoiding full table scans on every sync.
  • Capture a full audit trail of every record inserted into Snowflake, with automatic retry and replay if a query fails.

Questions

What data moves from Odoo to Snowflake?
Invoices, purchase orders, GL accounts, GL postings, payments, cost centers, and employee records flow from Odoo into Snowflake tables on a schedule you define. The flow is unidirectional, so Snowflake is read-only for queries and reporting. Odoo remains the system of record.
Does ml-connector handle Odoo's API key authentication and Snowflake's Key Pair setup?
Yes. ml-connector stores the Odoo API key encrypted and uses it to authenticate via JSON-2 Bearer token on every request. On Snowflake, it uses the RSA private key to generate JWT tokens and passes them with each REST API call. The connector refreshes Snowflake tokens before they expire and handles both auth methods automatically.
How often does the sync run, and what happens if Snowflake rate limits a request?
ml-connector polls Odoo and Snowflake on a schedule you configure, typically daily or after each accounting cycle close. If Snowflake returns HTTP 429 (rate limited), the connector backs off exponentially, waits, and retries the insert. Every record carries an audit trail, so you can replay failed inserts once the limit clears.

Related integrations

Connect Odoo and Snowflake

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

Get started