ml-connector
MYOBToast

MYOB and Toast integration

Toast runs your restaurant's point of sale, labor, and orders. MYOB is your accounting backbone in Australia and New Zealand. Connecting them means your daily sales reconcile automatically into MYOB's general ledger after each business close, without manual journals or spreadsheets. Discounts, tax, and service charges flow as separate line items, and every transaction carries a full audit trail for month-end review.

How MYOB works

MYOB exposes general ledger accounts, sales invoices, customers, contacts, and journals through the MYOB Business API (AccountRight Live API v2) using REST with OData v3 parameters. Authentication requires OAuth2 Authorization Code plus company file username and password supplied in the x-myobapi-cftoken header; access tokens expire in 20 minutes and must be refreshed before use. MYOB does not support webhooks or push events, so all data is polled using OData $filter on LastModified timestamps to detect changes since the last sync. The API enforces an 8 request/second rate limit and a 1 million request/day quota per API key, returning HTTP 429 if either is exceeded. PATCH and PUT operations require the RowVersion field; an outdated RowVersion returns a 409 conflict. API responses may include up to 1000 records per page.

How Toast works

Toast exposes sales orders, payments, labor shifts, menu items, and restaurant configuration through a REST API using OAuth2 Client Credentials with clientId and clientSecret. Every API call requires two headers: Authorization Bearer token and Toast-Restaurant-External-ID (a unique guid per restaurant location). Tokens must include userAccessType: TOAST_MACHINE_CLIENT and are typically cached to avoid hitting the auth rate limit. Toast supports both webhooks for orders and menu changes (verified via HMAC-SHA256 signature) and polling for comprehensive reconciliation. Payments and labor data are polling-only. The API enforces a 20 request/second default rate limit (10000 per 15 minutes), with menu and historical order endpoints more restrictive at 1 and 5 requests/second respectively. Business dates follow each restaurant's configurable closeoutHour; a sale at 1 AM on June 12 belongs to June 11 if closeoutHour is 3 AM. The API returns voided orders and payments alongside active ones; they must be filtered before posting.

What moves between them

The main flow runs from Toast into MYOB nightly after each restaurant's business close. ml-connector polls Toast orders and checks via GET /ordersBulk?businessDate=YYYYMMDD (accounting for each location's closeoutHour), filters out voided==true records, extracts payments, discounts, service charges, and tax, then maps menu items to MYOB sales invoice item types. It posts a daily net revenue journal into MYOB's general ledger, breaking out net sales, discount impact, service charges (if not gratuity), and tax on separate line items, each mapped to the correct MYOB GL account and customer. Multi-location restaurants require separate Toast-Restaurant-External-ID calls per location; all daily journals post to the same MYOB company file.

How ml-connector handles it

ml-connector caches Toast OAuth2 tokens to avoid hitting the auth rate limit on high-volume reconciliations. For each restaurant location, it retrieves the closeoutHour configuration and adjusts the business date filter accordingly so Toast sales post to the correct calendar day in MYOB. It polls Toast orders at 5 requests/second for historical orders and avoids the menu and config endpoints to stay within rate limits. On the MYOB side, it refreshes the company file token on 401, stores the bearer token and x-myobapi-cftoken header values encrypted, and maintains the RowVersion on any subsequent PATCH or PUT. When posting daily journals, it pre-checks GL account existence via OData $filter before constructing the journal; if an account is missing, it surfaces an error with the account name and allows replay once the account is created. Fundraising items (flagged selections in Toast) are excluded from net sales. Service charges classified as gratuity (gratuityServiceCharge==true) are not posted as revenue, aligning with tip reporting. Every journal carry a full audit trail and can be replayed if a downstream call fails. MYOB does not support an Idempotency-Key header, so ml-connector uses BullMQ jobId deduplication to prevent duplicate journal posts on retry.

A real-world example

A 5-location restaurant group in Sydney uses Toast for point of sale across all sites and MYOB for consolidated accounting. Before the integration, the group manager exported Toast daily sales summaries each morning, manually entered the net revenue and discounts into MYOB as a single journal entry per day, and spent hours each month reconciling discrepancies between Toast and MYOB. With Toast and MYOB connected, the nightly poll automatically posts the previous day's sales, with net revenue, discounts, and service charges broken out to the correct GL accounts, and each location's transactions clearly linked to that restaurant's center. The manager logs in to MYOB each morning to see the previous day's sales already posted, and month-end reconciliation is a matter of spot-checking a summary report rather than re-keying.

What you can do

  • Post daily Toast revenue summaries into MYOB's general ledger, automatically breaking out net sales, discounts, service charges, and tax on separate line items.
  • Handle Toast's multi-location restaurants by polling each Toast-Restaurant-External-ID separately and consolidating all daily journals into a single MYOB company file.
  • Filter out voided orders, checks, and payments and exclude fundraising items and gratuity service charges so only billable revenue posts.
  • Adjust Toast's business date based on each restaurant's configurable closeoutHour so sales post to the correct calendar day in MYOB.
  • Authenticate MYOB with OAuth2 plus company file credentials, cache Toast OAuth tokens to avoid rate limits, and queue every journal post with full audit trail and replay capability.

Questions

How does ml-connector handle Toast's multi-location restaurants when posting to a single MYOB company file?
ml-connector calls Toast separately for each restaurant location using its unique Toast-Restaurant-External-ID guid, retrieves that location's business date and sales, then consolidates all daily journals from every location and posts them into the single MYOB general ledger. You can optionally assign each Toast location to a separate MYOB customer or job code so the reconciliation remains location-specific within the ledger.
What happens if a Toast sale includes a voided order or a gratuity service charge?
ml-connector filters out any Toast record with voided==true before extracting revenue, so voided orders and payments do not post to MYOB. Service charges flagged as gratuity (gratuityServiceCharge==true) are excluded from net revenue and not posted, aligning with tip reporting conventions. Fundraising items (flagged selections) are also excluded from revenue.
How often does ml-connector post Toast sales to MYOB, and what if MYOB returns an error?
ml-connector polls Toast nightly after each restaurant's business close (accounting for closeoutHour), extracts sales and payments, and posts a single daily journal into MYOB's general ledger. Every journal is queued with a full audit trail and jobId deduplication, so if MYOB returns an error such as a missing GL account or a rate-limit 429, ml-connector retries the same jobId and will not post duplicate entries once MYOB recovers or the account is created.

Related integrations

Connect MYOB and Toast

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

Get started