URL: /strategy/keep-and-grow · Id: `page:/strategy/keep-and-grow`

# Keep and grow

> After the first 10 pay, keep them: define activation, act on every churn signal, upgrade at the limit, and ask for referrals once results land.

After the first 10 pay, keep them: define activation, act on every churn signal, upgrade at the limit, and ask for referrals once results land.

```text title="Your first month as one goal · Ask"
Keep our first 20 customers: find who is going quiet, draft the saves, and ask the happy ones for intros.
Spend up to $5 this month, and show me the plan first.
```

```ts title="Your first month as one goal · SDK"
import { $ } from 'startup-builder'

const result = await $.try.Goal.pursue({
  objective: 'Cut logo churn under 5% a month and ask every customer past their first result for an intro',
  budget: { amount: 5, currency: 'USD' },
  by: '2026-11-26',
  use: [
    'Customer.score',
    'Customer.save',
    'Subscription.nudge',
    'Review.request',
    'Referral.ask',
    'Play.review',
  ],
})
console.log(result)
```

```json title="Your first month as one goal · Response"
{
  "$id": "https://api.sb/leaseline.app/goals/goal_PmaTA20MUI",
  "$type": "Goal",
  "mode": "try",
  "stored": false,
  "goal": {
    "objective": "Cut logo churn under 5% a month and ask every customer past their first result for an intro",
    "keyResult": {
      "metric": "logo-churn",
      "target": 5,
      "by": "2026-11-26"
    }
  },
  "reads": [
    {
      "said": "going quiet",
      "means": "no login in 14 days, usage down 50% in a month, a ticket open 48 hours, or a failed payment",
      "hard": false
    },
    {
      "said": "happy ones",
      "means": "customers who reached their first result: a renewal notice sent",
      "hard": true
    }
  ],
  "steps": [
    {
      "n": 1,
      "operation": "Customer.score",
      "count": 30,
      "unit": "day",
      "usd": 0,
      "why": "all 20 customers, daily"
    },
    {
      "n": 2,
      "operation": "Customer.save",
      "count": 3,
      "unit": "customer",
      "usd": 0.03,
      "why": "a save note for each flagged customer"
    },
    {
      "n": 3,
      "operation": "Subscription.nudge",
      "count": 2,
      "unit": "customer",
      "usd": 0.01,
      "why": "past 80% of a plan limit"
    },
    {
      "n": 4,
      "operation": "Review.request",
      "count": 5,
      "unit": "customer",
      "usd": 0,
      "why": "the week their result lands"
    },
    {
      "n": 5,
      "operation": "Referral.ask",
      "count": 12,
      "unit": "customer",
      "usd": 0.06,
      "why": "who else has the problem"
    },
    {
      "n": 6,
      "operation": "Play.review",
      "count": 4,
      "unit": "week",
      "usd": 0.04,
      "why": "activation, churn and net revenue retention"
    }
  ],
  "estimate": {
    "usd": {
      "expected": 0.14,
      "max": 5
    },
    "minutes": 120,
    "fill": "every customer watched from day 1; saves within a day of a signal"
  },
  "budget": {
    "amount": 5,
    "currency": "USD",
    "left": 5
  }
}
```

- **Costs:** A few hours a month
- **Fits when:** You have 10 or more paying customers, or monthly logo churn above 5% read on 20 or more customers, or 3 or more cancellations in 60 days.
- **First customer:** Referred customers around day 120, once your customers reach their first result
- **Month one:** Calls $0.27 · Media none · Your hours 1.5
- **Number to watch:** Logo churn a month.

| Way | Time to first customer | Cash per customer | At scale, customers a month | Your hours a week | Loaded CAC |
| --- | --- | --- | --- | --- | --- |
| [Referrals](/plays/customer-referrals) | 120 days (60 to 270) | $5 ($1 to $150) | 1 (0.5 to 4) | 0.5 (0.25 to 1) | $222 |

Days are to the first paying customer; cash leaves out your hours, and loaded CAC adds them at $100 an hour. Planning estimate unless a source is named: [how each was set](/strategy/numbers#assumptions).

## The decision
Move here once 10 customers pay from [Hands-on](/strategy/hands-on), [Paid](/strategy/paid) or [Launch and search](/strategy/launch-and-search). Read churn as a rate only from 20 customers; below that, 3 or more cancellations in 60 days is the signal. First, define activation: the event every kept customer hit in week 1 and the churned ones missed.

Nudge every signup that has not activated at hour 24 and day 3. Open a save move on each churn signal: no login in 14 days, usage down 50% in a month, a ticket open 48 hours, a failed payment. [Silence watch](/capabilities/keep-and-grow/silence-watch) reads them daily.

Prompt an upgrade at 80% of a plan limit with [Upgrade note](/capabilities/keep-and-grow/upgrade-note). Read net revenue retention over the trailing 12 months: what the customers paying a year ago pay now. At 4% monthly churn, upgrades alone hold it near 69%; passing 100% takes expansion that grows with use, seats or usage, of about 4.2% a surviving account a month. Ask for referrals by hand under 50 customers, and switch on a program only past 50 ([Customer referrals](/plays/customer-referrals)).

## The math
`kept after a year = (1 − churn)^12; value ≈ monthly margin ÷ churn; net revenue retention, trailing 12 months = revenue now from customers paying a year ago ÷ their revenue then`

| Input | Value | Basis |
| --- | --- | --- |
| Monthly logo churn | 5%, 4% and 3% | Monthly plans to small businesses, read from 20 customers |
| Monthly margin at $49 | $39 | 80% gross margin |
| Value to CAC | 3:1 | The cost rule’s lifetime cap |
| Customers who reach 80% of a plan limit | 20% a quarter; 1 in 4 moves up a tier | A usage limit set near the median account |
| Customers who refer | 10% a quarter | Asked at the first result |
| Invites each, and invite to customer | 2, and 20% | A two-sided reward in account credit |

Planning estimate unless a source is named: [how each was set](/strategy/numbers#assumptions).

At 5% churn, 0.95^12 = 54% stay a year. At 3%, 69% stay ([the numbers](/strategy/numbers#retention)).

A $49 customer at 5% churn is worth $39 ÷ 5% = $784. At 3:1, CAC stays under about $261 ([your price](/strategy/numbers#price)).

Net revenue retention, trailing 12 months: at 4% churn 0.96^12 = 61% of customers remain, and upgrades from 5% of the base a quarter at +67% add the rest: about 69%. At 3% churn it is 78%. Above 100% needs surviving accounts to grow 4.2% a month at 4% churn: price on seats or usage, not on a tier the account reaches once.

[Referral ask](/capabilities/keep-and-grow/referral-ask): 50 × 10% × 2 × 20% = 2 customers a quarter. At 10 customers it is 0.4, so the founder asks in person. At scale referrals reach about 1 customer a month at scale.

## Playbook
| Step | Move on when |
| --- | --- |
| 1. Define activation from your first 10 customers | The event every kept customer hit in week 1 |
| 2. Watch every signup, and nudge at hour 24 and day 3 if not activated | Activation at 70% or more by week 4 |
| 3. Open a save move on each churn signal within a day | No login in 14 days, usage down 50%, a ticket open 48 hours, a failed payment |
| 4. Prompt an upgrade at 80% of a plan limit, and offer annual at month 2 or 3 after activation | 1 in 4 prompted customers moves up a tier |
| 5. Ask each customer for an intro within a week of their first result | 1 intro for every 3 asks |
| 6. Switch on a two-sided program past 50 customers, paid in account credit after the refund window | 5% or more of customers refer each quarter |
| 7. Read activation, logo churn and net revenue retention monthly | Churn under 5% a month by week 12 |

## Worked example
Leaseline has 20 customers at $149 and loses 2 a month. 10% churn keeps 28% after a year, and no acquisition rescues that.

Activation becomes “first renewal notice sent in week 1”, because no churned customer sent one. [Silence watch](/capabilities/keep-and-grow/silence-watch) sends nudges on day 3, and activation rises from 55% to 80%.

Churn falls to 4%, so a year keeps 61%. [Upgrade note](/capabilities/keep-and-grow/upgrade-note) at 80% of the plan limit moves 1 in 4 to the next tier. [Save and win back](/capabilities/keep-and-grow/save-and-win-back) drafts each save note. To pass 100%, the founder tests a per-property price on the largest 5 accounts.

**Churn falls from 10% to 4% a month, and trailing-12-month net revenue retention rises from 32% to 69%; seat pricing is the lever that would carry it past 100%.**

## When it breaks
| Symptom | Cause | Fix | Fix with |
| --- | --- | --- | --- |
| Signups that activate (under 40%, at 25 signups) | Onboarding loses people before the first result. | Nudge at hour 24 and day 3, and cut one setup step. | [`Message.schedule`](/code/apps/mailboxes/schedule) |
| Logo churn (over 5%, a month, read on 20 or more customers, or 3 or more cancellations in 60 days) | The wrong activation event, or saves that fire too late. | Read activation again from month-3 survivors, and open saves within a day. | `Metric.define` |
| Upgrade prompts taken (under 10%, at 20 prompts) | The prompt fires before the value is felt. | Fire it at 80% of the limit, after the third result. | `Subscription.resize` |
| Customers who refer (under 3%, a quarter) | The ask comes before the result, or the reward does not matter. | Ask at the first result, and reward in account credit. | `Referral.invite` |
| Annual plans that churn at renewal (over 20%, at renewal) | The annual offer went to customers who were about to leave. | Offer annual only 30 days or more after activation. | `Offer.publish` |

## How your agents run it
| Week | Play and move | Goal | Your time | Calls |
| --- | --- | --- | --- | --- |
| Week 1 | [Next order due](/plays/next-outcome): [Silence watch](/capabilities/keep-and-grow/silence-watch) (Workflow) | Score every customer daily, and flag no login in 14 days or usage down 50%. | 20 min | Free |
| Week 1 | [Next order due](/plays/next-outcome): [Weekly readout](/capabilities/measure/weekly-readout) (Workflow) | Read activation, logo churn and net revenue retention for the last 30 days. | 10 min | Free |
| Week 2 | [Next order due](/plays/next-outcome): [Save and win back](/capabilities/keep-and-grow/save-and-win-back) (agent task) | Draft a save note for each customer the watch flags. | 20 min | About 1.4¢ |
| Week 2 | [Usage upsell](/plays/usage-upsell): [Upgrade note at the limit](/capabilities/keep-and-grow/upgrade-note) (agent task) | Send an upgrade note to each customer past 80% of a plan limit. | 5 min | About 1.3¢ |
| Week 4 | [Review requests](/plays/review-requests): [Review requests](/capabilities/keep-and-grow/review-requests) (Workflow) | Ask each activated customer for a review the week their result lands. | 5 min | About 0.25¢ |
| Week 4 | [Customer referrals](/plays/customer-referrals): [Referral ask](/capabilities/keep-and-grow/referral-ask) (agent task) | Ask each customer past their first result who else has the problem. | 20 min | About 24¢ |
| Week 8 | [Customer referrals](/plays/customer-referrals): [Champion moved](/capabilities/keep-and-grow/champion-moved) (Workflow) | Follow champions who change jobs, and write in their first week. | 5 min | About 42¢ |
| Week 12 | [Usage upsell](/plays/usage-upsell): [Weekly readout](/capabilities/measure/weekly-readout) (Workflow) | Read churn, net revenue retention and referrals, and set next quarter’s goal. | 15 min | Free |

Each call is priced from [its composition](/capabilities/how-calls-compose). Week 1: about 30 minutes of yours and nothing in calls. Week 2: about 25 minutes of yours and 3¢ in calls. Week 4: about 25 minutes of yours and 25¢ in calls. Week 8: about 5 minutes of yours and 42¢ in calls. Week 12: about 15 minutes of yours and nothing in calls.

The month runs as a [Play Mix](https://startupbuilder.dev/business/nouns/play-mix): `PlayMix.compile` plans it from your hours and budget, `Play.apply` runs each Play, and each Play runs the compositions in its rows above. `Goal.pursue` is the shortcut that takes the month as [one goal](/code/goal-mode) and records which Play each step served.

```ts title="Month one as a Play Mix"
import { $ } from 'startup-builder'

const mix = await $.PlayMix.compile({ strategy: 'keep-and-grow', hours: 1 })
for (const play of mix.plays) await $.Play.apply({ play: play.id, hours: play.hours })

// Each Play runs its compositions in weeks 1 to 4:
// next-outcome        silence-watch, weekly-readout, save-and-win-back
// usage-upsell        upgrade-note
// review-requests     review-requests
// customer-referrals  referral-ask
```

You see the plan and its price before anything runs. Sends and posts go out within the limits you set; one approval rule on a class such as `send` makes every action in it wait for you, and going over a limit always asks. [How your agents act](/capabilities/agents) names every class.

## Good looks like
| When | The number | Target | Below this, do |
| --- | --- | --- | --- |
| Week 1 | Signups watched, with the activation event defined | 100% | No event yet: talk to 3 kept and 3 churned customers this week. |
| Week 4 | Signups that activate | 70% | Under 70%: nudge at hour 24 and day 3, then cut a setup step. |
| Week 12 | Logo churn a month, at most, on 20 or more customers, with trailing-12-month net revenue retention read monthly | 5% | Over 5%, or 3 cancellations in 60 days: read activation again from month-3 survivors. |

## Connect these first
| Account | What your agents do there | Connect |
| --- | --- | --- |
| [Stripe](/code/integrations/stripe) | Your agents put a checkout on every Offer, take a pilot’s first payment and refund when asked; each payment credits the Play that earned it. | Nothing to connect: your Startup’s own Stripe connected account opens with your first paid Offer (hub [Stripe](https://startupbuilder.dev/systems/integrations/stripe)). |
| [The CRM you already use](/code/integrations/your-crm) | Keep the CRM you know: your agents keep its contacts, companies and deals in step with your records, in the direction you choose. | Call `Integration.connect` with `system: 'crm'` and the `mode` you want, then open the `connectUrl` it returns and sign in to your CRM as an admin. |
| [Gmail](/code/integrations/gmail) | Your agents send from your own Gmail address, read every reply, and stop on any unsubscribe, with each thread filed to its Lead. | Call `Integration.connect` with `system: 'mailboxes'` and `venue: 'gmail'`, then open the `connectUrl` it returns and sign in as the Google account you send from. |
| [Google Analytics](/code/integrations/google-analytics) | Your agents read where visitors came from and what they did, count each Play’s visitors next to its signups, and build audiences to retarget. | Call `Integration.connect` with `system: 'analytics-and-experiments'`, then open the `connectUrl` it returns and sign in as a Google account with access to your property. |

## Plays it runs
| Play | Your time | What it costs | What it does |
| --- | --- | --- | --- |
| [Next order due](/plays/next-outcome) | 29 minutes in week 1, then 57 more minutes by week 4 | Calls about 5¢ a month | Tells a customer the day their last order makes the next one due, with the live price and a one-click order. |
| [Usage upsell](/plays/usage-upsell) | 7 minutes in week 1, then 6 more minutes by week 4 | Calls about 3¢ a month | Offers the next offer when a customer’s use paces past its limit, with today’s prorated charge; the customer upgrades in one press. |
| [Review requests](/plays/review-requests) | 8 minutes in week 1, then 8 more minutes by week 4 | Calls about 1¢ a month | Asks every customer for an honest review when their result lands, on the one site you need most, and answers every review within a day. |
| [Customer referrals](/plays/customer-referrals) | 16 minutes in week 1, then 12 more minutes by week 4 | Calls about 5¢ a month | Asks customers to invite a peer right after they get the result they came for, and rewards both once the peer’s first payment clears refunds. |
| [Annual prepay](/plays/annual-prepay) | 27 minutes in week 1, then 51 more minutes by week 4 | Calls about 3¢ a month | Offers a steady monthly customer a year up front, at a discount their own churn pays for, and answers an annual cancel with one save. |

## Reference
| Call | What it does | Path | Price |
| --- | --- | --- | --- |
| [`Event.capture`](/code/reference#event-capture) | Capture records an Event from a Site, App or API call that no Verb emits, such as a page view or a click. | `POST /events/capture` | Free |
| [`Metric.define`](/code/reference#metric-define) | Define compiles a Metric’s query against the startup’s Events and Entries and lists every Event it reads. | `POST /metrics/define` | Free |
| [`Metric.watch`](/code/reference#metric-watch) | Opens a Task the day a number crosses your line. | `POST /metrics/{metric}/watch` | Free |
| [`Subscription.resize`](/code/reference#subscription-resize) | Resize changes how many units a Subscription holds and prorates the current period. | `POST /subscriptions/{subscription}/resize` | Free |
| [`Referral.invite`](/code/reference#referral-invite) |  | `POST /referrals/invite` | Free |
| [`PlayMix.compile`](/code/reference#play-mix-compile) | Plans next week’s Plays from your budget and what worked last week. | `POST /play-mixes/compile` | Free |