ml-connector
Exact OnlineSnowflake

Exact Online and Snowflake integration

Exact Online runs accounting, purchasing, sales, and project management for European SMEs. Snowflake serves as a unified data warehouse for finance, operations, and analytics. Connecting the two lets you archive all Exact Online financial records into Snowflake without re-keying, query invoices and payments across regions, reconcile GL accounts with cost centers, and feed clean transaction data downstream to FP&A tools and reporting systems. ml-connector polls Exact Online on a schedule you control and pushes every record into Snowflake with a full audit trail.

How Exact Online works

Exact Online is a cloud ERP and accounting platform available in the Netherlands, Belgium, UK, Germany, France, Spain, and USA, each with region-specific base URLs. It exposes accounts (suppliers and customers), purchase and sales invoices with line items, purchase and sales orders, GL accounts, cost centers, cost units, journal entries, transaction lines, items, contacts, employees, payments, receipts, bank accounts, quotations, goods deliveries, bank entries, documents, time transactions, and projects through a REST API with OData v3 query syntax (filter, select, orderby, top, skip). Authentication uses OAuth 2.0 Authorization Code Grant with a 10-minute access token lifetime and 30-day rotating refresh token. Exact Online supports webhooks with HMAC-SHA256 validation for a wide set of resources including accounts, contacts, sales orders, invoices, GL accounts, and bank entries, but each webhook payload contains only the entity key and action; the full record must be fetched separately. Division ID is required for all API calls and must be fetched from /api/v1/current/Me first. Related entities ($expand) are not supported, so all fetches are single-request.

How Snowflake works

Snowflake is a cloud data warehouse that accepts structured data through REST and SQL. It is authenticated via Key Pair Authentication (RSA private key and JWT, recommended for server-to-server integration) or Programmatic Access Tokens with customizable expiry from 1 to 365 days. Snowflake has no built-in finance objects; all entities are user-defined tables created by the connector. The SQL API supports partition-based pagination with gzip-compressed responses. Queries can be synchronous or asynchronous (return HTTP 202 with a statement handle); synchronous queries execute immediately. Data is loaded via SQL INSERT statements or copied into tables via the Snowflake Internal Stage API. Snowflake uppercases unquoted identifiers, so quoted lowercase table and column names must be used consistently. There is no documented rate limit, but HTTP 429 is returned when the warehouse is under load; exponential backoff is recommended. Streams (native CDC) and Tasks (scheduled queries) are available for downstream change detection.

What moves between them

The flow runs from Exact Online into Snowflake. ml-connector polls Exact Online on a weekly schedule (or more frequently on demand) for all purchase invoices, purchase invoice lines, sales orders, sales order lines, GL accounts, cost centers, journal entries, transaction lines, and payment receipts. Every record is transformed into a JSON document and inserted into corresponding Snowflake tables with metadata: source system (Exact Online), sync timestamp, division ID, and record ID. Supplier and customer accounts are loaded as separate tables with flags indicating their role. GL accounts and cost centers are loaded with their names and hierarchies. Reference data such as items and contacts are synced on the same schedule. Historical records are retained in Snowflake; updates to Exact Online accounts or amounts trigger INSERT statements with new timestamps, not overwrites, so the warehouse becomes a full audit log of your accounting system's history.

How ml-connector handles it

ml-connector stores the Exact Online OAuth credentials encrypted and refreshes the access token before every sync run, watching the 10-minute expiry window and using the 30-day rotating refresh token. The integration accepts the region-specific Exact Online base URL per customer (Netherlands, Belgium, UK, Germany, France, Spain, or USA) and handles the required division ID by fetching it from /api/v1/current/Me on the first run. Since Exact Online webhooks deliver only entity keys and actions, not full records, ml-connector ignores webhook payloads and instead polls the full API on a schedule for all records. It converts OData query results (with $filter, $select, $orderby, $top, $skip) into JSON documents and uses Snowflake's SQL API with Key Pair Authentication to insert records in batches. Snowflake requires the warehouse to have AUTO_RESUME = TRUE, so ml-connector checks this at first run and warns if disabled. The integration handles Snowflake's case sensitivity by using quoted lowercase table names and maps Exact Online's supplier/customer flags into separate columns for easy filtering in downstream queries. Every insert is idempotent: if the same Exact Online record ID arrives twice, Snowflake's INSERT still succeeds but creates a duplicate row with a later sync timestamp, allowing for audit replay. If Snowflake returns HTTP 429 (rate limit), ml-connector backs off with exponential jitter and retries.

A real-world example

A mid-sized European software company has three legal entities in the Netherlands, Germany, and UK, each with its own Exact Online instance. Finance closes the books by exporting invoices, orders, and GL transactions from each Exact instance by hand, loading them into CSV files, and reconciling totals in Excel. With Exact Online and Snowflake connected, all three instances sync every week to a single Snowflake warehouse. Finance can now query all invoices across regions in one place, run GL reconciliation queries that filter by division and cost center, and join purchase order and invoice data to identify stuck or aged AP records. Month-end close shrinks from a manual three-day process to one day of SQL queries.

What you can do

  • Push all Exact Online financial records-invoices, orders, GL accounts, journal entries, payments, and cost centers-into Snowflake tables weekly or on demand.
  • Handle Exact Online's region-specific URLs and OAuth token refresh, managing the 10-minute access token and 30-day refresh window automatically.
  • Map supplier and customer accounts, GL hierarchies, and cost units into Snowflake dimensions for downstream joins and analytics.
  • Query the full history of every accounting transaction in Snowflake; every sync creates audit rows with source, timestamp, and record ID, never overwrites.
  • Manage idempotent inserts and exponential backoff retries so stalled or duplicate syncs do not corrupt your warehouse.

Questions

How often does the integration sync Exact Online data into Snowflake?
The default cadence is weekly, aligned with your accounting close calendar. You can adjust the schedule in ml-connector to daily, twice-weekly, or on-demand, since Exact Online polling is pull-only and has no quota per call. Webhook events from Exact Online are delivered immediately but contain only the entity key and action, so full records still come from the scheduled poll to Snowflake.
Does the integration handle multiple Exact Online instances (divisions and regions)?
Yes. ml-connector accepts one Exact Online division and region per Snowflake customer configuration, and fetches the division ID from /api/v1/current/Me on first run. If you have multiple divisions, you can set up separate ml-connector configs for each one, or extend the integration to loop across all divisions and prepend the division ID to every record in Snowflake for multi-tenancy queries.
What happens if an Exact Online record is updated or deleted?
Since ml-connector polls the full Exact Online API every sync and uses idempotent INSERT into Snowflake, updated records appear as new rows with a later sync timestamp and the updated values. Deleted records stop appearing in subsequent syncs, but rows for old versions remain in the warehouse for audit. This design makes Snowflake a time-versioned archive of your entire accounting history.

Related integrations

Connect Exact Online and Snowflake

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

Get started