Autonnel v0.1.0

Recall (abandoned cart)

Configurable intervals for abandoned-cart recovery emails. Coupon binding per interval.


Recall sends recovery emails to customers who started checkout but did not complete payment. autonnel checks PENDING orders on a schedule and sends the appropriate recall email at each configured interval.

Prerequisites

An email provider must be configured in Settings → Email Provider before recall emails can be sent. The Resend free tier (100 emails/day) is generally too restrictive for recall at any meaningful volume — use a paid tier or a different provider.

Go to Settings → Recall. There is one recall configuration per installation.

Default intervals

IntervalTemplateDefault offset
Recall 1RECALL_124 hours after order creation
Recall 2RECALL_272 hours after order creation
Recall 3RECALL_3168 hours (1 week) after order creation

You can change the hour offsets for each interval. Each interval must map to a distinct template type (RECALL_1, RECALL_2, or RECALL_3).

Binding a coupon

Each interval can optionally include a discount coupon. When a coupon is bound to an interval:

  1. The coupon code is injected into the recall email template as a highlighted block.
  2. The recall link includes ?coupon=CODE in the query string so it is applied automatically when the customer returns.

To bind a coupon, select one from the dropdown next to each interval. Only active coupons appear in the dropdown. If you deactivate a coupon that is bound to an interval, the interval continues to fire but the email is sent without the coupon code.

How the cron works

A cron job runs every 30 minutes. For each interval, it:

  1. Queries for pending orders whose creation time falls within the interval’s time window (offset ± a 72-hour lookback buffer to catch orders missed during downtime).
  2. Excludes orders with a placeholder email or no email.
  3. Checks whether a recall email for the same order and interval was already sent. If one exists, the order is skipped (dedup).
  4. Builds the recall checkout URL, preserving all original URL parameters from the order. This keeps attribution intact — fbclid, ttclid, gclid, UTM parameters, and others are passed through to the recovery link.
  5. Enqueues the recall email with the isRecall marker set.

The processor caps each interval run at 200 candidate orders to avoid long-running cron jobs.

The checkout URL in a recall email looks like:

https://yourstore.com/checkout?anid=<trackingId>&funnelId=<funnelId>&fbclid=<original>&recall=true&coupon=<code>

The recall=true flag marks sessions that arrive from a recall link. The original URL parameters are preserved so ad platform conversions are attributed correctly.

Testing in development

To test recall without waiting for the real intervals:

  1. Set short intervals in the UI, for example 0.1 hours (6 minutes), 0.2 hours (12 minutes), 0.3 hours (18 minutes).
  2. Create a test order and leave it in PENDING state.
  3. Wait for the cron to fire (every 30 minutes) or trigger the recall cron endpoint manually.

Deduplication cannot be bypassed: the same recall touch is never queued twice for the same order. To re-test a touch, create a fresh PENDING order.

Disabling recall

Toggle the Enabled switch at the top of the Recall settings tab. When disabled, the cron still runs but exits immediately without processing any orders.

Caveats

  • Recall emails require a working email provider. Configure and test one in Settings → Email Provider before enabling recall.
  • On the Resend free tier (100 emails/day), recall sends will exhaust your quota quickly. Use a paid plan for production recall.
  • Setting very long lookback intervals can cause the cron to process a large backlog on restart after downtime. A 72-hour lookback cap prevents runaway processing but also means orders older than (interval + 72h) will never receive a recall email.
  • Coupons — creating and managing the coupon codes you bind to intervals
  • Email provider — required before recall emails can be delivered
  • Email templates — the RECALL_1, RECALL_2, RECALL_3 template content