ml-connector
Epicor KineticSnowflake

Epicor Kinetic and Snowflake integration

Epicor Kinetic runs your manufacturing and distribution finance. Snowflake is your cloud data warehouse. Connecting the two lets you move accounts payable invoices, purchase orders, payments, and GL account hierarchies out of Epicor and into Snowflake tables where your finance team can query, reconcile, and report on them. No manual exports, no spreadsheet imports, no month-end delays waiting for data to be available.

How Epicor Kinetic works

Epicor Kinetic exposes vendors, AP invoices, purchase orders, AP payments, GL accounts, and parts through REST OData v4 endpoints. Cloud instances authenticate with OAuth2 client credentials or API Key combined with Basic Auth; on-premises sites use Token Resource Service to exchange Basic credentials for short-lived Bearer tokens. Epicor has no native outbound webhooks, so record changes are detected by polling with OData $filter on date fields to retrieve modified records since the last sync. Write operations follow a two-step pattern: GetNewXxx call followed by UpdateMaster, and Bearer tokens expire in approximately one hour.

How Snowflake works

Snowflake is a cloud data warehouse that stores financial data in user-defined SQL tables. It authenticates with Key Pair Authentication using RSA private keys and JWT tokens, or with programmatic access tokens. Queries run via the REST SQL API and support timestamp-based change detection using WHERE clauses on updated_at fields. Snowflake Streams offer native change data capture, and Tasks can trigger external function calls on a schedule. The warehouse must have AUTO_RESUME enabled, and async queries return an HTTP 202 with a statement handle for polling.

What moves between them

The main flow runs from Epicor Kinetic into Snowflake. After each poll cycle, ml-connector reads Epicor AP invoices, purchase orders, payments, and GL accounts using OData $filter on UpdatedOn to retrieve changes since the last run. These records are inserted or updated into Snowflake tables in your warehouse schema. GL account hierarchies and vendor master records are synced first so every invoice line references valid GL accounts and vendor dimensions. Change detection uses Epicor's UpdatedOn timestamp field filtered through OData; Snowflake Streams can then track downstream transformations if you need them.

How ml-connector handles it

ml-connector stores Epicor credentials encrypted (Basic Auth, API Key, or OAuth2 client ID and secret) and stores your Snowflake private key encrypted as well. For Epicor, it refreshes OAuth2 Bearer tokens before expiry and implements exponential backoff if calls hit Epicor's undocumented rate limits. It polls using OData $filter: UpdatedOn gt {last_sync_timestamp} to retrieve only changed invoices and orders, and uses offset pagination with $skip and $top=100. For Snowflake, it uses Key Pair Authentication to obtain short-lived JWT tokens that expire in one hour, respects Snowflake's requirement that the warehouse has AUTO_RESUME enabled, and inserts records into tables you define in your warehouse schema. If a write fails, the record is retried with exponential backoff, and every record carries a full audit trail so failed syncs can be replayed. Snowflake's case-sensitivity rules are respected: unquoted identifiers are uppercased, so table and column names must be quoted consistently or normalized to uppercase in your schema.

A real-world example

A mid-sized manufacturing company uses Epicor Kinetic for procurement and finance across multiple plants and warehouses. Before the integration, the accounting team exported AP invoices from Epicor once a week, uploaded them to Snowflake manually in CSV format, then ran reports to reconcile invoice totals against GL postings. Month-end close involved chasing down missing invoices and re-uploading corrected extracts. With Epicor and Snowflake connected, AP invoices sync every 8 hours without manual intervention. The finance team can query current invoices and their GL allocations directly from Snowflake, spot discrepancies in real time, and close the books faster. Vendor master records and GL dimensions stay synchronized so every line item references valid accounts.

What you can do

  • Extract AP invoices, purchase orders, and GL accounts from Epicor Kinetic using OData polling with timestamp-based change detection.
  • Write records into Snowflake tables with your own schema design, supporting transformations and downstream reporting.
  • Authenticate to Epicor with OAuth2, Basic Auth, or API Key, and to Snowflake with Key Pair Authentication or programmatic access tokens.
  • Handle Epicor token refresh cycles, rate limit backoff, and Snowflake warehouse resume requirements automatically.
  • Replay failed syncs with a full audit trail so no record is silently dropped.

Questions

How does ml-connector handle Epicor Kinetic's lack of webhooks?
ml-connector polls Epicor Kinetic on a schedule you define, querying for records changed since the last sync using OData $filter on the UpdatedOn timestamp field. This approach means data reaches Snowflake with a latency equal to your polling interval, but no manual configuration is required on the Epicor side.
What if my Snowflake warehouse is paused when ml-connector tries to write?
ml-connector respects Snowflake's requirement that AUTO_RESUME is enabled on the warehouse. If the warehouse is paused, Snowflake will resume it automatically, but this adds a short delay to your first write. You can also pin the warehouse to Always On if your data SLA requires sub-minute latency.
Which Epicor records can be synced to Snowflake?
The integration supports vendors, AP invoices, purchase orders, AP payments, GL accounts, and parts from Epicor Kinetic. You define the Snowflake table schema, so you can choose which fields to store and how to organize them. More complex analysis like cash application or invoice aging can be computed in Snowflake after the base records are synced.

Related integrations

Connect Epicor Kinetic and Snowflake

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

Get started