ml-connector
MYOBSnowflake

MYOB and Snowflake integration

MYOB holds your accounting data: invoices, bills, contacts, and general ledger accounts. Snowflake holds your analytics and reports. Connecting the two lets you query MYOB's transactional records directly in SQL, reconcile invoices against GL accounts, and feed your data lake with current accounting data without manual export-and-import. ml-connector handles the complexity of MYOB's credential model and API constraints while loading data into Snowflake on a reliable schedule.

How MYOB works

MYOB AccountRight Live API v2 exposes contacts, sales invoices, purchase bills, purchase orders, general ledger accounts, general journal entries, inventory items, and tax codes through REST endpoints using OData v3 query parameters. Authentication requires OAuth2 Authorization Code flow plus company file username and password supplied in every request via three headers: Authorization Bearer, x-myobapi-key, and x-myobapi-cftoken. Access tokens expire after 20 minutes and refresh tokens after 1 week. MYOB enforces an 8 requests-per-second rate limit and a daily quota of 1 million requests, with HTTP 429 returned on excess. The API supports polling only via OData LastModified filters; no webhooks or push notifications are available. Maximum page size is 1000 records per request.

How Snowflake works

Snowflake is a managed data warehouse providing SQL query and storage through REST APIs. It authenticates via Key Pair Authentication using RSA private keys and JWT tokens or Programmatic Access Tokens, both long-lived and renewed on expiry. Data is stored in user-defined tables within databases and schemas; Snowflake provides native Change Data Capture through Streams (which track INSERT/UPDATE/DELETE rows destructively) and Tasks (scheduled external function calls). The SQL API supports both synchronous and asynchronous queries; async queries return HTTP 202 with a statement handle for polling. Snowflake is a data warehouse, not an ERP, so ml-connector defines the table schema once and then loads records into those tables. Case sensitivity requires quoted identifiers to preserve lowercase names. The warehouse must have AUTO_RESUME enabled for queries to succeed.

What moves between them

The main flow is MYOB into Snowflake. ml-connector polls MYOB on a schedule you set, extracting sales invoices, purchase bills, contacts, purchase orders, and general ledger transactions since the last sync using OData LastModified filters. Each record is written to a corresponding Snowflake table: invoices, bills, contacts, purchase_orders, and gl_transactions. For repeated syncs, Snowflake Streams track which rows are new or changed, or you can query by timestamp watermark to find records modified since the last load. The connector does not write back to MYOB. Reference data such as contacts and GL accounts are synced first so foreign-key relationships in invoices and bills resolve correctly.

How ml-connector handles it

ml-connector stores your MYOB OAuth token and company file credentials encrypted, and refreshes the OAuth token every 15 minutes so the 20-minute expiry does not interrupt a sync run. It applies the 8 requests-per-second rate limit locally, queuing requests and backing off if MYOB returns 429. Every request includes the required MYOB headers: Authorization Bearer, x-myobapi-key, and x-myobapi-cftoken. Records are pulled using OData $filter=LastModified ge datetime'YYYY-MM-DD HH:MM:SS' to detect changes since the previous sync, and large result sets are paginated at 1000 records per page. On the Snowflake side, ml-connector creates target tables with columns matching MYOB entity fields (e.g., InvoiceNumber, Total, IssueDate) and loads data as JSON objects into VARIANT columns if semi-structured data is needed. It can leverage Snowflake Streams for native CDC, in which case rows consumed from the Stream are removed on read; alternatively, a timestamp watermark query persists the last sync time and only fetches rows newer than that point on the next run. All records carry a full audit trail: the load job ID, the source record ID, the timestamp, and the status of any downstream SQL operation. If a Snowflake insert or update fails, the record is logged with the SQL error so you can replay it or investigate the schema mismatch.

A real-world example

A mid-market NZ accounting firm uses MYOB for client bookkeeping and needs to consolidate monthly invoices and bills across 50 clients into a single Snowflake warehouse for partner analytics and revenue reporting. Before the integration, the firm exported MYOB invoices as CSV files each month, manually concatenated them, and loaded them into Snowflake via SQL INSERT statements, a process that took 2 hours and was error-prone when invoice numbers collided across clients or GL account codes changed. With MYOB and Snowflake connected, invoices and bills flow automatically into Snowflake on a nightly schedule, deduplicated by MYOB UID, and the firm's analysts can query the consolidated ledger directly in SQL without waiting for manual exports. Month-end reporting runs in minutes instead of hours.

What you can do

  • Poll MYOB on a schedule you control and extract invoices, bills, purchase orders, contacts, and GL transactions using OData LastModified filters.
  • Load MYOB records into Snowflake tables with native Change Data Capture via Streams or timestamp watermark queries for efficient incremental updates.
  • Handle MYOB's dual-credential OAuth2 and company file authentication, with automatic token refresh every 15 minutes to prevent expiry.
  • Respect MYOB's 8 requests-per-second rate limit and 1 million daily request quota by queuing locally and backing off on HTTP 429.
  • Maintain a complete audit trail of every record loaded to Snowflake, with job IDs and timestamps for replay and error investigation.

Questions

Does ml-connector support real-time sync from MYOB to Snowflake?
No. MYOB does not provide webhooks or push notifications, so ml-connector polls MYOB on a schedule you set using OData LastModified filters to detect changes since the last sync. For most accounting workflows, a nightly or twice-daily poll is sufficient. If you need sub-hourly updates, you can increase the polling frequency, but you must stay within MYOB's 8 requests-per-second and 1 million daily request limits.
How does ml-connector manage MYOB's 20-minute OAuth token expiry?
ml-connector stores your OAuth credentials encrypted and proactively refreshes the bearer token every 15 minutes, keeping the token fresh throughout a sync run. If a refresh fails, the connector returns a 401 error and stops to prevent partial syncs. The refresh token lasts 1 week, so you must update your credentials if the refresh token expires.
Which MYOB entities can be synced to Snowflake?
ml-connector supports sales invoices, purchase bills, purchase orders, contacts (suppliers, customers, employees), general ledger accounts, general journal entries, inventory items, and tax codes. Each entity is loaded into a corresponding Snowflake table using the column names from the MYOB API (e.g., InvoiceNumber, Total, IssueDate). If MYOB entities you need are missing, contact support to prioritize them.

Related integrations

Connect MYOB and Snowflake

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

Get started