Expansion Revenue
How to grow revenue from existing customers through seat expansion, usage growth, and plan upgrades — the NDR lever.
Why
Expansion revenue is the most efficient revenue in SaaS: it requires no acquisition cost, has a 100% gross margin (the infrastructure is already paid for), and compounds. The metric is Net Dollar Retention (NDR) = (starting MRR + expansion - churn - contraction) / starting MRR. A 110% NDR means you grow 10% even with zero new customers, because existing customers expand faster than they churn. The three levers are seat expansion (a 5-seat team grows to 10 seats as the company hires), usage growth (a customer on 10k API calls grows to 50k as their usage scales), and plan upgrades (a Starter customer upgrades to Pro as they need more features). The companies with 120%+ NDR (Figma, Slack, Notion) build the product so expansion is automatic: as the customer's team grows, they add seats; as their usage grows, they hit usage tiers; as their needs grow, they hit feature gates. The most common mistake is capping expansion (fixed-price plans with no per-seat or per-usage component) — this means a customer who 10x their usage pays the same, and you are subsidizing their growth. Always have a per-seat or per-usage component so expansion is captured.
When
Always. Expansion is not a one-time project — it is a product design principle. Build the pricing so expansion is automatic (per-seat, per-usage) and the product so growth triggers expansion.
How
1. Build pricing with a per-seat component ($5/seat for team plans) — as the customer's team grows, they add seats and your revenue grows automatically 2. Build pricing with a per-usage component ($0.01/API call above 10k) — as the customer's usage grows, they hit the usage tier and pay more 3. Make seat addition self-serve: the team admin can add seats in the billing settings without talking to sales — friction in seat addition kills expansion 4. Send a monthly 'usage report' to the customer: 'you used 12k of 10k included API calls — add a usage pack for $10/10k calls' — this turns usage growth into a buying decision 5. Track NDR monthly: (starting MRR + expansion - churn - contraction) / starting MRR — target 110%+; < 100% means you are shrinking 6. Identify the expansion triggers: which product actions correlate with seat expansion? (e.g., inviting teammates) with usage growth? (e.g., connecting more repos) — feature these actions in onboarding 7. For plan upgrades, use the feature-gate upsell (see upsell-strategy) — this is the third expansion lever 8. Review customers with negative expansion (downgrades, seat reductions) — these are churn signals; reach out to understand why they are contracting before they churn
Example
# NDR calculation (monthly)
const startingMRR = 100000;
const expansion = 12000; // seat additions + usage growth + upgrades
const churn = 5000; // lost customers
const contraction = 3000; // downgrades + seat reductions
const NDR = (startingMRR + expansion - churn - contraction) / startingMRR;
// NDR = (100000 + 12000 - 5000 - 3000) / 100000 = 1.04 = 104%
// Target: 110%+ → need more expansion or less churn
# Self-serve seat addition (in billing settings)
app.post("/billing/seats", async (req, res) => {
const { quantity } = req.body; // add 3 seats
await stripe.subscriptions.update(subId, {
items: [{ id: seatItemId, quantity: currentSeats + quantity }],
});
// Customer adds seats without talking to sales — frictionless expansion
});
# Usage report (monthly email)
Subject: Your EZ4Code usage — October
- API calls: 12,340 / 10,000 included → add a usage pack (+$10/10k)
- Seats: 8 / 5 included → add a seat pack (+$5/seat × 3 = $15)
- Total expansion: +$25/mo
[Add usage pack] [Add seats] [View dashboard]Common Problems
- ⚠Capping expansion with fixed-price plans — a customer who 10x their usage pays the same, and you subsidize their growth. Always have a per-seat or per-usage component.
- ⚠Making seat addition require sales contact — the admin cannot add seats self-serve, so expansion is delayed or lost. Make seat addition a billing-settings action.
- ⚠Not tracking NDR — you do not know if existing customers are growing or shrinking, so you cannot tell if expansion is working. Track NDR monthly and target 110%+.
Best Practices
- ✓Build pricing with per-seat and per-usage components so expansion is automatic — as the customer's team and usage grow, your revenue grows without a sales conversation.
- ✓Make seat addition self-serve in billing settings — frictionless expansion captures the revenue at the moment the customer needs it, not when sales gets around to calling.
- ✓Track NDR monthly and target 110%+ — this is the single best metric for SaaS health, because it measures whether your existing customers are growing with you.