ml-connector
Oracle NetSuiteSnowflake

Oracle NetSuite and Snowflake integration

Oracle NetSuite runs order-to-cash and procure-to-pay. Snowflake stores and queries enterprise data for reporting, analytics, and reconciliation. Connecting the two gives finance teams a single source of truth for transaction history and GL balances without manual exports or re-entry. New sales orders, invoices, vendor bills, and GL postings flow from NetSuite into Snowflake automatically and land in tables ready for reporting dashboards, cost analysis, and audit workflows.

How Oracle NetSuite works

Oracle NetSuite is a cloud ERP platform that exposes vendors, purchase orders, vendor bills, invoices, customers, inventory items, employees, departments, and general ledger accounts through SuiteTalk REST Web Services. Authentication uses OAuth 2.0 Client Credentials (recommended) or legacy Token-Based Authentication. NetSuite can push transaction events via native Event Subscriptions webhooks for record create, edit, and delete on sales orders, invoices, customers, inventory items, and vendor bills. For records not covered by webhooks or for bulk historical reads, ml-connector uses SuiteQL, a SQL query interface that polls data on a schedule. OAuth tokens in the M2M flow are valid for 60 minutes and do not have a refresh token, so ml-connector must refresh the token before each API call.

How Snowflake works

Snowflake is a cloud data warehouse that stores ERP records in user-defined tables and serves as the query engine for financial reporting, analytics, and reconciliation. Snowflake authenticates via Key Pair Authentication with RSA private key and JWT (recommended for service accounts) or via long-lived Programmatic Access Tokens. Snowflake is pull-only--it has no webhooks to external endpoints. Data is retrieved via the SQL API using synchronous or asynchronous (202) queries. The SQL API supports partition-based pagination and gzip-compressed responses. Snowflake Streams provide native change data capture (CDC) for incremental loads, and Snowflake Tasks can trigger scheduled SQL or external function calls. Unquoted identifiers are uppercased, so quoted lowercase table names are required for consistency. Warehouses must have AUTO_RESUME enabled for queries to complete.

What moves between them

The main flow runs from Oracle NetSuite into Snowflake. Purchase orders, vendor bills, invoices, and sales orders push from NetSuite via Event Subscriptions to ml-connector, which routes them into Snowflake transaction tables. General ledger accounts and dimensions (departments, locations, classifications) are synced on a daily schedule via SuiteQL polling to keep the warehouse GL reference data current. Line items are mapped to Snowflake GL dimension tables so finance teams can roll up costs by department or location in reporting queries.

How ml-connector handles it

ml-connector authenticates to Oracle NetSuite using OAuth 2.0 Client Credentials, refreshing the token every 59 minutes since M2M tokens do not have a refresh token endpoint. It ingests Event Subscription webhooks from NetSuite for transaction changes and routes them into Snowflake tables, preserving the original timestamps and record metadata. For records not available via webhooks, it polls SuiteQL on a daily cadence (configurable per flow) to backfill historical data and reference entities like GL accounts and dimensions. On the Snowflake side, ml-connector uses Key Pair Authentication with JWT and the SQL API to upsert records into warehouse tables, handling async 202 responses with polling and partition-based pagination for large result sets. NetSuite Event Subscriptions do not include HMAC signatures, so ml-connector validates webhook authenticity using an IP allowlist and a shared secret in the callback URL. Snowflake Streams (if configured) mark synced rows as consumed on read, so ml-connector tracks watermarks separately to avoid duplicate ingestion on retries.

A real-world example

A mid-market software-as-a-service company runs Oracle NetSuite for order management and accounting, and uses Snowflake for analytics and business intelligence. Before integration, the finance team exported vendor invoices and purchase order data from NetSuite to CSV weekly and loaded it into Snowflake manually for monthly cost center reconciliation and vendor spend analysis. Sync latency meant reports were always one week behind, and invoice corrections in NetSuite would not update Snowflake for another export cycle. With Oracle NetSuite and Snowflake connected, invoice and purchase order events flow in seconds via webhooks, Snowflake tables are always current with NetSuite, and month-end cost rollups and vendor spend queries run on live data without manual intervention.

What you can do

  • Push sales orders, invoices, and vendor bills from Oracle NetSuite into Snowflake transaction tables via Event Subscriptions webhooks.
  • Poll SuiteQL for general ledger accounts, departments, and other GL dimensions to keep Snowflake reference data synchronized on a daily schedule.
  • Map Oracle NetSuite GL accounts to Snowflake dimension tables so costs roll up by cost center, location, or department for reporting and analytics.
  • Refresh OAuth tokens automatically and handle Snowflake asynchronous SQL queries, pagination, and change data capture via Streams.
  • Validate NetSuite webhook authenticity using IP allowlist and shared secret, with a full audit trail on every record loaded into Snowflake.

Questions

Which direction does data move between Oracle NetSuite and Snowflake?
The main flow is from Oracle NetSuite into Snowflake. Transactional records like invoices, purchase orders, and vendor bills push from NetSuite via Event Subscriptions webhooks. General ledger reference data like chart of accounts and dimensions are polled daily via SuiteQL. Snowflake is a data warehouse, not an ERP, so data does not flow back from Snowflake to NetSuite.
Does ml-connector use Event Subscriptions webhooks or SuiteQL polling?
Both. ml-connector ingests NetSuite Event Subscriptions for transactional changes--invoices, sales orders, vendor bills--as they occur. For records not covered by webhooks and for bulk historical data, it polls SuiteQL on a daily schedule. This hybrid approach minimizes latency for critical transactions while ensuring reference data like GL accounts stays synchronized.
How does ml-connector authenticate to Oracle NetSuite and Snowflake?
ml-connector authenticates to Oracle NetSuite using OAuth 2.0 Client Credentials, which requires the integration app client ID and secret. It refreshes the token every 59 minutes since M2M tokens are valid for 60 minutes with no refresh token endpoint. On the Snowflake side, it uses Key Pair Authentication with an RSA private key and JWT to connect to the SQL API and load records into warehouse tables.

Related integrations

Connect Oracle NetSuite and Snowflake

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

Get started