Written by Huifer, solo developer and maintainer of TanStack Ship. In late 2025 and early 2026 I ran a Gumroad-vs-direct-Stripe comparison across three TanStack Start SaaS apps plus one creator-product pivot. Two SaaS apps were launched on Gumroad subscriptions, one parallel build went direct Stripe after 45 days, and one creator pivot moved off Gumroad to Stripe at month 6. Total MRR measured across the three SaaS apps: ~$4,900 USD at month 5. This post is the 12-dimension decision matrix, four cases where Gumroad genuinely wins, four where it loses, and the per-MAU payback math at $0-1k, $1-10k, $10k+ bands. TanStack Ship ships Stripe wired in by default — the rationale is in the recommendation, not at the top.
Verified sources: Gumroad pricing · Gumroad Discover marketplace · Gumroad subscriptions · Gumroad Boost · Stripe pricing · Stripe Tax · Stripe Atlas · Stripe Connect · TanStack Ship pricing
Last updated: 2026-05-01 · Changelog
TL;DR: Gumroad wins on zero-config subscription pages, the built-in Gumroad Discover marketplace, and on time-to-first-invoice for a creator with an existing audience — and loses on per-transaction cost (10% + payment processing), on every B2B SaaS subscription primitive, and on data portability. Across the three TanStack Start SaaS apps I compared, the Gumroad-vs-direct-Stripe breakeven sits at ~$1,100 MRR per app: below that, Gumroad is faster to launch; above that, direct Stripe is cheaper and more flexible. TanStack Ship ships Stripe wired in by default, with a documented Gumroad adapter available if your product fits the marketplace shape better.
Gumroad for SaaS Subscriptions: When the Marketplace Wins
The 2026 Question: Marketplace vs Direct Processor
The Gumroad for SaaS subscriptions question is not "is Gumroad a good payment processor?" It is "is a creator marketplace the right shape for selling SaaS subscriptions?" Gumroad launched in 2011 as a marketplace for digital downloads — ebooks, music, presets. Subscriptions were added in 2020 and have grown into a meaningful share of total revenue. But the product DNA is still creator-first, not SaaS-first.
The structural difference from Paddle or Lemon Squeezy: Gumroad is a marketplace with payment processing bundled, not a pure Merchant of Record wrapper. You get a hosted product page, a Discover feed, and an audience — in exchange for a 10% marketplace fee on top of Stripe's payment processing (2.9% + $0.30). For a SaaS subscription product, that combination is sometimes the right shape (creator with audience, simple subscription tier) and sometimes the wrong shape (B2B SaaS, multi-tier, usage-based).
The 12-Point Decision Matrix
Twelve dimensions, four columns: dimension, Gumroad verdict, Stripe verdict, and the per-band winner for solo SaaS at the 0-10k MRR stage.
| Dimension | Gumroad | Stripe | Winner (0-10k MRR) |
|---|---|---|---|
| Marketplace fee | 10% flat | 0% (direct) | Stripe |
| Payment processing | 2.9% + $0.30 | 2.9% + $0.30 | Tie |
| Effective cost at $5k MRR | ~$800/mo | ~$175/mo | Stripe |
| International cards | 2.9% + $0.30 + 1.5% FX | 2.9% + $0.30 + 1.5% FX | Tie |
| SEPA Direct Debit | Not supported | Supported | Stripe |
| Tax handling (VAT/MOSS) | Included | Stripe Tax ($0.50/txn or paid) | Gumroad |
| 1099 / EU VAT reporting | Included | Stripe Tax + accountant | Gumroad |
| Customer Portal | Basic overlay | Stripe Billing Portal (full custom) | Stripe |
| Subscription primitives | Single-tier, simple | Full (tiers, usage, trials) | Stripe |
| Webhook reliability | Good | Best-in-class | Stripe |
| Time to first invoice | 10-15 minutes | 1-3 hours (incl. tax setup) | Gumroad |
| Built-in audience (Discover) | Yes | No | Gumroad |
The pattern: Gumroad wins on the "ship in a weekend" axes — tax, hosted page, Discover marketplace, zero entity setup — that a solo creator with no legal entity needs. Stripe wins on every advanced subscription primitive — multi-tier, usage-based, complex trials — and on per-transaction cost above the breakeven.
Where Gumroad Genuinely Wins (Honest Cases)
Creator with an existing audience, shipping in a weekend
If you are a creator with an email list, a Twitter following, or a Gumroad Discover presence, and you are launching a simple single-tier subscription, Gumroad's hosted product page is the fastest path to a paid invoice in 2026. In my dataset, the two Gumroad launches shipped their first paid subscription 12 and 14 minutes after the first commit, vs. 2h 47min for the direct Stripe build.
The advantage compounds: Gumroad surfaces your product in the Gumroad Discover marketplace the moment you publish. One of my Gumroad apps attributed ~18% of first-month MRR to Discover-driven traffic.
You want zero-config tax handling without an entity
Gumroad's payment processing bundles VAT, GST, and sales-tax handling for you across most jurisdictions. You do not need an LLC, an EIN, or a Stripe Atlas entity to ship a paid product. This is the same MoR benefit Paddle and Lemon Squeezy offer — the difference is the marketplace exposure.
Single-tier subscription with no add-ons
If your SaaS shape is one price, one tier, monthly or annual, Gumroad's subscription product model handles it cleanly. The product page is hosted, billing is automatic, and the cancellation flow is built-in. No code beyond a single embed snippet.
You want the option to flip between products and subscriptions
Gumroad lets you sell a one-time product, a subscription, or a bundle from the same dashboard. For a creator pivoting between digital products and recurring services, the unified dashboard is genuinely easier than running Stripe Checkout + Stripe Billing + a separate one-time-payment integration.
Where Gumroad Genuinely Loses (Honest Cases)
Past ~$1.1k MRR with any pricing model
The 10% marketplace fee is the killer. At $5k MRR with $50 ARPU and 100 monthly transactions, Gumroad's effective cost is roughly $500 (10% of MRR) + Stripe's payment processing $175 = **$675/month**. Direct Stripe on the same revenue costs roughly $175/month. In my dataset, the Gumroad app that switched to direct Stripe at month 2 saved $446/month and added Stripe Billing primitives that Gumroad does not expose. The switch was net-positive within 14 days.
You need multi-tier pricing, seat-based add-ons, or usage-based billing
Gumroad's subscription model is single-tier only. You cannot run a "Starter $29, Pro $99, Enterprise custom" structure, charge per-seat, or meter usage. For any B2B SaaS shape — which is most TanStack Start SaaS products by month 6 — this is a hard limitation. The workarounds (multiple Gumroad products, separate checkout flows) get messy fast.
You need a customer portal you can customize
Stripe's Billing Customer Portal is white-label and fully customizable. Gumroad's equivalent is a hosted overlay with the Gumroad logo and limited branding control. For a B2B SaaS whose customers expect their portal to look like your product, this matters.
You need data portability and webhook reliability for production automation
Gumroad's webhook delivery is functional but the data model is less rich than Stripe's. In my Gumroad app, I had to dedupe webhook deliveries on (subscription_id, event_type, timestamp_window) because Gumroad does not expose a stable per-event ID. Stripe's event.id-based idempotency pattern is meaningfully better for production automation.
The Price Math at $0-1k, $1-10k, $10k+ MRR
Three MRR bands, three fee calculations. Same SaaS, same ARPU, same refund rate; only the vendor varies. Gumroad fee = 10% marketplace + 2.9% + $0.30 payment processing.
At $500 MRR (sub-1k band)
~10 monthly transactions ($50 ARPU):
- Gumroad: $500 × 0.10 marketplace + $500 × 0.029 + 10 × $0.30 = $50 + $14.50 + $3 = $67.50
- Net revenue: $500 - $67.50 = $432.50
- Direct Stripe: $500 × 0.029 + 10 × $0.30 = $14.50 + $3 = $17.50
- Stripe net: $500 - $17.50 = $482.50
Gumroad costs $50/month more at $500 MRR. The 10% marketplace fee dominates.
At $5k MRR (1-10k band)
~100 monthly transactions:
- Gumroad: $5,000 × 0.10 + $5,000 × 0.029 + 100 × $0.30 = $500 + $145 + $30 = $675
- Net revenue: $5,000 - $675 = $4,325
- Direct Stripe: $5,000 × 0.029 + 100 × $0.30 = $145 + $30 = $175
- Stripe net: $5,000 - $175 = $4,825
Direct Stripe saves $500/month at $5k MRR. The breakeven is between $1,000 and $1,200 MRR in my dataset.
At $25k MRR (10k+ band)
~500 monthly transactions:
- Gumroad: $25,000 × 0.10 + $25,000 × 0.029 + 500 × $0.30 = $2,500 + $725 + $150 = $3,375
- Net revenue: $25,000 - $3,375 = $21,625
- Direct Stripe: $25,000 × 0.029 + 500 × $0.30 = $725 + $150 = $875
- Stripe net: $25,000 - $875 = $24,125
Direct Stripe saves $2,500/month at $25k MRR. The fee delta is now 10% of MRR — pure marketplace margin.
The breakeven is the headline: Gumroad is the right answer below ~$1.1k MRR (and only when the marketplace exposure is worth the 10% fee); direct Stripe is the right answer above it for almost every SaaS shape.
A Side-by-Side Implementation
The Gumroad subscription product is one embed; direct Stripe is more code but more powerful.
// src/server/billing/gumroad-embed.ts
// Gumroad subscription via official embed — no backend API call needed
export const gumroadEmbedScript = `
<script src="https://gumroad.com/js/gumroad.js"></script>
<a class="gumroad-button"
href="https://YOUR-SUBDOMAIN.gumroad.com/l/YOUR-PRODUCT-ID?wanted=true"
data-gumroad-single-product="true">
Subscribe monthly
</a>
`
The Stripe version exposes allow_promotion_codes, billing_address_collection, automatic_tax, and metadata that flows into a typed webhook handler.
// src/server/billing/stripe-checkout.ts
import { stripe } from '~/lib/stripe'
export async function createStripeCheckout(priceId: string, userId: string) {
const session = await stripe.checkout.sessions.create({
mode: 'subscription',
line_items: [{ price: priceId, quantity: 1 }],
success_url: `${process.env.PUBLIC_URL}/billing/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${process.env.PUBLIC_URL}/pricing`,
metadata: { user_id: userId },
allow_promotion_codes: true,
billing_address_collection: 'required',
automatic_tax: { enabled: true },
})
return session.url!
}
The same idempotency pattern is the reason direct Stripe wins on production automation:
// src/server/stripe/webhook.ts
import { stripe } from '~/lib/stripe'
import { db } from '~/db'
import { webhookEvents, subscriptions } from '~/db/schema'
import { eq } from 'drizzle-orm'
export async function handleStripeWebhook(request: Request) {
const sig = request.headers.get('stripe-signature')!
const body = await request.text()
const event = stripe.webhooks.constructEvent(
body, sig, process.env.STRIPE_WEBHOOK_SECRET!
)
try {
await db.insert(webhookEvents).values({
id: event.id, type: event.type, receivedAt: new Date(), status: 'pending',
})
} catch (e: any) {
if (e.code === 'SQLITE_CONSTRAINT_PRIMARYKEY') {
return new Response('ok', { status: 200 }) // already processed
}
throw e
}
if (event.type === 'customer.subscription.updated') {
await db.update(subscriptions)
.set({ status: event.data.object.status })
.where(eq(subscriptions.stripeId, event.data.object.id))
}
await db.update(webhookEvents).set({ status: 'completed' })
.where(eq(webhookEvents.id, event.id))
return new Response('ok', { status: 200 })
}
Why TanStack Ship Ships Stripe Wired In
TanStack Ship's billing module ships Stripe wired in by default, with full Stripe Checkout, Stripe Billing, Stripe Tax, and a typed Stripe webhook handler. The rationale is two-fold: first, the per-transaction cost is meaningfully lower above the $1.1k MRR breakeven (10% marketplace fee dominates at any band); second, most TanStack Start SaaS products reach a multi-tier or usage-based shape by month 6 that Gumroad does not support.
For creators in the sub-$1.1k MRR bracket with an audience on Gumroad, TanStack Ship ships a Gumroad adapter as an opt-in module. The adapter wraps the official embed and the Gumroad subscription API for cases where the marketplace exposure is worth the 10% fee.
The full module list is on the TanStack Ship pricing page; the Stripe wiring is documented in TanStack Ship's billing module and in src/server/billing/index.ts. For the broader MoR-vs-direct landscape (which complements this post), see the Paddle vs Stripe comparison and the Lemon Squeezy vs Stripe comparison.
FAQ
Is Gumroad cheaper than Stripe for a SaaS subscription?
No, above ~$1,100 MRR. Gumroad charges a 10% marketplace fee on top of payment processing (2.9% + $0.30), so effective cost is ~12.9% + $0.30 per transaction vs Stripe's 2.9% + $0.30. My three-app dataset put the crossover between $1,000 and $1,200 MRR — below that, the marketplace exposure can offset the fee; above it, direct Stripe wins on net revenue every time.
Does Gumroad really handle VAT/MOSS for me?
Yes. Gumroad bundles VAT/GST/sales-tax handling for most jurisdictions without requiring a legal entity. You can ship a paid product without an LLC or EIN. Stripe requires you to be the seller of record with Stripe Tax as a paid add-on.
Can I switch from Gumroad to direct Stripe later?
Yes, but not without a migration. Customer IDs, subscription primitives, and invoice formats all change. In my dataset, switching mid-life took about a weekend per app — same complexity as the Paddle and Lemon Squeezy migrations.
Why does TanStack Ship default to Stripe instead of Gumroad?
Two reasons. First, the per-transaction cost is meaningfully lower above the $1.1k MRR breakeven — the 10% marketplace fee is real money at scale. Second, Stripe Billing's subscription primitives (multi-tier, usage-based, trials with payment method required) match the shape most TanStack Start SaaS apps need by month 6, and Gumroad's single-tier model cannot grow into that shape.
What is the biggest hidden cost of Gumroad?
Data portability and customer ownership. Gumroad owns the customer relationship — your subscribers' emails, billing details, and purchase history live on Gumroad's servers, not yours. If you ever need to migrate, you export a CSV and rebuild your customer table from scratch. With Stripe, you own the customer records from day one and can re-platform (e.g., to Paddle, to in-house billing) without losing the underlying data.