ml-connector
MYOBAdobe Commerce

MYOB and Adobe Commerce integration

MYOB manages accounting and general ledger for SMEs across Australia and New Zealand. Adobe Commerce runs the e-commerce storefront. Connecting the two keeps revenue in sync between point-of-sale and the ledger. Every order placed in Adobe Commerce flows into MYOB as a sales invoice, posted to the correct GL account and customer record, so month-end close sees the real revenue without re-keying. Customer records stay aligned, and MYOB reference data keeps Adobe Commerce mappings accurate.

How MYOB works

MYOB Business API (AccountRight Live API v2) exposes contacts, purchase and sales documents, general ledger accounts, inventory items, and tax codes through REST with OData v3 query parameters. Cloud and desktop editions connect via tenant-specific base URLs. Authentication requires OAuth2 Authorization Code flow, an API key, and company file username/password credentials; access tokens expire after 20 minutes and refresh tokens last one week. MYOB does not support webhooks or event push, so data is read by polling with LastModified timestamp filters to detect changes since the last sync.

How Adobe Commerce works

Adobe Commerce provides REST and GraphQL APIs for orders, invoices, customers, products, and B2B entities (SaaS and PaaS models). Both expose the same core order and invoice structures, though PaaS uses consumer OAuth 1.0a credentials and SaaS uses IMS OAuth 2.0 client credentials. Adobe Commerce supports synchronous webhooks (x-adobe-commerce-webhook-signature HMAC SHA256) on SaaS editions, and also supports event subscriptions through Adobe I/O Events. GL accounts and payments are not exposed as discrete API resources; the ERP must apply its own GL rules during mapping.

What moves between them

Sales invoices flow from Adobe Commerce into MYOB. When an order is placed or invoiced in Adobe Commerce, ml-connector either receives a webhook push or polls for new orders on a schedule. For each order, ml-connector reads the order detail, customer, and line items from Adobe, maps the customer to a MYOB contact and each product to a GL account, then creates a sales invoice in MYOB's general ledger. Customers and products are synced inbound from MYOB as reference data to validate mappings before posting. MYOB GL accounts and tax codes flow one direction for read-only mapping.

How ml-connector handles it

ml-connector stores MYOB OAuth tokens and company file credentials encrypted, and presents both the OAuth bearer token and the company file credentials header (x-myobapi-cftoken) on every MYOB API call. MYOB access tokens expire in 20 minutes, so ml-connector caches the refresh token and re-authenticates transparently on 401. For Adobe Commerce, ml-connector validates the webhook signature using the HMAC SHA256 algorithm with the webhook secret, and also supports fallback polling when webhooks are unavailable. Since MYOB has no webhooks, Adobe Commerce order notifications are either received via Adobe's synchronous webhook on SaaS editions or polled on a schedule. Product-to-GL-account mappings are stored per customer and validated against current MYOB GL accounts before each sync to avoid posting to deleted or archived accounts. Adobe Commerce orders include payments and captures via the Order and Invoice resources only; ml-connector extracts the captured amount from the Invoice when available. MYOB enforces RowVersion on updates, so ml-connector reads the current RowVersion before any PATCH or PUT to avoid 409 conflicts. Every invoice post carries a full audit trail, and failed invoices can be replayed once the root cause is fixed.

A real-world example

A mid-sized Australian retailer runs an e-commerce storefront on Adobe Commerce to sell directly to customers and through B2B resellers, while MYOB tracks all accounting and general ledger. Before the integration, the finance team extracted order reports from Adobe Commerce every evening and manually created sales invoices in MYOB by GL account and customer, a process that took 30 minutes to an hour and frequently introduced mismatches between the two systems. Customer addresses changed in Adobe but not in MYOB, GL accounts were retired in MYOB but old mappings persisted in spreadsheets, and month-end reconciliation required hours of matching orders to invoices. With MYOB and Adobe Commerce connected, every order triggers an invoice in MYOB within minutes, posted to the correct GL account and customer record. The finance team no longer re-keys revenue, customer data stays current, and month-end close can begin as soon as the cutoff hits.

What you can do

  • Receive Adobe Commerce orders via webhook or polling and post them as sales invoices into MYOB's general ledger, mapped to the correct customer contact and GL account.
  • Sync customers and products from MYOB as read-only reference data to validate mappings before any invoice is posted to the ledger.
  • Handle MYOB's dual authentication (OAuth2 bearer token plus company file credentials) and automatic token refresh when access tokens expire.
  • Validate webhook signatures from Adobe Commerce using HMAC SHA256 and fallback to REST polling when webhooks are unavailable.
  • Track order state, invoice amounts, and customer details with a full audit trail, and replay failed invoices once the root cause is resolved.

Questions

How does ml-connector handle MYOB's requirement for both OAuth2 and company file credentials?
ml-connector stores the OAuth2 token and the company file credentials (username and password) encrypted in the database. On every API call to MYOB, it presents both the Authorization Bearer token and the x-myobapi-cftoken header (the Base64-encoded company file credentials). When the access token expires after 20 minutes, ml-connector uses the refresh token to obtain a new bearer token transparently, so the sync does not require manual re-authentication.
What happens when MYOB has no webhooks but Adobe Commerce does?
ml-connector receives synchronous webhooks from Adobe Commerce on SaaS editions (signed with HMAC SHA256) and posts invoices to MYOB within seconds. On PaaS editions or when webhooks are unavailable, ml-connector polls Adobe Commerce for new orders on a schedule, reading using REST with the Adobe credentials, and then posts each order to MYOB via the same invoice creation flow. Both paths produce the same result.
Can ml-connector post GL transactions to MYOB that violate the chart of accounts?
No. Before posting any invoice, ml-connector reads the current list of MYOB GL accounts from the source side and validates that the mapped GL account exists and is not archived. If an account is retired in MYOB, the mapping is flagged and the sync pauses until a new account is configured. This prevents orphaned transactions and ensures every invoice lands on a valid GL account.

Related integrations

Connect MYOB and Adobe Commerce

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

Get started