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.
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
More MYOB integrations
Other systems that connect to Snowflake
Connect MYOB and Snowflake
Free to use. Add your credentials, ping your real systems, and see if we fit.
Get started