Start a conversation

Recontract or MACD cloning fails with "csutil:Too many queueable jobs added to the queue: 2" (fixed in csutil 38.0.6 / 37.0.4)

Overview

Problem

A Recontract or MACD flow fails during asynchronous product configuration cloning. The async task stops with a Salesforce governor-limit exception from the csutil package.

Symptoms

  • The async task shows this error: System.LimitException: csutil:Too many queueable jobs added to the queue: 2
  • On the async task record:
  • csutil__has_errors__c = true
  • csutil__status__c = PROCESS_AFTER_FINISH
  • The driver is ApexBatchJobDriver. The async class is cscfga.PCAsyncCopyTask.
  • In the Apex debug log, LIMIT_USAGE|QUEUEABLE|2|1 appears before the exception.
  • The top of the stack trace is: csutil.AsyncTaskIntegrationCheckRunner.start ← csutil.AsyncTaskManager.enqueueAsyncTasksRun ← csordtelcoa.AfterBatchCompleted.invokeObservers ← csordtelcoa.MultipleCloningProcessEventHandler.execute

When this issue applies

All three conditions must be true:

  1. The csutil setting csutil__CSUtilConfig__c.csutil__run_as_integration_user__c is true.
  2. The installed csutil version is earlier than 38.0.6 (R38) or earlier than 37.0.4 (R37).
  3. A process asks csutil to enqueue async tasks two or more times in one asynchronous transaction, for example in one Batch Apex execute(). Recontract and MACD cloning do this.

Root cause

Salesforce allows one queueable job per Batch Apex execute() transaction. Salesforce counts this limit separately for each managed-package namespace.

When run_as_integration_user__c is true, csutil starts its async tasks through AsyncTaskIntegrationCheckRunner. Before the fix, this runner did not check whether it had already enqueued a job in the same transaction. The standard runner already had that check.

During Recontract and MACD cloning, the Telecoms module (csordtelcoa) asks csutil to enqueue async tasks twice in one Batch execute():

  1. MultipleCloningProcessEventHandler.execute() enqueues the first job.
  2. AfterBatchCompleted.invokeObservers() enqueues the second job. Salesforce then throws the LimitException.

The Telecoms module cannot detect csutil's enqueue, because Limits.getQueueableJobs() covers only the caller's own namespace. The defect is in csutil. Any package that uses csutil with the same call pattern can hit it.

Fix availability

The fix adds a same-transaction check to AsyncTaskIntegrationCheckRunner. The fix is in csutil only.

Release line Package Fixed version Release date
R38 csutil 38.0.6 2026-07-14
R37 csutil 37.0.4 2026-07-14
  • R38 install link, to use in the target org: /packaging/installPackage.apexp?p0=04td10000005Sy9AAE
  • R37: contact CloudSense Support for the 37.0.4 install link.

A Telecoms module (csordtelcoa) upgrade alone does not fix this issue. An early fix in the Telecoms module was later removed. You must upgrade csutil.

The Telecoms module does not formally require csutil 38.0.6. The package installer therefore does not force the csutil upgrade. Upgrade csutil yourself.

Definitions

  • MACD: Move, Add, Change, Delete. A change flow on an existing subscription or solution.
  • Queueable job: a Salesforce asynchronous Apex job. Salesforce limits how many one transaction can start.
  • Namespace: the prefix of a managed package, for example csutil or csordtelcoa.

Solution

Step 1: Check the installed csutil version

  1. In the affected org, go to Setup → Installed Packages.
  2. Find the csutil package (namespace csutil). Record the version number.
  3. Compare the version with the fixed version for your release line: - R38: 38.0.6 or later is fixed. - R37: 37.0.4 or later is fixed.

If the installed version is equal to or later than the fixed version, this known issue does not apply. Go to "When to contact Support" below and report the error as a new issue.

Step 2: Upgrade csutil

  1. Install the fixed csutil version in a sandbox first. - R38: use the install link in "Fix availability". - R37: get the 37.0.4 install link from CloudSense Support.
  2. Run a Recontract or MACD flow in the sandbox. Make sure that the flow completes.
  3. Install the same csutil version in production.

Step 3: Rerun the failed flow and verify

  1. Rerun the Recontract or MACD flow that failed.
  2. Open the async task record for the new run.
  3. Make sure that csutil__has_errors__c = false.

When to contact Support

Contact CloudSense Support if one of these is true:

  • The error occurs on csutil 38.0.6 or later (R38), or 37.0.4 or later (R37).
  • You need the R37 37.0.4 install link.

Send all of this information in your first message:

Item How to get it If you cannot get it
Org ID and org type (production or sandbox) Setup → Company Information Send the org name and type
Installed versions of csutil, cscfga, and csordtelcoa Setup → Installed Packages Send a screenshot of the Installed Packages page
Value of csutil__run_as_integration_user__c Query csutil__CSUtilConfig__c, or open the custom setting in Setup State that you could not read it
The full error text and stack trace The async task record, or the Apex debug log Send the async task record ID
An Apex debug log of the failed run Setup → Debug Logs. Set a trace flag on the running user, then reproduce the failure Send the date and time (with time zone) of the failure
The flow type and the affected record IDs The Recontract or MACD basket, opportunity, or order Send the basket or order name
Choose files or drag and drop files
Was this article helpful?
Yes
No
  1. Mohammed Amer

  2. Posted

Comments