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 order | skipped — 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 consent | skipped — consent |
| — no leads webhook is configured | skipped — no_channel |
| — the step is more than a day past its moment | skipped — 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.