NetSuite
Sync data from your warehouse to Oracle NetSuite records via the SuiteTalk REST API. Keep your NetSuite customers, contacts, vendors, and custom records up to date with your latest customer data.
Prerequisites
- An Oracle NetSuite account with SuiteTalk REST Web Services enabled
- An integration record configured for Token-Based Authentication (TBA)
- Access tokens (token ID and token secret) generated for the integration
- A role with permissions to create and edit the target record types
Authentication
NetSuite uses Token-Based Authentication (TBA), which is Oracle’s recommended method for server-to-server integrations.
Setting Up TBA in NetSuite
- Navigate to Setup → Company → Enable Features → SuiteCloud and enable:
- Client SuiteScript
- Server SuiteScript
- SuiteTalk (Web Services)
- REST Web Services
- Token-Based Authentication
- Navigate to Setup → Integration → Manage Integrations → New and create an integration record:
- Enable Token-Based Authentication
- Save the Consumer Key and Consumer Secret (shown only once)
- Navigate to Setup → Users/Roles → Access Tokens → New and create an access token:
- Select the application (integration record) from step 2
- Select a user and role with appropriate permissions
- Save the Token ID and Token Secret (shown only once)
- Enter these four values in the Zeotap connection form
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
| Account ID | Text | Yes | Your NetSuite account ID. For sandbox accounts, append _SB1 (e.g., 1234567_SB1). |
| Max Concurrent Requests | Number | No | Maximum parallel API requests (1—10). Default: 5. Lower values reduce rate limiting risk. |
Credentials
| Field | Type | Required | Description |
|---|---|---|---|
| Consumer Key | Text | Yes | From your NetSuite integration record. |
| Consumer Secret | Password | Yes | From your NetSuite integration record. Stored encrypted. |
| Token ID | Text | Yes | Access token ID generated for this integration. |
| Token Secret | Password | Yes | Access token secret generated for this integration. Stored encrypted. |
Target Settings
| Field | Type | Required | Description |
|---|---|---|---|
| Record Type | Select | Yes | The NetSuite record type to sync data to (Customer, Contact, Vendor, etc.). |
| Custom Record Type ID | Text | Conditional | Internal ID of the custom record type. Required when Record Type is Custom Record. |
Available Record Types
| Record Type | API Value | Description |
|---|---|---|
| Customer | customer | Customer records (companies and individuals) |
| Contact | contact | Contact persons associated with customers |
| Vendor | vendor | Vendor/supplier records |
| Employee | employee | Employee records |
| Partner | partner | Partner records |
| Lead | lead | Lead records |
| Prospect | prospect | Prospect records |
| Sales Order | salesOrder | Sales order transactions |
| Invoice | invoice | Invoice transactions |
| Opportunity | opportunity | Sales opportunity records |
| Support Case | supportCase | Customer support cases |
| Custom Record | customRecord | Any custom record type defined in your account |
Supported Operations
Sync Modes
| Mode | Supported | Description |
|---|---|---|
| Upsert | Yes | Creates new records or updates existing ones matched by External ID |
| Insert | Yes | Creates new records only |
| Update | Yes | Updates existing records matched by Internal ID or External ID |
| Mirror | — |
Audience Sync Modes
NetSuite does not support audience sync modes. Use standard sync modes with field mapping.
Features
- Field Mapping: Yes — map source columns to NetSuite record fields
- Schema Introspection: No — configure field mappings manually using NetSuite field IDs
Required Field Mappings
| Field | Description | Alternatives |
|---|---|---|
| External ID | Used to match records for upsert operations. Must map to a field marked as “External ID” in NetSuite. | Internal ID (internalId) |
Common Destination Fields
These fields are pre-populated in the field mapping dropdown for convenience:
| Field | Type | Description |
|---|---|---|
internalId | string | NetSuite internal record ID. Read-only on insert. |
externalId | string | External identifier for upsert matching. |
companyName | string | Company or organization name. |
email | string | Primary email address. |
firstName | string | Contact first name. |
lastName | string | Contact last name. |
phone | string | Primary phone number. |
entityId | string | Human-readable record identifier. |
subsidiary | string | Subsidiary internal ID (required for OneWorld accounts). |
entityStatus | string | Record status internal ID. |
comments | string | Free-text comments or notes. |
category | string | Record category internal ID. |
Rate Limits
NetSuite enforces concurrency-based governance limits rather than per-second rate limits:
- Concurrency limit: Depends on your NetSuite license tier (typically 5—25 concurrent requests)
- Record-level locking: Concurrent updates to the same record will fail; Zeotap serializes writes to avoid this
- Governance units: SuiteScript governance units do not apply to REST API calls, but large batch sizes may trigger timeouts
If you encounter rate limiting errors, reduce the Max Concurrent Requests setting.
Troubleshooting
Authentication failed (401)
Verify that:
- Token-Based Authentication is enabled in Setup → Company → Enable Features → SuiteCloud
- The integration record has TBA enabled
- The consumer key, consumer secret, token ID, and token secret are correct
- The access token has not been revoked
Invalid account ID
The account ID is shown in Setup → Company → Company Information. For sandbox accounts, append _SB1 (e.g., 1234567_SB1). Do not include the company name.
Record not found on update
Updates require a valid internalId or externalId. Verify the mapped identifier field contains values that exist in NetSuite.
Subsidiary is required (OneWorld)
NetSuite OneWorld accounts require a subsidiary on most record types. Map the subsidiary field to the internal ID of the target subsidiary.
Custom record type not found
When using custom records, the Custom Record Type ID must be the internal ID (e.g., customrecord_mytype), not the display label. Find this in Customization → Lists, Records, & Fields → Record Types.
Permission denied
The role associated with the access token must have:
- Lists → Record Type: Create, Edit (for insert/upsert)
- Setup → REST Web Services: Full
- Setup → Log in using Access Tokens: Full