ml-connector
Oracle NetSuiteToast

Oracle NetSuite and Toast integration

Toast runs restaurant operations from POS through labor and inventory. Oracle NetSuite runs the complete accounting system. Connecting the two keeps your revenue records aligned: every Toast order and payment posts to NetSuite's general ledger without re-keying, voided transactions are filtered, and revenue is allocated to the correct GL account and cost center for each location. Month-end close starts with sales already posted and reconciled.

How Oracle NetSuite works

Oracle NetSuite exposes purchase orders, vendor bills, sales orders, invoices, accounts, customers, inventory items, employees, departments, locations, and classifications through SuiteTalk REST Web Services. Authentication uses OAuth 2.0 Client Credentials (M2M with certificate, recommended) or Token-Based Authentication. NetSuite sends webhooks via Event Subscriptions on supported record types, though native subscriptions do not include HMAC signatures; customers use IP allowlists or secrets in URLs instead. For historical or bulk data, ml-connector polls via SuiteQL. OAuth tokens are valid for 60 minutes with no refresh token in M2M flows, and governance units limit high-volume event processing.

How Toast works

Toast exposes orders, checks (bills), payments, menu items, employees, shifts, time entries, revenue centers, and sales categories through REST APIs. Authentication uses OAuth 2.0 Client Credentials, exchanging clientId and clientSecret for a bearer token that must include userAccessType: TOAST_MACHINE_CLIENT. Every request requires the Authorization header and a Toast-Restaurant-External-ID header identifying the location. Toast pushes webhooks for order_updated, channel_order_updated, stock, and menu changes with HMAC-SHA256 signature verification. Payments and labor shifts are not webhook-enabled and must be polled. Configuration API and Menu API have stricter rate limits (1 request per second per location). Business dates are configurable per restaurant.

What moves between them

Toast sales orders, checks (line items), and payments flow into Oracle NetSuite daily. After each business day closes in Toast, ml-connector reconciles orders from the previous business date, filters voided orders and fundraising items, and posts net revenue and receivable entries to NetSuite's general ledger, mapped to the correct revenue centers and GL accounts per location. Service charges are classified (gratuity vs standard), and payments are recorded in the correct receivable or cash account. Historical orders older than one month can be re-polled for reconciliation at a slower rate. Data flows one direction: Toast into NetSuite. NetSuite does not write menu or order data back to Toast.

How ml-connector handles it

ml-connector stores Toast's OAuth clientId and clientSecret encrypted, exchanges them for a bearer token on demand, and caches the token to avoid hitting Toast's authentication rate limit. On the NetSuite side, it uses OAuth 2.0 Client Credentials with the required certificate and accepts a custom integration mapping ID per NetSuite account. Toast requires the restaurant ID (Toast-Restaurant-External-ID) on every request; ml-connector retrieves all accessible locations via the partners API if multi-location support is enabled. For daily reconciliation, ml-connector polls Toast's orders API with businessDate filters, accounting for each restaurant's configurable closeout hour. Voided orders (voided==true), fundraising items, and service charges flagged as gratuity are filtered before posting. NetSuite's 60-minute OAuth token is refreshed before expiry. Toast does not guarantee webhook delivery, so ml-connector implements a nightly full-day reconciliation poll as the safety net. Rate limits (Toast: 20 req/sec default, Menu API 1 req/sec per location) are observed with backoff. Every posted record carries a Toast externalId for deduplication and audit.

A real-world example

A casual dining group operates 15 Toast-enabled locations across three cities, each running its own POS but using a single Oracle NetSuite instance for consolidated accounting. Before the integration, the corporate accounting team waited for a nightly manual export of sales from each location, then re-entered the totals into NetSuite by hand, separating cash from credit card payments and allocating revenue to cost centers by location. Reconciling the 15 locations took three full days after month-end close. With Toast and NetSuite connected, each location's daily orders, checks, and payments post automatically to NetSuite on the revenue recognition date, allocated to the correct location cost center. The group's accounting team now sees live sales in NetSuite and completes month-end close in one day.

What you can do

  • Post Toast orders and checks (bills) to Oracle NetSuite's revenue and receivable accounts, segregated by payment method and location.
  • Filter voided orders, fundraising items, and service charge classifications before posting to the general ledger.
  • Handle multi-location restaurants by routing each location's sales to a separate cost center or department in NetSuite.
  • Cache Toast OAuth tokens and refresh Oracle NetSuite's 60-minute OAuth tokens automatically to avoid authentication rate limits.
  • Reconcile daily via webhook and nightly full-day poll to catch missed orders and ensure every Toast transaction posts to NetSuite.

Questions

How does ml-connector handle Toast's lack of payment webhooks?
Toast does not push webhooks for payments or labor. ml-connector polls Toast's orders API once per business day to fetch orders, checks, and payments together. A nightly full-day reconciliation poll acts as a safety net since Toast webhooks are not guaranteed delivery. Each record is checked for duplication via Toast's externalId field.
What happens to voided orders and service charges?
ml-connector filters voided orders (voided==true) before posting to NetSuite and excludes fundraising items. Service charges are classified based on the gratuityServiceCharge flag. Gratuity charges are recorded separately from net sales, so tip reporting and GL allocation remain accurate.
How are multi-location restaurants handled?
ml-connector retrieves all accessible locations via Toast's partners API at startup. Each location has a separate Toast-Restaurant-External-ID. Sales from each location are posted to a dedicated cost center or department in NetSuite so location-level profit and loss reporting is possible.

Related integrations

Connect Oracle NetSuite and Toast

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

Get started