ml-connector
MYOBTaxJar

MYOB and TaxJar integration

MYOB handles accounting across Australia and New Zealand. TaxJar automates sales tax compliance and calculation. Connecting the two keeps your tax reporting in sync with your actual sales. Every invoice MYOB records flows to TaxJar for real-time tax rate calculation and automatic reporting to tax authorities. No re-entry, no manual reconciliation, no missed transactions.

How MYOB works

MYOB Business API exposes contacts, invoices, purchase orders, general ledger accounts, items, and tax codes through REST endpoints with OData v3 query parameters. Authentication requires OAuth2 authorization code flow plus a company file username and password, passed as base64-encoded credentials in the x-myobapi-cftoken header on every call. Access tokens expire after 20 minutes and refresh tokens after one week. The API enforces an 8 requests-per-second rate limit and 1 million requests per day per API key. MYOB does not support webhooks, so polling with LastModified timestamps is the only way to detect changes.

How TaxJar works

TaxJar exposes tax calculations, transaction reporting, nexus regions, and rate lookup through REST endpoints at api.taxjar.com. It uses token-based API key authentication without OAuth2, accepting the key either as a Bearer token or in the Authorization Token header. TaxJar provides a stateless sandbox environment for testing, available to Professional plan customers and above. The platform does not support webhooks or event subscriptions, so integrations are poll-based or merchant-initiated via real-time POST calls at checkout. Idempotency is handled by the API: a 422 conflict response on POST means the transaction exists, and a PUT update is required; a 404 on PUT means a POST is needed instead.

What moves between them

Sales invoices move from MYOB to TaxJar. ml-connector polls MYOB for new or modified invoices using OData $filter on LastModified, extracts the customer, line items, and totals, and posts each transaction to TaxJar's transaction endpoint. TaxJar calculates the applicable sales tax based on the customer address and item categories and stores the transaction for reporting to state tax authorities. The flow is one-direction: TaxJar is read-only for tax rate lookups, and MYOB remains the source of truth for invoice data.

How ml-connector handles it

ml-connector stores both the MYOB OAuth token and the company file credentials (username and password) encrypted, and re-authenticates with fresh tokens when they expire. On each poll cycle, it reads MYOB invoices using OData $filter=LastModified gt datetime'YYYY-MM-DD'T'HH:mm:ss' and maps MYOB sale line items to TaxJar transaction format, including the customer address, item SKUs mapped to TaxJar tax categories, and line totals. When posting to TaxJar, it handles the idempotency quirk: if a 422 exists response comes back, it falls back to a PUT to update the existing transaction; if a 404 comes back on the PUT, it retries POST. MYOB enforces a RowVersion field on every record and returns 409 conflicts on stale versions, so ml-connector reads the full invoice object before any update. Rate limits on both sides trigger HTTP 429 responses; ml-connector backs off with exponential jitter and retries. Every transaction posted carries a job ID for replay if a downstream call fails.

A real-world example

A mid-sized e-commerce company based in Australia uses MYOB for bookkeeping and invoice management, and TaxJar to handle sales tax compliance across multiple states and territories where they have nexus. Before integration, the finance team exported invoices from MYOB weekly and manually uploaded them to TaxJar, then spot-checked that TaxJar's tax calculations matched the amounts recorded in MYOB. With MYOB and TaxJar connected, each invoice syncs automatically within minutes of being saved in MYOB, TaxJar calculates tax in real time, and the finance team receives alerts if a transaction fails to report. Month-end tax reconciliation is now a simple dashboard check instead of manual comparisons and re-uploads.

What you can do

  • Poll MYOB invoices on a schedule tied to your billing cycle and post completed transactions to TaxJar.
  • Map MYOB customer addresses and item SKUs to TaxJar transaction format, including tax category codes.
  • Bridge MYOB multi-credential OAuth and company file auth to TaxJar token-based API without manual credential juggling.
  • Handle MYOB's RowVersion conflicts and TaxJar's idempotency quirks (422 and 404 fallbacks) automatically.
  • Track every transaction with a job ID, audit trail, and replay capability if a downstream call fails.

Questions

Which way does data flow between MYOB and TaxJar?
Data flows one direction: from MYOB invoices into TaxJar for tax calculation and compliance reporting. ml-connector reads invoices from MYOB and posts them as transactions to TaxJar. TaxJar remains read-only for tax rate lookups; MYOB is the authoritative source of all invoice and transaction data.
How does ml-connector handle MYOB's complex OAuth and company file credential requirement?
ml-connector stores both the OAuth token and the company file username and password encrypted, and includes both in every API call. When OAuth tokens expire after 20 minutes, ml-connector refreshes them using the refresh token. When company file credentials are invalid, TaxJar returns 401 and ml-connector alerts the customer to update the stored credentials.
Does TaxJar's idempotency model need special handling?
Yes. TaxJar returns 422 if a transaction already exists on a POST; in that case ml-connector falls back to a PUT to update it. If the PUT returns 404, ml-connector retries POST. This bidirectional fallback ensures invoices are reliably synced without duplicates or missed updates.

Related integrations

Connect MYOB and TaxJar

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

Get started