Webhooks deliver asynchronous notifications when events occur in the Return Helper system — for example, when a label is generated or a shipment arrives at the warehouse. Your server must expose an HTTPS endpoint to receive these POST requests.
Before submitting a setup request, make sure your endpoint meets the following requirements:
Publicly accessible — the URL must be reachable from the internet (no VPN, localhost, or internal-only addresses)
HTTPS — the endpoint must be served over HTTPS with a valid TLS certificate
HTTP POST — the endpoint must accept POST requests with a application/json body
Respond HTTP 200 — your server must return a 200 OK status promptly after receiving the request; any other status code or a timeout is treated as a failed delivery
Fast response — process the event asynchronously if needed; do not perform heavy work before responding, to avoid delivery timeouts
To register your webhook endpoint, please fill in the Webhook Setup Request Form. The form contains all the information we need to complete the setup quickly, and is the fastest way to get your endpoint activated.
We recommend using the form above, as it ensures all required details are captured in one step. If you are unable to use the form, you may also send the request by email — see the template below.
Email template (if you cannot use the form)
If you prefer to contact us by email, send the following to support@returnhelper.com and CC paco@returnhelper.com, tingfung@returnhelper.com, and roy@returnhelper.com:
Subject: Request webhook setup in Return Helper - <YOUR CLIENT CODE>To: support@returnhelper.comCC: paco@returnhelper.com, tingfung@returnhelper.com, roy@returnhelper.comDear Support Team,We would like to request webhook setup in Return Helper. Please find the details below:Email address: <YOUR EMAIL ADDRESS>Client code: <YOUR CLIENT CODE>Endpoint: https://your-server.example.com/webhookEnvironment: <Sandbox / Production / Both>Comments: <Any additional information, or leave blank>
Timing — Events may arrive a few seconds after the triggering action, and in rare cases up to a few minutes later.Duplicate events — Your endpoint may receive the same event more than once. Implement idempotent processing (e.g. track processed eventTime + notificationId combinations).Event ordering — Delivery order is not guaranteed. Design your handler to process events in any order. For example, inventoryCreated may arrive before warehouseMarkShipmentArrivedV2. Use the API to fetch any objects referenced in events you receive out of sequence.Each event includes an eventTime field in ISO 8601 format.
Always verify the signature before processing any payload. Use the raw request body — any transformation (e.g. by a framework that re-serialises JSON) will cause verification to fail.
Your signing key is provided by Return Helper (it is Base64-encoded). Store it securely and never expose it.
Decode the string_to_sign (from Step 3) from Base64 → byte array
Decode your signing key from Base64 → byte array
Compute HMAC-SHA256 using the signing key bytes over the string_to_sign bytes → signature byte array
Base64-encode the signature byte array
Expected result:
gXJRba6qE2rCQqJc8WEou2i8cCl0STp2AjH+y/R6ltw=
Step 5 — Compare signaturesCompare the signature computed in Step 4 with the one extracted in Step 1. Use a constant-time string comparison to prevent timing attacks.Additional security: Reject events where eventTime differs from your system clock by more than 15 minutes (replay attack protection).
Respond with a 2xx HTTP status code to acknowledge receipt. Non-2xx responses trigger retries. After 10 consecutive failures, notification delivery to your endpoint is suspended for 24 hours.
Sent when a return label request completes (success or failure).
Always use shipmentId to match labels to shipments in your system — do not use labelId. In rare cases a carrier failure causes a new label (with a new labelId) to be issued for the same shipmentId.
category: labelGenerated / action: labelGeneratedKey fields in label:
Field
Description
labelId
Label identifier (do not use for matching — see warning above)
Sent when a warehouse marks a shipment received. Always followed by one or more Inventory Created events.category: rsl / action: markShipmentArrive / version: 202407Key fields in shipment:
Sent after a shipment is received (or a VAS split occurs) to notify that a new return inventory record has been created. One event is sent per inventory item — a single shipment may produce multiple events if multiple packages were received under the same label.category: newInventoryCreated / action: newInventoryCreatedKey fields in returnInventory:
Field
Description
returnInventoryId
Unique inventory identifier — use this to assign handling
warehouseId
Warehouse where inventory is held
rma
Warehouse-assigned RMA value
handlingCode
Current handling instruction
handlingStatusCode
Current handling status
imageList
Images captured at receipt
returnInventoryMetaList
Additional metadata (e.g. custom fields from shipment)
Sent when a shipment with no prior return request is identified and assigned to a seller.category: rsl / action: assignUnknown / version: 202407Key fields in returnInventory:
Sent when a handling instruction (dispose, resend, recall, etc.) is completed by the warehouse.category: rinv / action: completeInventoryHandlingKey fields in returnInventory:
Sent when a warehouse updates the measured dimensions or weight of a return inventory.category: completeRecalibrate / action: completeRecalibrateKey fields in recalibrateSupplement:
Field
Description
warehouseId
Warehouse that performed recalibration
returnInventoryId
Affected inventory ID
returnRequestLineItemId
Linked line item ID
rma
RMA value
dimension1 / dimension2 / dimension3
Updated dimensions
weight
Updated weight
recalibratedOn
Recalibration timestamp
returnInventoryMetaList
Updated metadata list (each entry has metaType and metaMap)
Sent when a warehouse or user adds or updates metadata on a return inventory.category: updateReturnInventoryMeta / action: updateReturnInventoryMetaThe payload contains returnInventory with the same structure as Inventory Created, including the updated returnInventoryMetaList.metaType values:
Sent when a seller updates the SKU of a return inventory.category: userUpdateReturnInventorySku / action: userUpdateReturnInventorySkuThe payload contains returnRequest and returnInventory.Key fields in returnRequest:
Field
Description
returnRequestId
Unique return request identifier
apiId
Seller API ID
sellerReferenceNumber
Seller’s reference number
returnStatusCode
Return request status
returnTitle
Return title
totalValue / totalValueCurrency
Total declared value and currency
remarks
Remarks
rma
RMA value
isArchived
Whether the request is archived
returnRequestSourceType
Source type of the return request
The returnInventory object follows the same structure as Inventory Handling Complete, with the updated sku field.
Sent when a VAS operation splits a parcel into multiple inventories. Contains the new line item and inventory records for each resulting parcel.category: lineItemVasReturnInventoryLineItem / action: splitLineItemTop-level payload fields:
Field
Type
Description
returnRequestId
integer
Linked return request ID
returnRequestLineItemId
long
Original line item ID
returnRequestLineItemVasId
long
VAS record ID that triggered the split
vasStatusCode
string
VAS status code
splitLineItemAndReturnInventoryList
array
List of resulting split items (see below)
Each item in splitLineItemAndReturnInventoryList contains:
Field
Type
Description
returnRequestLineItem
object
New line item record (includes returnRequestLineItemId, sellerReferenceNumber, description, quantity, weight, weightUom, valueCurrencyCode, value, handlingCode, rma, customFieldMap)
Sent when a warehouse updates remarks on a return request.category: warehouseUpdateWarehouseRemarks / action: warehouseUpdateWarehouseRemarksThe payload contains three objects:
Sent when a buyer creates a return in the Branded Return portal and a label is generated.
Only applicable to customers integrated with the Return Helper Branded Return service.
category: buyerReturnRrLabel / action: buyerReturnLabelGeneratedCheck buyerReturn.labelRequestStatusCode for "success" or "fail".Key fields in buyerReturn:
Sent when a buyer creates a return request via Shopify integration.category: shopifyBuyerCreateReturn / action: shopifyBuyerCreateReturnKey fields in shopifyReturn:
Sent when the shipping cost of a consolidated shipping order is updated.category: consolidateShippingOrderShippingFeeUpdated / action: consolidateShippingOrderShippingFeeUpdatedKey fields in order:
Sent when a warehouse has packed all inventories into boxes for a consolidated order.category: consolidateShippingOrderInventoryAllPacked / action: consolidateShippingOrderInventoryAllPackedKey fields in order:
Sent when a warehouse dispatches a consolidated shipment to a carrier.category: consolidateShippingShipmentSent / action: consolidateShippingShipmentSentKey fields in shipment:
Sent when the Air Waybill number for a consolidated shipment is updated.category: consolidateShippingShipmentShipped / action: consolidateShippingShipmentShippedThe shipment object follows the same structure as Consolidate Shipment Sent, with the updated awb field.
Sent when all shipments in a consolidated order have been shipped.category: consolidateShippingOrderCompleted / action: consolidateShippingOrderCompletedThe order object follows the same structure as Consolidate Shipping All Packed, including the full shipmentList with boxList and inventory details.
Sent when a warehouse force-cancels a consolidated shipping order.category: consolidateShippingOrderCancelled / action: consolidateShippingOrderCancelledKey fields in order: