Direct gateways like Stripe charge lower fees (about 2.9% + $0.30) but make you the merchant of record, responsible for your own tax registration and filing. Merchants of Record like Paddle charge more (about 5% + $0.50) but handle tax compliance entirely.
Most companies pick one and stick with it. But tax obligations are regional, not global, so the better move is routing each transaction to whichever provider maximizes your take-home revenue for that specific buyer.
Why Nexus Thresholds Matter
Paddle processes enough volume globally that it's already registered for tax in nearly every jurisdiction, so it charges the applicable VAT or sales tax on every sale. If you process directly through Stripe, your own tax obligation depends on your sales volume in that specific region.
Thresholds vary by state and country, and they're not all the same number. Many US states still use the original Wayfair standard of $100,000 in annual sales or 200 transactions. California is not one of them: since April 2019 its threshold is a flat $500,000 in sales with no transaction count at all (TaxJar, CDTFA guidance via Mosey). If your SaaS hasn't crossed whatever threshold actually applies in a buyer's state, you have no legal obligation to collect tax there yet.
Incoming Checkout Session
|
GetVisitor.info Payload
|
+------------------+------------------+
| |
Below sales_tax.threshold At/above sales_tax.threshold
| |
Route to STRIPE (Direct) Route to PADDLE (MoR)
• Save ~2.1% in gateway fees • MoR handles complex tax filing
• Customer pays $0 in sales tax • Zero legal/filing overhead
• Maximum price competitiveness • Compliant in high-volume states
Decision Matrix
| Scenario | Status | Route | Benefit |
|---|---|---|---|
| Tax applies, threshold not yet reached | Below nexus | Stripe | Lower fee, zero tax for buyer |
| Tax applies, threshold reached | Above nexus | Paddle | Offloads filing and remittance |
| No sales tax or VAT in jurisdiction | N/A | Stripe | Lowest processing fee |
| VPN or proxy detected | Elevated risk | Stripe, standard fraud checks | Enforce 3DS |
The Payload
{
"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
}
}
}
function selectPaymentProcessor(gviData, yourAnnualSalesInRegion) {
const { sales_tax } = gviData.commerce;
const atOrAboveThreshold = sales_tax?.threshold != null && yourAnnualSalesInRegion >= sales_tax.threshold;
if (sales_tax && atOrAboveThreshold) {
return { processor: "PADDLE", collectTax: true };
}
return { processor: "STRIPE", collectTax: false };
}
app.post("/api/create-checkout", async (req, res) => {
const gviData = req.gviPayload;
const route = selectPaymentProcessor(gviData);
if (route.processor === "PADDLE") {
const session = await createPaddleCheckoutSession({ planId: req.body.planId });
return res.json({ url: session.url, provider: "paddle" });
}
const session = await createStripeCheckoutSession({ planId: req.body.planId });
return res.json({ url: session.url, provider: "stripe" });
});
The Numbers
Say you're selling a $100/month plan to a buyer in California and you're still below the $500,000 nexus threshold there.
| Metric | Static Paddle (MoR) | Router via GVI (Stripe) | Difference |
|---|---|---|---|
| Base price | $100.00 | $100.00 | — |
| Sales tax (8.85% CA avg) | +$8.85 | $0.00, below threshold | Buyer saves $8.85 |
| Total paid by buyer | $108.85 | $100.00 | 8.1% lower |
| Processing fee | -$5.50 (5% + $0.50) | -$3.20 (2.9% + $0.30) | +$2.30 saved |
| Net revenue | $94.50 | $96.80 | +$2.30 more |
Once you cross $500,000 in California sales, the router switches you to Paddle automatically and the tax filing burden moves off your plate.
Sign up at GetVisitor.info for location and tax-threshold intelligence.