> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Abandoned Cart Recovery

> Detect abandoned or failed checkouts automatically and send email sequences, with an optional discount, that bring customers back to complete the purchase.

<Info>
  Abandoned Cart Recovery (ACR) detects checkouts that were abandoned or whose payment failed, and emails the customer a link to complete the purchase. You can add an automatic discount to each recovery.
</Info>

## What Is Abandoned Cart Recovery?

ACR identifies customers who started a checkout but didn't complete it, whether the payment failed or they left before paying, and sends them a sequence of recovery emails. It covers one-time purchases and the first payment of a new subscription, including a free trial.

* **Failed payments**: The customer attempted payment, but it was declined or failed with an error.
* **Incomplete checkouts**: The customer visited checkout but never attempted payment.

## How ACR Works

<Steps>
  <Step title="Detection">
    Dodo Payments looks for payments that are at least 60 minutes old and haven't succeeded. It skips payments that are still processing or were cancelled, payments without a customer email address, and one-time payments with a zero total. If the customer has made a newer successful payment, no abandoned checkout is recorded.
  </Step>

  <Step title="Classification">
    Each abandoned checkout is classified by reason:

    * **Payment Failed**: The customer attempted payment, but it failed.
    * **Checkout Incomplete**: The customer visited checkout but never attempted payment.
  </Step>

  <Step title="Email Sequence">
    Based on the classification, Dodo Payments sends up to 3 recovery emails at the delays you configure. Each email contains a unique recovery link and an unsubscribe link. The email also supports one-click unsubscribe (RFC 8058), so mail apps that support it can show their own unsubscribe button.
  </Step>

  <Step title="Recovery">
    When the customer clicks the recovery link, a checkout opens with their original cart. They complete payment in a fresh checkout session.
  </Step>
</Steps>

## Status Lifecycle

Each abandoned checkout moves through these states:

| Status | Description |
| - | - |
| `abandoned` | Checkout detected as abandoned, no emails sent yet |
| `recovering` | At least one recovery email has been sent |
| `recovered` | Customer completed payment through the recovery link |
| `exhausted` | All emails were sent and seven days passed with no recovery, or a newer checkout superseded this one |
| `opted_out` | Customer unsubscribed from recovery emails |

## Configuring ACR

Turn on and configure ACR in **Settings → Recovery** in your dashboard.

<Frame caption="Abandoned Cart Recovery settings in the dashboard">
  <img src="https://mintcdn.com/dodopayments/tvJ2MmXYymW0IZ3R/images/recovery/acr-settings.png?fit=max&auto=format&n=tvJ2MmXYymW0IZ3R&q=85&s=564184c25e7ec3e98f1ec07264ebba5d" alt="ACR settings page showing enable toggle, discount configuration, and email sequence editor" style={{ maxHeight: '500px', width: 'auto' }} width="2838" height="1386" data-path="images/recovery/acr-settings.png" />
</Frame>

### Global Settings

These settings apply to every abandoned checkout:

| Setting | Description | Default |
| - | - | - |
| **Enable Abandoned Cart Recovery** | Master toggle for ACR | Off |
| **Give customers a discount code** | Generate a discount code for each abandoned checkout and include it in the recovery emails | Off |
| **Discount Percentage (%)** | Percentage discount applied to the recovery checkout for this customer | 10 |
| **Valid for (days)** | How many days the generated discount code stays valid | 5 |

### Email Sequences

ACR has two email sequences, **Payment Failed** and **Checkout Incomplete**, each with up to 3 emails. The dashboard lists them as **Emails sent to customer when payment fails** and **Emails sent to customer when checkout is incomplete**.

<Frame caption="ACR email sequence configuration">
  <img src="https://mintcdn.com/dodopayments/tvJ2MmXYymW0IZ3R/images/recovery/acr-email-config.png?fit=max&auto=format&n=tvJ2MmXYymW0IZ3R&q=85&s=3f2bd0fbdf6b2b6bfe898c17bf2693a4" alt="Email sequence editor showing subject, body, timing, and enable toggle for each email in the sequence" style={{ maxHeight: '500px', width: 'auto' }} width="1138" height="1670" data-path="images/recovery/acr-email-config.png" />
</Frame>

Each email has these settings:

| Setting | Description |
| - | - |
| **Enable this email** | Turns the email on or off without deleting it |
| **Send after** | How long after abandonment detection to send this email, in days and hours |
| **Subject Line** | The email subject. It supports the placeholders listed after this table. |
| **Email Body Text** | Plain text shown inside the standard recovery email layout, above the order summary. Line breaks are kept. HTML and placeholders are not rendered. |
| **Reply-to email** | The address that receives customer replies. If you leave it empty, your store contact email is used. |

In **Subject Line**, Dodo Payments replaces these placeholders: `{store_name}`, `{store_owner_name}`, `{store_contact_email}`, `{discount_code}`, `{recovery_link}`, and `{unsubscribe_link}`.

Both sequences use the same default delays:

| Email # | Default Delay |
| - | - |
| 1 | 1 hour |
| 2 | 24 hours |
| 3 | 72 hours |

### Example Recovery Emails

ACR sends a different email for each abandonment reason. These examples show what the customer sees.

<Tabs>
  <Tab title="Payment Failed">
    <Frame caption="Recovery email sent when a payment attempt fails">
      <img src="https://mintcdn.com/dodopayments/tvJ2MmXYymW0IZ3R/images/recovery/acr-failed-email.png?fit=max&auto=format&n=tvJ2MmXYymW0IZ3R&q=85&s=a8da91be6212c9fdd2b373572e3c1912" alt="Recovery email for a failed payment showing store name, message about payment failure, order summary with product details, discount, and a Resume Checkout button" style={{ maxHeight: '500px', width: 'auto' }} width="1070" height="1502" data-path="images/recovery/acr-failed-email.png" />
    </Frame>
  </Tab>

  <Tab title="Checkout Incomplete">
    <Frame caption="Recovery email sent when a customer leaves without attempting payment">
      <img src="https://mintcdn.com/dodopayments/tvJ2MmXYymW0IZ3R/images/recovery/acr-abandoned-email.png?fit=max&auto=format&n=tvJ2MmXYymW0IZ3R&q=85&s=05adcd350e1ceefa7854c86a37c862b9" alt="Recovery email for an incomplete checkout showing store name, message about saved cart, order summary with product details, discount, and a Resume Checkout button" style={{ maxHeight: '500px', width: 'auto' }} width="1070" height="1502" data-path="images/recovery/acr-abandoned-email.png" />
    </Frame>
  </Tab>
</Tabs>

## Recovery Discounts

When **Give customers a discount code** is on and the percentage is above 0, ACR generates a unique, single-use discount code for each abandoned checkout at detection. The codes start with `ACR-`. Each discount:

* Is restricted to the products from the original checkout
* Expires after the number of days in **Valid for (days)**, counted from detection
* Is limited to one redemption
* Is hidden from your dashboard discount list (internal use only)

<Tip>
  Start with a modest discount (5-10%) and measure its effect on conversion before you increase it.
</Tip>

## Customer Recovery Experience

When a customer clicks **Resume Checkout** in a recovery email, Dodo Payments opens a new checkout session with the same cart: the same products, add-ons, and quantities, and the amount the customer entered for a Pay What You Want product. If you turned on the discount, its code is already applied. If the customer opens the link again while that session is still valid, the same session reopens.

## Analytics

Track ACR performance under **Analytics → Recovery** in your dashboard.

<Frame caption="Recovery analytics dashboard showing ACR and dunning metrics">
  <img src="https://mintcdn.com/dodopayments/B3-0kuKcZDP1TiJD/images/recovery/recovery-analytics.png?fit=max&auto=format&n=B3-0kuKcZDP1TiJD&q=85&s=d3bf0c7474818bc4584b75654423e14c" alt="Recovery analytics dashboard showing abandoned checkout counts, recovery rates, recovered revenue, average time to recover, and breakdowns by product and email" style={{ maxHeight: '500px', width: 'auto' }} width="2548" height="2190" data-path="images/recovery/recovery-analytics.png" />
</Frame>

The Abandoned Cart Recovery section shows these metrics:

| Metric | Description |
| - | - |
| **Abandoned checkouts** | Total number of detected abandoned checkouts |
| **Recovery rate** | Percentage of abandoned checkouts that were recovered |
| **Recovered revenue** | Total revenue recovered through ACR |
| **Avg. time to recover** | Average time from abandonment to recovery |
| **Recovery rate by email** | Breakdown of which email in the sequence drove the recovery |
| **Recovery rate by product** | Which products have the highest recovery rates |

## Webhook Events

ACR sends two webhook events:

| Event | Description |
| - | - |
| `abandoned_checkout.detected` | An abandoned checkout has been detected and recovery has begun |
| `abandoned_checkout.recovered` | A customer completed payment through the recovery flow |

<Card title="Recovery Webhook Payloads" icon="code" href="/developer-resources/webhooks/intents/recovery">
  View the full webhook payload schemas for ACR events.
</Card>

## Edge Cases

ACR handles these cases automatically:

| Scenario | Behavior |
| - | - |
| Customer completes purchase before next email | A payment through the recovery link marks the checkout `recovered` when it succeeds. If the customer pays the original checkout instead, the next send check marks the checkout `exhausted`. |
| Customer starts a new checkout | The old abandoned checkout is marked `exhausted` at the next send check |
| Customer clicks **Resume Checkout** after the checkout is recovered | The link returns a message that the checkout has already been recovered, and no new checkout opens |
| Customer unsubscribes | The abandoned checkout is marked `opted_out`, and no further emails are sent. An email already scheduled for that checkout is dropped. |

## Best Practices

* **Start with defaults**: Every email comes with a default delay and subject. Customize them after you have baseline data.
* **Personalize emails**: Use subject placeholders such as `{store_name}` and `{discount_code}` to make each email specific to the purchase.
* **Monitor analytics**: Check **Recovery rate by email** to see which messages drive the most conversions, and turn off emails that recover little.
* **Use discounts strategically**: Start small (5-10%) to protect margins while you test the effect on conversion.
* **Keep emails concise**: Keep recovery emails short and focused on one action. The email layout already includes the **Resume Checkout** button.

<Info>
  ACR runs automatically once you turn it on. Start with the default settings, watch your analytics, and adjust based on the results.
</Info>

## Related

<CardGroup cols={2}>
  <Card title="Recovery Webhooks" icon="webhook" href="/developer-resources/webhooks/intents/recovery">
    React to `abandoned_checkout.detected` and `abandoned_checkout.recovered` events.
  </Card>

  <Card title="Subscription Dunning" icon="rotate" href="/features/recovery/subscription-dunning">
    Recover lapsed subscriptions with automated dunning emails.
  </Card>

  <Card title="Customer Portal" icon="id-card" href="/features/customer-portal">
    Where customers manage their subscriptions and payment methods.
  </Card>

  <Card title="Discounts" icon="percent" href="/features/discount-codes">
    How discount codes work, including the codes ACR generates.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.