A buyer sees "$50/month" on your pricing page, clicks Get Started, then watches the total jump to $59.50 at checkout once VAT or state sales tax is added. That jump is checkout shock, and it's one of the most avoidable reasons a high-intent buyer leaves.
What It Costs You
Baymard Institute's checkout research, based on a survey of US adult online shoppers, found that extra costs like shipping, tax, and fees are the single biggest reason people abandon checkout: 39% cite it directly. A further 14% abandon simply because they can't see or calculate the total cost before committing (baymard.com/learn/reduce-cart-abandonment).
Showing an honest estimate on the pricing page, before the buyer ever reaches checkout, removes both problems at once.
Two Nuances That Matter
Nexus thresholds. Most jurisdictions (EU, UK, individual US states) only require you to collect tax once your sales in that region cross a legal threshold. Showing tax before you've actually crossed it inflates your price for no reason.
US address volatility. You only know a visitor's city or state from IP before they type a full address. Rather than guess a single rate, show a labeled state-wide estimate: "Estimated Tax: ~$4.43 (8.85% CA avg), calibrated at checkout."
What Powers the Estimate
{
"location": { "country": "United States", "country_code": "US", "state": "California" },
"commerce": {
"currency": { "code": "USD" },
"sales_tax": {
"label": "SUT",
"rate": 7.25,
"rate_with_local_addons": { "min": 7.25, "max": 10.75 },
"threshold": 500000
}
}
}
commerce.sales_tax:nullwhen no sales tax or VAT applies at all.commerce.sales_tax.threshold: the nexus threshold for *your* business to cross before you're obligated to collect in that jurisdiction (nullwhen not applicable).commerce.sales_tax.rate: national or state floor rate.commerce.sales_tax.rate_with_local_addons.min/.max: full state-wide bounds (state + local) for a pre-checkout estimate.
function renderPricingSummary(gviData, planBasePriceUSD = 50, yourAnnualSalesInRegion = 0) {
const { location, commerce } = gviData;
const { sales_tax } = commerce;
const belowThreshold = sales_tax?.threshold != null && yourAnnualSalesInRegion < sales_tax.threshold;
if (!sales_tax || belowThreshold) {
return { subtotalUSD: planBasePriceUSD, estimatedTaxUSD: 0, totalUSD: planBasePriceUSD, taxLabel: "No tax applied" };
}
let taxNote;
let effectiveRatePct;
if (location.country_code === "US") {
const { min, max } = sales_tax.rate_with_local_addons;
effectiveRatePct = (min + max) / 2;
taxNote = `Est. ${location.state} sales tax (${min.toFixed(1)}%–${max.toFixed(1)}%, calibrated at checkout)`;
} else {
effectiveRatePct = sales_tax.rate;
taxNote = `Est. ${location.country} ${sales_tax.label} (${effectiveRatePct.toFixed(0)}%)`;
}
const estimatedTaxUSD = planBasePriceUSD * (effectiveRatePct / 100);
return {
subtotalUSD: planBasePriceUSD,
estimatedTaxUSD: estimatedTaxUSD.toFixed(2),
totalUSD: (planBasePriceUSD + estimatedTaxUSD).toFixed(2),
taxLabel: taxNote
};
}
Where This Wins
| Approach | Late Surprise Risk | Setup | Trust Impact |
|---|---|---|---|
| Hidden until payment | High | Low | Drives the 39% drop-off above |
| Flat static tax label | High, wrong in untaxed regions | Low | Confuses more than it helps |
| GVI location-aware estimate | None | One API call | Clear upfront pricing |
Sign up at GetVisitor.info to add tax intelligence to your pricing page.