Toggle Theme

Payment Stack for Solo Founders: Stripe, Paddle, Lemon Squeezy, or WeChat Pay?

Easton editorial illustration: one dominant circular payment-routing switch with four selectable rails, one downstream stacked entitlement ledger/database receiving the verified flow

"Paddle: provision access and handle subscription state with webhooks"

Disclaimer: This article does not provide tax, legal, company-registration, foreign-exchange, or entity-eligibility advice. For Merchant of Record arrangements, VAT/GST/sales tax, domestic or overseas entities, and payout routes, rely on provider terms and qualified professional advice.

Your pricing.ts defines starter_monthly, pro_yearly, lifetime_license, and wechat_one_time, but the database has only one is_paid field. A checkout.session.completed webhook arrives and the customer returns through success_url, yet entitlements is still empty. The problem is not the payment button. The payment system has failed to connect products, orders, subscriptions, and access rights.

A solo founder should answer five questions before choosing a provider: What are you selling? How is it billed? Who is buying it? Who owns the transaction and sales-tax responsibilities? Who grants access after payment? Stripe, Paddle, Lemon Squeezy, and WeChat Pay are not four equivalent buttons. They cover different layers and responsibilities.

Define the Sales Model Before Choosing a Payment Provider

One-time purchases revolve around orders and delivery. SaaS subscriptions require the full billing lifecycle. Usage-based billing also needs traceable usage data. Put the model into products, prices, and local tables before comparing providers.

Sales modelStarting points to evaluateKey asynchronous eventsCore local tables
One-time digital productStripe / Paddle / Lemon Squeezycheckout.session.completed / transaction.completed / order_createdorders + entitlements
SaaS subscriptionStripe Billing / Paddle Billing / Lemon Squeezycustomer.subscription.* / subscription.*subscriptions + entitlements + usage_events when metered
Hybrid subscription and one-time salesStripe Billing / Paddle BillingMultiple event typesorders + subscriptions + entitlements
Mainland China or WeChat ecosystemWeChat Pay (JSAPI/H5/Native)Payment callback and order-query resultorders + wechat_prepay

Keep three points in mind:

  • A one-time product primarily needs orders, fulfillment, refunds, and redelivery. It does not need the full subscription lifecycle.
  • A SaaS subscription needs a subscriptions table with current_period_start/end, cancel_at, and status. Metered billing also needs auditable usage_events.
  • WeChat Pay is a payment rail and merchant system, not a replacement for a global Merchant of Record or SaaS billing platform.

Stripe Billing, Paddle Billing, and WeChat Pay capabilities can change. Before implementation, recheck account region, product mode, payment-method eligibility, API version, and provider terms.

A Merchant of Record Does Not Remove Every Responsibility

A Merchant of Record, or MoR, is the seller of record for a transaction. Paddle and Lemon Squeezy both use the Merchant of Record model for eligible digital products and handle payments, sales tax, refunds, or disputes within the scope of those transactions. This reduces global sales-tax and billing operations, but it does not eliminate the creator’s or company’s income-tax, entity, product-compliance, data-protection, and accounting obligations.

With the Stripe route, the merchant normally remains the seller of record. Stripe Tax can help calculate sales tax, VAT, and GST and provide threshold-monitoring and registration-related tools, but it does not automatically make Stripe your Merchant of Record. Registration, filing, and entity responsibilities depend on the jurisdiction and transaction.

Do not choose an MoR from a fixed revenue threshold. Compare these dimensions instead:

DimensionSelf-managed payment and billing stackMerchant of Record
CustomizationCombine Checkout, Billing, Tax, invoicing, and internal workflowsFollow the platform’s product policy, checkout, contract, and settlement rules
Tax and billing operationsThe merchant confirms registration, filing, invoicing, refunds, and dispute processesThe MoR assumes sales-tax, payment, and selected compliance work for transactions in scope
Cost modelInclude tax tooling, engineering, finance, and support in addition to processing feesEvaluate settlement, refunds, add-on fees, and platform limits, not only the platform percentage
Best fitStrong customization, an existing operations function, or special contract flowsReduced global sales-tax and subscription-operations work for eligible products

The final contract and tax boundary depends on the entity, jurisdiction, product, and customer type. Marketing pages describe product positioning; they do not replace provider terms or professional advice.

Choosing Between Stripe, Paddle, Lemon Squeezy, and WeChat Pay

If you want subscriptions and WeChat Pay, split the problem first. Subscription lifecycle, global payments, and mainland-China payment coverage do not have to come from one provider. A payment method appearing on a platform does not mean it works for every account region, Checkout mode, or recurring flow.

ProviderResponsibility modelSubscriptions and one-time salesChina payment scenariosNative licensingGood starting point
StripePayment, Billing, and Tax tools; normally not the MoRCheckout and Billing with extensive customizationAlipay/WeChat Pay depend on account region, currency, and product modeNo general License Key productSaaS products that need control over payments, subscriptions, tax tooling, and internal flows
PaddleMerchant of RecordPaddle Billing and CheckoutCheck current Dashboard and documentation eligibility by account and regionApplication maintains entitlementsSoftware businesses that want less global sales-tax and subscription-operations work
Lemon SqueezyMerchant of RecordOne-time digital products, straightforward subscriptions, and metered billingOne-time checkout can show Alipay/WeChat Pay; subscription methods are more limitedLicense KeysDigital products, licenses, and early subscriptions
WeChat PayPayment rail and merchant systemJSAPI/H5/Native payment scenarios; billing lifecycle is self-managedMainland China and the WeChat ecosystemNoneRMB one-time purchases and WeChat-based checkout

The following points were confirmed in official documentation on July 18, 2026:

  • Stripe Checkout supports hosted pages, embedded pages, and composable components. Payment methods depend on region, currency, and Checkout mode.
  • Paddle webhooks use at-least-once delivery. Paddle retries when an endpoint does not return 200 within five seconds. Events can be duplicated or arrive out of order, so deduplicate with event_id and use occurred_at when reasoning about sequence.
  • Lemon Squeezy currently lists Cards, PayPal, Apple Pay, Google Pay, Alipay, WeChat Pay, Cash App Pay, and bank debits. Subscription products currently support only Cards, Apple Pay, Google Pay, and PayPal.
  • A WeChat Pay H5 flow requires server-side order creation, payment callbacks, and active order queries. A browser redirect alone is not authoritative.

Fees, payment methods, settlement schedules, supported countries, and product policies can all change. Open the provider’s current pricing and contract pages when building the final budget instead of copying an old percentage from an article.

Webhooks Are the Entitlement-Sync Boundary

Consider two common failures:

  1. checkout.session.completed arrives and success_url redirects, but entitlements is not updated, so a paying customer still cannot use the product.
  2. The same event reaches webhook_events twice, and the handler issues two licenses.

Both failures come from treating one HTTP request or a success page as final business truth. Payment events can be duplicated, delayed, or delivered out of order. Some states also require an order query or a later event for confirmation.

Webhook Endpoint Design Principles

PrincipleStripePaddleLemon SqueezyWeChat Pay
HTTPS endpointRequiredRequiredRequiredRequired
Signature verificationStripe-SignaturePaddle-SignatureX-SignatureWeChat Pay API v3 signature
Idempotency keyEvent ID or business-object IDevent_idEvent type + object ID or a custom unique keyout_trade_no and provider transaction ID
Response strategyVerify and persist the event, then respond quickly and process asynchronouslyReturn 200 within five secondsReturn success, then process asynchronouslyFollow the current API response contract
Recovery pathQuery payment or subscription stateQuery entities and reconcileQuery order or subscription stateQuery orders, reconcile statements, and support manual recovery

The operating rules are straightforward:

  • A webhook or payment callback is the entitlement-sync entry point. success_url should display “processing,” not grant access.
  • Verify the signature first, then store the raw event or required fields in webhook_events. Move complex business work to an asynchronous job.
  • Enforce idempotency with a unique constraint. Record event_id, source, occurred_at, processed_at, status, and payload_hash.
  • For out-of-order delivery, compare provider event time, object update time, or state version. Do not overwrite state based only on request arrival order.
  • Run reconciliation periodically, query order or subscription state, and keep a manual recovery path.

Orders, Subscriptions, Entitlements, and Events

TableCore fieldsStripe mappingPaddle mappingLemon Squeezy mapping
ordersprovider_order_id, customer_id, amount, currency, status, created_atCheckout Session / PaymentIntenttransactionorder
subscriptionsprovider_subscription_id, customer_id, status, current_period_end, cancel_atsubscriptionsubscriptionsubscription
entitlementsuser_id, product_id, feature_key, source, status, expires_atDerived from an order or subscriptionDerived from a transaction or subscriptionDerived from an order, subscription, or license
webhook_eventsprovider, event_id, occurred_at, processed_at, status, payload_hashIdempotency and auditIdempotency and orderingIdempotency and audit

Do not copy every object from one provider’s API into local tables. Define the stable fields needed for access checks, then store provider object IDs for queries and reconciliation.

Entitlement Synchronization Strategies

StrategyWhen to use itImplementation notes
Lean cacheMost subscription SaaS productsStore only the customer, subscription, status, price, and product fields needed for access checks. Keep them current with provider events.
State mirrorOffline billing views or complex operations dashboardsReplicate more subscription data, track update time, and reconcile to prevent local drift.
License keyOne-time digital products or desktop softwareSave the instance ID after activation and validate store, product, variant, and customer mappings. A license key is not a complete user system.

Paddle’s official provisioning documentation recommends a lean cache for most applications. Move to a state mirror only when richer local queries are necessary. Lemon Squeezy license keys also require application-side validation of product and customer data and a mapping from each instance to your account and device model.

Provider-Specific Implementation Notes

These notes define the first implementation boundary. They do not replace each provider’s complete integration documentation.

Stripe Implementation Notes

An early SaaS product can start with hosted Checkout and Customer Portal rather than maintaining a custom card form. Stripe Billing handles lifecycle capabilities such as subscriptions, invoices, usage-based billing, and revenue recovery. Stripe Tax is a tax calculation and workflow tool, not a Merchant of Record.

Products and prices must map to local entitlements: product_id represents a product or access package, while price_id represents monthly, annual, per-seat, or usage pricing. Do not leave only is_paid on the users table.

For an implementation example, see the Next.js cart and Stripe payment tutorial, which covers Checkout Sessions, a webhook endpoint, and order handling.

Paddle Implementation Notes

First confirm that a tutorial targets Paddle Billing rather than Paddle Classic. Their APIs, webhooks, Paddle.js versions, and Product/Price models differ.

Paddle Checkout presents the checkout, but your application still owns provisioning. Most applications only need the customer, subscription, status, price, product, and scheduled-change fields involved in access decisions. Build a state mirror only when the operations interface truly needs complete billing data.

Whichever cache model you choose, update it through webhooks and run reconciliation. Using a Merchant of Record does not make the application automatically know who can access each feature.

Lemon Squeezy Implementation Notes

Lemon Squeezy is a practical starting point for early digital products, licenses, and relatively simple subscriptions. It provides a Merchant of Record, checkout, subscriptions, usage-based billing, webhooks, and License Keys. Confirm actual fees and support against the current store plan and documentation.

After activating a license key, save the instance ID and validate store_id, product_id, variant_id, and the customer. A key for another product or a resold key must not map directly to a Pro entitlement.

If the requirement is a WeChat Pay subscription, verify subscription payment methods separately. The current documentation lists WeChat Pay and Alipay as available payment methods, but subscription products support only Cards, Apple Pay, Google Pay, and PayPal.

WeChat Pay Boundaries

WeChat Pay works well for mainland-China and WeChat checkout, but it is not a global Merchant of Record and does not provide a complete SaaS billing lifecycle. The merchant still needs order state, callback signature verification, order queries, refunds, reconciliation, invoicing, and entitlement synchronization.

H5, JSAPI, Mini Program, and Native are payment scenarios, not separate subscription systems. In an H5 flow, the backend creates an order and passes h5_url to the frontend. When the browser returns, the backend still queries the order and applies the payment callback to the order identified by out_trade_no.

Confirm product permissions, merchant entity, domains, fees, and API parameters against the current WeChat Pay merchant documentation.

Next Step: Turn the Payment Button into a Testable State Machine

After choosing providers, break the integration into testable engineering tasks:

  1. Create orders, subscriptions, entitlements, and webhook_events. Add usage_events for metered billing.
  2. Implement signature verification, idempotency, out-of-order handling, fast acknowledgment, and failure recovery for every webhook or payment callback.
  3. Make the success page query local order state instead of setting is_paid=true.
  4. Add tests for provider queries, reconciliation, refunds, failed renewals, and manual recovery.
  5. In the sandbox, resend events and deliver state updates out of order. Verify that access is neither granted twice nor rolled back incorrectly.

For backend deployment and database choices, continue with the Supabase Edge Functions guide and the backend and database articles in this series. Completion is not a successful payment-page redirect. It is the point where orders, subscriptions, and entitlements converge on the correct state despite duplicates, delays, out-of-order delivery, and refunds.

Choose and Implement a Solo Founder Payment Stack

Start with the sales model, responsibility boundary, and target market, then choose providers and build an auditable entitlement-sync path.

⏱️ Estimated time: 45 min

  1. 1

    Step 1: Define the sales model

    Specify whether the product uses a one-time purchase, SaaS subscription, usage-based billing, or a hybrid model. Document refunds, renewals, upgrades, downgrades, and access end dates.
  2. 2

    Step 2: Assign tax and operational responsibilities

    Decide whether to combine payment, billing, and tax tools yourself or use a Merchant of Record. Confirm entity and tax responsibilities against provider terms and professional advice.
  3. 3

    Step 3: Choose payment rails for each market

    Evaluate Stripe, Paddle, and Lemon Squeezy for global card payments and subscriptions. Evaluate WeChat Pay for one-time purchases in mainland China or the WeChat ecosystem, checking account region, product category, and payment-method eligibility.
  4. 4

    Step 4: Build the local state model

    Create orders, subscriptions, entitlements, and webhook_events. Use unique provider event or order IDs for idempotency and auditing.
  5. 5

    Step 5: Test asynchronous entitlement updates

    Test signature verification, duplicate events, out-of-order delivery, timeouts, refunds, failed renewals, and manual recovery. The success page should display processing status, not grant access.

FAQ

What is the main difference between Stripe, Paddle, and Lemon Squeezy?
Stripe provides payment, Billing, and Tax tools while the merchant generally retains the related sales, tax, and operational responsibilities. Paddle and Lemon Squeezy act as Merchants of Record for transactions in scope, taking on payments, sales tax, and some compliance work. Your application still owns entitlement synchronization.
Should a solo founder start with a Merchant of Record or Stripe?
Do not decide from a single revenue threshold. Compare target markets, product eligibility, your ability to operate tax and billing workflows, settlement and refund requirements, customization needs, and total cost. Get professional advice for entity and tax questions.
Will Paddle or Lemon Squeezy automatically enable SaaS access?
No. The provider can handle payment, billing, or Merchant of Record duties, but your application must consume webhooks, map orders or subscriptions to local entitlements, and reconcile missed events.
If Lemon Squeezy supports WeChat Pay, can it run WeChat Pay subscriptions?
That conclusion does not follow. Lemon Squeezy currently lists WeChat Pay and Alipay, but its subscription products currently support only cards, Apple Pay, Google Pay, and PayPal. Recheck the latest payment-method documentation before launch.
Can WeChat Pay replace Stripe for global SaaS billing?
Not directly. WeChat Pay is a payment rail and merchant system for mainland China and WeChat scenarios. Global subscriptions, sales tax, billing lifecycle operations, and multi-currency support still need a separate design.
How should an application handle duplicate, out-of-order, or missing webhooks?
Verify the signature, store the original event, and enforce a unique event or provider order ID. Use event time or provider state versions for ordering, respond quickly, process asynchronously, and repair gaps through queries, reconciliation, and manual recovery.
What tables does a minimum payment system need?
At minimum, use orders, entitlements, and webhook_events. Add subscriptions for recurring products and traceable usage_events for usage-based billing.

11 min read · Published on: Oct 21, 2026

Comments

Sign in with GitHub to leave a comment

Easton BlogEaston Blog