ml-connector
Exact OnlineToast

Exact Online and Toast integration

Exact Online handles accounting and finance for restaurant chains. Toast runs the POS and orders. Connecting the two keeps your sales journal current without re-keying daily totals. Toast sales orders and payments post into Exact Online's general ledger on a nightly schedule, allocated to the revenue center for each location, so month-end close begins with your sales accounts already reconciled.

How Exact Online works

Exact Online is a cloud ERP covering accounting, purchasing, sales, inventory, HR, and project management. It exposes accounts, invoices, orders, GL accounts, cost centers, revenue centers, and journal entries through a REST API with OData v3 query syntax (filter, select, orderby, top, skip). Authentication is OAuth 2.0 Authorization Code Grant only, with 10-minute access tokens and 30-day refresh tokens. Exact Online supports webhooks with HMAC-SHA256 signature verification for create, update, and delete events, but webhook payloads contain only the entity key, so related data must be fetched in separate API requests. The API is region-specific with base URLs per country (Netherlands, Belgium, UK, Germany, France, Spain, USA). No expand support means related entities require separate calls.

How Toast works

Toast is a cloud POS and restaurant management platform. It exposes orders, checks, payments, menu items, employees, shifts, revenue centers, and sales categories through REST APIs. Authentication is OAuth 2.0 Client Credentials, exchanging clientId and clientSecret for a bearer token. Every request requires two headers: the Authorization bearer token and a Toast-Restaurant-External-ID header to specify the location. Toast supports both webhooks and polling, with webhooks covering order and menu updates but not payments or labor, so ml-connector uses nightly polling for orders and payments. Rate limits are 20 requests per second by default. Multi-location restaurants require separate API calls per Toast-Restaurant-External-ID. Toast does not document an Idempotency-Key header, so deduplication uses the externalId field on orders. Business dates are configurable per location and depend on each restaurant's closeout hour.

What moves between them

The primary flow is Toast into Exact Online. Each night, ml-connector polls Toast orders and payments for the previous business date, filters out voided orders and non-revenue items (fundraising), rolls up revenue and discounts by revenue center and menu category, then posts the daily sales journal into Exact Online's GL with one line per revenue center. Exact Online GL accounts and revenue centers are pre-mapped to Toast menu categories and revenue centers, so every line references a valid GL account and revenue center that already exists. The flow runs nightly after Toast business-date closeout to ensure the full day's sales are included.

How ml-connector handles it

ml-connector stores both credential sets encrypted. On the Exact Online side it refreshes the OAuth Authorization Code Grant token when a call returns 401 and caches it to avoid re-authorization overhead. On the Toast side it uses OAuth Client Credentials with the clientId and clientSecret, caches the bearer token, and includes the Toast-Restaurant-External-ID header on every request. Because Toast webhook delivery is not guaranteed, ml-connector polls nightly via GET /ordersBulk with the business date parameter rather than relying on webhooks. Before posting, it filters out voided orders (voided==true) and fundraising items and sums revenue by revenue center and menu category. Toast business dates are configurable per location (closeoutHour sets the boundary), so the poll query must account for each location's timezone and closeout rules to avoid missing sales that fall after midnight UTC. Toast rate limits are 20 requests per second by default, so ml-connector spaces requests with backoff and retries on 429. Every order carry a full audit trail and can be replayed if a downstream GL posting fails.

A real-world example

A fast-casual restaurant chain operates 12 Toast POS locations across a metro area and uses Exact Online for accounting and P&L by location. Before the integration, the accounting team downloaded the daily sales summary from Toast each morning, manually added up revenue by location and category, then entered journal entries into Exact Online to post the sales. Reconciliation was manual, error-prone, and delayed P&L close by a day. With Exact Online and Toast connected, each location's daily sales post into the GL at midnight, allocated to the correct revenue center, and the morning sales report is already waiting with GL accounts reconciled. Month-end close begins with the revenue accounts complete and verified.

What you can do

  • Post Toast daily sales totals into Exact Online general ledger, allocated by revenue center and menu category, on a nightly schedule.
  • Filter voided orders and non-revenue items (fundraising) so only net sales post to GL.
  • Map Toast menu categories and revenue centers to Exact Online GL accounts and revenue centers so every line references valid dimensions.
  • Handle Toast business dates per location by accounting for each restaurant's configurable closeout hour, so sales after midnight land on the correct day.
  • Audit every order and payment, track which transactions posted to GL, and replay failed postings if a downstream GL call fails.

Questions

Why does ml-connector poll Toast every night instead of using webhooks?
Toast webhooks do not cover payments and are not guaranteed to deliver. ml-connector uses nightly polling via GET /ordersBulk with the business-date parameter as a reliable safety net, even where webhooks are enabled for orders. This ensures every sale is captured and no late-arriving orders are missed after a webhook is sent.
How does ml-connector handle Toast's multi-location and business-date rules?
Toast requires a separate Toast-Restaurant-External-ID header per location, and business dates vary by location (configured via closeoutHour). ml-connector queries each location separately, accounts for its timezone and closeout rules to determine the correct business date, and rolls up sales by that location's revenue center. This ensures a sale at 1 AM is posted to the correct business date even if it occurs after midnight UTC.
How are sales mapped to Exact Online GL accounts and revenue centers?
Before the first sync, ml-connector builds a mapping from Toast menu categories and revenue centers to Exact Online GL accounts and revenue centers. On each nightly poll, sales are grouped by these dimensions and one journal line is posted per revenue center. If a Toast revenue center has no mapping, that sale is flagged and not posted, ensuring every GL entry references a valid account and dimension.

Related integrations

Connect Exact Online and Toast

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

Get started