Cart recovery (organic)
The organic-side cart recovery playbook reaches shoppers who abandoned their cart with a WhatsApp / SMS / email follow-up that includes a payment link letting them complete the order in one tap. It pairs with the paid cart recovery playbook for shoppers who don’t respond to the first touch.
Why server-side, not browser-side
Some platforms detect abandonment with a browser timer (“sat on checkout for 30 seconds, fire a popup”). That model breaks down for almost every real scenario:
- Misses tab-close, browser-crash, lost-network abandonments
- Burns battery
- Leaks timing logic into the browser
Active Reach detects abandonment server-side via a Celery beat scan over ClickHouse — storefront_cart_abandonment_scanner.py. The scanner finds carts where:
cart.addedfired- No
transaction.purchasefollowed within the abandonment window - The contact hasn’t been touched by recovery in this window
This catches everything. The trade-off: detection latency is 15–30 minutes, not seconds. For cart recovery this is the right trade-off — most abandonments resolve themselves within 5 minutes; the 15–30 min lag means you only follow up with genuine abandoners. The same server-side beat model applies to search, browse, and checkout abandonment.
The playbook
T+30m First touch — WhatsApp template with cart contents + payment link
T+4h Second touch — same channel, gentler nudge if still unconverted
T+24h Third touch — different channel (email if first touches were WA)
T+48h Handoff to paid cart recovery (Meta DPA / Google Shopping)
(any point) Conversion → suppress every pending touchEach touch is gated by the journey-driven dispatch policy — chat-first override, frequency caps, warm-offer collapse, and platform suppression all apply.
Payment link auto-injection
Every cart-recovery touch includes a one-tap payment link. The link is generated automatically — operators don’t need to think about it:
| Layer | Behaviour |
|---|---|
| Engine | Auto-injects {{generated.payment_link}} into every cart-recovery template |
| AI playbook generator | When the AI assistant drafts a cart-recovery journey, the payment-link node is auto-emitted |
| UI | The drawer shows a “payment link will be generated” confirmation when the operator drafts the journey |
If you remove the placeholder by mistake, it gets re-injected at send-time so the link is never absent.
The link itself routes through your configured payment processor — see Cashfree integration for the wiring.
Activating the playbook
Discover
Go to Engage → Automations → Discover → Cart recovery (organic). The card shows estimated weekly recoveries based on your historical abandonment rate.
Review the template
Click into the playbook. You see:
- Trigger:
cart.added+ no purchase within 30 min - Touch schedule (3 touches over 48 hours)
- Channel mix (defaults to WhatsApp + email)
- Suppression rules (recent buyers, opted-out, in support thread)
Customise (optional)
The defaults work for most workspaces, but you can:
- Tighten or widen the touch schedule
- Swap channels (e.g. SMS instead of WhatsApp if your audience prefers it)
- Edit message copy (a creative profile is applied automatically; you can override per-touch)
Activate
Click Activate. The playbook enters Live state and starts enrolling abandoners on the next scanner cycle (within 30 min).
Cross-channel personalisation
The same playbook adapts the message to whichever channel ends up delivering:
| Channel | What the touch looks like |
|---|---|
| Approved template with cart contents (product images), price total, payment link button | |
| SMS | Concise text — Your cart is waiting. Tap to finish: {link} |
| Rich HTML with full cart, recommendation block, payment link CTA | |
| In-app | Rendered as a banner when the contact next opens your storefront |
You don’t author per-channel copies — the engine picks the right template family from your channel templates library based on the channel that actually delivers.
Recovery vs reminder
The first touch is a recovery — the shopper got distracted; here’s the cart, here’s a one-tap finish. The third touch is a reminder + incentive — they didn’t come back; here’s a small offer to nudge.
You configure the incentive ladder per playbook:
- Touch 1: no incentive
- Touch 2: no incentive
- Touch 3: 5% off (optional)
Some workspaces find that any incentive trains shoppers to abandon-and-wait for the discount. Run an experiment via the Incrementality framework before defaulting to incentives.
Measurement
The recovery dashboard at Engage → Automations → Cart recovery → Analytics shows:
- Carts detected — total abandonments
- Touches sent — by leg
- Recoveries — carts that purchased after a touch
- Net incremental — using the holdout configured in Incrementality
- Channel conversion — which channel converted highest (for tuning the channel mix)
What’s next
- Cart recovery ads — the paid leg of the recovery playbook
- Journey-driven dispatch — dispatch policy that governs every touch
- Cashfree integration — payment-link processor