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 = truecsutil__status__c = PROCESS_AFTER_FINISH- The driver is
ApexBatchJobDriver. The async class iscscfga.PCAsyncCopyTask. - In the Apex debug log,
LIMIT_USAGE|QUEUEABLE|2|1appears 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:
- The csutil setting
csutil__CSUtilConfig__c.csutil__run_as_integration_user__cistrue. - The installed csutil version is earlier than 38.0.6 (R38) or earlier than 37.0.4 (R37).
- 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():
MultipleCloningProcessEventHandler.execute()enqueues the first job.AfterBatchCompleted.invokeObservers()enqueues the second job. Salesforce then throws theLimitException.
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
csutilorcsordtelcoa.
Solution
Step 1: Check the installed csutil version
- In the affected org, go to Setup → Installed Packages.
- Find the csutil package (namespace
csutil). Record the version number. - 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
- 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.
- Run a Recontract or MACD flow in the sandbox. Make sure that the flow completes.
- Install the same csutil version in production.
Step 3: Rerun the failed flow and verify
- Rerun the Recontract or MACD flow that failed.
- Open the async task record for the new run.
- 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 |
Mohammed Amer
Comments