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