What is it?
The payments layer of the Salesforce Commerce Cloud (SFCC) integration covers two flows: refund orchestration and exchange payment timing. In both, Ingrid Returns provides the calculated amounts and controls the timing, while your system executes the actual transactions in SFCC. Ingrid does not call any SFCC payment or order API directly.
For refunds, Ingrid calculates what's owed after items are processed at the warehouse and emits a refund-ready event. For exchanges, Ingrid sends a signed event when your exchange policy timing condition is met, and your system creates the exchange order.
How it works
Refund flow
A customer submits a return in the Ingrid Returns widget.
Items arrive at the warehouse and are confirmed via quality check or a warehouse integration.
Ingrid calculates the refund amount from returned items, return costs, and any exchange cost deductions.
Ingrid emits the
REFUND_PENDING_EXTERNALevent to your webhook endpoint once the calculation is complete.The payload includes a refund transaction ID.
Your system fetches the full breakdown from
GET /merchant/refund/transaction— items amount, shipping refund, exchange cost, total, and currency.Your system issues the refund in SFCC using those amounts.
Your system confirms completion via the Public API.
Exchange payment flow
When the exchange policy condition is met, Ingrid sends a
POSTto your configured webhook URL.The request is signed with HMAC-SHA256; the signature appears in the
X-Ingrid-Signatureheader.Your endpoint verifies the signature before processing.
Your system creates the exchange order in SFCC.
If your endpoint is unavailable, the exchange fails — SFCC availability is irrelevant; only your endpoint's availability matters. A single return can generate more than one exchange event, each as a separate webhook call.
Ingrid controls the timing and supplies the amounts. Your system controls the money movement.
Exchange policy timing
Policy | When the exchange event fires |
Immediate exchange | When the customer confirms the return — before items reach the warehouse |
Exchange on return | When all returned items are received at the warehouse |
Exchange on shipment | When the returned parcel is in transit (carrier scan) |
Manual approval | When a Back-office user approves the exchange |
Configuration
Exchange policy
Shop level:
Returns Back-office → Settings → Shop Settings— applies to all price lists by default (default: immediate exchange).Price list level:
Returns Back-office → Settings → Price Setups— overrides the shop-level setting for a specific price list.
Webhook URL and secret
Set your webhook URL and secret in the Salesforce ecom integration settings in the Returns Back-office. Both are required — if either is missing, exchange webhook deliveries fail. The secret is used to compute the HMAC-SHA256 signature your endpoint verifies.
Webhook authentication
Outbound notifications (including refund events) are configured in Returns Back-office → Integrations → Webhook Outgoing Subscriptions and can be authenticated with:
Method | Description |
API key | A key you generate to verify requests genuinely come from Ingrid |
OAuth 2.0 | OAuth 2.0 authentication |
Microsoft Business Central | Microsoft Business Central authentication |
Subscribe to REFUND_PENDING_EXTERNAL specifically. It's distinct from the warehouse receipt event — subscribing only to receipt events won't give you refund amounts.
Examples
Refund after warehouse receipt
A merchant refunds customers only after returned items are confirmed at the warehouse.
A customer returns a £89 jacket.
Warehouse staff confirm receipt via quality check.
Ingrid emits
REFUND_PENDING_EXTERNALwith a refund transaction ID.The merchant calls
GET /merchant/refund/transactionand receives a total of £89.00 with no return cost applied.The merchant issues the £89 refund in SFCC.
The merchant confirms completion via the Public API.
Result: the refund is issued with a verified amount, no manual calculation, within hours of warehouse confirmation.
Immediate exchange on return confirmation
A merchant ships the replacement as soon as the customer confirms the return, without waiting for the original to arrive. Policy: immediate exchange.
A customer selects a size L shirt to replace a size M they're returning.
Ingrid confirms the return and sends a signed
POSTto the merchant's exchange endpoint.The endpoint verifies
X-Ingrid-Signatureusing the webhook secret.The merchant creates a new size L order in SFCC.
SFCC fulfillment picks it up as a standard order.
Result: the replacement ships before the returned item arrives, for a faster, frictionless customer experience.
FAQ
The refund event fired but there's no amount in the payload — where is it?
The payload carries a refund transaction ID, not the amounts. Use it to filter GET /merchant/refund/transaction and retrieve the full breakdown (total amount, shipping refund, return costs).
The calculated refund is zero. Why?
Ingrid calculates from the customer-currency price fields on the order line items. If those were missing when the order was ingested, the amount will be zero and no refund transaction is created. Confirm the order was pushed with correct customer-currency prices.
How do I verify an incoming exchange webhook is genuinely from Ingrid?
Compute HMAC-SHA256 of the raw request body using your webhook secret and compare it to the X-Ingrid-Signature header. Reject the request if they don't match.
We received exchange webhooks for the same return more than once — is that expected?
Yes. A single return can be associated with multiple exchange orders, and each generates its own webhook call.
Can we change the exchange policy after go-live?
Yes. Changes apply to new returns from that point. Returns already in progress keep the policy that was active when they were created.
Our endpoint was down during an exchange event — will Ingrid retry?
Don't rely on automatic redelivery. Use the Public API to retrieve the return and exchange data and process the exchange manually if an event was missed.
Limitations
Constraint | Type | Detail |
No direct SFCC calls for refunds | Hard limit | Ingrid calls no SFCC payment API. Your system issues the refund after the |
Exchange depends on your endpoint | Hard limit | If your webhook URL is unavailable, the exchange fails regardless of SFCC availability. |
Refund calculation needs customer-currency prices | Hard limit | Missing customer-currency price fields result in a zero refund amount and no transaction record. |
Policy applies at return creation time | Hard limit | Changing the policy doesn't affect returns already in progress. |
Price list overrides shop-level policy | Configurable | Exchange policy on a price list takes precedence over the shop-level default. |
