ml-connector
Exact OnlineDatabricks

Exact Online and Databricks integration

Exact Online stores your operational and financial records. Databricks powers your reporting and analytics. Connecting the two moves your purchasing, sales, and general ledger data into a unified data lake for compliance audits, cost analysis, and executive reporting. Webhook notifications from Exact Online trigger automatic syncs into Databricks, so your data warehouse reflects changes in real time. ml-connector handles the OAuth handshake on both sides and verifies every webhook payload.

How Exact Online works

Exact Online exposes purchase orders, sales invoices, GL accounts, cost centers, items, accounts (suppliers and customers), journal entries, and bank transactions through a REST API with OData v3 query syntax (filter, select, orderby, top, skip). Each customer has a division ID that must be included in every API path. Authentication uses OAuth 2.0 Authorization Code Grant with a 10-minute access token lifetime and 30-day rotating refresh tokens. Webhooks are available for purchase orders, invoices, GL accounts, and other financial entities, using HMAC-SHA256 signatures to verify payload authenticity. Division ID is required for all calls and must be fetched from the /current/Me endpoint first.

How Databricks works

Databricks provides REST APIs for creating and updating tables within catalogs and schemas, and for reading table metadata and data through SQL warehouses. Authentication uses OAuth 2.0 Client Credentials (Service Principal) or Personal Access Token, with workspace-specific base URLs. Databricks is a data platform designed for analytics and ML, not transactional operations, so data flows inbound only - purchase orders and invoices are stored as Delta Lake tables for reporting, reconciliation, and historical audit trails. MLflow webhooks exist for model registry events, but data ingestion relies on REST table writes via the catalog/schema API.

What moves between them

Financial and operational records flow from Exact Online into Databricks. Purchase orders, purchase invoices, sales invoices, GL accounts, cost centers, items, and journal entries are synced via Exact Online's webhook notifications. When a purchase order is created or updated in Exact Online, the webhook triggers an inbound notification; ml-connector fetches the full record and writes it into a Databricks Delta table. Invoices and GL transactions follow the same pattern, landing in distinct Databricks tables organized by entity type. Cost centers and GL accounts are synced bidirectionally so Databricks can validate invoice line allocations against live Exact Online dimensions. Syncs occur immediately on webhook receipt (near real-time) with a full audit trail of every inbound record.

How ml-connector handles it

ml-connector stores both Exact Online and Databricks OAuth credentials encrypted. On the Exact Online side, it refreshes the access token every 9 minutes to stay ahead of the 10-minute expiry, and decodes the division ID from the App Center configuration so requests route to the correct tenant. Incoming webhooks are verified using HMAC-SHA256 with the webhook secret stored in Exact Online's App Center, and rejected if the signature does not match. The webhook payload contains only the entity key and action (create/update/delete), so ml-connector follows up with a GET request to Exact Online's REST API to fetch the full record. On the Databricks side, ml-connector uses workspace-level OAuth 2.0 Client Credentials to obtain a 3600-second bearer token, and writes each entity type into its own Delta Lake table (purchaseorders, salesinvoices, glaccount, etc.). Cost centers and GL accounts are written first so downstream invoice lines can reference them without constraint violations. Because Databricks tables are immutable once written, ml-connector implements upsert logic via merge statements to preserve audit history. If a webhook call times out or a Databricks write fails, the job is queued for retry with exponential backoff.

A real-world example

A mid-market distribution company runs Exact Online ERP across five regional divisions in Europe and uses Databricks for financial analytics and cost center reporting. Before the integration, the finance team exported purchase invoices and GL postings from Exact Online daily into CSV files and manually loaded them into Databricks, a process that created lag and frequent data mismatches during month-end reconciliation. With Exact Online and Databricks connected via webhooks, each invoice and GL posting lands in Databricks within seconds of creation, and cost center allocations are validated against live dimensions. The finance team now runs their month-end close reports against the Databricks data lake with confidence that the ledger and invoice records are in sync.

What you can do

  • Sync purchase orders, sales invoices, purchase invoices, and GL journal entries from Exact Online into Databricks Delta tables via webhook notifications.
  • Validate invoice line allocations against GL accounts and cost centers synced from Exact Online before writing to Databricks.
  • Refresh Exact Online's OAuth access token automatically (10-minute expiry) and verify every webhook payload using HMAC-SHA256 signatures.
  • Upsert records into Databricks tables with full audit trails so historical changes are preserved and can be queried for compliance.
  • Handle missed webhooks and Databricks write failures with exponential backoff retries until successful.

Questions

Does data flow both ways between Exact Online and Databricks?
Data flows primarily from Exact Online into Databricks for reporting and audit purposes. Cost centers and GL accounts are synced in both directions so Databricks can validate invoice allocations. Databricks is a read-mostly analytics platform, so financial transactions are never written back into Exact Online.
How does ml-connector handle Exact Online's 10-minute OAuth token expiry?
ml-connector tracks token issue time and refreshes the access token every 9 minutes, staying ahead of the 10-minute expiry window. Refresh tokens are valid for 30 days and rotate on each refresh, so ml-connector stores the new refresh token after each successful refresh.
What happens if a webhook is missed or a Databricks write fails?
ml-connector queues failed syncs for retry with exponential backoff and jitter. The webhook payload is logged with a full audit trail, so if a Databricks write fails due to a temporary outage, the record can be replayed once the warehouse is back online.

Related integrations

Connect Exact Online and Databricks

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

Get started