Skip to main content

Cart Recovery

A recovery sequence turns an abandoned checkout into a short series of follow-up messages — and the division of labour is the whole design: the platform plans, your shop sends.

Who Sends What

The platform decides which lead enters a sequence, when each step is due, and — at the moment of sending — whether anything has silenced it. Each due step is then delivered as a sequence_step event to your own automation channel (the leads webhook under Settings → Integrations), where your automation — n8n, Make, or anything that answers a webhook — composes and sends the message under your shop's own sending identity.

The platform never emails your customers on your behalf. That is a legal boundary, not a missing feature: the sender of a message to your customer is the controller of that communication, and that is you. The Data Processing Agreement states this in as many words.

Building a Sequence

Leads → Recovery sequences (site admin). A sequence is up to five steps, each with a delay (hours after the previous step), a subject and a message. New sequences are created switched off.

Enabling is a separate step, and it belongs to the site owner. Before a sequence goes live, the owner confirms — in a dialog that states it in full — that the shop is the controller and sender of these messages. The confirmation is stored with the sequence: who confirmed, and when. Without it, the sequence cannot be enabled — the API refuses.

Enabling never enrols your backlog: only leads that arrive after the moment of enabling enter the sequence, so switching one on is not a mail campaign over a year of old carts.

What Silences a Step

Eligibility is re-checked at the moment of sending, not when the step was planned — everything that matters happens while a delay is counting:

The customer...The step is
placed the orderskipped — ordered
was muted by a team member (Stop recovery messages on the lead)skipped — opted_out
has a recorded consent refusal, where the site requires consentskipped — consent
— no leads webhook is configuredskipped — no_channel
— the step is more than a day past its momentskipped — expired

Every skip is recorded with its name. A step that is silenced leaves a trace, because silence without a trace is indistinguishable from a broken engine.

Idempotency

Each planned step is a row with a unique key on (lead, sequence, step). Two server instances planning or firing at once cannot produce a duplicate — the database key decides the winner, so no customer receives the same step twice.