ml-connector
Exact OnlineGusto

Exact Online and Gusto integration

Exact Online runs your accounting, purchasing, and inventory. Gusto handles payroll and employee data across multiple locations. When the two are connected, each payroll cycle updates your general ledger in Exact Online without manual re-entry. Employee records, pay amounts, and tax withholdings flow from Gusto into Exact Online, and labor costs post to the correct cost centers and GL accounts in your chart of accounts.

How Exact Online works

Exact Online is a cloud-based ERP covering accounting, purchasing, sales, inventory, HR, and project management through a REST API with OData v3 query syntax. It requires OAuth 2.0 Authorization Code Grant with a 10-minute access token and 30-day rotating refresh token per app registration in the Exact Online App Center. Division ID is required for all API calls and must be fetched from the /current/Me endpoint. Key entities include Accounts, Sales Orders, Purchase Orders, GL Accounts, Cost Centers, Cost Units, Journal Entries, Employees, and Payments. Exact Online publishes webhooks for significant REST resources including GL Accounts, Journal Entries, and Employees, with HMAC-SHA256 verification and up to 10 retries. The API is region-specific and available in Netherlands, Belgium, UK, Germany, France, Spain, and USA. Related entities must be fetched in separate requests, as $expand is not supported.

How Gusto works

Gusto is a cloud-based HR and payroll platform for small and mid-size businesses. It exposes Employees, Payrolls, Earnings, Deductions, Tax Withholdings, and Pay Schedules through a REST API at api.gusto.com with OAuth 2.0 Authorization Code flow. Each OAuth token is scoped to a single company, with a 2-hour access token and a never-expiring single-use refresh token. Gusto publishes webhooks for payroll events (created, updated, calculated, processed, paid) and employee events (created, updated, onboarded, terminated), with HMAC-SHA256 verification and up to 16 retries over 3 days. Dollar amounts are returned as string decimals. Employee compensation data is scoped, and Gusto enforces a 200-request-per-minute rate limit. Gusto has no GL accounts, cost centers, or accounting dimensions of its own; it is payroll and HR only.

What moves between them

The main flow runs from Gusto into Exact Online. After each payroll run, ml-connector receives a webhook notification from Gusto that payroll has been processed, reads the employee compensation and payroll data, and posts labor cost journal entries into Exact Online's general ledger. Employee records including names, job titles, and location also flow from Gusto into Exact Online so your employee roster reflects payroll changes. Cost centers and departments are mapped first so every payroll journal line references a GL account and cost center that exists in Exact Online. Reference data such as earning types and deduction categories flow from Gusto to keep your payroll dimension reference tables current.

How ml-connector handles it

ml-connector stores both credential sets encrypted, handles the OAuth 2.0 refresh cycle for both systems independently since Exact Online tokens expire in 10 minutes and Gusto tokens expire in 2 hours, and tracks the division ID for each Exact Online customer from the /current/Me endpoint. On the Gusto side, it receives payroll webhooks at a registered HTTPS endpoint, verifies the HMAC-SHA256 signature using the subscription verification token, and reads the full payroll and employee data via REST. On the Exact Online side, it maps Gusto cost centers and employee locations to Exact Online cost centers and cost units, then constructs journal entries with matching GL account and cost center references. Because Exact Online webhooks for GL transactions may have a delay, ml-connector can also poll Exact Online's GL Accounts and Journal Entries endpoints on a schedule to detect any manual entries or corrections. Gusto's 200-request-per-minute rate limit is respected, and retries use exponential backoff. Every record carries a transaction ID for tracing and can be replayed if the GL posting fails.

A real-world example

A growing professional services firm with offices in the UK and Spain runs Exact Online for accounting and project management, and uses Gusto for payroll and employee benefits across both locations. Before integration, the accounting team manually exported payroll totals from Gusto every pay period, looked up the cost center for each location, and created journal entries in Exact Online to record labor expense. Reconciliation at month-end required cross-checking employee counts and payroll amounts by location against two systems. With Exact Online and Gusto connected, each payroll run automatically creates labor cost journal entries in the UK division and Spain division of Exact Online, allocated to the correct cost center for each office, and employee changes flow automatically so headcount is always in sync.

What you can do

  • Post Gusto payroll labor costs into Exact Online's general ledger after each pay run, allocated to the correct cost center and location.
  • Keep Exact Online employee records in sync with Gusto hires, terminations, compensation changes, and location transfers.
  • Map Gusto employees and cost centers to Exact Online cost units and cost centers so payroll lands on the right GL accounts.
  • Handle region-specific Exact Online URLs for Netherlands, Belgium, UK, Germany, France, Spain, and USA, with per-customer division ID management.
  • Verify Gusto payroll webhooks with HMAC-SHA256, refresh both systems' OAuth tokens on schedule, and replay failed GL postings.

Questions

Which direction does data move between Exact Online and Gusto?
The main flow is Gusto into Exact Online. Payroll labor costs, employee records, and earnings data move from Gusto into Exact Online after each payroll run. Reference data such as cost centers and earning types are aligned in both directions so payroll allocations map to valid Exact Online GL accounts and cost centers. Exact Online's GL accounts and chart of accounts are read-only for payroll purposes.
How does ml-connector handle the different OAuth token lifetimes for Exact Online and Gusto?
ml-connector stores both OAuth credential sets encrypted and refreshes them independently. Exact Online tokens expire in 10 minutes, so the refresh cycle is checked on every API call to that system. Gusto tokens expire in 2 hours with a never-expiring single-use refresh token, so the refresh is performed when a call returns 401 or on a fixed schedule. Both refresh tokens are rotated on each refresh and must be stored securely.
How does ml-connector map Gusto payroll data to the correct Exact Online cost centers and GL accounts?
ml-connector first fetches the full chart of GL accounts and cost centers from the correct Exact Online division using the division ID. It maps Gusto employee locations to Exact Online cost centers and cost units, and maps Gusto earning types to pre-configured GL accounts so payroll lines land on the right accounts. The mapping is configurable per customer and validated on every payroll run to ensure no transactions post to invalid accounts.

Related integrations

Connect Exact Online and Gusto

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

Get started