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:

  1. Find your Account ID (the prefix of your NetSuite URL).

  2. Enable the SuiteCloud features above.

  3. Install the read-only AccountLink bundle, which creates the role.

  4. Grant that role access to any custom transaction types, records, or segments.

  5. Assign a user to the role.

  6. Create an Integration record to obtain the Consumer Key and Secret.

  7. Create an access token for that user, role, and integration to obtain the Token ID and Secret.

  8. 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

  1. On the "Sync with NetSuite" step, click Connect to NetSuite.

  2. In the Merge Link window, follow the NetSuite setup steps and enter your Token-Based Authentication credentials.

  3. You are returned to Stackpack and the first sync starts immediately.

From Company Settings

  1. Go to Company Settings → Integrations → NetSuite and click Connect (or Add integration if a profile already exists).

  2. Enter a name for the profile and click Connect. This is how the connection appears in Stackpack.

  3. 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.