Baymard Says 40% of Checkout Abandonment Is Surprise Costs. Your SaaS Signup Page Hides the Same Problem Behind "Plus Tax."
Baymard's checkout research found 40% abandon over surprise costs. SaaS signup pages lose the same buyers to tax-exclusive pricing and seat math.
Somewhere between "yes, I want this" and "here's my card number," a chunk of people who already agreed to pay you just leave. Not because the product failed to convince them — they were already convinced, that's why they clicked the button that put them on your payment page in the first place. Something on the way to actually paying made them stop, and because they never created a subscription, that loss doesn't show up anywhere you're already looking. It's not in your trial-to-paid rate. It's not in your churn rate. It's a number most SaaS teams have simply never measured.
Baymard Institute has spent close to two decades running checkout usability research, most of it on ecommerce, and their abandonment-reasons data is the most cited independent source on why people quit a purchase they already started. SaaS teams tend to assume this research doesn't apply to them — no shipping costs, no cart, no delivery estimate. Look at the actual list of reasons, though, and most of it maps onto a subscription signup page almost exactly. The names change. The mechanism doesn't.
A loss your churn dashboard structurally cannot see
Every churn metric we've written about — logo churn, revenue churn, trial-to-paid conversion — starts counting from the moment a subscription record exists. A customer has to be created before they can churn. Checkout abandonment happens one step earlier than that, which is exactly why it's invisible to every tool built to measure retention: there's no subscription object, no customer ID, no row in Stripe to query. The person existed in your analytics as a pageview on your pricing or checkout page, and then they didn't.
This is also why it's a different problem than trial-to-paid conversion, even though the two get confused constantly. Trial conversion measures people who already started a trial and then didn't upgrade — you have their email, their usage data, a window to win them back with an in-trial sequence. A checkout abandoner frequently never gets that far. They saw a price, a form, or a total that didn't match what they expected, and they left before a trial clock ever started ticking. You usually don't have their email. You rarely have a second chance.
The four reasons that transfer directly from ecommerce to SaaS
| Baymard's ecommerce reason | Share of abandoners | SaaS checkout equivalent |
|---|---|---|
| Extra costs too high (shipping, tax, fees) | 40% | Tax calculated only on the final step; a seat count that multiplies the advertised price; a usage estimate with no visible ceiling |
| Site required account creation | 18% | A full signup form — name, company, password, sometimes a phone number — before the price is even confirmed |
| Checkout was too long or complicated | 17% | Multi-step wizards collecting billing address, company details, and payment info across separate screens |
| Could not see total cost up front | 12% | An annual/monthly toggle that recalculates the price after the buyer has already committed mentally to a number |
| Not enough payment methods | 9% | Card-only checkout with no wallet, bank debit, or local payment method for international buyers |
Abandonment reasons and percentages from Baymard Institute's checkout usability research. SaaS mapping is ours.
Read down that middle column and it's a near-exact ranking of what actually breaks a SaaS signup flow, just dressed in different language. "Extra costs too high" isn't really about shipping for anyone — it's about a number changing after the buyer already decided what they were willing to pay. A SaaS buyer who read "$29/month" on your pricing page and lands on a payment screen reading $31.03 after tax has had the exact same experience as someone who added a shirt to their cart and watched the total jump at checkout.
Source: Baymard Institute, checkout abandonment reasons (updated 2025)
Where SaaS pricing hides the "extra cost" problem specifically
Tax-exclusive pricing by default
Most SaaS pricing pages quote a tax-exclusive number because that's the default most billing tools ship with, and because B2B buyers are assumed to expense it anyway. Neither reason holds for a self-serve buyer paying with a personal or small-business card who's comparing your $29 against a competitor's $25 with no idea tax applies to either. The fix isn't necessarily switching to tax-inclusive pricing everywhere — that creates its own problems across jurisdictions with wildly different rates. It's showing the real total, tax included, before the card field, not after submission. Stripe's automatic tax calculation can run that math and display it inline on a checkout page; the failure mode we've written about in tax calculation errors on stuck invoices is what happens when that same calculation breaks downstream — the upstream version of the problem is simpler: show the number before you ask for a card, not after.
Seat math the buyer has to do themselves
"$12/user/month" reads as cheap right up until a buyer adding 40 teammates realizes they're about to be charged $480/month, and realizes it while typing seat counts into a form instead of while deciding to buy. This is the mirror image of the problem we cover in seat-based churn — that piece is about seats quietly disappearing at renewal; this is about the sticker shock of seat multiplication happening at the moment of first purchase, before the account exists to measure anything about it. A running total that updates live as seats are added, visible before the payment method field, removes the mental math the buyer would otherwise do wrong in your favor exactly once, right before they decide it's not worth it.
Usage-based pricing with no visible ceiling
A buyer evaluating consumption-based pricing can't do the "extra costs too high" calculation at all if there's nothing to calculate against — no estimator, no "typical customer pays" range, no cap. They're being asked to commit to a card on file against an unknown number, which is a strictly worse version of the surprise-cost problem Baymard's respondents are describing, because at least a surprise shipping fee has a dollar figure attached to it when it finally shows up.
Account creation before price confirmation
Eighteen percent of ecommerce abandoners cite forced account creation, and the SaaS version is usually worse: a multi-field signup form — name, work email, company name, team size, sometimes a phone number for "a quick demo call" — standing between the pricing page and the actual payment screen. Every field is defensible individually. A sales team wants the company name. Support wants a phone number. None of them are necessary to take a payment, and each one is a moment where someone who was ready to pay thirty seconds ago gets to reconsider.
The fix that actually works is reordering, not removing. Collect the payment method first, against the exact price just confirmed, and ask for account details — password, team setup, SSO — immediately after the card is validated and the subscription exists. This is closer to how Stripe Checkout behaves by default, and it solves a problem adjacent to the one we cover in free trial abuse metrics: that piece is about trials with no card requirement at all letting fraudulent signups through. This is the opposite failure — demanding information before payment that would be far less costly to collect after it, once a real, chargeable card is already on file.
Payment method scarcity is a self-inflicted version of this
| What the buyer sees | What actually happened |
|---|---|
| Card entry form with no wallet option | Checkout is correctly configured but offers only one payment rail to every buyer, everywhere |
| International buyer sees a US-style card form | No local payment method available, even where card penetration is low |
| Decline with no explanation | A card network or issuer rejected the charge, and the checkout form gives no next step |
This one is almost entirely self-inflicted at this point, because the fix already exists inside Stripe and most teams just haven't turned it on. We've covered the mechanics in Stripe's dynamic payment methods: Checkout can show the right local methods for a buyer's region and currency automatically, without you maintaining a list of which country gets which option. A checkout page offering only cards to a buyer in a market where cards aren't the default way people pay online is manufacturing its own version of Baymard's "not enough payment methods" complaint — not because the feature doesn't exist, but because nobody enabled it.
Measuring a funnel step most SaaS teams never built
None of this is fixable without first measuring it, and most SaaS analytics setups don't have a step for "pricing page viewed → payment form started → payment form abandoned → subscription created" as its own tracked funnel. It's a handful of events to add to whatever you're already using for product analytics, but almost nobody adds them, because the instinct is to track the funnel starting from the trial or the subscription, where the data is already sitting in Stripe. Everything before that point has to be tracked deliberately or it simply doesn't exist in your reporting.
Once you have it, the fix is straightforward to prioritize: whichever step in that funnel has the steepest drop-off is costing you more than any single churn-prevention tactic you could run on customers who already made it through. A 15% abandonment rate on a payment form that 10,000 people a month reach is 1,500 people who already said yes and left anyway — a number worth comparing against what your LTV calculator says a single customer is worth, because the math on fixing a checkout form almost always beats the math on winning back someone who already decided and walked away once.
What to actually check this week
- Open your own checkout on a clean session and time it. From pricing page to confirmed payment, count the fields, count the screens, and note the first moment the real total — tax included, seats multiplied — appears. If that number shows up anywhere other than the first screen a buyer sees after clicking "subscribe," you've found your highest-leverage fix before reading another word of analytics.
- Add the missing funnel step. Fire an event when the payment form loads and another when a subscription is actually created. The gap between those two counts is your checkout abandonment rate, and until it exists as its own number, every other retention metric you track is starting the clock too late to see it.
- Check which payment methods Checkout is actually offering by region. If dynamic payment methods aren't enabled, a meaningful share of international buyers are seeing a form built for a market that isn't theirs, and nothing in your conversion data will tell you that directly — you have to go check the configuration.
- Count the fields between "click subscribe" and "card validated." Anything that isn't the price, the plan, and the payment method itself is a candidate to move to after the card is on file, not before it.
It's worth sitting with the asymmetry here for a second: a huge amount of SaaS retention work goes into the cancellation flow — understanding why someone who's already a customer wants to leave, and giving them a reason to stay. The checkout page is the same decision point, just running in the opposite direction, on someone who hasn't become a customer yet. CancelFlow exists to catch the moment on the way out. The data in this piece is the reminder that the moment on the way in deserves the same scrutiny, and far fewer SaaS teams are actually looking at it.
Frequently asked questions
What is checkout abandonment for a SaaS product?+
Checkout abandonment is when someone who already decided to buy — they clicked "Start trial" or "Subscribe," landed on your payment page — leaves before completing it. It's distinct from trial churn or a cancellation: the person never became a customer, so they never show up in your churn rate, your trial-to-paid conversion number, or any retention dashboard. The only place this loss is visible is a drop-off between "viewed pricing page" and "subscription created" in your product analytics, and most SaaS teams never build that specific funnel step.
Why do people abandon a signup page after already deciding to pay?+
Baymard Institute's research into checkout abandonment, based on surveying US online shoppers, found the top reason by a wide margin is extra costs appearing late — 40% of abandoners cite it. For SaaS specifically, the equivalent is tax added only on the final payment step, a seat count that multiplies the advertised per-user price into a much bigger total, or a usage-based estimate the buyer can't actually calculate before entering a card. The person didn't change their mind about buying. They changed their mind about the number they were shown.
Does requiring a credit card upfront reduce signup abandonment?+
It changes who abandons, not whether abandonment happens. Card-required (opt-in) trials convert a higher share of the people who start one — the broader SaaS data on this, which we cover in our trial-to-paid conversion benchmarks, puts opt-in trials at 25–40% median conversion versus 8–15% for opt-out. But that's a different measurement than checkout-page abandonment specifically: opt-in trials push the abandonment point earlier, onto the payment form itself, where Baymard's reasons — distrust of the site with card details, too few payment methods, a checkout that's too long — apply directly.
Can I reduce account-creation friction without opening the door to trial abuse?+
Yes, by changing the order of operations rather than removing the step. Collect payment details first, then provision the account and ask for a password or SSO login after the card is validated — the fraud and abuse signal you actually want (a real, chargeable card) arrives before the friction point, not after it. This is the same sequencing Stripe Checkout uses by default, and it's a different problem from the one we cover in free trial abuse metrics, which is about trials with no card at all.
Stop losing subscribers today
One script tag. One function call. A live cancellation flow in under 10 minutes.
Start free trial →