Plan a win-back campaign from your Stripe or RevenueCat export
Load a subscriptions or events export. See who you lost and why, set offer limits, and get one personal message per person with a unique return code. Later, load a newer export to see who came back.
Your files never leave this browser. Nothing is uploaded.
Load your export
Stripe: Billing, Subscriptions, Export, all columns. RevenueCat: a customer export or an event export with app_user_id, type, period_type and expiration_at.
No export to hand? Load an example: a fictional app called Lifted, about 80 rows covering every status.
Column mapping
Detected from the header row. Change any column the planner got wrong; everything below updates.
Load a file to see the columns.
Who you lost
Each person lands in one segment. Active subscribers are left out. Monthly revenue lost is each person's price turned into a monthly figure.
Load an export in step 1 to see your segments.
How each segment is decided
| Segment | Stripe | RevenueCat |
|---|---|---|
| Cancelled | Status canceled after a paid period | CANCELLATION or EXPIRATION after a paid period, cancel_reason not BILLING_ERROR |
| Billing failed | past_due, unpaid, or canceled with reason payment_failed | BILLING_ISSUE, or cancel_reason BILLING_ERROR |
| Trial never converted | Cancelled inside the trial, or incomplete_expired | Trial EXPIRATION or CANCELLATION with no normal purchase |
| Active (left out) | active or trialing | Latest purchase or UNCANCELLATION still in date |
Set the rules
Offers stay inside the limits you set. Billing failed gets no discount by default: the card needs fixing, not a price cut.
Write the messages
One short email per person, in your voice. Edit the templates, then copy single messages or download the whole campaign as a CSV for any email tool.
Edit the templates
Merge fields:
{first_name}{app}{plan}{days_subscribed}{progress}{offer}{return_code}{sender}{fix_link}An empty field falls back to plain words (Hi there, your subscription). Text inside [[ ]] is dropped when a field in it is empty. A line with an empty field and no fallback is dropped. Write {plan|your plan} to set your own fallback.
Messages appear here once an export is loaded.
Who came back?
A few weeks after sending, export again and load the newer file. A return counts when the same email or customer is paying again, or their return code shows up in a coupon or offer column, within 60 days of the message.
Using the sample? Load the same fictional app 30 days later.
Want this running on your webhook automatically?
During early access we connect your RevenueCat or Stripe webhook by hand, message each lost subscriber when they lapse, and report who came back. No monthly fee: 15% of the revenue from subscribers who return, for 6 months.