Notes
NetSuite integration concurrency and governance limits, with the numbers
NetSuite limits an integration in two ways. An account accepts 5 to 20 concurrent API requests depending on its service tier, plus 10 for each SuiteCloud Plus license, and every script run has a budget of governance units: 5,000 for a RESTlet, 10,000 for a scheduled script.
Updated
Two limits, and they work differently
NetSuite has no requests-per-minute limit of the kind most APIs have. It has two separate limits, and an integration runs into them in different places.
Concurrency is counted per account. It is the number of API requests NetSuite is processing at the same moment. Every integration that talks to the account draws from the same pool: the store integration, the warehouse system, the EDI provider, the reporting tool.
Governance units are counted per script execution. Every SuiteScript API call costs a fixed number of units, and each script type has a budget. A script that runs out is stopped in the middle of its work.
| Concurrency | Governance units | |
|---|---|---|
| Scope | The whole account | One script execution |
| What it counts | Requests in flight at the same moment | API calls made inside the script |
| Applies to | SOAP, REST web services, RESTlets | RESTlets, scheduled, map/reduce and user event scripts |
| Error | SSS_REQUEST_LIMIT_EXCEEDED, HTTP 429 |
SSS_USAGE_LIMIT_EXCEEDED |
A long request makes both worse at once. A RESTlet that processes 80 orders in one call uses most of its unit budget and holds one concurrency slot for the full duration.
The numbers
The figures below were read from Oracle's NetSuite documentation on October 3, 2026.
Concurrent requests per account
The limit depends on the service tier of the account. Each SuiteCloud Plus license adds 10. Oracle documents the table under concurrency governance limits.
| Service tier | Base limit | With 1 SuiteCloud Plus license | With 5 licenses |
|---|---|---|---|
| Standard | 5 | 15 | 55 |
| Premium | 15 | 25 | 65 |
| Enterprise | 20 | 30 | 70 |
| Ultimate | 20 | 30 | 70 |
These tiers apply to contracts from June 2020. Older contracts use numbered tiers: shared and tier 3 have a base limit of 5, tier 2 has 10, tiers 1 and 1+ have 15, tier 0 has 20. A sandbox matches production. Development and partner accounts always have 5, whatever the number of licenses.
A request over the limit is rejected, not queued. What comes back depends on the interface:
| Interface | Response when the limit is exceeded |
|---|---|
| RESTlet | HTTP 400, SSS_REQUEST_LIMIT_EXCEEDED |
| REST web services | HTTP 429, CONCURRENCY_LIMIT_EXCEEDED |
| SOAP, token-based authentication | WS_REQUEST_BLOCKED |
| SOAP, request-level credentials | WS_CONCUR_SESSION_DISALLWD |
The REST web services response looks like this:
{
"title": "Bad Request",
"status": 429,
"o:errorCode": "USER_ERROR",
"o:errorDetails": [
{
"detail": "Concurrent request limit exceeded. Request blocked.",
"o:errorCode": "CONCURRENCY_LIMIT_EXCEEDED"
}
]
}
Governance units per script type
Oracle lists the budgets under script type usage unit limits.
| Script type | Units per execution |
|---|---|
| RESTlet | 5,000 |
| Scheduled script | 10,000 |
| Suitelet, user event script, workflow action script | 1,000 |
Map/reduce, getInputData and summarize |
10,000 per invocation |
Map/reduce, reduce |
5,000 per invocation |
Map/reduce, map |
1,000 per invocation |
A map/reduce script has no limit on the whole run. Each function invocation has its own budget, and a job yields and reschedules itself after 10,000 units. That is the script type for work on tens of thousands of records.
Governance units per call
The cost of a call depends on the record type. A sales order, an invoice and an item fulfillment are transaction records. A customer and an item are standard non-transaction records. The full list is in Oracle's SuiteScript API governance table.
| Call | Transaction record | Other standard record | Custom record |
|---|---|---|---|
record.load, record.create, record.transform |
10 | 5 | 2 |
record.submitFields |
10 | 5 | 2 |
Record.save, record.delete |
20 | 10 | 4 |
ResultSet.each, ResultSet.getRange (search) |
10 | 10 | 10 |
query.runSuiteQL |
10 | 10 | 10 |
search.lookupFields |
1 | 1 | 1 |
The often quoted figures of 5 units for a load and 10 for a save are the costs for a customer or an item. A sales order costs twice that.
What it means for an order sync
Take a RESTlet that receives orders from a store and creates sales orders. Per order it does four things:
| Step | Call | Units |
|---|---|---|
| Check that the order does not exist yet | search, getRange |
10 |
| Find the customer | search, getRange |
10 |
| Create the sales order | record.create |
10 |
| Save it | Record.save |
20 |
| Total per order | 50 |
5,000 units divided by 50 is 100 orders per RESTlet call, with no units left over. A new customer adds 15 units (create 5, save 10). A batch of 20 orders per call uses 1,000 to 1,300 units and leaves room for the orders that need more work.
The same batch decides the throughput under the concurrency limit. Assume one order takes 2 seconds to create, because user event scripts and workflows run on every save:
- One order per request, 5 slots: 5 orders every 2 seconds, 150 orders a minute, and the account has no slot left for anything else.
- 20 orders per request, 2 slots: 40 orders every 40 seconds, 60 orders a minute, with 3 slots free for the warehouse and reporting integrations.
Reads work the other way around. Loading 60,000 items one by one with record.load costs 300,000 units, the budget of 60 RESTlet calls. The same read through SuiteQL on the REST interface returns up to 1,000 rows per page: 60 requests. One SuiteQL query returns at most 100,000 rows, so a larger catalog is split by a range on the internal ID. Bulk reads go through SuiteQL; writes that need lookups and defaults go through a RESTlet that does the work in one request. How to turn these figures into a duration for a full run is in working out integration throughput.
What happens when you hit the ceiling
NetSuite does not hold a request that exceeds the concurrency limit. It rejects it, and the caller has to send it again. Oracle's own guidance is to retry after a delay, to increase the delay on each further attempt, and to avoid retrying from several threads at the same moment, since that creates a new peak.
There are three ways to get more room:
- A SuiteCloud Plus license. Each one adds 10 concurrent requests. A Standard account goes from 5 to 15.
- Moving work out of the peak. A full item export at 02:00 competes with nothing. The same export at 10:00 competes with order entry.
- Fewer, larger requests. 20 orders in one RESTlet call hold one slot. 20 separate calls hold up to 20.
The documentation of standard connectors and iPaaS platforms gives a fourth answer to throttling: a smaller page size and a longer schedule interval. That keeps the flow running and makes every record arrive later. The mechanics of retries and growing pauses are covered in API throttling, 429s and backoff.
A script that runs out of governance units is a different failure. It stops with SSS_USAGE_LIMIT_EXCEEDED after some records are saved and before others. The RESTlet has to count its own remaining units, stop at a safe point and report which orders it has finished, so the caller resends only the rest. What a failed run looks like from the outside is in what happens when an integration fails.
Peak days
A queue set up for a normal Tuesday and one set up for Black Friday are different queues. A store that takes 50 orders an hour on a Tuesday and 500 an hour on its peak day sends ten times the requests into the same 5 slots, while the warehouse integration posts ten times the fulfillments into that same pool.
At 2 seconds per order, 500 orders are 1,000 seconds of request time in an hour. That fits in one slot. The problem is the stock export that runs every 15 minutes: 60 SuiteQL pages at 3 seconds each is 180 seconds on one slot, or 36 seconds on all five. Run on all five, every order request in those 36 seconds is rejected.
The integration therefore gets a fixed share of the account limit, below the limit itself. On a Standard account: 2 slots for orders, 1 for stock reads, 2 left for the other integrations. The queue enforces that share, so a burst of orders waits a few seconds in the queue and is never rejected by NetSuite. The store side has its own budget, described in Shopify API rate limits.
What this means for your integration
We build the NetSuite side around these numbers. Orders go through a queue with a fixed number of concurrent requests, RESTlets work in batches that stay inside 5,000 units, bulk reads use SuiteQL, and a rejected request is retried with a growing pause. Nothing is dropped when NetSuite answers with SSS_REQUEST_LIMIT_EXCEEDED: the order stays in the queue, and the dashboard log shows when it was sent, rejected and accepted.
The account-specific parts are on the NetSuite integration page and, for Shopify stores, on Shopify NetSuite integration. Which order fields move and which system owns them is on orders, customers and shipping. Tell us your service tier and which integrations already use the account, and we work out how many slots the new integration gets.
Frequently asked questions
What is the NetSuite concurrency limit for integrations?
The base limit is 5 concurrent requests on the Standard service tier, 15 on Premium and 20 on Enterprise and Ultimate. Each SuiteCloud Plus license adds 10. The limit applies to the whole account and covers SOAP web services, REST web services and RESTlets together. The number for your account is on the Integration Governance page under Setup, Integration, Integration Management.
Do RESTlets and REST web services share the same concurrency limit?
Yes. Since the 2017.2 release NetSuite governs concurrency at the account level, and SOAP requests, REST web services requests and RESTlet calls draw from one pool. An order sync, a warehouse integration and a reporting export that all call the same account share the same 5, 15 or 20 slots.
How many governance units does a RESTlet get?
A RESTlet gets 5,000 usage units per execution. A scheduled script gets 10,000, and Suitelets and user event scripts get 1,000. Loading a sales order costs 10 units and saving it costs 20, so a RESTlet that looks up, creates and saves an order at 50 units can process at most 100 orders in one call.
What error does NetSuite return when the concurrency limit is exceeded?
A RESTlet request is rejected with HTTP 400 and the SuiteScript error code SSS_REQUEST_LIMIT_EXCEEDED. REST web services return status 429 with CONCURRENCY_LIMIT_EXCEEDED. SOAP web services return the fault WS_REQUEST_BLOCKED with token-based authentication, or WS_CONCUR_SESSION_DISALLWD with request-level credentials. In every case the request has not been processed and has to be sent again.
Does a NetSuite sandbox have the same concurrency limit as production?
A sandbox account matches the governance limit of the production account. Development and partner accounts always have a limit of 5, and that limit does not grow with SuiteCloud Plus licenses. An integration that is load tested in a development account is therefore tested against the lowest limit NetSuite has.
Tell us what you need
Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.
- You know the price and the timeline before you commit to anything
- We work out the connection that takes the work off your hands
- We handle the build, hosting, monitoring and maintenance
- Your team has less information to retype and fewer discrepancies to chase