Salesforce → ERP¶
Salesforce does not push prices to ERP. There is no webhook and no ERP_Integration_Setting for Product_Price__c. ERP is the caller. What comes back is the HTTP result of that call.
Single price upsert¶
A key Salesforce has never seen is HTTP 201:
ERP requires id and does not store it. The price row has no Salesforce id field. The create or update API the caller used has already been answered with the saved row. A failed upsert leaves that row at syncStatus Failed.
A key Salesforce already has is HTTP 204 and an empty body.
ERP reads that as a failure: price upsert: empty id (status 204). The local row becomes Failed. The Salesforce record was updated. The next single sync sends the same PATCH and gets 204 again.
A failure also posts the failed Integration Log.
A validation failure is the Salesforce error array. On POST /api/prices and PATCH /api/prices/{skuBatchKey} the caller still receives the saved row. On the explicit sync-to-salesforce call the answer is HTTP 500 internal_error with message internal server error.
Composite batch change¶
The new batch is HTTP 200 from POST /services/data/v67.0/composite. Each step reports its own status. A 2xx step is a success here, including a 204 with an empty body on the price being end-dated. The new key is a 201.
{
"compositeResponse": [
{
"referenceId": "endDateOldBatch0",
"httpStatusCode": 204,
"body": null
},
{
"referenceId": "newBatch",
"httpStatusCode": 201,
"body": {
"id": "a0R000000000002AAA",
"success": true,
"errors": [],
"created": true
}
}
]
}
ERP does not read those ids. Both local rows become Synced.
A failed step makes the Composite fail. With allOrNone true, Salesforce rolls the call back, and a later step can come back as PROCESSING_HALTED. ERP marks the new price and every price it closed as Failed, and posts the failed Integration Log. The November row stays closed locally on 2026-11-30 even when Salesforce rolled the end date back.