Connect NetSuite to Snowflake
Land NetSuite transactions, entities, and custom records in Snowflake without a nightly export you cannot see into: SuiteQL and saved searches on a short schedule, or a SuiteScript push for the tables that need it, merged on internal ID with a watermark. Every load is an ordered run you can replay.
Why teams connect NetSuite and Snowflake
NetSuite is the source of truth for revenue, cost, and inventory. Snowflake is where finance and analytics model it against sales, product, and marketing. NetSuite has no change-data-capture stream, so the usual pipeline is a nightly saved-search export, a fragile ODBC job, or a managed connector that is a black box at month-end.
- Transactions and entities land in Snowflake every few minutes on a lastModified watermark, and the connector's Record changed trigger polls a SuiteQL last-modified timestamp for the tables that need a shorter interval
- SuiteQL joins pull a transaction with its customer, subsidiary, and line items in one query, so the warehouse tables are already shaped for reporting
- Every load is an ordered run log with the query, the row count, and the merge, so a number that looks wrong in a board is traceable to a specific sync
- Concurrency governance is respected: the connector paces queries so a backfill does not trip NetSuite limits for the rest of the account
Worked example
The load flow most finance-analytics teams turn on first.
NetSuite transactions into RAW.NETSUITE.TRANSACTION, every five minutes
Watermark-driven through SuiteQL, with a nightly full reconcile.
- Trigger: a schedule every 5 minutes.
- Query:
Run SuiteQLfor transactions wherelastmodifieddate > :watermark, joining the entity, subsidiary, and currency, up to 1,000 rows per page. - Lines: a second SuiteQL query pulls the transaction lines for the same set, into a
TRANSACTION_LINEtable. - Stage and merge: for a batch above 5,000 rows, stage and
COPY INTO; below that, merge directly.MERGE INTO RAW.NETSUITE.TRANSACTION t USING :batch s ON t.INTERNAL_ID = s.INTERNAL_ID. - Watermark: write the max
lastmodifieddateseen to a control table. - Deletes: a nightly saved search of deleted records marks
IS_DELETED = TRUEin the warehouse. - Nightly reconcile: a full saved-search export of the trailing 45 days is merged, catching any row a short-window watermark missed.
Field mapping
The starting map for the transaction to RAW.NETSUITE.TRANSACTION step.
| NetSuite (SuiteQL) | Snowflake column | Notes |
|---|---|---|
transaction.id | INTERNAL_ID NUMBER | Merge key. |
transaction.type | TYPE VARCHAR | SalesOrd, CustInvc, VendBill, and so on. Kept as the internal code. |
transaction.tranid | TRAN_ID VARCHAR | The human document number. |
transaction.entity | ENTITY_ID NUMBER | Foreign key to RAW.NETSUITE.ENTITY. |
transaction.trandate | TRAN_DATE DATE | Date, in the account timezone. |
transaction.currency, exchangerate | CURRENCY VARCHAR, EXCHANGE_RATE NUMBER | Keep both so the warehouse can present base and transaction currency. |
transaction.foreigntotal | FOREIGN_TOTAL NUMBER(18,2) | Transaction-currency total. Derive a base-currency column. |
transaction.subsidiary | SUBSIDIARY_ID NUMBER | OneWorld accounts only. Null on single-subsidiary. |
transaction.lastmodifieddate | LAST_MODIFIED TIMESTAMP_NTZ | Watermark. UTC. |
| (derived) | IS_DELETED BOOLEAN | Set by the deleted-records flow, default FALSE. |
What syncs, each direction
- Transactions and lines. Sales orders, invoices, bills, journals, and their lines land as typed tables, joined to entity and subsidiary. (NetSuite to Snowflake)
- Entities and items. Customers, vendors, employees, and the item list sync as dimension tables for the fact tables to join. (NetSuite to Snowflake)
- Custom records. Any custom record type is picked up from the metadata catalog and loaded the same way as a standard record. (NetSuite to Snowflake)
- Saved-search results. An existing saved search runs on a schedule and its result set lands as a table, keeping the report logic in NetSuite. (NetSuite to Snowflake)
Governance and audit
The same controls apply to this sync as to every other Neblex workload.
- Ordered run log. Every load records the SuiteQL statement, the row count, and the merge. Replay without re-querying NetSuite.
- Paced against governance. Queries are queued against the account concurrency limit, so a backfill runs slower rather than blocking other integrations.
- Scoped access. NetSuite uses a role with read access to the record types being loaded. Snowflake uses a role with grants on the target schema only.
- Environments. Build against a NetSuite sandbox and a Snowflake scratch schema, then promote the same flow to production.
Frequently asked questions
NetSuite has no CDC. How fresh is the data?
Every few minutes on a lastModified watermark for scheduled loads. For the tables that need it, a managed SuiteScript user-event script pushes changes to Neblex on the next poll.
Will the load compete with the ERP for capacity?
No. The connector queues SuiteQL calls against the account concurrency limit and backs off on governance errors, so a backfill slows down rather than blocking payroll or fulfillment.
How are deleted records handled?
A nightly saved search of deleted internal IDs marks them IS_DELETED = TRUE in the warehouse, rather than the row disappearing.
Can we keep using our existing saved searches?
Yes. A saved search can be run on a schedule and its result set landed as a table, which keeps the report logic where finance already maintains it.
Does anything get installed in NetSuite?
SuiteQL and saved-search loads need nothing. The optional near-prompt push uses a small managed user-event script you can review.
Connectors on this page
NetSuite
Applications
- Operations
- 271
- Typed outputs
- 0%
- Change triggers
- 1 (poll)
- Authentication
- ConnectionString
Snowflake
Snowflake
- Operations
- 7
- Typed outputs
- 85.7%
- Change triggers
- Poll or inbound webhook
- Authentication
- ConnectionString
NetSuite does not publish typed output schemas yet, so the field mapping on this page is configured in the flow rather than pre-verified.
Bring one real integration
We will build it with you against your own systems, with the run log open.