ThriveCart
A weekend of work, and real gaps remain.
A checkout and cart for digital products with upsells, order bumps and affiliate handling attached, sold as a one-off licence rather than a subscription.
Build the checkout I actually need instead of ThriveCart — and note first that it is bought once rather than subscribed, so the money argument here is thin. The reason to build is control: a checkout on your own domain, with the price computed by your own server, and no third party in the payment path. STACK - Node 20+ with Fastify, server-rendered HTML - SQLite through better-sqlite3, WAL mode - One payment provider, hosted fields or hosted checkout, so no card data touches this - Caddy in front THE RULE THAT MATTERS MOST - **The price comes from the server, never from the page.** A product identifier goes up, a price comes back. Anything else means somebody edits the markup and buys the thing for one euro, and it is the most common flaw in cart implementations - The same applies to quantity, shipping, discounts and tax. The browser displays; the server decides - The total is recomputed immediately before the payment session is created, from identifiers and quantities alone THE DATA MODEL - products: id, sku, name, price_cents, currency, tax_category, delivery_kind, is_active - offers: id, product_id, kind, config_json — an order bump, an upsell, a downsell - carts: id, token, items_json, subtotal_cents, currency, created_at, abandoned_at, converted_at - orders: id, number, cart_id, email, name, subtotal_cents, tax_cents, discount_cents, total_cents, currency, status, provider_ref, placed_at, refunded_at - order_items: id, order_id, product_id, sku, name, unit_price_cents, quantity, tax_rate, tax_cents — copied at the time of order, so a later price change never rewrites history - upsell_events: id, order_id, offer_id, shown_at, accepted_at, declined_at - affiliates, referrals, commissions — if you need them, and the shape is under Rewardful elsewhere in this catalogue - provider_events, for idempotency by event id UPSELLS AFTER PAYMENT, WHICH IS THE FEATURE - A one-click upsell charges the card again without asking for it, which requires the processor to have kept the payment method and to allow a subsequent charge. Check that your provider supports it and under what terms before designing the flow - Every accepted upsell is its own order line with its own charge, recorded separately. Bundling it into the original order makes a refund impossible to reason about - **A declined upsell must not block delivery of what was already bought.** Deliver the first purchase immediately, on payment, and treat the upsell as a separate transaction - Show the upsell once. A funnel that asks three times is the pattern people complain about publicly, and it costs more in refunds than it earns CHECKOUT - Three fields and a payment method. Every additional field costs conversions, measurably - The order created from the verified webhook, never from the browser returning to a success page — somebody who closes the tab after paying must still have an order - Idempotency by event id, and out-of-order delivery handled - Tax on digital goods is usually the buyer's rate. Collect the country, apply the rate, and store two pieces of non-conflicting evidence of where they were AFTER THE ORDER - Delivery through signed expiring links with a use limit, where a resumed download counts as one use rather than five - A receipt that arrives, from your own domain with SPF, DKIM and DMARC configured - An order-status page at a token URL, no account - Refunds through the provider, with access revoked from the webhook WHAT MATTERS MOST Server-side pricing and webhook-created orders. Try to buy something at a price you edited in the browser, and close the tab immediately after paying — if either produces the wrong outcome, nothing else in the checkout matters.
What you lose
- A checkout tested against a great deal of real traffic, which is what the conversion claim rests on
- One-click upsells after payment, which need the processor to charge again without asking for a card
- An affiliate system with attribution and payouts already built
- A one-off price, which is unusual enough that the money argument is weak
If you would rather not build
- A hosted checkout from the payment provider, which is free and handles the hard parts
- Lemon Squeezy or Paddle, if what you actually want is somebody else carrying the tax
The escape hatch
open source · no votes, no paid placement
Medusa
$0A modular open-source commerce engine with a checkout you control.
medusajs/medusafree · open source
Vendure
$0A headless commerce framework with a plugin system.
vendure-ecommerce/vendurefree · open source
Why this verdict
our own opinion · changed only by a person
47/100
Verdict kinda at 47: the checkout is a fortnight, but the product is a one-off licence rather than a subscription, which makes the saving small, and one-click upsells depend on what the payment provider allows rather than on your code.
History
tracked since 14 Aug 2026 · nothing is ever overwritten
Questions about ThriveCart
answered from the record above
Is ThriveCart free?
No — the plan we track is $41.58 a month. Bought once at around $495 for a lifetime licence rather than subscribed; the figure shown spreads that over a year.
Can you replace ThriveCart by building your own?
ALMOST. A weekend of work, and real gaps remain. Replacement score 47 out of 100, build time a weekend. Read what you lose before you decide.
How much does ThriveCart cost?
$41.58 a month on Standard — $498.96 a year. Recorded 14 Aug 2026.
What do you lose by replacing ThriveCart?
A checkout tested against a great deal of real traffic, which is what the conversion claim rests on; One-click upsells after payment, which need the processor to charge again without asking for a card; An affiliate system with attribution and payouts already built; A one-off price, which is unusual enough that the money argument is weak. If any of those carry weight for you, keep paying.
Is there an open-source alternative to ThriveCart?
Yes: Medusa, Vendure. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

