top of page
Sesame Software

How to Create a Unified BI View From Salesforce and NetSuite

  • Jan 28
  • 8 min read

Quick Answer

Creating a unified BI view from Salesforce and NetSuite means replicating both systems into a single, customer-controlled database rather than trying to query either platform directly for reporting. A real business data integration strategy for these two systems requires separating NetSuite's transactional and analytical connection types, automating schema discovery so manual DDL mapping doesn't become a maintenance burden for your database administrators, correctly handling NetSuite's non-incremental administrative tables, and preserving data sovereignty by keeping the entire pipeline inside your own infrastructure.


The result is a 360-degree business data view that BI tools like Power BI, Tableau, or Looker can retrieve data from directly, without ever touching Salesforce or NetSuite's live production APIs.


Key Takeaways

  • Salesforce and NetSuite are architecturally distinct systems — Salesforce's polymorphic, object-oriented schema and NetSuite's nested transactional tables don't map to each other, or to a relational database's rows and columns, without deliberate translation.

  • NetSuite integration should split into two connection types: a transactional path for record-level operations and a read-only analytical path for bulk reporting queries, used for what each is actually built for.

  • Automated schema discovery and reserved-word handling eliminate the manual mapping work that makes custom Salesforce and NetSuite pipelines slow to build and fragile to maintain, freeing up a data engineer's time for higher-value database design work.

  • More than 50 NetSuite administrative tables don't support incremental sync and require truncate-and-reload handling to avoid silent data drift in your reporting layer.

  • A self-hosted, customer-controlled deployment keeps sensitive customer and financial data under your own custody throughout data synchronization, addressing data sovereignty concerns before a compliance review ever raises them.


The Challenge: Why Front-Office and Back-Office Data Mismatch

For mid-market and enterprise IT teams, a 360-degree business data view is the goal — and it's routinely stalled by a real architectural divide. Front-office CRM data in Salesforce and back-office ERP financial records in NetSuite live in completely separate cloud silos, built on fundamentally different data models. Salesforce uses a highly dynamic, object-oriented schema with polymorphic relationship fields like WhoId and WhatId. NetSuite relies on nested transaction records and relational parent-child accounting tables. Neither was designed with the other in mind.


Traditional ETL approaches try to bridge this gap with custom coding and manual schema mapping, and that approach runs into three recurring friction points, common types of failure across nearly every custom integration project. Schema drift is constant, since Salesforce and NetSuite schemas change as business users add custom fields, and a pipeline built on manual mapping breaks every time that happens.


API governor limits and timeouts show up the moment a query touches a large, tightly packed historical dataset over SOAP or REST. And data sovereignty becomes a real compliance concern the moment sensitive customer, financial, or pipeline data passes through a third-party ETL vendor's own servers — a genuine headache under HIPAA and GDPR frameworks.


A resilient data synchronization pipeline needs to route around all three by automating schema creation, optimizing API load, and keeping data entirely under your own custody.


Step 1: Establish Your Unified, Customer-Hosted Database Layer

Unlike integration platforms that require storing your data on their servers, a self-hosted deployment model runs the entire pipeline inside your own environment — typically as a Java web archive deployed inside Apache Tomcat (version 8.5 or 9.0) on a 64-bit Java virtual machine.


This architecture is what makes complete data sovereignty possible rather than aspirational. The application server sits behind your corporate firewall and initiates only outbound HTTPS connections on port 443 to reach cloud APIs, writing locally via JDBC to your database target — no inbound network ports need to be opened at all.


Data moves securely over TLS 1.2 connections directly from the SaaS APIs to your target database management system. And you have real flexibility in where that data lands for storage: a row-oriented database such as SQL Server, Oracle, PostgreSQL, MySQL, or MariaDB, or a columnar data warehouse such as Snowflake, Amazon Redshift, or Azure SQL.


Step 2: Configure Your Salesforce and NetSuite Connections

Both systems connect through specialized, metadata-driven templates, but each requires a different setup.

Salesforce integration configuration. Creating a Salesforce datasource means providing an integration user with sufficient data-visibility privileges, configuring the connection to point at production or sandbox, and supplying a security token if your org requires one. Concurrent login limits are managed automatically to maximize query parallelization without exceeding Salesforce's own API constraints.

NetSuite integration configuration. Connecting to NetSuite means separating transactional operational data from analytical reporting runs, and NetSuite integration exposes two specialized paths for exactly that purpose. SuiteTalk (SOAP) is well suited for transactional operations — writing data back and downloading structured file attachments. SuiteAnalytics Connect (JDBC) enables direct, high-speed SQL queries against NetSuite's data model for analytical workloads, and maintains consistency with your existing SuiteAnalytics Workbooks along the way. Securing the NetSuite connection means using token-based authentication: creating an integration record in NetSuite, enabling token-based auth, and configuring the resulting client and access token credentials in your integration platform.

Step 3: Automate Schema Discovery and Align Your Targets

Once your sources and target database are configured, there's no need to spend hours manually writing DDL scripts or mapping columns by hand — a task that otherwise falls squarely on database administrators and slows every downstream project.

Automated target schema generation. A single schema discovery command queries both the Salesforce and NetSuite APIs, and the engine handles the rest: discovering all standard and custom objects, fields, and tables; dynamically creating the corresponding tables, columns, indexes, and primary keys in your target database; and automatically adjusting column widths as fields evolve in the source systems, preventing the kind of text-truncation errors that otherwise cause silent record rejections.

Resolving naming and reserved word collisions. Salesforce, NetSuite, and relational databases each use different naming conventions, so a clean compile depends on handling collisions deliberately — a database design detail that's easy to overlook until a sync run fails on it. Configuring a custom table prefix keeps replicated tables organized and readable. Without one, any source object or field name that happens to match a target database reserved word — ACCOUNT, for example — automatically gets an "X" appended to the end of the name, becoming ACCOUNTX, so the schema compiles without a developer manually renaming anything.

Step 4: Tune Your Synchronization Pipelines for Scale

Enterprise data synchronization at hundreds of thousands of records demands real tuning, not default settings, to avoid system lag and deadlocks — and organizing data flows correctly up front avoids most of the problems teams hit at real-world production volume.

The 3-to-1 writer-to-finder thread ratio. Preventing target database write bottlenecks requires maintaining a 3-to-1 ratio of database writer threads to finder threads. This is a required configuration, not a suggestion — it keeps database writes fast and deadlock-free during high-volume runs.

Dynamic time-slicing. Heavy bulk updates on either the CRM or ERP side will time out a standard API query if the window is fixed. Dynamic time-slicing monitors record counts against a configured maximum, and when a time slice would return too many records, the engine automatically shortens the interval and re-queries — breaking bulk updates into clean, segmented chunks instead of risking a timeout.

In-memory throttling. If the target database slows down due to network latency, extraction shouldn't keep pulling data and hogging memory. A maximum queue size setting pauses extraction once that limit is reached, letting database writers catch up before more records come in — preventing memory overflow crashes that would otherwise take the whole pipeline down.

Step 5: Master Non-Incremental Objects and Saved Searches

Most transaction tables sync incrementally using modification timestamps, but a specific set of administrative tables doesn't support that at all — and knowing which is which matters as much for data quality as any other step in the pipeline.

Truncate-and-reload for NetSuite administrative tables. NetSuite tracks more than 50 standard objects — including Subsidiary, Department, Budget, Account, and Location — that don't carry native modification timestamps. These non-incremental tables are recognized automatically, truncated, and fully reloaded on each sync run to prevent data drift, without interrupting your active BI queries against the rest of the database.

Treating NetSuite Saved Searches as standard tables. Pre-filtered NetSuite Saved Searches can become standard, queryable database tables through a dedicated schema command, giving you customized data views without writing custom join logic. Spaces and special characters in the search name are automatically converted to underscores, and the resulting table includes an extra TOTALRECORDS column — updated on each run with the exact, static record count the search returned, giving you a built-in audit log of that filtered dataset's growth over time.

Step 6: Implement History Tracking (The "X" Tables)

Time-series reporting and auditing require knowing what a record looked like before it changed, not just its current state — access to historical data is what turns a snapshot database into something a compliance team can actually rely on.

Enabling history tracking automatically creates a corresponding table prefixed with a leading "X" — XACCOUNT or XCUSTOMER, for example. Before the engine writes an updated record to the primary table, it first copies the existing row image to the "X" table, building a complete version history of your cloud records under your own custody over time.

This capability depends on the target database's architecture. History tracking is fully supported on row-oriented systems — Oracle, SQL Server, PostgreSQL, MySQL, MariaDB, DB2, and Sybase. Columnar warehouses like Snowflake, Amazon Redshift, Vertica, and Greenplum are optimized for bulk-loaded analytical queries rather than rapid, transactional row-by-row writes, so history tracking isn't supported on those platforms, and access control over historical versions in that architecture would need to happen elsewhere — though standard, flat replication remains fully supported there.

Step 7: Build and Query Your Unified BI Views

With Salesforce and NetSuite data continuously replicated into your private relational database or cloud warehouse, your BI tools — Power BI, Tableau, Looker, or whatever your organization standardizes on — connect directly to a single, high-performance target database instead of two separate, rate-limited APIs. This is data-driven reporting the way it should work: one place to move data into, one place to query it from.

Standard SQL views and stored procedures let you join Salesforce accounts with NetSuite customer financial tables without ever touching Salesforce API limits or slowing down your production environments. A simple view illustrates the pattern — joining replicated Salesforce Accounts with NetSuite Customers through a custom integration key to produce a trusted, current reporting layer:

CREATE VIEW V_UNIFIED_CUSTOMER_360 AS

SELECT 

    sf.ID AS Salesforce_Account_Id,

    sf.NAMEX AS Customer_Name,

    sf.INDUSTRY AS Industry,

    ns.INTERNALID AS NetSuite_Customer_Id,

    ns.BALANCE AS Outstanding_Balance,

    ns.DAYS_OVERDUE AS Days_Past_Due,

    sf.Database_update_date AS Last_Sync_Timestamp

FROM 

    dbo.SF_ACCOUNT sf

INNER JOIN 

    dbo.NS_CUSTOMER ns ON sf.LEGACY_ACCOUNTID = ns.INTERNALID

WHERE 

    sf.DELETE_FLAG <> 'Y';

Once the underlying replication is running, this kind of pipeline can be scheduled to execute automatically through a built-in cron scheduler, giving you a reliable, code-free unified business intelligence architecture that scales as your Salesforce and NetSuite data grows — a high-level view of your business that any data engineer on your team can maintain without re-learning the pipeline from scratch each time something changes upstream.

Frequently Asked Questions

Why can't BI tools just query Salesforce and NetSuite directly? Direct queries against either platform's live API compete with production traffic, run into rate limits and timeouts on large datasets, and can't easily join data across both systems. Replicating both into a single target database removes all three problems at once.

What's the difference between SuiteTalk and SuiteAnalytics Connect for NetSuite integration? SuiteTalk (SOAP) handles transactional operations like writing data back to NetSuite and downloading file attachments. SuiteAnalytics Connect (JDBC) is a read-only, SQL-based path built for high-speed analytical queries, keeping bulk reporting traffic separate from transactional operations.

Which NetSuite tables require truncate-and-reload instead of incremental sync? More than 50 administrative objects, including Subsidiary, Department, Budget, Account, and Location, lack native modification timestamps and must be fully reloaded on each sync run rather than queried incrementally.

Does history tracking work the same way on every database target? No. History tracking depends on row-by-row transactional writes, so it's supported on row-oriented databases like Oracle, SQL Server, and PostgreSQL, but not on columnar, bulk-loaded warehouses like Snowflake or Redshift, which support standard replication only.

Can NetSuite Saved Searches be part of a unified BI database? Yes. A Saved Search can be converted into a standard database table, complete with a TOTALRECORDS column that tracks the exact record count on every sync — preserving the business logic already built into the search without reimplementing it in SQL.



 
 
bottom of page