In-App Upsell: The Upgrade Happens in Your Product, Not on Your Pricing Page
behaviour analytics event tracking SaaS growth SaaS analytics product behaviour tracking subscription analytics user behavior analytics

Nobody wakes up and thinks, 'today I will visit a pricing page'! People upgrade in a specific, fleeting moment, and it is almost always the second they bump into the edge of what their current plan allows. They hit the export limit, or go to add a fifth teammate, or reach for a feature that turns out to be locked. That is the moment. Blink, and your email sequence tries to sell them the upgrade next Tuesday, long after the urge has cooled off.
Where the upgrade actually happens
We pour effort into the pricing page. We A/B test the headline, reorder the tiers, agonise over whether the toggle says monthly or annual. All of which assumes the decision gets made there. It mostly does not. The pricing page is usually where someone confirms a decision they already made somewhere else, at a moment of friction or ambition you never saw. We have written about how much intent you can read on the pricing page itself, and there is plenty, but the spark that sends a person there in the first place almost always fires upstream, inside the product, the instant they run into a limit.
The upgrade is a feeling before it is a transaction, and the feeling happens in the product,. Someone is mid-flow, they are getting real value, they reach for the next thing and it is behind a wall. Right there, for about thirty seconds, they are the most willing to pay they will ever be. If your only move is a pricing link in the footer and a nurture email that goes out on Thursdays, you have missed it. By the time that email lands they have either found a workaround or forgotten they cared. You have to meet the moment, not schedule a conversation about it for later. Ian Naylor, Founder at SaaSToolkit.ai
The growth you are sitting on
This matters more than most early teams realise, because expansion is where SaaS growth actually comes from once you are past the scrappy stage. The numbers are hard to argue with. The probability of selling to an existing customer sits around 60% to 70%, against 5% to 20% for a brand-new prospect, a figure that has been quoted for years because it keeps holding up. You already earned these people's trust. Selling them a little more of something they use every day is a far easier job than talking a stranger into starting from zero.
And it compounds as you grow. High Alpha's benchmarking puts expansion revenue at 23% of total revenue for companies around 1 to 5 million ARR, climbing to 40% by the 20 to 50 million mark, and above 50 million, expansion from existing customers overtakes new-customer revenue outright. The companies that win the long game got good at growing the accounts they already have. In-app upsell is the machinery that does exactly that, every day, without a campaign.
What a good in-app upsell actually looks like
Now, "in-app upsell" probably makes you picture a nagging modal that blocks the screen until you click something. That is the bad version, and it is bad for one reason: it fires on the company's schedule instead of the customer's need. The good version is close to the opposite. It stays out of the way most of the time and shows up at exactly the right moment, which makes it feel less like a sales pitch and more like the product reading the room.
A good in-app upsell waits for a real signal, not a date on a calendar. Maybe someone just hit their monthly limit for the third time, or clicked a premium feature and met the upgrade wall, or invited two teammates this week, which usually means a bigger plan is coming whether you prompt it or not. Those are moments of genuine intent, and a well-placed nudge in that moment reads as helpful, because it is. You wanted the thing, here is the thing.
The line between helpful and annoying is almost entirely timing and targeting, and both come straight out of behaviour. Show the team plan to the person who just added their fourth seat, not to the solo user who signed up yesterday. Offer more export capacity to the one hitting the export cap, not to someone who has never touched it. Get that right and the prompt stops feeling like an interruption.
The best upsell does not feel like being sold to, it feels like the product anticipating you. I tell teams to sit down and list every moment a user bumps into a limit or reaches for something locked. That list is your upsell strategy, the whole thing. You do not need clever copy or a discount. You need to turn up at those exact moments with the obvious next step and make it one click. Everything else, the emails, the pricing tweaks, the sales nudges, is you trying to rebuild a moment that already came and went inside the product while you were looking at a dashboard. ," Becky Halls, Strategist at SaaSToolkit.
Treat the upgrade like a product feature
Here is the shift that separates the teams who are good at this from the ones who run a campaign twice a year and hope. They stop treating monetisation as a marketing project that sits next to the product, and start treating the upgrade as part of the product itself.
Most SaaS companies keep monetisation and product in two different departments, and that is the whole mistake," says Marcus Elliott, a product-led growth advisor. "The pricing lives with marketing, the product lives with engineering, and the actual buying moment falls straight down the gap between them. The teams growing revenue per account fastest are the ones who treat the upgrade as a feature: triggered by usage, built into the experience, measured like any other flow. Once monetisation lives inside the product, expansion stops being a quarterly push and becomes something that happens on its own, all the time.
That reframing changes what you build. You measure the upgrade prompt like a funnel, watch which signals convert, and improve it the way you would onboarding or activation, so it becomes a living part of the product rather than a banner someone bolts on before a sales target.
The catch, and where SaaSToolkit comes in
Here is why most teams do not do this, even the ones nodding along. The behaviour signal and the upsell message live in separate tools. Your product analytics knows who just hit the limit. Your messaging or billing tool, the thing that can actually show the upgrade prompt, usually has no idea. So you fall back to exporting a list of power users once a month and emailing them, which is the slow, late, scheduled approach wearing a different hat.
This is the gap SaaSToolkit is built to close. One JavaScript snippet captures what every user does, and the same snippet lets you trigger an in-app message off the back of it. So when a user hits the behaviour that signals upgrade intent, the prompt can fire right there, in the product, in the moment, aimed only at the people the signal actually fits. No export. No second vendor. No waiting for the Thursday send.
You track the moment and act on it in the same place, which is the only way an in-app upsell ever lands as good timing instead of a nag.
So if your expansion revenue is flat while your pricing page gets plenty of traffic that never converts, the page is probably not your problem. The problem is that you are trying to sell the upgrade after the moment instead of during it. Drop the snippet in, map the handful of limits and locked features where your users actually feel the ceiling, and let the upgrade prompt meet them right there. Start free, wire up your first behaviour-triggered in-app upsell this week, and stop leaving your easiest revenue sitting untouched inside your own product.
FAQ
What is an in-app upsell? It is an upgrade prompt shown to a user inside your product, rather than on a pricing page or in an email. The strongest versions are triggered by behaviour, so they appear at the moment a user hits a limit or reaches for a locked feature, when their intent to upgrade is highest. Done well, it feels like help rather than a sales pitch.
Why do in-app upsells work better than upgrade emails? Because timing is everything, and an email almost always arrives after the moment has passed. A user who hits a wall today is ready to pay today, not next Tuesday when your nurture sequence gets to them. An in-app prompt meets that intent while it is live. The email reaches an inbox the user has to remember to act on later, by which point they have usually found a workaround.
Are in-app upsells annoying? Only when they are badly timed and badly aimed, which most are. A modal that blocks everyone on a fixed schedule is annoying. A single prompt that appears exactly when a user bumps into a limit they want to get past is genuinely useful. The difference is behaviour: showing the right offer to the right person at the right moment, and leaving everyone else alone.
When is the best time to show an upgrade prompt? At the point of friction or ambition, when a user runs into the edge of their plan. That might be hitting a usage cap, clicking a feature locked to a higher tier, or adding team members that point to a bigger plan. These behavioural signals mark the moment intent peaks. Fixed dates and one-size-for-everyone campaigns miss it almost every time.
How is in-app upsell different from what is on my pricing page? The pricing page is where people confirm a decision. The in-app upsell is where the decision actually gets made, at the moment a user feels a limit. Both matter, but if you only invest in the pricing page you are polishing the final step, when the moment that actually decided it happened earlier, inside the product, where you were not looking.
How does SaaSToolkit help with in-app upsell? SaaSToolkit captures user behaviour and triggers in-app messages from one JavaScript snippet, so an upgrade prompt can fire the instant a user hits an upgrade-intent signal, aimed only at the people it fits. Behaviour and messaging sit together instead of in separate tools, so you can catch the moment live rather than exporting a list and emailing it days later.