Connecting NetSuite
Last updated: September 22, 2026
Stackpack supports a read-only integration with Oracle NetSuite that pulls vendor spend from your general ledger into Stackpack. This builds your vendor list automatically and keeps each vendor's spend history current. Stackpack never writes to NetSuite.
For what Stackpack keeps from your accounting system, and what it does not, see What Stackpack stores from your accounting system.
Authentication
Stackpack connects to NetSuite through Merge, a unified accounting API provider. You connect inside Stackpack using Merge's secure Link window, which guides you through NetSuite's Token-Based Authentication setup and collects the resulting credentials. Merge stores those credentials and syncs your NetSuite data; Stackpack reads from Merge. Stackpack never sees your NetSuite login or tokens.
Requirements
A NetSuite user with the Administrator role.
SOAP Web Services, REST Web Services, and Token-Based Authentication enabled in NetSuite (Setup → Company → Enable Features → SuiteCloud).
Following the in-window instructions, you will install Merge's read-only role bundle, assign the role to a user, create an Integration record, generate an access token, and paste in your Account ID, Consumer Key, Consumer Secret, Token ID, and Token Secret.
Step-by-step walkthrough. Merge publishes a guide to the NetSuite linking process, with screenshots of every NetSuite screen involved: https://help.merge.dev/en/articles/7792671-netsuite-how-do-i-link-my-account
Its steps, in order:
Find your Account ID (the prefix of your NetSuite URL).
Enable the SuiteCloud features above.
Install the read-only AccountLink bundle, which creates the role.
Grant that role access to any custom transaction types, records, or segments.
Assign a user to the role.
Create an Integration record to obtain the Consumer Key and Secret.
Create an access token for that user, role, and integration to obtain the Token ID and Secret.
Enter the credentials in the Link window.
The same steps appear inside the Link window, so the guide is a reference rather than a separate process.
Caveats
Stackpack currently operates in USD. Amounts are read as recorded on each NetSuite posting and are not converted, so companies with non-USD transactions will see those amounts summed as-is. Multi-currency support is on our roadmap.
Because of the data flow for Netsuite, data can in some cases take two days to appear.
Stackpack reads NetSuite Departments as Departments and Classes as Classes. Populating Stackpack Departments from NetSuite is enabled by a switch on your account, either directly from Departments or from Classes. Ask your Stackpack contact to enable either.
NetSuite Subsidiaries and Locations are not represented in Stackpack. Spend across all subsidiaries the token's role can access is combined per vendor.
If the access token is revoked, the role loses permissions, or the token's user is deactivated, the profile stops syncing and must be reconnected.
Connecting
During onboarding
On the "Sync with NetSuite" step, click Connect to NetSuite.
In the Merge Link window, follow the NetSuite setup steps and enter your Token-Based Authentication credentials.
You are returned to Stackpack and the first sync starts immediately.
From Company Settings
Go to Company Settings → Integrations → NetSuite and click Connect (or Add integration if a profile already exists).
Enter a name for the profile and click Connect. This is how the connection appears in Stackpack.
Complete the steps in the Merge Link window.
Reconnecting allows you to supply fresh credentials. It restores syncing without changing any synced data. Use it when Stackpack reports the profile needs attention.
Disconnecting discards the stored NetSuite credentials, and removes the profile from Stackpack. You may also delete the Integration record or access token in NetSuite.
Sync schedule and window
The first sync runs when you connect. After that, Stackpack syncs automatically once a day.
Stackpack retains spend for the current calendar year plus the two prior calendar years. (During January through March, one additional prior year is retained so year-over-year comparisons remain available.)
Each sync re-reads the months since the previous sync, and the prior quarter is fully refreshed at the start of each new quarter. Late payments, edits, and reversals in NetSuite are therefore picked up and applied to the month of the original posting date.
What Stackpack reads from NetSuite
Reference lists: Chart of Accounts, Vendors (all statuses, so historical spend on inactive vendors still resolves), and Classes and Departments.
General ledger postings, filtered by posting date. Stackpack reads the general ledger: every posting appears once, typed by the NetSuite transaction that created it, with its debit and credit lines. Stackpack records one entry per spend-side line, so a bill payment that settled a bill split across three accounts produces three entries.
NetSuite transaction | Recorded as | Notes |
|---|---|---|
Bill Payment, Vendor Prepayment | Payment | The accounts payable debit lines. The bank or credit card funding side is not recorded. Dated by posting date. |
Credit Card charge, CCard Refund | Expense | The expense-account lines. The credit card settlement side is not recorded. A refund's expense credit is recorded as negative spend. |
Journal | Journal Entry (Debit or Credit) | Every line naming a vendor, signed. Tracked separately as accrual spend. |
Other vendor transactions | Transaction | Expense-side lines of any other posting type classified as a transaction. |
The following are read from the ledger but deliberately not recorded as spend:
Bill and Bill Credit postings. The ledger carries no paid or open status, so a bill's cash effect is captured when its Bill Payment posts. A bill credit's effect shows up as a reduced or absent payment. Recording them as well would double count.
Deposit, Transfer, and Vendor Prepayment Application postings, which move no vendor cash.
Deleted records and posting types Stackpack does not recognize (these are logged).
Line-level exclusions. A line is skipped when any of the following is true:
It has no posting date.
It has no vendor. The vendor is taken from the line's entity; there is no header fallback.
Its amount is zero.
Its account type is Accounts Receivable, Bank, Fixed Asset, Long Term Liability, Non-Posting, Other Asset, Other Current Asset, Other Current Liability, or Other Income, or its account is not classified as an Expense or Liability. Accounts Payable, Cost of Goods Sold, Credit Card, Expense, and Other Expense accounts are included.
Its account is on the profile's excluded GL account list, if your Stackpack administrator has configured one.
Fields captured per ledger line
Field | NetSuite source (as presented by Merge) |
|---|---|
Transaction ID | General ledger line ID |
Date | Posting date of the transaction, falling back to the line's created date |
Amount | Debit minus credit on the line. Negative for credit-card refunds and journal credits. |
Currency | Transaction currency, falling back to base currency |
Type | Payment, Expense, Transaction, or Journal Entry (Debit or Credit) |
Accrual | Set for Journal lines only |
Memo | Line description |
Account category | The account's type (for example Expense, Cost of Goods Sold, Accounts Payable, Credit Card) |
Account ID and name | The account on the line |
Class ID and name | Class on the line, falling back to the transaction's Class |
Department ID and name | Department on the line, falling back to the transaction's Department |
Location ID and name | Not populated for NetSuite |
Vendor ID and name | The vendor (entity) on the line |
How postings become vendor spend
Stackpack groups the captured lines by vendor, matching on the vendor's ID. Within each vendor, lines are grouped by the calendar month of their posting date. Each vendor then carries a monthly spend time series, one bucket per month, with:
Monthly spend field | Derived from |
|---|---|
Year and month | The posting date's calendar month |
Amount | Sum of Payment, Expense, and Transaction line amounts for that month. Refunds reduce the total. |
Transaction count | Number of those lines in that month |
Accrual amount | Sum of Journal debits to the vendor, offset by Journal credits |
Alongside the time series, each vendor records the accounts its lines posted to (each with a line count), the earliest month with spend in the retained window, and the most recent month with spend. When the Department or Class switch is enabled, the vendor also records the Departments or Classes it posted to, and Stackpack keeps a per-department monthly spend series keyed on the Department name, falling back to the Class name when no Department is set.
Spend views in Stackpack use Amount by default. If accrual-based spend is enabled for your company, vendors that have Journal activity show Amount + Accrual amount, and vendors without any Journal activity continue to show Amount.
Monthly buckets older than the retention window are dropped on each sync. Buckets inside the window are replaced by the latest sync, so corrections in NetSuite flow through rather than accumulate.
Frequently asked questions
Q: What does the NetSuite integration involve, and what information does Stackpack pull from NetSuite?
A NetSuite administrator connects through Merge Link inside Stackpack, creating a read-only integration record and access token in NetSuite. Merge syncs your NetSuite general ledger, and Stackpack reads it daily: Bill Payments, credit card charges and refunds, journal lines that name a vendor, and other vendor postings, together with your Chart of Accounts, Vendors, Classes, and Departments. Stackpack keeps the current year plus two prior years and never writes to NetSuite.
Q: Which specific data points or fields are required for the integration?
Each ledger line needs a posting date, a vendor (entity), a non-zero amount, and an account of an included type (Expense, Cost of Goods Sold, Other Expense, Accounts Payable, or Credit Card). Lines missing any of these are skipped. Class, Department, and line description are optional and enrich the vendor record when present.
Q: Are there any data or configuration prerequisites we should validate before starting the trial?
SOAP Web Services, REST Web Services, and Token-Based Authentication are enabled, and the connecting user is an Administrator.
Merge's read-only AccountLink bundle is installed, its role has access to any custom transaction types, records, or segments you use, and the assigned user can reach every subsidiary whose spend you want included.
Vendor transactions carry the vendor on their lines. Bill Payments, credit card charges, and journal lines without an entity cannot be attributed and are skipped.
Vendor records are consistent (one Vendor per supplier avoids split spend).
If you want Departments in Stackpack, Department (or Class) is set on transactions and you have asked Stackpack to enable the matching switch.
Your books are in USD. Non-USD transactions are summed without conversion.
Q: Who is Merge, and what do they see?
Merge is a unified API provider that maintains a normalized copy of your NetSuite accounting data and exposes it to Stackpack. Merge holds the NetSuite credentials you enter in the Link window; Stackpack holds only a token that lets it read your NetSuite data. Disconnecting in Stackpack deletes the linked account at Merge as well as our stored credentials.
Q: Why does a bill not appear until it is paid?
Stackpack recognizes bill spend from the Bill Payment posting, dated by its posting date, so spend reflects cash leaving the company. Bill and Bill Credit postings are read but not counted, which avoids double counting a bill and its payment.
Q: How are refunds and vendor credits handled?
A credit card refund posts a credit to the expense account and is recorded as negative spend in the month it posts. A Bill Credit reduces the amount of the eventual Bill Payment, so its effect appears through the smaller payment rather than as a separate entry.
Q: We have multiple subsidiaries. How are they handled?
Merge reads every subsidiary the access token's role can reach, and Stackpack combines that spend per vendor. Subsidiary is not carried as a dimension, so spend is not split by subsidiary in Stackpack.
Q: The Link window says my permissions are wrong. What should I check?
Confirm the read-only AccountLink bundle finished installing, the user is assigned to its role, the role has access to any custom transaction types, records, or segments, the Integration record has Token-Based Authentication checked, and the token was generated for that user, role, and integration. Then reconnect from Company Settings.
Q: Can we exclude certain accounts, such as payroll or taxes?
Yes. Your Stackpack administrator can set an excluded GL account list per profile, by account ID or name. Lines posted to those accounts are skipped on the next sync.
Q: Why is a vendor's spend different in Stackpack than in NetSuite?
The usual causes are unpaid bills (no Bill Payment yet), lines without an entity, postings to excluded account types, accounts on your excluded GL account list, subsidiaries the role cannot access, and Merge's sync lag. Spend is also dated by the Bill Payment's posting date rather than the bill date, so a bill entered in one month and paid in the next appears in the payment month.