ml-connector
Microsoft Dynamics GPSnowflake

Microsoft Dynamics GP and Snowflake integration

Microsoft Dynamics GP runs your on-premises financial operations: payables, receivables, general ledger, and inventory. Snowflake is your cloud analytics warehouse. Connecting them lets you move financial data out of GP into Snowflake on a repeating schedule, where it feeds dashboards, cost analysis, and business intelligence tools without re-keying or manual exports. ml-connector handles the authentication bridge between your Windows domain and Snowflake, filters out unchanged records, and retries failed writes so your warehouse always has the latest state.

How Microsoft Dynamics GP works

Microsoft Dynamics GP exposes vendors, payables invoices, purchase orders, payments, GL accounts, GL journal entries, customers, receivables invoices, and inventory items through two API surfaces: REST Service Based Architecture (SBA) at https://<server>:<port>/GPService/Tenants(<TenantName>)/Companies(<CompanyName>)/<Module>/<Resource> for GP 2015 and later, or SOAP/WCF Web Services for GP 2010 and later. Authentication is Windows Authentication via Negotiate, Kerberos, or NTLM tied to your Active Directory domain account mapped to a GP User with role-based permissions. GP exposes no webhook system, so records are read by polling with ModifiedDate filters at customer-defined intervals. The company name is the actual SQL Server database name, and records can only be written when in an unposted (Work) state; once posted or closed they are read-only. Posted vs unposted financial records are kept in separate tables, and fiscal periods must be open in the GP calendar to create new transactions.

How Snowflake works

Snowflake is a cloud data warehouse accessed through REST APIs: the SQL API for executing queries and the REST API for resource operations. Authentication uses either Key Pair Authentication with an RSA private key and JWT (recommended for server-to-server connectors), or Programmatic Access Tokens as bearer tokens. Snowflake has no native finance objects; all entities are user-defined tables that you control. Queries use partition-based pagination with gzip-compressed responses, and long-running queries return HTTP 202 with a statement handle for polling. Snowflake does not push data to external endpoints; all data flows inbound via inserts and updates. Case sensitivity requires careful handling because Snowflake uppercases unquoted identifiers, and the warehouse must have AUTO_RESUME enabled for queries to succeed.

What moves between them

The flow is unidirectional from Microsoft Dynamics GP into Snowflake. ml-connector polls GP on a schedule you define (e.g., hourly or daily), reading vendors, payables invoices, purchase orders, GL accounts, GL journal entries, customers, receivables invoices, and inventory items. Each record carries a ModifiedDate timestamp so only changed records are fetched on subsequent polls. Records are written into Snowflake tables as new rows (append) or as updates to existing rows (upsert), depending on your mapping. GL data is particularly important for reporting and reconciliation, and ml-connector ensures that only posted GL entries are synced so your warehouse reflects financial reality. Because GP has no webhooks, the cadence is polling-based and can be tuned to match your business cycle: daily for reconciliation-critical data, hourly for operational dashboards.

How ml-connector handles it

ml-connector stores your Windows domain account credentials encrypted and presents them to the GP endpoint using Windows Authentication (Negotiate, Kerberos, or NTLM) on every request. It accepts the server hostname and port, tenant name, and company database name as configuration per customer, since GP installations are on-premises and vary by deployment. On the Snowflake side, ml-connector stores the RSA private key or bearer token encrypted and uses it to generate JWTs or attach the token to every API call. When querying Snowflake's SQL API, ml-connector polls async query handles with exponential backoff until the result is ready, then upserts the fetched GP records into the target tables. It tracks the ModifiedDate watermark from each poll cycle and uses it as a filter on the next poll (e.g., $filter=ModifiedDate ge 2024-06-12) so unchanged records are never re-fetched. If a record is posted or in a closed fiscal period in GP, it is treated as read-only and will not be updated even if the source record changes. Snowflake's network policies require the connector egress IP to be whitelisted, and ml-connector respects Snowflake's lack of rate limits by backing off on HTTP 429 and logging all polling cycles in the audit trail so failures can be replayed. Every record retains its source identifiers and timestamps so you can trace the data path from GP to Snowflake and validate reconciliation.

A real-world example

A regional beverage distributor runs Microsoft Dynamics GP on-premises for payables, purchasing, and inventory across three regional hubs. The finance team wants to analyze payables aging and purchase orders by region and product category, but exports require manual work and lag by a day or two. The warehouse team maintains Snowflake as their business intelligence platform. By connecting GP to Snowflake, payables invoices, purchase orders, and GL accounts flow into the warehouse hourly. Finance analysts can query current state without asking the AP team for an export, and the BI dashboards update automatically so aging reports and spend analysis always reflect the current state. Month-end reconciliation is faster because the warehouse has the full audit trail of when records were posted in GP.

What you can do

  • Poll Microsoft Dynamics GP vendors, invoices, purchase orders, GL accounts, and inventory items on a schedule you define, with ModifiedDate filtering to avoid re-fetching unchanged data.
  • Authenticate to on-premises GP with your Windows domain account and to Snowflake with key pair or bearer token, with encrypted credential storage.
  • Write records into Snowflake tables as appends or upserts, with automatic schema mapping and case-sensitivity handling.
  • Handle Snowflake's async SQL API with polling, exponential backoff, and failure replay so data always reaches the warehouse.
  • Respect GL posting state and fiscal period open status so only truly valid financial records are synced and your warehouse reflects GP's authoritative state.

Questions

Does ml-connector work with all versions of Microsoft Dynamics GP?
ml-connector supports GP 2015 and later via REST Service Based Architecture (SBA), and GP 2010 and later via SOAP Web Services. Verify with your administrator which API surface is installed at your site, since many on-premises installs run SOAP-only. GP support ends September 30, 2029, so migration to Dynamics 365 Business Central may be worth planning.
What happens if a GL entry is posted in GP after we have already synced it to Snowflake?
ml-connector syncs only unposted (Work) records and records already in Open or Historical state. Once a record transitions from Work to Open (posted), it becomes read-only in GP and will not be updated further. Your Snowflake table will retain the historical record so you have a complete audit trail.
Does Snowflake require network setup to allow ml-connector to connect?
Yes. Snowflake uses network policies to restrict which IP addresses can reach it. Before connecting, work with your Snowflake administrator to whitelist the egress IP that ml-connector uses, and ensure your warehouse has AUTO_RESUME enabled so queries do not time out.

Related integrations

Connect Microsoft Dynamics GP and Snowflake

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

Get started