Sequences
Duplicate an example, or compose your own emails and waits for Unpaid, Leaving, and Win-back.
What a sequence is
Automations → Sequences. A sequence is the plan that runs when a recovery event fires: messages (emails built from your templates) separated by waits (delays), a Split when two paths need to diverge, and — on Unpaid sequences — a Retry invoice step.
You compose it on a visual canvas: click a block to edit it in the inspector, add or remove steps, reorder them. The canvas stays compact: each step fits on one line, and waits are just dots whose duration shows on hover. Write the emails under Automations → Templates, or straight from a Message block without leaving the canvas. Every sequence ends with a read-only Closing step — 72 hours for the customer to act.
Three possible triggers, picked when you create the sequence:
| Trigger | When |
|---|---|
| Unpaid | Stripe can't collect an invoice. |
| Leaving | A still-live subscription is set to end at period close. |
| Win-back | The subscription is gone. |
Examples vs. your sequences
The catalog ships three sequences labeled Example and Platform. They are recipes you can open and copy. They never send mail.
You cannot activate an example. The status cell on that row is a dash, not Active.
Duplicate — on the row menu, or Duplicate to edit on the detail page — creates your own inactive copy. Edit it, attach a Stripe coupon if you want one, then Activate the copy.
Your sequences are fully editable. New ones start Inactive, so nothing fires by accident. Only one sequence can be live per trigger. Activating yours turns off the other live sequence of that type. A confirmation names the one that will be turned off.
Runs already in flight keep the plan they started with. Deactivating or replacing a sequence only changes future runs.Enroll (on Unpaid, Leaving, and Win-back) always uses whichever sequence is live when you click. That sequence still needs the matching flow Active in Recovery. Enroll also needs Premium — see Billing. An example is never the live sequence.
What the examples show
- Example: Unpaid — a hard-decline split. The hard path sends a card-update email on a calendar. The soft path sends the same email and Retry invoice between waits. Both paths meet, then Closing.
- Example: Save — starts 5 days before period end. Tenure of 12 months or more gets an offer, then the same offer again. Under 12 months gets a stay email first, then an offer. No pause on this graph, and no coupon attached — attach one on your copy.
- Example: Win-back — two exit-survey splits one after the other, with a merge between them. Some reasons get a checkout offer. Product reasons get a news email with the same offer card.
Mail starts on the next matching Stripe event only after you activate your copy, and only if that flow is on in Recovery.
Wait steps
A wait is more than "N hours later". On your own sequences you can pick:
- Hours after the previous step — the classic delay.
- A calendar moment — this or next week, a specific day of the month, with an hour window (for example 8–9 AM). Working days run Monday to Friday; there's no holiday calendar. Hover the wait on the canvas to read it back. This week shows as is. Next week reads as Tue next week. Next month includes the period, like 1st next month 08:00.
- Before period end — N days before the subscription ends, at a set hour. Available on Unpaid and Leaving, not on Win-back since the subscription is already gone.
Times follow the workspace timezone (Settings → General). To see when a step would actually fire, use Simulate (below).
Closing
Every sequence ends with a Closing step: 72 hours, always last, not removable. It gives the customer time to pay, claim an offer, or stay. During those hours the run stays Running — Overview still counts it as In progress, not No follow-up. When the 72 hours elapse with no verdict, the run becomes Completed.
You cannot add a step after it. Adding on the last operator step inserts before Closing. Both branches of a Split flow into the same Closing.
Retry invoice (Unpaid only)
On an Unpaid sequence, you can add a Retry invoice block. When the run reaches it, churnhook asks Stripe to pay the latest open invoice — the same collect as the button on the Unpaid list.
If Stripe marks the invoice paid, the run becomes Recovered and later emails don't send. If it stays open, the sequence continues. A decline or Stripe error fails this step; you can retry the run from its detail.
This block doesn't exist on Leaving and Win-back sequences — there's no open invoice to collect there.
SMS (Unpaid only)
On an Unpaid sequence, a Message block can send an SMS instead of an email, from your own Bird account. A skipped SMS never stops the run. Setup, templates, and skip reasons are on SMS.
Split and merge
On any of the three triggers, you can add a Split: two branches, one question. The available questions depend on the trigger. The answer is frozen when the run starts — a later Stripe change doesn't flip the run onto the other branch.
| Question | True when | Unpaid | Leaving / Win-back |
|---|---|---|---|
| Tenure ≥ N months | The subscription is at least N months old (default 12) | yes | yes |
| Hard decline | The invoice's decline is final (expired card, stolen, invalid number…) | yes | hidden |
| Amount ≥ N | The compared amount reaches N euros | unpaid invoice | monthly plan amount |
| Exit survey reason | The subscription’s Stripe cancellation reason is one you checked | hidden | yes |
| Stripe price | The subscription's price is in the list you picked | yes | yes |
| Billing interval | The subscription’s Stripe billing interval is one you checked | yes | yes |
Missing data always takes the No branch — the run never fails because of it.
Billing interval takes Yes when the subscription bills on an interval you checked. The inspector lists Monthly and Yearly first, then Weekly and Daily. The diamond on the canvas names those intervals. A plan billed every three months still counts as monthly. Pause stays monthly-only. You still pick the offer on each arm.
Exit survey reason uses Stripe’s nine cancellation reasons (too expensive, unused, found an alternative, and so on). You cannot add your own. The inspector labels them Stripe cancellation reasons and marks which ones the default Customer Portal currently offers. If Stripe is not collecting cancellation reasons on that portal, the diamond warns that this branch will always take No. The same happens when the subscription has no stored reason. Those reasons also appear on Exit surveys.
Merge joins two branches back into one queue for the rest of the sequence, so shared steps aren't duplicated. You can still chain Splits that way — merge, then split again on the shared path, as the examples do.
You can also drop a Split on a Yes or No arm, so the second question only exists for that group. Each diamond still closes with its own Merge. One Split inside an arm is allowed; a third level is refused. The canvas widens so the three columns stay side by side. Simulate traces only the path this customer takes: a Split sitting on the unused arm stays unhighlighted.
Leaving offers (keep, coupon, or pause)
On a Leaving sequence, a Message block can carry one offer at a time: None, Keep, Coupon, or Pause. Switching modes clears the others.
| Offer | What it does |
|---|---|
| Keep | One click to undo the scheduled cancel, same price, same plan |
| Coupon | A Stripe discount already created on your Connect account, applied to the next invoice |
| Pause | 1 or 2 months of paused billing (monthly plans only) |
The customer acts from the page the email links to; nothing is applied until they click the confirm button on that page. Accepting applies the chosen offer and undoes the scheduled cancel; the Leaving run becomes Recovered.
Declining an offer just acknowledges it — the offer stays valid until period end. Sending a new offer email on the same run expires any earlier unclaimed offers.
The offer and the template must match: a Keep offer needs the "keep" link in the template, a Coupon offer needs the "offer" link, a Pause offer needs the "pause" link. Saving a mismatch is rejected, and so is later editing a template in a way that would break that pairing. The exact link names ({{keep_url}}, {{offer_url}}, {{pause_url}}) are covered in Templates.
Win-back coupons
On a Win-back sequence, the same coupon picker is available. You also choose how long the offer stays valid: 3, 7, 14, or 30 days from send (14 by default). The customer is sent to Stripe Checkout, on their previous plan, discount already applied. The run becomes Recovered when that exact Checkout is paid.
Win-back Checkout needs your connected account's public business name set in the Stripe Dashboard — churnhook can't fill it in for you.
Simulating a sequence
For an example customer, Simulate shows which steps would fire, on which day and at what time. Nothing is sent or saved, and runs already in flight don't change.
Click Simulate, at the top right of the canvas. The Schedule simulation panel replaces the inspector. It also works on the examples. While editing, it uses your unsaved changes. Selecting a block to edit it closes the panel, since the inspector takes its place back.
Open Simulation settings to describe the customer. The panel only offers the fields the sequence needs:
| Field | When it shows |
|---|---|
| Sample start (t0) | Always. It's the moment the sequence starts. |
| Sample period end | Unpaid and Leaving sequences. |
| Sample tenure (months) | The sequence has a Tenure Split. |
| Sample decline | It has a Hard decline Split. |
| Sample amount (€) | It has an Amount Split. |
| Sample survey reason | It has an Exit survey reason Split. |
| Sample Stripe price | It has a Stripe price Split. |
| Sample billing interval | It has a Billing interval Split. |
Two scenarios fill the dates and the tenure in one click: New customer (2 months tenure, period ends in 5 days) and Loyal customer (18 months, period ends in 20 days). They show when the sequence has a period end or a tenure.
The calendar opens on the start month, where the start day is marked with a dark circle. The arrows change month and Start goes back to the start month. When the panel is wide enough, two months show side by side.
Each day shows the icon of the steps that fire that day: trigger, message, Retry invoice or Closing. Past two steps, a +N counter takes over. Waits don't appear: they only push the next step back. Neither do steps on the branch this customer doesn't take.
The flag marks the period end. A step that lands after the subscription ends carries a dashed orange dot: it may never send. Times follow the workspace timezone.
Click a day to read its steps under the calendar: the time, the template and the branch. The graph highlights the same blocks and traces the path this customer takes at each Split. Clicking a block in the graph selects its day. The start day is selected when the panel opens.
Editing safely
Clicking a sequence opens it read-only: clicking a block shows its detail without changing anything. Edit switches to edit mode. Two safety rules:
- A sequence must be valid to activate: every message block needs a template.
- Runs already in flight are never affected by an edit or a deactivation — each one keeps the plan it started with.
A sequence can have at most 50 steps. The Closing box does not count. A single customer path can have at most 5 emails — other arms can hold more, as long as no one path exceeds 5. A path can also hold up to 2 SMS, which don't count toward those 5. You can nest a Split one level deep, and a sequence can hold at most 8 Splits. Past those limits the editor greys out adding. A copy of Example: Unpaid you can save and activate as-is.
