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.
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
More Exact Online integrations
Other systems that connect to Snowflake
Connect Exact Online and Snowflake
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started