NetSuite
This guide walks you through setting up Token-Based Authentication (TBA) in NetSuite so Harmony can securely read your vendor, contract, and procurement data.
What you'll do: Create a dedicated role with minimal permissions, generate authentication tokens, and collect the 5 values needed to complete the Harmony integration setup.
1. Prerequisites - Enable Features
Navigation: Setup › Company › Setup Tasks › Enable Features › SuiteCloud tab
Check both:
✅ REST Web Services
✅ Token-Based Authentication
Accept the SuiteCloud Terms of Service if prompted. Save.
2. Create the Role
Navigation: Setup › Users/Roles › Manage Roles › New
General settings:
Name
Harmony Integration Role (or any descriptive name)
Subsidiary Restrictions
All (so the token sees vendors/purchase orders across all subsidiaries)
Authentication
Leave all unchecked (Two-Factor: Not required)
Permissions - Minimal Required Set
Add the following permissions to the role. These are the minimum permissions required for Harmony to read your vendor, contract, and procurement data.
Setup tab:
Log in using Access Tokens
Full
REST Web Services
Full
View Login Audit Trail
View
Only required for the Native App Integration* flow
Reports tab:
SuiteAnalytics Workbook
Edit
Unlocks SuiteQL query execution
Transaction Detail
View
Enables transaction table access in SuiteQL
Lists tab:
Contacts
View
Employees
View
Employee Record
View
Only required for the Native App Integration* flow
Items
View
System Notes for Analytics and REST
View
Vendors
View
Transactions tab:
Bills
View
Find Transaction
View
Purchase Order
View
* Native App Integration is the flow where Harmony surfaces per-user NetSuite activity (last-login, seat usage) alongside vendor and contract data - treating NetSuite itself as a SaaS app in your inventory. It reads employee records and the login audit trail to identify active users. If you only need vendor/contract/spend sync, you can skip these two permissions.
3. Assign the Role to a User
Navigation: Lists › Employees › Employees (find the user who will own the integration)
We recommend using a dedicated service account rather than a personal employee account, so the integration is not affected if the employee leaves.
Open the employee/user record
Go to the Access subtab
In the Roles section, click Add
Select the role you created (e.g. Harmony Integration Role)
Save
Tip: If you cannot see the user in the Access Token dropdown later, it means this step was not completed - the role is not assigned to the user, or the role is missing the "Log in using Access Tokens" permission.
4. Create the Integration Record
Navigation: Setup › Integration › Manage Integrations › New
Name
Harmony Integration (or any descriptive name)
State
Enabled
Token-based Authentication
✅ Checked
TBA: issuetoken Endpoint
⬜ Unchecked
TBA: Authorization Flow
⬜ Unchecked
OAuth 2.0 section
Leave all unchecked
Click Save.
⚠️ IMMEDIATELY copy the two values shown - they appear only once and cannot be retrieved later:
Consumer Key
Consumer Secret
These may be labeled as Client ID and Client Secret in other documentation.
5. Create the Access Token
Navigation: Setup › Users/Roles › Access Tokens › New
Application Name
Select your integration record
User
Select the user with the role assigned
Role
Select the role you created
Click Save.
⚠️ IMMEDIATELY copy the two values - shown only once:
Token ID
Token Secret
6. The 5 Values You Need
Once you have completed the steps above, enter these 5 values in the Harmony integration setup screen to complete the connection:
1
Account ID
Setup › Company › Company Information (format: 1234567 or 1234567_SB1 for sandbox)
2
Consumer Key
From Step 4 (Integration Record save)
3
Consumer Secret
From Step 4 (Integration Record save)
4
Token ID
From Step 5 (Access Token save)
5
Token Secret
From Step 5 (Access Token save)
Note: When you open the NetSuite integration setup form in Harmony, a "For more details, visit our documentation" link at the top of the form brings you directly back to this guide if you need a reference while filling in your credentials.
7. Choose Which Transaction Types to Sync
After entering your credentials, you can control which NetSuite transaction types Harmony pulls in as part of your contracts integration. Two toggles are available in your NetSuite integration settings:
Sync Purchase Orders
On (enabled by default)
Standard purchasing workflow - most organizations use this
Sync Vendor Bills
Off (disabled by default)
Enable this if your team books vendor contracts directly as Vendor Bills with no associated Purchase Order
Both toggles can be enabled at the same time if your organization records spend through both transaction types. Existing NetSuite tenants retain their current behavior - Sync Purchase Orders remains on and Sync Vendor Bills remains off unless you explicitly enable it.
8. Optional (Strongly Recommended) - Service Start / End Date Columns
NetSuite does not have a single, standard "contract start date" or "contract end date" field. Instead, most customers track the service period on transaction lines (the individual lines of a Bill or Purchase Order) using custom transaction column fields
typically named something like
custcol_service_start_dateandcustcol_service_end_date.
Harmony uses these two columns to populate the contract start date and contract end date for each vendor contract it derives from your NetSuite data. Without them, those fields will be left NULL in Harmony, which significantly reduces the value of renewal tracking, expiring-contract alerts, and spend-by-period reporting.
✅ We strongly recommend providing these two column IDs. If your organization tracks service periods on transaction lines under different field names, use those instead - the important thing is that the field is a transaction line column holding a date.
8.1 Supported column types
The service_start_date_column and service_end_date_column fields accept either of the following:
A custom column ID - any
custcol_*field of type Date that your organization uses to record service periods (e.g.custcol_service_start_date).A NetSuite native amortization column - if your organization uses NetSuite's built-in amortization schedule instead of custom fields, you can enter one of these two reserved values:
amortizstartdate
NetSuite's native amortization start date column
amortizationenddate
NetSuite's native amortization end date column
This is an explicit, per-credential choice. There is no automatic fallback - Harmony uses exactly the column ID you provide.
8.2 Where these fields live in NetSuite
Transaction Line Fields (a.k.a. transaction column fields) - custom fields that appear on each line of a transaction (Bill, Purchase Order, Invoice, etc.), not on the transaction header.
Their internal ID is what Harmony needs. Internal IDs almost always start with the prefix
custcol_(for examplecustcol_service_start_date).
8.3 How to find the exact column IDs
Option A - Browse the Transaction Line Fields list (recommended)
In NetSuite, go to Customization › Lists, Records, & Fields › Transaction Line Fields.
In the list, look for fields whose Label describes a service period, contract period, subscription term, or similar - common names include:
Service Start Date / Service End Date
Contract Start / Contract End
Coverage Start / Coverage End
Subscription Start / Subscription End
Confirm the Type column shows Date (not Free-Form Text, List/Record, etc.).
Copy the value from the ID column - this is the internal ID you enter in Harmony (for example
custcol_service_start_date). If the ID column is not visible, click the field name to open it - the ID is shown at the top of the record.
Option B - Inspect a real transaction
If you're not sure which custom fields your organization actually populates, open a representative Bill or Purchase Order that has the service period filled in:
Open the transaction and go to the Items subtab (line items).
Click a line to edit it, or expand the line detail.
Hover the label of the start-date / end-date field - most browsers will show the underlying field ID in a tooltip. You can also right-click and choose Inspect - the field's HTML
idattribute contains the internal ID (look forcustcol_<something>).
Option C - Ask your NetSuite administrator
If you don't have permission to access Customization, your NetSuite admin can tell you the internal IDs of the service-period fields your organization uses.
8.4 Enter the IDs in Harmony
Paste the internal IDs (including the custcol_ prefix, or the native amortization column name) into the last two fields of the Harmony NetSuite setup screen:
Service start date column
custcol_service_start_date or amortizstartdate
Service end date column
custcol_service_end_date or amortizationenddate
Leave either field blank to skip it - the corresponding contract date will remain NULL in Harmony.
⚠️ Common pitfalls
The value must be the internal ID (e.g.
custcol_service_start_date), not the display label ("Service Start Date") - unless you are using one of the two native amortization column names listed above.Custom fields must be Transaction Line Fields, not Transaction Body Fields or Item Fields.
Custom fields must be of type Date. Free-form text fields containing dates as strings are not supported.
The role you created in Step 2 must have View access to the transactions (Bills, Purchase Orders) whose lines carry these fields - the minimal permissions listed above already cover this.
Harmony validates your configured column IDs against your NetSuite instance at connection time. If a column ID contains a typo, references a non-date field, or points to the wrong table, you will receive a clear error message immediately so you can correct it before your first sync runs.
9. Native App Integration - User and License Insights
In addition to contract and spend sync, you can connect NetSuite as a native application integration in Harmony. This gives IT admins direct visibility into NetSuite user activity, roles, and license utilization from the Applications page - treating NetSuite itself as a managed SaaS app in your inventory.
Once connected, Harmony syncs your NetSuite data daily, with a manual refresh option available. The same Token-Based Authentication credentials used for contract sync power this integration.
What Harmony surfaces:
User inventory - active employees synced with name, email, role, status, and license class (Full User, Employee Center, Retail User, External Center, and others)
Last activity - last login date per user, derived from the NetSuite login audit trail
License utilization - a breakdown of license slots in use versus available, helping you identify unused or over-provisioned licenses
Role visibility - the NetSuite roles assigned to each user, useful for access reviews and offboarding checks
To enable this flow, make sure the role you created in Step 2 includes the two additional permissions noted in that section:
View Login Audit Trail (Setup tab) - required to read last-login data
Employee Record (Lists tab) - required to read employee details
Last updated
Was this helpful?
