ml-connector
Sage IntacctToast

Sage Intacct and Toast integration

Sage Intacct manages your accounting and general ledger. Toast manages your restaurant operations, payments, and labor. Connecting the two posts your daily sales and labor costs into Sage Intacct automatically, eliminating the manual journal entries that traditionally close each business day. Every order, payment, and shift feeds into the right revenue category and cost center in your GL without re-keying or month-end reconciliation headaches.

How Sage Intacct works

Sage Intacct exposes vendors, accounts payable bills, payments, general ledger accounts, and dimensions through a single XML gateway endpoint at https://api.intacct.com/ia/xml/xmlgw.phtml. Authentication is session-based: exchange partner credentials and user credentials for a 50-minute sessionid on first call, then cache the session for subsequent operations. Intacct does not push webhooks; all data queries are polling operations driven by scheduler or manual request. HTTP 200 responses may contain application-level errors encoded in the XML body, which must be parsed for errormessage tags and status codes. Session caching is isolated by senderId, companyId, and userId.

How Toast works

Toast surfaces restaurant sales orders, checks, payments, labor shifts, menu items, and configuration data through REST APIs at https://ws-api.toasttab.com. Authentication is OAuth 2.0 Client Credentials: exchange clientId and clientSecret for a bearer token, and include that token plus a Toast-Restaurant-External-ID header on every request. Toast pushes webhooks for order and menu changes, but does not webhook for payments or labor, so those require nightly polling using the reconciliation endpoint GET /ordersBulk?businessDate=YYYYMMDD. Multi-location restaurants require separate calls per Toast-Restaurant-External-ID. Voided orders and checks are still returned in the API and must be filtered before posting to GL.

What moves between them

Revenue and labor costs flow from Toast into Sage Intacct once per business day. ml-connector polls Toast's order, payment, and labor APIs using the reconciliation businessDate parameter, which respects each restaurant's configurable closeoutHour, so a 1 AM sale on June 12 rolls into the June 11 business date if the restaurant closes at 3 AM. Voided orders and fundraising items are excluded. Each business day's sales, discounts, service charges, and labor costs are aggregated by revenue category and cost center, then posted as a single GL journal entry into the matching Sage Intacct general ledger accounts and dimensions. Toast configuration data (menus, employees, cost centers) is read once during setup; posting is write-only.

How ml-connector handles it

ml-connector caches the Toast OAuth 2.0 bearer token across calls to avoid hitting the auth rate limit, and decaches it when a call returns 401. For multi-location restaurants, it retrieves all accessible locations via GET /partners/v1/restaurants and routes each location's data to the correct Toast-Restaurant-External-ID header. It polls Toast on a nightly schedule tied to each restaurant's business date by reading the closeoutHour configuration and calculating the previous business date in YYYYMMDD format. Voided orders are filtered using the voided==true flag, and fundraising items are excluded from net sales. On the Sage Intacct side, it caches the XML session after the first getAPISession call and refreshes it when approaching the 50-minute expiry. It parses all HTTP 200 responses for errormessage tags inside the XML body because Intacct signals application errors at the HTTP 200 level. All GL postings carry a unique identifier for server-side deduplication using Intacct's uniqueid flag. Every transaction is logged with full detail, payload, and response for audit and replay.

A real-world example

A regional restaurant group with 15 locations runs Toast for ordering, POS, and labor scheduling, and Sage Intacct for consolidated accounting and GL management. Before the integration, the corporate accounting team downloaded daily sales reports from Toast, calculated taxes and service charges, and manually entered the daily revenue journal into Sage Intacct each morning, then repeated the process for labor cost allocations. With Toast and Sage Intacct connected, the nightly reconciliation pull fetches all sales, payments, and labor from each location, aggregates by revenue category and cost center, and posts the complete daily journal automatically. The accounting team reviews the posted GL entry in the morning instead of building it, freeing up time for month-end close and variance analysis. Each location's sales land on the correct revenue category and cost center automatically, eliminating allocation errors.

What you can do

  • Post daily Toast sales revenue, taxes, service charges, and discounts into Sage Intacct's general ledger, aggregated by revenue category and mapped to the correct GL accounts.
  • Allocate restaurant labor costs from Toast shifts and time entries to the correct Sage Intacct cost centers using configured labor rate and location dimension mappings.
  • Handle Toast's multi-location routing by reading all accessible locations and polling each one separately on the matching business date accounting for its closeoutHour.
  • Cache OAuth 2.0 tokens and Sage Intacct XML sessions to avoid auth rate limits, and validate configuration data once at setup time.
  • Poll Toast nightly on a configurable schedule, filter voided orders and non-revenue items, and post GL entries with full audit trails and idempotent replay on Sage Intacct's uniqueid flag.

Questions

How does ml-connector handle Toast's multi-location setup?
ml-connector calls GET /partners/v1/restaurants to retrieve all accessible locations at setup, then polls each location separately on its own business date using the Toast-Restaurant-External-ID header. Business date is calculated using each restaurant's configurable closeoutHour, so a sale at 1 AM on June 12 rolls into June 11 if closeoutHour is 3 AM. All locations post into the same Sage Intacct company and GL account structure.
Why does ml-connector poll Toast every night instead of using webhooks for all data?
Toast webhooks cover orders and menu changes, but do not push payment or labor events, so polling is required for complete reconciliation anyway. ml-connector implements nightly polling of the GET /ordersBulk?businessDate=YYYYMMDD endpoint as the primary pattern for accuracy and completeness, supplemented by webhook ingestion for real-time order events during the day.
How are voided orders and non-revenue items handled?
Toast API returns voided orders, checks, and payments with a voided flag set to true. ml-connector filters out all voided records before aggregation. Fundraising items flagged in Toast selections are also excluded from net sales. Only paid orders, regular revenue items, and non-voided payments are included in the GL journal.

Related integrations

Connect Sage Intacct and Toast

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

Get started