Skip to content
SyncMyShop

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"
    }
  ]
}
A sixth concurrent request on a NetSuite account with a limit of 5 The order sync has 4 RESTlet calls in flight and a warehouse integration has 1 SuiteQL request in flight on a Standard tier account with a concurrency limit of 5. The sixth request is rejected with HTTP 400 and SSS_REQUEST_LIMIT_EXCEEDED, waits in the queue and succeeds 2 seconds later. Order sync with a queue NetSuite Standard, limit 5 Warehouse other integration 4 RESTlet calls in flight 1 SuiteQL request in flight 5 of 5 slots in use POST restlet, request 6 400 SSS_REQUEST_LIMIT_EXCEEDED order stays in the queue 2 seconds later POST restlet, retry 1 200 OK, sales order created NetSuite rejects the request over the limit and does not hold it. The queue keeps the order and sends it again.
Five requests are in flight on an account with a limit of 5. The sixth is rejected, waits in the queue and succeeds on the retry.

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:

  1. A SuiteCloud Plus license. Each one adds 10 concurrent requests. A Standard account goes from 5 to 15.
  2. 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.
  3. 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

Suppliers, products, orders per day, a rough estimate is fine.

Or email directly: carsten@syncmyshop.com