ml-connector
Sage 50Snowflake

Sage 50 and Snowflake integration

Sage 50 is an on-premise accounting system, and Snowflake is a cloud warehouse. Moving accounting records from Sage 50 into Snowflake lets you run analytics, build dashboards, and archive your ledger without manually exporting spreadsheets. ml-connector reads Sage 50 records via the local Windows SDK, polls for changes on a schedule you set, and writes the data into Snowflake tables for long-term storage and querying.

How Sage 50 works

Sage 50 is a desktop application available in US (Peachtree) and UK (Line 50) editions, installed on Windows with direct access to company data files on disk. It exposes vendors, customers, purchase invoices, sales invoices, purchase orders, sales orders, payments, receipts, accounts, general journal entries, employees, inventory items, and goods received notes through a local .NET SDK (US) or Sage Data Objects COM layer (UK). No REST API, no webhooks, no remote integration surface. Authentication uses Windows-local username and password against the Sage 50 user database plus a full path to the company data folder or ApplicationID. Integration requires a Windows process running on the same machine or LAN with direct file access. Data discovery relies on polling by LastModifiedDate or TransactionDate; the recommended minimum poll interval is 5 to 15 minutes for near-real-time sync.

How Snowflake works

Snowflake is a cloud data warehouse serving as storage and query engine for structured business data. It exposes SQL tables, databases, and schemas through REST APIs (SQL statement API at https://<account_identifier>.snowflakecomputing.com/api/v2/statements) and supports Key Pair authentication (RSA private key plus JWT, recommended for server-to-server) or Programmatic Access Token bearer auth. Snowflake is pull-only from the connector side: it accepts incoming REST writes to insert or upsert vendor, invoice, account, and journal records into tables you define, with no push webhooks to external systems. The SQL API uses partition-based pagination and returns async queries as HTTP 202 with statement handles for polling. JWT tokens expire in 1 hour and PAT tokens in 1 to 365 days. Warehouse must have AUTO_RESUME enabled. Snowflake uppercases unquoted identifiers, and rate limits return HTTP 429 with no published threshold; exponential backoff is recommended.

What moves between them

Records flow from Sage 50 into Snowflake. The polling agent queries Sage 50 for vendors, customers, purchase invoices, sales invoices, general journal entries, accounts, and employees by LastModifiedDate or TransactionDate. Batches of records are sent to Snowflake via REST INSERT or MERGE operations into tables you define in your warehouse. Because Sage 50 has no webhooks, polling runs on a schedule (typically hourly to daily depending on transaction volume). Snowflake is read-only from the Sage 50 side: ml-connector does not write accounting data back into Sage 50. Change detection in Snowflake is done via SQL timestamp watermarks on the receive side.

How ml-connector handles it

ml-connector runs a Windows service or scheduled task on a machine where Sage 50 is installed. It stores the Sage 50 ApplicationID or DataPath, username, and password encrypted at rest. At poll time, it opens a local SDK or COM session, authenticates with the stored credentials, queries for modified records by date range, and closes the session. Records are batched and sent to Snowflake via the SQL statement REST API using Key Pair authentication (JWT from the private key) or a Programmatic Access Token. ml-connector handles JWT token expiry by refreshing before 1 hour elapses, and it retries failed Snowflake writes with exponential backoff when it encounters HTTP 429 rate limits. Because Sage 50 is exclusive-access desktop software, the polling agent must not run while a user is logged in interactively. GL account creation is supported but modifications to fundamental account structure are limited. All records carry a sync timestamp and source identifier for audit and replay.

A real-world example

A mid-sized accounting firm manages dozens of small-business clients using Sage 50. Each client's ledger is isolated in its own Sage 50 company folder on a shared Windows server. Before the integration, the firm exported trial balances and journal registers from each client monthly via Sage 50 export dialogs and hand-loaded them into a shared data warehouse for consolidated reporting and audit. With Sage 50 and Snowflake connected, ml-connector polls each client's Sage 50 company folder every 6 hours, pushes vendors, invoices, accounts, and GL entries into Snowflake, and the firm runs cross-client analytics, balance-sheet rollups, and audit reconciliations via SQL queries. Month-end close reporting is automated, and the manual export-and-load cycle is eliminated.

What you can do

  • Read vendors, customers, invoices, orders, payments, accounts, and general journal entries from Sage 50 via local Windows SDK or COM layer and push them into Snowflake tables.
  • Poll Sage 50 on a schedule you control, querying for changes by date range and sending batches to Snowflake via REST with encrypted credentials.
  • Authenticate Sage 50 with local Windows username and password, and Snowflake with Key Pair authentication or Programmatic Access Token.
  • Handle JWT token expiry and rate-limiting backoff on the Snowflake side, with full retry logic and no data loss.
  • Maintain an audit trail of every record sync, including source timestamp, modification date, and sync completion status in Snowflake.

Questions

Does ml-connector support both Sage 50 US and UK editions?
Yes. The US edition is integrated via the .NET SDK or legacy COM/ODBC layer, and the UK edition via Sage Data Objects. Both require a Windows machine with Sage 50 installed and direct access to company data files. ml-connector detects the edition by the presence of .SAI files (US) or AccData folder (UK) and routes accordingly.
What happens if a Sage 50 user logs in interactively while ml-connector is polling?
Sage 50 enforces exclusive file access, so the SDK session will fail or lock the user out. ml-connector detects this condition and pauses polling until the user logs out, then resumes. The polling agent should run on a dedicated Windows server or VM separate from user desktops to avoid conflicts.
Does Snowflake push any events back to Sage 50?
No. The integration is one-way: Sage 50 into Snowflake only. Snowflake is a data warehouse and does not write accounting entries back to Sage 50. If you need two-way sync (e.g., vendor master or price updates), that requires a separate flow from Snowflake back into Sage 50, which is not part of this integration.

Related integrations

Connect Sage 50 and Snowflake

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

Get started