Back to articles
integrations7 min read

NetSuite Concurrency Errors: Why They Happen and How to Fix Them

Understand why multiple NetSuite integrations hit concurrency errors and learn practical ways to prevent failed requests.

By Ashoka Sanjapu

When Concurrency Becomes a Real Problem

Your integration works correctly during testing. Then production traffic increases, multiple integrations begin running together, and requests suddenly start failing.

You add retries, but the errors continue. In some cases, the retries create even more traffic and make the problem worse.

A valid NetSuite request can still fail when other integrations are already using the account's available concurrency.

The issue is usually not one bad request. It is how several integrations share and consume the available NetSuite capacity.

What NetSuite Concurrency Actually Means

Concurrency is the number of integration requests NetSuite can process at the same time.

The account-level concurrency limit is shared across:

Request typeUses the shared integration concurrency limit?
RESTletsYes
REST Web ServicesYes
SOAP Web ServicesYes
Map/Reduce ScriptsNo, they use separate SuiteScript governance
Scheduled ScriptsNo, they use separate SuiteScript governance

Each active RESTlet or web-services request occupies part of the available concurrency until it finishes.

Concurrency is not the total number of requests sent during a day. It is the number of requests running at the same moment.

A Simple Example

Assume an account has five available concurrent requests.

At one moment, the following requests are running:

  • Three RESTlet requests from an order integration
  • One REST Web Services request from an inventory integration
  • One SOAP request from another application

All five available requests are now in use.

If another request arrives before one finishes, NetSuite can reject it even though the request itself is valid.

The problem is not always the number of records being processed. It is how many requests are active at the same time and how long they remain active.

Why Concurrency Errors Happen

Concurrency problems usually come from a combination of:

  • Too many parallel requests
  • Multiple integrations running at the same time
  • Slow RESTlets holding request slots for too long
  • Immediate retries creating another traffic spike
  • Sending one simultaneous API request for every record

An integration may work correctly by itself but fail when other applications begin using the same NetSuite account.

Common Concurrency Errors

The error depends on the integration method.

Integration methodCommon response
RESTletHTTP 400 with SSS_REQUEST_LIMIT_EXCEEDED
REST Web ServicesHTTP 429 with CONCURRENCY_LIMIT_EXCEEDED
SOAP using token-based authenticationExceededConcurrentRequestLimitFault or WS_REQUEST_BLOCKED
SOAP using request-level credentialsExceededRequestLimitFault or WS_CONCUR_SESSION_DISALLWD

Do not treat every HTTP 400 or 429 response as a concurrency problem. Check the NetSuite error code before deciding whether the request should be retried.

Diagnose the Problem Before Changing Code

Before increasing limits or changing middleware settings, confirm where the requests are coming from.

Check Integration Governance

In NetSuite, navigate to:

Setup
→ Integration
→ Integration Management
→ Integration Governance

Review:

  • Account concurrency limit
  • Peak concurrency
  • Rejected requests
  • Rejected-request ratio
  • Limits assigned to individual integrations

Check the Concurrency Monitor

The APM SuiteApp Concurrency Monitor can help identify:

NetSuite Concurrency Monitor

  • Which integrations use the most concurrency
  • When requests exceeded the limit
  • Which integrations were running together
  • Periods when usage approached the account limit

Match Errors With Integration Schedules

Compare the failure time with middleware schedules, order imports, inventory synchronizations, reporting jobs, and retry queues.

Failures that occur at the same time each day often point to overlapping schedules.

How to Fix NetSuite Concurrency Errors

1. Control the Request Flow

Do not send every record to NetSuite at the same time.

Use a controlled worker pool:

async function runWithConcurrency(items, limit, worker) {
  const queue = [...items];

  const workers = Array.from(
    { length: Math.min(limit, queue.length) },
    async () => {
      while (queue.length > 0) {
        const item = queue.shift();

        if (item !== undefined) {
          await worker(item);
        }
      }
    },
  );

  await Promise.all(workers);
}

await runWithConcurrency(orders, 3, sendOrderToNetSuite);

This processes a maximum of three orders at the same time.

Leave part of the account limit available for other integrations. Large scheduled integrations should also run at different times instead of competing for the same capacity.

2. Retry Safely

Retry only recognized concurrency failures. Validation, authentication, and invalid-data errors usually require correction instead.

Use exponential backoff with jitter so failed requests do not retry together:

const wait = milliseconds =>
  new Promise(resolve => setTimeout(resolve, milliseconds));

function isConcurrencyError(error) {
  const status = error?.status ?? error?.response?.status;
  const code =
    error?.code ??
    error?.response?.data?.code ??
    error?.response?.data?.["o:errorCode"];

  return (
    status === 429 ||
    code === "SSS_REQUEST_LIMIT_EXCEEDED" ||
    code === "CONCURRENCY_LIMIT_EXCEEDED" ||
    code === "WS_REQUEST_BLOCKED" ||
    code === "WS_CONCUR_SESSION_DISALLWD"
  );
}

async function executeWithRetry(operation, maxAttempts = 5) {
  for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
    try {
      return await operation();
    } catch (error) {
      if (!isConcurrencyError(error) || attempt === maxAttempts) {
        throw error;
      }

      const delay =
        1000 * 2 ** (attempt - 1) +
        Math.floor(Math.random() * 500);

      await wait(delay);
    }
  }
}

3. Reduce Pressure on NetSuite

Keep RESTlets and web-service requests focused:

  • Avoid repeated searches and record loads
  • Avoid updating the same record multiple times
  • Return only the data the caller needs
  • Move heavy processing to Map/Reduce when appropriate
  • Use integration-specific limits only when one application needs control
  • Increase SuiteCloud Plus capacity only after optimizing the integration

Moving work to Map/Reduce does not increase external API concurrency. It can shorten the RESTlet request by validating and queuing work instead of processing everything synchronously.

Reliable pattern: Limit active requests, retry temporary failures safely, and keep each NetSuite request short.

Quick Troubleshooting Checklist

  • Confirm the account concurrency limit
  • Review rejected requests in Integration Governance
  • Identify integrations running at the failure time
  • Review middleware worker settings
  • Measure request duration
  • Add controlled retries with backoff
  • Stagger overlapping integration schedules

Final Thoughts

NetSuite concurrency errors are rarely fixed by adding retries alone.

The reliable solution is to control how many requests are sent at once, keep each request focused, and retry temporary failures without creating another traffic spike.

A well-designed integration leaves room for other applications and makes final failures easy to identify and reconcile.

Official References