ml-connector
Exact OnlineGoogle Sheets

Exact Online and Google Sheets integration

Exact Online runs your accounting and procurement. Google Sheets is where your finance team collaborates and reports. Connecting the two keeps your sheet data live from Exact Online so finance and procurement teams have a single source of truth without manual exports or re-entry. Sales invoices, purchase invoices, purchase orders, GL accounts, and payment records flow from Exact Online into Sheets on a schedule you control, mapped to columns you define.

How Exact Online works

Exact Online exposes accounting and ERP data through an OData v3 REST API, with region-specific base URLs for the Netherlands, Belgium, UK, Germany, France, Spain, and USA. Access tokens last 10 minutes and refresh tokens rotate every 30 days, requiring re-authorization if unused beyond that window. Webhooks are supported for a broad set of resources including accounts, invoices, purchase orders, GL accounts, journal entries, items, and bank entries, delivering only the entity key and action (create/update/delete), so ml-connector fetches the full record via REST after receiving the webhook notification. Division ID is required for all API calls and must be fetched from the /api/v1/current/Me endpoint. The Employee endpoint is read-only if your HR/Payroll module is licensed.

How Google Sheets works

Google Sheets is a general-purpose cloud spreadsheet with no native ERP or accounting entities. The Sheets API v4 provides REST endpoints to read and write cell data using A1 notation ranges or named ranges that you define. Authentication uses OAuth 2.0 Authorization Code flow or Service Account credentials, with no special setup required. Polling is the recommended sync method since Google Drive watch channels expire hourly and do not auto-renew, requiring manual re-subscription if webhooks are enabled. All data is customer-defined via sheet tabs and column headers, so ml-connector maps Exact Online records to your schema without assumptions about what columns should exist.

What moves between them

Data flows from Exact Online into Google Sheets. When an Exact Online resource such as a sales invoice, purchase invoice, or purchase order is created or updated, Exact Online sends a webhook notification to ml-connector. ml-connector receives the notification, fetches the full record from Exact Online, maps it to columns in your Google Sheet (which you define), and appends or updates rows in the sheet. GL accounts, accounts (suppliers and customers), items, and cost centers can flow as reference data to separate tabs so finance teams have the complete context for each transaction. Exact Online is the source of truth; the sheet is read from, never written back to Exact Online.

How ml-connector handles it

ml-connector stores OAuth credentials for both Exact Online and Google Sheets encrypted. It registers webhooks in Exact Online for invoices, purchase orders, accounts, and GL accounts, and on receipt of each webhook (which carries only the entity key and action), it immediately fetches the full record from Exact Online's REST API, refreshing the access token if it has passed the 10-minute lifetime. The Exact Online region (Netherlands, UK, USA, etc.) and division ID are stored per customer so the correct API base URL and division are used on every call. ml-connector writes data to Google Sheets using A1 notation or named ranges you provide, creating tabs if they do not exist. Because Exact Online webhooks contain only the key and action, and Google Sheets has no atomic write-many-rows operation, ml-connector fetches one record at a time and writes it synchronously, so throughput is bounded by Exact Online's API. Retries use exponential backoff to handle temporary Sheets API rate limits and Exact Online token refresh errors.

A real-world example

A mid-sized trading or distribution company uses Exact Online for all invoicing, purchase orders, and GL accounting across its European operations. The finance team uses a shared Google Sheet to track invoice aging, outstanding purchase orders, and monthly accruals. Previously, someone manually exported invoice and purchase order lists from Exact Online each day and pasted them into the sheet, a tedious error-prone task that lagged behind actual transactions by hours. With Exact Online and Google Sheets connected, every new sales invoice, purchase invoice, and purchase order appears in the sheet within seconds of creation in Exact Online. The aging report is always current, month-end accruals are complete and accurate, and the team spends no time on manual data entry.

What you can do

  • Receive Exact Online webhooks for sales invoices, purchase invoices, purchase orders, GL accounts, and accounts, and write each record to a Google Sheet tab you define.
  • Map Exact Online invoice lines to separate rows in Google Sheets, with line amounts, descriptions, and GL account codes.
  • Sync purchase order line items and approval status so procurement teams track committed spend in real time.
  • Handle Exact Online OAuth refresh token rotation (10-minute access tokens, 30-day refresh window) and region-specific API base URLs per customer.
  • Append new records and update existing rows in Google Sheets using named ranges or A1 notation, with retries and error logging on each write.

Questions

Why does ml-connector fetch the full record after receiving an Exact Online webhook?
Exact Online webhook payloads contain only the entity key and action (create/update/delete), not the full record data. ml-connector immediately fetches the complete record from Exact Online's REST API so Google Sheets receives all fields needed for reporting and reconciliation.
What happens when the Exact Online access token expires?
Exact Online access tokens last 10 minutes. ml-connector tracks the token lifetime and refreshes it before expiry using the refresh token, so webhook processing is not interrupted. Refresh tokens rotate on each refresh and must be re-authorized at least once every 30 days or the user must re-authenticate.
Does Google Sheets need webhooks or polling for new data?
Google Sheets webhooks are unreliable because watch channels expire hourly and do not auto-renew. ml-connector relies on Exact Online webhooks to trigger the sync, so data appears in Sheets as soon as it is created in Exact Online. Manual polling via ml-connector configuration is also supported if webhooks are not enabled in Exact Online.

Related integrations

Connect Exact Online and Google Sheets

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

Get started