ml-connector
OdooGoogle Sheets

Odoo and Google Sheets integration

Odoo runs your accounting and procurement. Google Sheets is where your team collaborates on data. Connecting them keeps both in sync without manual export-import cycles. Finance records, purchase orders, and supplier accounts flow from Odoo into a sheet you control, and edits you make in the sheet flow back into Odoo. ml-connector manages the full pipeline: polling Odoo on your schedule, mapping ERP records to spreadsheet rows, handling authentication, and tracking every change.

How Odoo works

Odoo is an open-source ERP available as Odoo Online (SaaS at odoo.com), Odoo.sh (PaaS), or self-hosted. It exposes accounts, invoices, purchase orders, employees, and other records through XML-RPC and JSON-2 REST APIs. Authentication uses an API key paired with a username, and API calls respect the integration user's Odoo access rights. Polling with write_date high-water-mark filters is the recommended sync method for production, since Odoo webhooks are not production-grade. External API access requires Odoo's Custom pricing plan.

How Google Sheets works

Google Sheets exposes spreadsheet data through REST API (v4) that reads and writes cells across tabs and named ranges using A1 notation. Authentication uses OAuth 2.0 (user-delegated or Service Account). Sheet structure is customer-defined - there are no native ERP entities like invoices or purchase orders, only cell values. Polling every 5 to 15 minutes is recommended since Google Drive watch channels expire hourly and do not auto-renew. Any team member with edit access can modify a sheet, so data integrity depends on your column schema and manual validation.

What moves between them

The main flow is from Odoo into Google Sheets. ml-connector polls Odoo accounts, invoices, and purchase orders at an interval you set, then writes rows into the sheet you designate, mapping ERP fields to columns you define. When you or a team member updates values in the sheet (supplier name, PO amount, account code), ml-connector reads those changes and syncs them back into Odoo via the REST API. Reference data such as account codes and supplier IDs must be present in the sheet columns so ml-connector can match rows to Odoo records and avoid duplicate writes.

How ml-connector handles it

ml-connector stores your Odoo API key encrypted and your Google OAuth token encrypted, refreshing the Google token when calls return 401. It polls Odoo using write_date filters and a high-water-mark timestamp so only changed records are fetched on each run, reducing API quota burn. For each Odoo record, it looks up the matching row in your sheet by a key column you specify (e.g., invoice ID or account code), then writes or updates the row with the field values mapped to your column headers. Inbound changes from the sheet are validated against the column schema you define - missing required columns or invalid values are logged and skipped. Odoo record rules and access rights are enforced by Odoo itself, so ml-connector cannot read or write data the integration user does not have permission for. All records carry a unique sync ID and timestamp, and failed writes are audited so you can retry them manually if needed.

A real-world example

A mid-sized manufacturing company uses Odoo for accounting and procurement, with a finance team spread across two offices. The team maintains a Google Sheet with a list of approved suppliers, their payment terms, and YTD spend, which they update weekly in planning meetings. Before the integration, someone would export the Odoo supplier and invoice data to CSV every Friday, paste it into the sheet by hand, and re-enter any term changes from the sheet back into Odoo on Monday. With Odoo and Google Sheets connected, the sheet auto-refreshes every morning, so the team always sees current spend and can edit supplier terms in the sheet knowing ml-connector will sync the changes back to Odoo that night. The manual export-paste-re-enter cycle is gone.

What you can do

  • Sync Odoo accounts, invoices, and purchase orders to Google Sheets rows on a schedule, mapped to columns you define.
  • Update Odoo records when you edit values in your Google Sheets tab, with validation against your column schema.
  • Store Odoo API keys and Google OAuth tokens encrypted, and refresh tokens when API calls expire.
  • Poll Odoo using high-water-mark timestamps so only changed records are fetched, reducing quota usage.
  • Audit every sync run with record counts, change timestamps, and error logs for compliance and debugging.

Questions

Which direction does data move between Odoo and Google Sheets?
Both directions. Odoo records flow into the sheet on your polling schedule, mapped to rows and columns you define. When you edit values in the sheet, ml-connector syncs them back into Odoo. Reference data such as account codes must be present in the sheet columns so ml-connector can match rows to Odoo records.
How does ml-connector handle Odoo access rights and API key security?
Odoo API calls are made with the integration user's credentials and respect that user's Odoo access rights and record rules - so ml-connector cannot read or write data the user does not have permission for. The API key is stored encrypted and never logged or exposed.
What happens if my sheet column headers do not match the Odoo records being synced?
ml-connector validates each inbound change against your column schema. Missing required columns or invalid values are logged and skipped - the sync continues, and you can review the audit log to see which records failed. You can fix the schema and retry the sync manually.

Related integrations

Connect Odoo and Google Sheets

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

Get started