Applies when the question is "of everyone already paying us, who is ready to grow, and who do we call first?" Produces a ranked weekly digest, one entry per account, each with a named contact and a specific suggested move.
Expansion revenue is usually lost to neglect, not to competitors. The customers most ready to upgrade are often the quiet ones: a mid-size company on your cheapest plan, or a team that has burned 90% of its allowance three weeks before renewal. A weekly scan with fixed scoring rules catches them before the customer has to ask, or leaves.
Template placeholders
Replace every {{...}} before enabling. See the setup checklist reference for the full list and the decisions behind each.
{{BILLING_SOURCE}}: Where active subscriptions live (e.g. Stripe, Chargebee, your product database){{CRM}}: Your CRM (e.g. HubSpot, Salesforce, Attio){{CLOSED_WON_STAGE}}: The CRM stage or lifecycle value that marks a paying customer{{TIER_TAGS}}: Your account tiers, top two used here (default: Diamond and Gold; lower tiers are excluded){{ACV_TAGS}}: Your ACV potential tags (default: high, medium, low){{USAGE_UNIT}}: What customers consume on a plan (e.g. credits, seats, API calls, records){{PLAN_LADDER}}: Your plans with price and included{{USAGE_UNIT}}, lowest to highest{{SCALE_PRICE}}: Monthly price of the plan you expect a mature customer to sit on (default thresholds below assume about $1,200 a month){{EXPANSION_TARGETS_FILE}}: Optional: a maintained list of target accounts with their expansion angle and status{{DIGEST_CHANNEL}}: Where the digest posts (e.g. a #expansion-leads Slack channel){{ERROR_CHANNEL}}: Where run failures post{{EXPANSION_OWNER}}: The person who works expansion conversations
Step 1: Build the working universe
- Pull every active subscription with a price above zero from
{{BILLING_SOURCE}}: account domain, plan, monthly price, included{{USAGE_UNIT}}, remaining{{USAGE_UNIT}}this cycle, billing interval. Page through until you have all of them. - Pull every account at
{{CLOSED_WON_STAGE}}from{{CRM}}. - The working universe is the intersection: in the closed-won stage AND paying. Drop any domain that appears in only one source, and log the mismatches; they are usually billing or CRM hygiene problems worth a separate look.
Step 2: Score each account (default maximum 8.5)
Collect for each account: monthly price, tier tag, ACV tag, employee count, and burn (share of this cycle's {{USAGE_UNIT}} already used). Compute the score in code, not by eye.
Tier (a gate, not just points). Only the top two tiers in {{TIER_TAGS}} are scanned.
- Top tier (default Diamond): 2.0
- Second tier (default Gold): 1.0
- Anything lower or untiered: excluded from the scan entirely
ACV potential (from {{ACV_TAGS}})
- High: 1.5
- Medium: 0.75
- Low or untagged: 0
Price gap (what they pay against {{SCALE_PRICE}}). Defaults assume a scale plan around $1,200 a month; rescale the bands to your own ladder.
- $250 a month or less: 2.0
- $251 to $500: 1.5
- $501 to $750: 1.0
- $751 to $1,200: 0.5
- Above $1,200: 0 (already at scale; less urgency)
Headcount against price (an ACV mismatch)
- 200+ employees paying $750 a month or less: 1.0
- 75 to 199 employees paying $750 a month or less: 0.5
- Under 75 employees: 0
Burn = (included − remaining) / included × 100. If the included amount is not on the subscription, take it from the plan in {{PLAN_LADDER}}.
- 90% or more: 2.0 (critical; they are probably already topping up)
- 70% to 89%: 1.5
- 50% to 69%: 0.75
- Under 50%: 0
If burn cannot be determined, use the most recent usage note on the account. If there is none, the default is to score burn as 0 and say so in the entry. Never guess it.
Sort descending and keep the top 25.
Step 3: Add the expansion context
For each of the top 25, check {{EXPANSION_TARGETS_FILE}} if you keep one:
- Use the recorded expansion angle and category if the account is listed.
- Skip accounts already in motion. Default: status "live upgrade conversation" or "meeting booked". A second rep opening the same conversation is worse than missing a week.
If the account is not listed, derive the angle from the signals: burn, headcount against price, ACV tag.
Step 4: Classify urgency
Critical: act this week, if any of:
- Burn 90% or more
- A buyer-initiated signal on the account (they flagged running out, asked about upgrading)
- Top tier paying $500 a month or less
High: act within two weeks, if any of:
- Burn 70% to 89%
- 200+ employees paying $600 a month or less
- Score 6.0 or more
Medium: on the radar. Everything else in the top 25.
Step 5: Post the digest
Post to {{DIGEST_CHANNEL}}, one message per account so each can be claimed and threaded.
Header message first:
Weekly expansion scan, week of <Monday date>
<N> paying customers scanned
| Urgency | Rule (from Step 4) | Count |
| Critical | Burn ≥ 90%, buyer asked, or top tier paying ≤ $500/mo | <x> |
| High | Burn 70 to 89%, 200+ employees paying ≤ $600/mo, or score ≥ 6.0 | <x> |
| Medium | The rest of the top 25 | <x> |
Top 5 by urgency, then top 5 by ARR upside, below.
Then two short lists:
- Top 5 by urgency: the highest composite scores.
- Top 5 by ARR upside: (recommended plan price − current price) × 12, highest first, ties broken by employee count. Skip anyone already in the first list.
Then the remaining Critical and High accounts, then Medium accounts up to a total of 20. Critical and High are always posted, even if together they pass 20; in that case no Medium accounts are posted. Otherwise cut the lowest-scoring Medium accounts first.
Each account message:
Title line: <urgency> <tier> <Company> (<domain>) | $<current>/mo → <recommended plan>
Up to five bullets:
- Who: a named contact (champion, economic buyer or expansion owner) with their LinkedIn URL. If there is none on file, write "Contact not on file; enrichment recommended." Never invent one.
- Signal: the specific reason: burn, repeated top-ups, headcount against price, something the buyer said, seats filling up, a use-case ceiling.
- Context: current plan, relationship history, any open or past upgrade conversation.
- Reach out: one concrete suggestion naming who contacts them, on which channel, with what angle and what ask. Good: "
{{EXPANSION_OWNER}}emails the ops lead about hitting 100% of their allowance, which she raised on the last call; ask is the next plan up." Bad: "Follow up with the team." - Score: tier and the score out of 8.5.
In a thread reply: the score breakdown, other contacts at the account, and the CRM record link.
The digest suggests outreach; it never sends any. A person decides and acts.
Step 6: When things go wrong
- Fewer than 5 accounts qualify: post the digest anyway, with a note: "Low qualifying count. ACV tags may need refreshing on recently won accounts."
- The billing or CRM pull fails: post the error to
{{ERROR_CHANNEL}}and stop. A digest built on half the book is misleading.
What good looks like
- Every account in the digest is paying, closed-won and in a top tier, and none is already in an open upgrade conversation.
- Every score can be rebuilt from its breakdown in the thread.
- Every entry names a real person and a specific move. The suggested reach-out could be sent after a two-minute edit.
- Critical accounts are the ones a person would agree are urgent on sight: running out of allowance, asking for more, or clearly underpaying for their size.
- The same account does not appear in both top-5 lists.
- When data is missing (no burn, no contact), the entry says so instead of filling the gap.