Cart Recovery
Cart recovery is entirely optional. By default, Simpler emails shoppers who abandon their checkout with a link back to their cart. Implement this endpoint only if you would rather follow up with shoppers using your own tools.
When a shopper leaves Simpler Checkout without completing their purchase, Simpler can send the abandoned checkout to your system instead of emailing the shopper. You receive who the shopper is, what they left in their cart and a link that brings them back, so you can run the follow-up through your own email platform, CRM or marketing automation.
Your store receives cart recoveries in one way only: either Simpler emails the shopper, or Simpler sends the cart to you. It never does both.
- Full request schema: Receive Cart Recovery API reference
- Delivery semantics: Retries & Timeouts
When Simpler sends a cart recovery
Simpler sends a cart recovery when a shopper has started a checkout, entered their email address and then left it inactive for a while without completing the purchase.
To avoid overwhelming shoppers, Simpler sends at most one cart recovery per shopper within a cooldown period, even if they abandon several checkouts.
Receiving a cart recovery
Simpler sends a POST request to /simpler/v1/cart-recovery on your store, authenticated in the same way as the rest of the Platform Interface.
The request contains:
customer— the shopper'semail, and theirfirst_nameandlocalewhen they are known.items— the products left in the cart, with theirproduct_id,quantityand selectedattributes.recovery_url— a link that brings the shopper back to Simpler Checkout with their cart and the details they had already entered.abandoned_at— when the shopper abandoned the checkout.
{
"abandoned_at": "2026-10-21T09:00:00Z",
"customer": {
"email": "john.doe@simpler.so",
"first_name": "John",
"locale": "el_GR"
},
"items": [
{
"product_id": "1234",
"quantity": 1,
"attributes": { "Size": "XL", "Color": "White" }
}
],
"recovery_url": "https://checkout.simpler.so/recover/5f0c6a52-8a1d-4c1e-9f2a-7b3d2e1c4a90"
}
Let's implement a simple receiver that stores the cart recovery and hands it to your marketing tooling in the background.
class SimplerCartRecoveryController extends AbstractController {
public function receiveCartRecovery(Request $request): Response {
// 1. Verify the Security Signature
// Always validate that the request actually came from Simpler
$signature = $request->headers->get('X-Simpler-CRC');
$payload = $request->getContent();
$mySecret = 'YOUR_APP_SECRET';
if (hash_hmac('sha1', $payload, $mySecret) !== $signature) {
return new Response('Invalid Signature', 401);
}
// 2. Parse the cart recovery
$recovery = json_decode($payload, true);
// 3. Queue the follow-up
// Your email platform or CRM decides when and how to contact the shopper,
// using the recovery URL as the call to action.
CartRecoveryQueue::push([
'email' => $recovery['customer']['email'],
'first_name' => $recovery['customer']['first_name'] ?? null,
'locale' => $recovery['customer']['locale'] ?? null,
'items' => $recovery['items'],
'recovery_url' => $recovery['recovery_url'],
]);
// 4. Acknowledge receipt
// Return 202 Accepted immediately so Simpler knows you received it.
return new Response('Cart Recovery Received', 202);
}
}
Return 202 Accepted as soon as you have stored the request, and contact the shopper from a background job. Simpler does not currently retry failed deliveries, so a cart recovery that fails or times out is not sent again.
Cart recoveries are not deduplicated. In rare cases you may receive the same abandoned checkout twice, so make sure your follow-up doesn't contact the shopper twice for the same cart.
Other platforms
If your store runs on one of our plugins (such as WooCommerce, Magento or PrestaShop), or you'd rather receive cart recoveries directly in a separate tool, Simpler can send them to any URL you choose. The request is the same as above.
Cart recovery is enabled per store. Once your endpoint is live and publicly accessible, contact our Integrations Support team so we can switch your store to receive cart recoveries. If your endpoint isn't at /simpler/v1/cart-recovery, share its full URL too.