Issue
When syncing data using a Reverse ETL connection to Salesforce, the sync fails with a 403 Forbidden status and the destination returns the error: REQUEST_LIMIT_EXCEEDED: ConcurrentPerOrgLongTxn Limit exceeded.
If users attempt to resolve this by enabling the Bulk API for an upsert operation, the sync may subsequently fail and return the following payload error: Undefined bulkUpsertExternalId.externalIdName or externalIdValue when using bulkUpsert operation.
Product
Segment
Environment
Segment Console
Cause
The ConcurrentPerOrgLongTxn error occurs because standard REST API requests are sent individually. When Reverse ETL extracts and sends a high volume of records simultaneously, it exceeds Salesforce's concurrent transaction limits.
Enabling the Bulk API resolves this by collecting events into batches of up to 5,000 before sending them to Salesforce. However, if the operation is set to "Upsert", the Undefined bulkUpsertExternalId error occurs because the Bulk API requires a specifically mapped External ID to perform upsert operations, which is missing from the destination mapping.
Resolution
- Navigate to your Reverse ETL mapping in the Segment Console.
- Toggle the Use Salesforce Bulk API setting to Yes to batch requests and prevent concurrency limit errors.
- In the mapping settings, locate the Bulk Upsert External Id section.
- Map the External Id Name to the exact Salesforce API name of the field used as your unique identifier (for example, Email).
- Map the External Id Value to the corresponding column from your source model.
- Ensure that the field used for the External ID is not included again in the Other Fields mapping section. Including it as a custom field will cause an error in Salesforce.
- Save the mapping and run a sync.
Additional Information
- Segment automatically retries events that were extracted from your data warehouse but failed to load.
- When Segment processes retries, the records from the current sync are always loaded first, followed by the previous failures. Because of this, the load graph for the newest sync will only reflect the initial load results. Once the retried records are successfully loaded, the Segment Console will update the status of the original failed syncs to "Success".