Build Win Back Flow logo

Build Win Back Flow

Community
khadinakbarlabs
build-win-back-flow

Build a win-back flow for lapsed and churning subscribers using Apple StoreKit 2 win-back offers, RevenueCat campaigns, and segmented messaging. Use when the user says 'win-back', 'lapsed users', 'churn recovery', 'bring users back', 'expired trial', 'canceled subscription', 'reactivation', or 'promotional offer'.

Overview

Publisherkhadinakbarlabs
Repositoryexpo-mobile-app-builder
Skill namebuild-win-back-flow
Stars
3
Forks
0
Bundled files
1
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 1 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by khadinakbarlabs on GitHub. Read the source before you install it.

Installation

Install the Build Win Back Flow AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/khadinakbarlabs/expo-mobile-app-builder/tree/main/skills/build-win-back-flow
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/khadinakbarlabs/expo-mobile-app-builder.git /tmp/expo-mobile-app-builder
mkdir -p .claude/skills
cp -r /tmp/expo-mobile-app-builder/skills/build-win-back-flow .claude/skills/build-win-back-flow
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Build Win Back Flow in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Build Win Back Flow on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Build Win Back Flow is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Build a win-back flow

Win-back is recovering users who have lapsed — expired trials, canceled subscriptions, or gone inactive. It is one of the highest-ROI growth motions because reactivating a known user is far cheaper than acquiring a new one, and the data shows most churn is recoverable if you act on it.

Segment first — different lapsed states need different offers

Never treat all churn the same. The message and offer must match the segment:

SegmentDefinitionBest offer
Expired trialStarted a trial, never convertedDiscounted first period; surface the value they didn't see; remove friction
Lapsed subscriberPaid, then canceled or let it expireWin-back offer (StoreKit 2); "we miss you" + what's new since they left
Inactive free userWas active, hasn't opened in 10+ daysRe-engagement push/email with a specific reason to return; no paywall
Involuntary churnPayment failedDunning/retry — see below; this is the most recoverable of all

The Apple/Google win-back primitives

Apple StoreKit 2 win-back offers (iOS 18+)

Configured in App Store Connect, target subscribers whose subscription has expired (lapsed, not active). RevenueCat and Superwall both expose them. The user sees the offer on the App Store product page, in App Store emails, and you can present it in-app.

  • Up to a limited number of win-back offers per subscription group.
  • Discounted price for a set duration (e.g., 50% off for 3 months).
  • Presented via StoreKit; RevenueCat surfaces them in the offerings/entitlements API.
tsx
// RevenueCat: detect eligibility and present a win-back offering
import Purchases from 'react-native-purchases';
const offerings = await Purchases.getOfferings();
const winback = offerings.all['winback_expired']; // offering configured for lapsed segment

Apple promotional offers

Target existing or previous subscribers with a discounted price for a set duration. More flexible than win-back offers (you control eligibility in your backend) and can target currently-active subscribers too.

Google Play

No equivalent first-class "win-back offer" primitive, but you can use promo codes and in-app messaging to the same effect. Subscribe to Real-Time Developer Notifications (RTDN) for SUBSCRIPTION_CANCELED, SUBSCRIPTION_EXPIRED, and SUBSCRIPTION_ON_HOLD to trigger flows. See app-store-server-notifications-android.

Involuntary churn is the easy win

30–50% of total churn is involuntary (failed payments), and it's the most recoverable. On Google Play, nearly a third of cancellations are involuntary billing failures vs just 14% on Apple. (RevenueCat State of Subscription Apps)

  • Dunning emails ("your payment failed — update your card") + smart retries recover an estimated 50–60% of failed payments.
  • Apple/Google handle billing retries on their side, but surface grace-period and account-on-hold states to the user in-app with a clear "update payment method" CTA.
  • Subscribe to server notifications (app-store-server-notifications, app-store-server-notifications-android) to react to BILLING_RETRY, GRACE_PERIOD, ACCOUNT_HOLD.

The win-back campaign structure (RevenueCat web checkout)

RevenueCat supports routing win-back offers through a web checkout to bypass the 15–30% store commission — present the lapsed user with a "Claim your offer" button (push, email, or in-app banner), route to a Stripe-hosted web checkout, then restore access in-app immediately on success. This works in regions/states where alternative billing is permitted; respect current Apple/Google policy and regional law before relying on it.

Timing

  • Expired trial: wait 1–3 days, then a single "we saved your progress" + discounted offer. Don't spam.
  • Lapsed subscriber: at genuine expiry (when premium access actually ends, not when they hit cancel), then again at 7/30/60 days with escalating personalization.
  • Inactive free user: 3 days silent → gentle nudge; 7 days → direct message + incentive; 14 days → escalated offer. (See design-lifecycle-messaging.)

The cancel-vs-expire distinction (important)

A user who cancels (turns off renewal) but is still in their paid period is not yet lapsed — don't fire a win-back. Wait until premium access actually expires. Firing win-back at cancel-time cannibalizes the subscription they're still paying for. Use server notifications to distinguish SUBSCRIPTION_CANCELED (still active until period end) from SUBSCRIPTION_EXPIRED (lapsed).

Messaging that converts

  • Name the specific value they're missing. "Your 47-day streak is frozen. Come back before you lose it." Not "We miss you!"
  • Surface what's new since they left. Features, content, improvements. Give them a reason beyond the discount.
  • Make the offer time-limited and specific. "50% off your next 3 months — claim by Friday." Not "a discount."
  • One clear CTA. Claim offer / update payment / come back. No menus.

Measure

text
winback_segment_assigned   {segment: expired_trial|lapsed|inactive|involuntary}
winback_message_sent       {channel: push|email|in_app|web}
winback_offer_presented
winback_offer_claimed
winback_reactivated        // returned to active subscription or active use
winback_revenue            // attributed revenue from the campaign

Track reactivation rate and attributed revenue per segment. Win-back ROI is typically far higher than new-user acquisition ROI.

What not to do

  • Don't fire win-back at cancel-time. Wait for genuine expiry.
  • Don't spam. One well-timed, personalized message beats five generic ones.
  • Don't offer >50% off routinely — trains users to cancel-for-deals. Cap routine win-back at 20–30% for 2–3 months. See build-cancellation-flow.
  • Don't ignore involuntary churn — it's the biggest, cheapest recovery pool and the most neglected.

Pair with

  • integrate-revenuecat-rn — win-back offerings, web checkout, server notifications.
  • app-store-server-notifications / app-store-server-notifications-android — the lifecycle signals that trigger win-back.
  • build-cancellation-flow — intercept active churn before it becomes win-back territory.
  • design-lifecycle-messaging — the cross-channel cadence this lives in.
  • pricing-strategy — discount guardrails.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Build Win Back Flow AI skill do?

Build a win-back flow for lapsed and churning subscribers using Apple StoreKit 2 win-back offers, RevenueCat campaigns, and segmented messaging. Use when the user says 'win-back', 'lapsed users', 'churn recovery', 'bring users back', 'expired trial', 'canceled subscription', 'reactivation', or 'promotional offer'.

Why use Build Win Back Flow on TypingMind?

Because you install it once and use it with any model. Build Win Back Flow is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Build Win Back Flow in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/khadinakbarlabs/expo-mobile-app-builder/tree/main/skills/build-win-back-flow. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Build Win Back Flow?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Build Win Back Flow?

As many as you like. As long as a model supports skills, you can use Build Win Back Flow with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Build Win Back Flow AI skill free?

Yes. It is published on GitHub by khadinakbarlabs under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇