Integration

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.

NetSuite to Snowflake
Direction
Every few minutes, polled
Latency
Scheduled, on lastModified
Common trigger
Template, then pick records and queries
Setup

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.

  1. 1Trigger: a schedule every 5 minutes.
  2. 2Query: Run SuiteQL for transactions where lastmodifieddate > :watermark, joining the entity, subsidiary, and currency, up to 1,000 rows per page.
  3. 3Lines: a second SuiteQL query pulls the transaction lines for the same set, into a TRANSACTION_LINE table.
  4. 4Stage 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.
  5. 5Watermark: write the max lastmodifieddate seen to a control table.
  6. 6Deletes: a nightly saved search of deleted records marks IS_DELETED = TRUE in the warehouse.
  7. 7Nightly 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 columnNotes
transaction.idINTERNAL_ID NUMBERMerge key.
transaction.typeTYPE VARCHARSalesOrd, CustInvc, VendBill, and so on. Kept as the internal code.
transaction.tranidTRAN_ID VARCHARThe human document number.
transaction.entityENTITY_ID NUMBERForeign key to RAW.NETSUITE.ENTITY.
transaction.trandateTRAN_DATE DATEDate, in the account timezone.
transaction.currency, exchangerateCURRENCY VARCHAR, EXCHANGE_RATE NUMBERKeep both so the warehouse can present base and transaction currency.
transaction.foreigntotalFOREIGN_TOTAL NUMBER(18,2)Transaction-currency total. Derive a base-currency column.
transaction.subsidiarySUBSIDIARY_ID NUMBEROneWorld accounts only. Null on single-subsidiary.
transaction.lastmodifieddateLAST_MODIFIED TIMESTAMP_NTZWatermark. UTC.
(derived)IS_DELETED BOOLEANSet 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.

See it on your data

Bring one real integration

We will build it with you against your own systems, with the run log open.