ml-connector
MYOBBILL

MYOB and BILL integration

MYOB runs accounting for small to medium businesses across Australia and New Zealand. BILL automates accounts payable, accounts receivable, and spend workflows. Connecting the two keeps your vendor master synchronized between accounting and payables automation, and moves bills and payments between systems without re-keying. ml-connector manages the different authentication schemes on each side and moves the data on a schedule you control.

How MYOB works

MYOB AccountRight Live API v2 exposes contacts (suppliers, customers, employees), purchase bills, purchase orders, supplier payments, sales invoices, customer payments, general ledger accounts, general journals, inventory items, and tax codes through REST endpoints with OData v3 query parameters. Authentication requires OAuth2 Authorization Code flow plus company file username and password supplied in three headers on every call: Authorization Bearer token, x-myobapi-key (API Key), and x-myobapi-cftoken (Base64-encoded company file credentials). Access tokens expire in 20 minutes and refresh tokens last 1 week. MYOB has no webhooks or push notifications, so all changes are detected by polling with OData $filter on LastModified timestamps. The API enforces rate limits of 8 requests per second and 1 million requests per day per API key.

How BILL works

BILL exposes vendors, bills, payments, recurring bills, vendor credits, customers, invoices, credit memos, recurring invoices, chart of accounts, funding accounts, and documents through REST endpoints at https://gateway.prod.bill.com/connect/v3/. Authentication uses a session-based flow: POST to /v3/login with username, password, organizationId, and devKey to obtain a sessionId that expires after 35 minutes of inactivity (or 48 hours for sync tokens). Spend and Expense records use a separate API token in the Authorization header. BILL supports webhooks for push notifications; up to 10 subscriptions per organization can watch events like vendor.created, vendor.updated, bill.created, bill.updated, and payment.updated. Webhook signatures are verified via HMAC-SHA256 in the x-bill-sha-signature header.

What moves between them

The main flow is MYOB to BILL. Supplier contacts from MYOB are synchronized into BILL as vendors, and purchase bills created in MYOB flow into BILL as bills. When a supplier is updated in MYOB or a bill changes, ml-connector detects the modification on the next poll cycle using LastModified timestamps and pushes the update to BILL. BILL's purchase orders are not available in the REST API, so only bills flow in this direction. BILL webhook events for vendor, bill, and payment changes are received and can trigger downstream sync to other connected systems or audit logging.

How ml-connector handles it

ml-connector stores both MYOB OAuth credentials and company file username/password encrypted, and supplies the full dual-auth header set on every MYOB REST call. The 20-minute OAuth access token is refreshed proactively before expiry to avoid mid-request failures. ml-connector polls MYOB suppliers and bills on a regular cadence using OData $filter with the LastModified field to detect only changed records since the last sync; this avoids re-processing unchanged data. For BILL, ml-connector calls POST /v3/login with the provided username, password, organizationId, and devKey to obtain a sessionId, then uses that session on subsequent API calls until the 35-minute inactivity timer expires. BILL's webhook subscriptions are registered at setup, and every webhook payload is validated using HMAC-SHA256 signature verification with the stored securityKey before processing. When MYOB rate limits (8 req/s) are hit, ml-connector backs off exponentially and retries. MYOB requires RowVersion on PATCH and PUT operations; ml-connector fetches the current RowVersion before update to avoid 409 conflicts. BILL does not support purchase orders in its v3 API, so bill-only sync is enforced. Every record carries a full audit trail with timestamps and can be replayed if a webhook or downstream call fails.

A real-world example

A small accounting firm in Melbourne runs MYOB AccountRight for 15 client businesses, managing supplier invoices, payments, and general ledger entries across all clients. The firm also uses BILL internally to automate its own accounts payable and spend workflows. Before the integration, when a client's supplier changed address or payment terms in MYOB, the firm's staff had to manually enter that change into BILL's vendor list. When bills arrived and were entered in MYOB, they were re-keyed into BILL, duplicating effort and creating reconciliation gaps. With MYOB and BILL connected, supplier changes sync automatically into BILL's vendor master, and bills created in MYOB flow directly into BILL for payment automation. The accounting team no longer re-enters vendor data, and bills hit BILL in real time for timely payment processing.

What you can do

  • Synchronize supplier contacts from MYOB to BILL as vendors, with LastModified polling to detect updates.
  • Post purchase bills created in MYOB into BILL, mapped to the matching vendor record.
  • Refresh MYOB OAuth tokens automatically before expiry to prevent mid-request failures.
  • Handle MYOB's dual authentication (OAuth2 Bearer token plus company file credentials) on every call.
  • Verify BILL webhook signatures using HMAC-SHA256 and respond to vendor, bill, and payment events in real time.

Questions

Does ml-connector support MYOB purchase orders?
No. MYOB's AccountRight Live API v2 exposes purchase orders, but BILL's v3 API does not support purchase orders in its REST endpoints. The integration syncs supplier contacts and purchase bills between the systems. If purchase order tracking is needed, those records must be managed separately or in MYOB alone.
How does ml-connector handle MYOB's 20-minute access token expiry?
ml-connector proactively refreshes the MYOB access token before the 20-minute expiry window closes, using the stored refresh token (which lasts 1 week). This prevents mid-request authentication failures. If a refresh token expires, ml-connector will return a new OAuth2 authorization grant via the stored credentials.
What happens if MYOB or BILL rate limits are reached?
MYOB enforces 8 requests per second and 1 million requests per day per API key; BILL's limits are enforced at the gateway. When a 429 (Too Many Requests) response is received, ml-connector pauses, backs off exponentially with jitter, and retries the request. Every retry is logged in the audit trail so the sync can be reviewed.

Related integrations

Connect MYOB and BILL

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

Get started