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

# Abandoned checkouts

> What Reval records when a customer leaves the subscription checkout halfway, why it does not show in Shopify's list, and how to build the recovery email in Klaviyo.

When a customer types their email in Reval's checkout and does not finish paying, that sale is lost today without you knowing. With **Abandoned checkouts** on, Reval saves the attempt, shows it under **Orders → Abandoned checkouts** and emits an event so you can build a recovery email in Klaviyo or in your webhooks tool.

> [!WARNING]
>
> Reval checkouts **do not appear in Shopify's Orders → Abandoned checkouts**. That list is read-only for apps and Shopify feeds it only with its own checkout. Reval's list is the equivalent, inside the app.

## Turning it on

**Settings → Orders and inventory → Abandoned checkouts and carts**. It ships **off**: this is personal data of people who did not buy. While it is off nothing is saved or emitted.

## What gets recorded

As soon as the customer types a valid email in any of Reval's three checkouts (product, subscription cart or box), Reval saves the attempt and keeps it updated while they fill the form: email, name and address if entered, the products with their frequency, the amount and the date. Nothing from the card is ever stored.

The same customer abandoning the same kind of checkout several times updates **one record**, not several.

## The list

**Orders → Abandoned checkouts** shows customer, products, amount, checkout kind, status and last activity:

| Status | Meaning |
| - | - |
| **In progress** | The customer typed the email less than an hour ago. |
| **Abandoned** | An hour went by without activity and no payment (Shopify's own rule). |
| **Completed** | Paid in the same session. Not shown in the Abandoned tab. |
| **Recovered** | Paid after having abandoned, or came back through the recovery link. |

**Copy link** gives you the recovery link: it opens the same checkout with the products, plan, frequency and the customer's details already filled in (not the card). It is the same link the event carries.

Records are **deleted after 90 days** without activity, like Shopify's.

## The recovery email in Klaviyo

Reval follows the same scheme as Shopify's Klaviyo integration: the **«Checkout iniciado»** event fires **as soon as the customer types the email**, not after the wait. The wait and the cut-off live in the flow, like your abandoned-cart flow:

1. **Trigger**: metric «Checkout iniciado».
2. **Delay**: whatever you want (Shopify defaults to 10 hours; 1 hour is also common).
3. **Flow filter**: *«Suscripción creada» zero times since starting this flow*. If the customer bought, the email does not go out.
4. **Email**: use `{{ event.recovery_url }}` as the button, `{{ event.items_text }}` or `{{ event.product_names }}` to list what they left, and `{{ event.amount_formatted }}` for the amount.

Event properties: `checkout_kind` (`product` / `box` / `cart`), `title`, `product_names`, `items_text`, `items` (list with `title`, `quantity`, `frequency_label`), `item_count`, `amount`, `amount_formatted`, `currency`, `customer_first_name`, `customer_last_name`, `shipping_city`, `shipping_province`, `shipping_country`, `recovery_url`, `checkout_started_at`.

There is no separate "recovered" event: the signal that they bought is the usual **«Suscripción creada»** metric, which is what the filter in step 3 looks at.

## Abandoned carts

Reval's **subscription cart** (the drawer that gathers several products to pay in one checkout) is recorded with the same option, one step earlier: when the customer fills it and does not go on to the checkout. Because the cart lives in the browser and does not know who the customer is, Reval only saves it when it can identify them with certainty: the customer **is logged in** to the store, or **already typed their email** in a Reval checkout from that same browser. Anonymous carts are neither saved nor emit anything; the list shows what share of carts could be identified, to decide whether widening is worth it.

They appear in the list as **Cart (no checkout)**, with the products as Reval priced them and a link that opens the checkout with that cart loaded. When the customer goes on to the checkout the record becomes **Reached checkout** (and the checkout takes over); if they empty the cart, **Emptied**; if they buy, **Completed**.

The event is **«Carrito iniciado»** («Carrinho iniciado» in Portuguese stores), with the same properties as «Checkout iniciado», and fires as soon as there is an identifiable cart. So that one person gets **one flow** rather than one per cart and another per checkout, the cart flow carries two filters:

1. **Trigger**: metric «Carrito iniciado».
2. **Delay**: whatever you want.
3. **Flow filters**: *«Checkout iniciado» zero times since starting this flow* (if they reached the checkout, that flow handles it) **and** *«Carrito vaciado» zero times since starting this flow* (if they emptied it, there is nothing to recover). Add *«Suscripción creada» zero times* to cover a direct purchase.
4. **Email**: `{{ event.recovery_url }}` opens the checkout with the cart.

Over webhooks the topics are **`cart.started`** and **`cart.emptied`**.

> [!NOTE]
>
> This needs the updated cart block in the theme (published with the app). Until the store has it, carts are not recorded; checkouts are.

## Webhooks

The same event reaches your endpoints under the **`checkout.started`** topic if you subscribe to it in **Integrations → Webhooks**, with the same properties in `data`. See [Webhooks](https://docs.appreval.com/en/developers/webhooks.md).

> [!NOTE]
>
> Shopify Flow does not receive this event for now: its «Subscription event» trigger is bound to a subscription, and there is none yet here.


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