AstroBaaS

Catalogue & product data

Abandoned Cart Recovery

Paid pluginsize Mplanned, not built

Indicative price, not an offer: €15–30/month

Generated from docs/plan/paid/abandoned-cart-recovery/PLAN.md in the AstroBaaS repository. Nothing described below is implemented — it is the written plan for it.

Merged from duplicate proposals: “Abandoned Cart Recovery”, “Abandoned cart recovery and customer segmentation”

Paid email-marketing plugin that sends automated reminder emails at configurable intervals (commonly 4 hours, 24 hours) when a customer’s cart expires without checkout. Integrates with the email layer to compose personalized emails showing cart items and offer an optional discount code to complete the purchase. Most merchants use third-party email tools; this is a convenience bundle.

The problem

30% of visitors add items but don’t checkout — I lose sales to browsing. I need automatic emails reminding them at 4 hours and 24 hours, optionally with a discount code, without building a separate email campaign tool.

What it does

  • Define abandoned cart as: cart created, at least one item added, no order placed after X minutes (configurable, default 60 min)
  • Store abandoned cart snapshots: customer email, cart items (SKU, name, qty, price_cents), cart total, timestamp
  • Send first reminder email at 4 hours (configurable), second at 24 hours (configurable), with a recoverable cart link or code
  • Generate single-use recovery links (e.g., /checkout?cart_id=abc123&token=xyz) that re-populate the customer’s cart
  • Optional discount code: attach a code to the email (e.g., ‘COMEBACK10’ for 10% off), redeemable in the recovered cart only
  • Email template: merchant-customizable copy, product images from cart, cart total, CTA button to recover
  • Track recovery: when a customer clicks the recovery link or uses the code, log the event and suppress further reminders for that cart
  • Dashboard: ‘X carts abandoned this week, Y recovered, Z orders completed from recovered carts’ with revenue impact
  • Segment abandoned carts: by cart value, by product category, by customer cohort (first-time buyer vs repeat)
  • Bulk recovery: merchant can manually send recovery email to selected carts
  • Suppress list: do not email customers who have opted out or already received N reminders
  • A/B test templates: run two email variants, measure recovery rate and report winner

What it deliberately does NOT do

Each boundary carries its reason. A boundary without a reason gets crossed by the next person who reads this.

  • Email list management (subscribe/unsubscribe) — core owns the contact form and newsletter signup; abandoned cart uses those signals
  • SMS reminders — email-only; SMS requires per-country telco integration and compliance
  • Integration with external email service providers (Mailchimp, Klaviyo) — built-in email sender only; merchants using ESP must manually copy recovered carts or use webhooks
  • Dynamic discounting based on price sensitivity — merchant sets one code per rule; no ML-driven pricing
  • Recovery link expiration enforcement — recovery links are valid indefinitely; merchants manually manage cart cleanup

Data model

New entities: abandoned_cart (id, customer_email, customer_id, items: array of {product_id, variant_id, qty, price_cents, name}, cart_total: integer, created_at, recovered_at: nullable, last_reminder_sent_at, reminder_count: integer), cart_recovery_email (id, abandoned_cart_id, recipient_email, template_id, sent_at, opened_at: nullable, clicked_at: nullable, recovery_link_clicked: boolean, discount_code_used: boolean). Adds field to product: allow_abandoned_cart_recovery (boolean, default true). No schema migration for existing products.

API

  • GET /carts/:id/abandoned-status — check if a cart is abandoned and last reminder sent
  • POST /abandoned-carts/send-reminder/:id — manually trigger a reminder email for a cart
  • GET /abandoned-carts?days=7&status=unrecovered — list unrecovered carts from last N days
  • GET /abandoned-carts/metrics — dashboard stats (count, recovery rate, revenue recovered)
  • POST /abandoned-carts/:id/recovery-link — generate a single-use recovery link and send email
  • GET /recovery/link/:token — retrieve cart items from recovery link (public, no auth)
  • POST /abandoned-carts/:id/segment — retrieve segment (by value, category, customer cohort)
  • PUT /abandoned-carts/settings — configure reminder intervals, discount code, email template

Every route added here must also appear in src/pages/openapi.json.ts — a test fails the build if it does not.

Admin

Paid plugin admin panel includes: (1) Settings page (reminder intervals in hours, discount code, email template builder with preview), (2) Dashboard showing abandoned cart metrics (count, recovery rate, revenue impact), (3) List view of abandoned carts with filters (date range, value range, status), (4) Manual recovery email trigger, (5) A/B test variant creator and performance report. Merchants see a ‘Recovered: $X,XXX’ metric on the main dashboard.

The seam — why this is paid

Paid tier owns the entire plugin: abandoned cart detection, reminder logic, email templates, dashboard, and A/B testing. Core owns the cart model, email sender, and webhook system (paid tier listens to checkout events to mark carts as recovered). Core does not gate email sending; any plugin can send emails via the core email layer.

Email marketing, not core platform. Many merchants use third-party email tools. Justifies paid as convenience bundle or when paired with SMS.

Dependencies

  • cart-system (core; must exist to track carts and detect abandonment)
  • email-layer (core; paid plugin sends via core email sender)
  • webhook-system (core; to track when a cart is recovered)
  • customer-accounts (optional; if customer_id is available, segment by cohort)

Acceptance checks

Each of these must be able to fail. Before claiming this is done, break the code deliberately and watch each one go red.

  • A cart created 65 minutes ago with at least one item and no subsequent order is marked abandoned and qualifies for reminder
  • First reminder email is sent at T+4h, second at T+24h, with configurable intervals honored
  • Recovery link /checkout?cart_id=abc&token=xyz restores cart items and totals correctly (prices do not re-compute)
  • Clicking recovery link marks abandoned_cart.recovered_at and suppresses further reminders
  • A discount code attached to the email is redeemable only on orders containing at least one item from the abandoned cart
  • Dashboard metric ‘X carts recovered’ increases when an order is placed via recovery link
  • Unsubscribed customers (via newsletter signup) do not receive abandoned cart emails
  • A/B test with two email templates shows open rate and click rate for each variant

Risks

High email volume from abandoned carts can exceed a merchant’s email sending limits or trigger spam filters. If recovery links are not time-limited, a merchant’s email service may be overwhelmed by replay attacks or link harvesting. Cart items may change price between abandonment and recovery; showing stale prices in the email misleads customers. If the discount code is too generous or too restrictive, it either cannibalizes revenue or fails to incentivize recovery.

Commercial context

Suggested price€15–30/month
Rival anchorMagento Open Source (not included); Adobe Commerce (included)

The anchor is what the nearest equivalent charges on Shopify or Magento today. It is context for a pricing decision, not the decision.


Generated from the commerce plan. See docs/COMMERCE-PLAN.md for the full catalogue and ../../AI-GUIDE.md for how to work on this repository.