Upsell Strategy
How to upsell customers to higher tiers at the moment they need the features, not when you want the revenue.
Why
Upsell is the highest-ROI revenue motion because the customer already trusts you, already pays you, and the upgrade is a small incremental decision rather than a new purchase. The lift is significant: a SaaS with 10% monthly upsell rate doubles its ARPU in 7 months. The key is timing: you upsell when the customer hits a feature gate (they need private projects, which are on Pro), not when you want more revenue (sending a 'upgrade to Pro' email every month). The feature-gate upsell converts at 15-25% because the customer has a concrete need; the revenue-driven upsell converts at < 1% because it is noise. The mechanism is an in-app prompt at the moment of friction: the user clicks 'create private project' and sees 'private projects are on Pro — upgrade for $29/mo to create unlimited private projects'. This is not a sales pitch; it is a feature unlock, and the customer experiences it as helpful rather than pushy. The most common mistake is email-based upsell ('you should upgrade to Pro') — this is pushy, low-conversion, and trains customers to ignore your emails.
When
When the customer hits a feature gate. Build the gates into the product (private projects, AI coding, custom domains) and trigger the upsell prompt at the gate, not in an email.
How
1. Identify the features that are Pro-only and that Starter customers naturally need as they grow: private projects, AI coding, priority support, custom domains 2. Build feature gates: when a Starter user tries to use a Pro feature, show a prompt that explains the feature and offers the upgrade — not a generic 'upgrade to Pro' but a specific 'private projects are on Pro — upgrade for $29/mo' 3. Make the upgrade one-click: the prompt has a 'Upgrade to Pro' button that goes directly to Stripe Checkout with the customer's payment method pre-filled — do not make them re-enter card details 4. Track which gates trigger the most upsells — if 'private projects' drives 60% of upsells, feature that gate more prominently; if 'custom domains' drives 2%, de-emphasize it 5. Add a 'preview' path: let the Starter user see the Pro feature (e.g., view a private project's README) so they understand the value before upgrading 6. For annual plan upsell: when a monthly customer renews for the 3rd time, offer 'switch to annual and save 2 months — $290/yr vs $348/yr' — this is a no-brainer for them and locks in a year of revenue for you 7. Do not send upsell emails — the conversion is < 1% and they train customers to ignore your emails; the in-app gate is 20x more effective 8. Measure upsell rate by cohort: what % of Starter customers upgrade to Pro within 90 days? Target 10-15%; if < 5%, the gates are not visible or the price jump is too large
Example
# Feature-gate upsell prompt (in-app, at the moment of friction)
function PrivateProjectGate({ user }: { user: User }) {
if (user.plan !== "starter") return null;
return (
<div class="gate-prompt">
<h3>Private projects are a Pro feature</h3>
<p>Keep your work private — visible only to you and your team.</p>
<a href={stripeCheckoutUrl({ plan: "pro", customer: user.id })} class="btn-primary">
Upgrade to Pro — $29/mo
</a>
<a href="/features/private-projects" class="btn-secondary">See what else Pro includes</a>
</div>
);
}
# Annual plan upsell (after 3rd monthly renewal)
if (user.monthlyRenewals === 3 && user.plan === "monthly") {
showPrompt("Switch to annual and save 2 months — $290/yr vs $348/yr");
}
# Tracking: which gates drive upsells
# gate_impressions: { "private_projects": 1200, "ai_coding": 800, "custom_domains": 200 }
# gate_upgrades: { "private_projects": 180, "ai_coding": 96, "custom_domains": 4 }
# conversion_rate: { "private_projects": 15%, "ai_coding": 12%, "custom_domains": 2% }
# → feature private_projects gate more, de-emphasize custom_domainsCommon Problems
- ⚠Email-based upsell ('you should upgrade to Pro') — conversion is < 1% and it trains customers to ignore your emails. Use in-app feature gates at the moment of friction.
- ⚠Generic 'upgrade to Pro' prompts — the customer does not know what they are missing. Make the prompt specific: 'private projects are on Pro — upgrade to create unlimited private projects'.
- ⚠Making the upgrade multi-step (re-enter card, choose plan, confirm) — every step drops conversion. Pre-fill the payment method and make it one click to Stripe Checkout.
Best Practices
- ✓Trigger upsell at feature gates, not in emails — the in-app prompt at the moment of friction converts 15-25% vs < 1% for email, because the customer has a concrete need.
- ✓Make the upgrade one-click with pre-filled payment details — every additional step (re-entering card, choosing plan) drops conversion by 20-30%.
- ✓Track upsell conversion by gate and feature the gates that drive the most upgrades — this optimizes the upsell surface area for the features customers actually want.