ml-connector
QuickBooks DesktopToast

QuickBooks Desktop and Toast integration

QuickBooks Desktop runs the books for many restaurants and food service operations. Toast powers the POS, ordering, and labor. Connecting the two keeps your sales orders, vendor expenses, and labor allocations in sync between front-of-house and back office. Sales orders from Toast flow into QuickBooks as invoices, posting to the correct accounts by outlet; vendor expenses sync back to Toast for cost-per-location analysis. Payroll and labor costs stay aligned without manual re-entry.

How QuickBooks Desktop works

QuickBooks Desktop exposes vendors, bills, invoices, journal entries, accounts, employees, items, and customer records through QBXML, an XML message format sent over SOAP. The integration requires a QBWC (QB Web Connector) agent running on the customer's Windows machine that polls a remote SOAP endpoint you specify. Every session starts with an authenticate() call where QBWC provides username and password, and your service returns a session token (GUID) for all subsequent calls. QuickBooks must be running and logged into the company file for the connector to process requests. Queries use ModifiedDateRangeFilter to detect changes, and TxnDeletedQueryRq to find deletions. QuickBooks Desktop does not support OAuth or webhooks; it is polling-only with a typical 5-15 minute interval.

How Toast works

Toast exposes sales orders, checks, payments, menu items, employees, labor shifts, and restaurant configuration through REST JSON APIs running at https://ws-api.toasttab.com. Authentication uses OAuth 2.0 Client Credentials: exchange clientId and clientSecret for a bearer token valid for 24 hours. Every API call requires two headers: the Authorization bearer token and Toast-Restaurant-External-ID (the restaurant's GUID). Toast supports both webhooks and polling. Webhooks push events for order updates, channel orders, stock changes, and menu changes with HMAC-SHA256 signature verification. Payments and labor data require polling because no webhook exists for those entities. Toast rate limits to 20 requests per second, and the menu API to 1 request per second per restaurant location.

What moves between them

Sales orders from Toast post into QuickBooks Desktop as invoices, one per Toast order, mapped to the vendor and account derived from the Toast outlet and menu category. Order line items become invoice line items with the menu item description and Toast revenue center mapped to the QuickBooks account structure. Payments in Toast sync into QuickBooks as journal entries allocating to the correct revenue and clearing account per restaurant. Vendor data in QuickBooks syncs back to Toast to populate the expense posting accounts and cost centers for labor allocation reports. The flow runs on a schedule tied to the Toast business date (which accounts for each restaurant's closeoutHour), with reconciliation pulls each business date to catch any missed records.

How ml-connector handles it

ml-connector opens a QBWC session with QuickBooks by calling authenticate() with QBWC-supplied credentials and caching the session token for all subsequent calls in the session. On the Toast side it refreshes the OAuth bearer token on a 24-hour cycle and caches it to avoid auth rate limits. When a Toast order is ready to post, ml-connector reads the order via Toast REST API, maps the outlet GUID to the QuickBooks account, looks up the current EditSequence (version counter) for that account to prevent concurrent-edit conflicts, and sends an InvoiceAddRq QBXML request with all line items, quantities, and amounts. Toast orders are idempotency-checked via the externalId field: if an order was already posted, retrying the same request checks the externalId and skips re-creation. Voided or fundraising orders are filtered before posting. On the return path, ml-connector queries QuickBooks for vendors and account updates on a schedule, sends those back to Toast via its limited write endpoints where supported, and skips read-only entities like menu items. QBXML requests timeout in approximately 60 seconds, so large queries are paginated. Every record carries audit metadata: Toast order ID, QB transaction ID, timestamp, and outcome, so a failed GL post can be replayed once the root cause is fixed.

A real-world example

A multi-location casual dining group runs QuickBooks Desktop at headquarters to consolidate AP, AR, payroll, and GL accounts across four restaurant locations. Each location uses Toast for its POS, ordering, and labor management. Before the integration, the back-office manager exported sales summaries from each Toast outlet every day and manually entered them into QuickBooks as invoices and GL entries, matching the sales breakdown by outlet to the correct GL accounts and cost centers. Month-end close required cross-checking Toast payment totals against QB deposits and chasing discrepancies between labor hours in Toast and payroll register in QuickBooks. After connecting Toast to QuickBooks, each day's sales orders post automatically to the GL with zero re-keying, allocated to the correct outlet and revenue center. Labor allocations sync from Toast into QB expense accounts by location. The back-office team spends half the time on reconciliation, and the GL is balanced and ready for close by the first business day of the month.

What you can do

  • Post Toast sales orders into QuickBooks Desktop as invoices, one per order, with line items mapped to menu category and QB account.
  • Map Toast outlets and revenue centers to QuickBooks accounts, vendors, and cost centers so every sale lands on the right GL account.
  • Sync Toast payments into QuickBooks as journal entries allocating to the correct clearing and revenue accounts per location.
  • Push vendor and account updates from QuickBooks back to Toast for expense posting accounts, and handle idempotency so retries do not create duplicates.
  • Poll on a schedule tied to each restaurant's business date, handle the 60-second QBXML timeout with pagination, and maintain a full audit trail on every transaction.

Questions

Does the integration handle multiple Toast locations?
Yes. Toast requires a separate external ID (Toast-Restaurant-External-ID) per location. ml-connector retrieves all accessible locations via the Toast API and maps each location's outlet to the correct QuickBooks account or cost center. Multi-location posting happens in a single schedule, so all outlets sync together.
What happens if a Toast order is voided after posting?
Toast returns voided orders from the API with a voided flag set to true. ml-connector filters voided orders before posting them as new invoices. If an order was already posted and then voided in Toast, a manual reversal or credit memo in QuickBooks is required; the integration does not auto-reverse.
How does the integration handle QuickBooks' EditSequence version counter?
QuickBooks enforces an EditSequence (version counter) on every transaction to prevent concurrent edits. Before posting a Toast order as an invoice, ml-connector queries the target account for its current EditSequence, includes it in the InvoiceAddRq QBXML request, and retries if a conflict is detected. This ensures Toast orders post cleanly even if the account is edited in QuickBooks at the same time.

Related integrations

Connect QuickBooks Desktop and Toast

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

Get started