LabHub

Blog

Payment Infrastructure for Solo Developers and Micro-SaaS in 2026 — Stripe, Lemon Squeezy, Polar, Paddle, Creem Deep Dive

한국어English日本語

Prologue — Payments Are Accounting, Not Code

The most underestimated piece of work for a solo developer building a SaaS is payments. The code part is easy. One line of Stripe Checkout, fifty lines of webhook handler, done. The real problem is the queue of things that follow: VAT, sales tax, invoices, refunds, dunning, chargebacks, tax filings, revenue recognition. All of it adds up to the single word "payments."

The good news in 2026 is that you do not have to build all of this yourself. A category of services called Merchant of Record (MoR) — Lemon Squeezy, Polar, Paddle, Creem, Gumroad — takes on VAT filings, sales tax, and full legal seller responsibility, in exchange for 4 to 6 percent of the transaction. Payment Service Providers (PSPs) like Stripe, Adyen, Braintree, by contrast, are only responsible for processing the card. VAT filings, entity registrations, refund policy — those are on you.

This post is about that choice. When is it sane to build on Stripe directly, and when is it sane to pay an MoR an extra 5 percent. We also walk through where each platform actually stands in May 2026 — pricing, limits, who acquired whom. We end with a decision matrix by MRR stage.


1. Stripe vs MoR — The Responsibility Line

1.1 What a Merchant of Record Actually Is

Legally, a "Merchant of Record" is the legal seller of the goods or service to your customer. It is the name printed at the top of the receipt or invoice. With an MoR, your customer sees something like LEMON SQUEEZY* or PADDLE.NET* on their card statement. Not your company name.

What does being the legal seller carry? It carries:

Doing this yourself is real work. In the US alone, post the 2018 South Dakota v. Wayfair ruling, every state sets its own economic-nexus thresholds based on revenue or transaction count. The EU has OSS (One Stop Shop) and IOSS, but you still register and file quarterly.

1.2 Stripe Is a PSP — Not an MoR

Stripe is, at its core, payment-processing infrastructure. Accepting cards and settling the funds is the day job. Layered on top, Stripe sells:

The point: Stripe is powerful but does not file VAT for you. Stripe Tax computes rates and exports period reports, but the act of filing "this is our quarterly revenue" with each tax authority is on you or your accountant or a partner like TaxJar or Avalara. Stripe Tax is guidance plus data extraction, not filing-as-a-service.

1.3 MoR vs DIY — The Split

AreaStripe (DIY)MoR (Lemon Squeezy, Polar, Paddle)
Card processing fee2.9% + $0.30 (US)Included
Tax calculationStripe Tax (extra)Included
Tax filing and remittanceYour responsibilityMoR handles it
B2B invoicing (EU)Stripe InvoicingIncluded
Refund and chargeback handlingYou respondMoR responds
Entity registration per countryRegister where requiredMoR is the seller
Name on customer statementYour companyMoR's name
Fraud and KYCStripe Radar (extra)Included
Currencies and local payment methodsConfigure yourselfIncluded
Total fee (typical)About 2.9 to 3.5%About 5 to 6%

The rule is simple. The extra 2 to 3 percent you pay an MoR is insurance against having to file tax in every jurisdiction. Whether the insurance is worth it depends on how many countries you sell to and at what revenue.


2. Stripe — The Giant Is Still the Giant

2.1 Where Stripe Stands in 2026

In May 2026 Stripe is still the de facto global PSP standard. It processed around $1.4T in 2024 payment volume, supports 50 plus currencies, and offers acquiring in 40 plus countries. The reason Stripe is attractive to a solo developer is straightforward. The developer experience is unmatched.

// Stripe Checkout — the minimum viable subscription flow
import Stripe from 'stripe'
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY)

const session = await stripe.checkout.sessions.create({
  mode: 'subscription',
  line_items: [{ price: 'price_1ABC', quantity: 1 }],
  success_url: 'https://example.com/success?session_id={CHECKOUT_SESSION_ID}',
  cancel_url: 'https://example.com/cancel',
  automatic_tax: { enabled: true }, // Stripe Tax on
})

return { url: session.url }

That is the whole thing. Hosted checkout, payment methods, PCI-DSS card vaulting, 3DS and SCA, receipt emails, Apple Pay and Google Pay, all included.

2.2 Stripe Tax — What It Actually Does

As of 2026, Stripe Tax delivers:

What Stripe Tax does not do:

Pricing: Stripe Tax adds 0.5 percent of taxed transactions, or $0.50 per transaction depending on the contract.

2.3 Stripe Workflows — The Big Change in Late 2025

Stripe Workflows reached GA around October 2025. It is a no-code automation builder for things that used to require Zapier, Make, or a custom queue worker — Slack alerts on failed payments, 7-day renewal reminders, draft replies to incoming disputes — now drawn inside Stripe.

# Stripe Workflows — retry then downgrade after a failed payment
trigger: invoice.payment_failed
actions:
  - wait: 24h
  - retry_payment
  - branch:
      if: invoice.attempt_count >= 4
      then:
        - send_email: dunning_final
        - update_subscription: { status: past_due }
      else:
        - send_email: dunning_reminder

This materially simplifies the dunning problem. It used to require third-party Smart Retries (Recover, Baremetrics) or hand-rolled cron logic.

2.4 Stripe Connect — For Marketplaces

Connect is what a solo developer reaches for when building a marketplace, like instructors selling courses on your platform with you taking a fee. There are Standard, Express, and Custom account models, with the split-payout application_fee_amount as the key knob.

Connect adds fees. Standard is $2 per active account per month (US), and Express and Custom are higher. For a plain SaaS, skip Connect.

2.5 Stripe + Lemon Squeezy — After the 2024 Acquisition

In July 2024 Stripe acquired Lemon Squeezy. Lemon Squeezy continues to operate as a distinct brand. The key facts:

Bottom line: the acquisition did not change how Lemon Squeezy works for customers. If you use Lemon Squeezy, keep using it.


3. Lemon Squeezy — The MoR Standard for Digital Products

3.1 Positioning

Lemon Squeezy launched in 2021 and was acquired by Stripe in 2024. Its target is digital-product SaaS and indie hackers. Payments, subscriptions, tax, invoices, discount codes, and license-key issuance all fit on one screen.

Pricing (as of May 2026):

// Lemon Squeezy — create a checkout link
import { lemonSqueezySetup, createCheckout } from '@lemonsqueezy/lemonsqueezy.js'

lemonSqueezySetup({ apiKey: process.env.LS_API_KEY })

const { data } = await createCheckout('storeId', 'variantId', {
  productOptions: { redirectUrl: 'https://example.com/welcome' },
  checkoutOptions: { embed: true },
  checkoutData: { email: 'user@example.com' },
})

return data.attributes.url

3.2 Strengths

3.3 Weaknesses

3.4 When to Use It


4. Polar.sh — The New Open-Source-Friendly MoR

4.1 Positioning

Polar launched in 2023 and went through Y Combinator W24. Through 2024 and 2025 it grew quickly and positioned itself as the "Lemon Squeezy alternative." Open-source friendliness is the core differentiator: the SDK, docs, and parts of the infrastructure are public on GitHub, and pricing is more aggressive.

Pricing (as of May 2026):

// Polar — create a checkout session
import { Polar } from '@polar-sh/sdk'

const polar = new Polar({ accessToken: process.env.POLAR_ACCESS_TOKEN })

const checkout = await polar.checkouts.create({
  productPriceId: 'price_xyz',
  successUrl: 'https://example.com/success?checkout_id={CHECKOUT_ID}',
  customerEmail: 'user@example.com',
})

return checkout.url

4.2 Strengths

4.3 Weaknesses

4.4 When to Use It


5. Paddle — The OG Merchant of Record

5.1 Positioning

Paddle is a UK company founded in 2012, the original SaaS-specific MoR. It acquired ProfitWell in 2022, and between 2024 and 2025 built up a roster of large SaaS customers (SyncFusion, Beamer, Krisp, etc.), making it solid in enterprise territory.

Pricing (as of May 2026):

// Paddle Billing — open a checkout with the v2 SDK
import { initializePaddle } from '@paddle/paddle-js'

const paddle = await initializePaddle({
  environment: 'production',
  token: process.env.PADDLE_CLIENT_TOKEN,
})

paddle.Checkout.open({
  items: [{ priceId: 'pri_xxx', quantity: 1 }],
  customer: { email: 'user@example.com' },
  successUrl: 'https://example.com/welcome',
})

5.2 Strengths

5.3 Weaknesses

5.4 When to Use It


6. Creem — The European-Flavored Newer MoR

6.1 Positioning

Creem is a newer European MoR that launched in 2023, around the same time as Polar, also targeting indie hackers and solo SaaS. Pricing is in Lemon Squeezy territory, but the differentiators are UI simplicity and a faster payout cycle.

Pricing (as of May 2026):

6.2 Strengths

6.3 Weaknesses

6.4 When to Use It


7. Gumroad — Creators and Digital Downloads

7.1 Positioning

Gumroad is the oldest creator-focused payments platform, founded in 2011. It is focused on selling things — eBooks, courses, design assets, music, digital downloads. SaaS subscriptions are technically supported but not the strong suit.

Pricing (as of May 2026):

7.2 Strengths

7.3 Weaknesses

7.4 When to Use It


8. Mobile IAP — The 30 Percent Reality

8.1 The App Store Mandate

If you ship a mobile app and sell digital goods or subscriptions through it, Apple App Store and Google Play require you to use their in-app purchase systems. Bypass and your app is rejected or removed.

Fees (as of May 2026):

8.2 External Payments — What Changed in 2024 and 2025

US, EU, Korea, and Japan saw regulatory and judicial outcomes that partially allow external-payment links. State of play in May 2026:

Reality 1: Routing through external payments does not flip 30 percent to zero. Apple and Google still take a commission. The savings are usually only 5 to 10 percent.

Reality 2: External-payment UX is bad. "Pay in app" becomes "app to browser to payment to app return." Conversion drops.

Reality 3: For a web-first business, Stripe or MoR. For mobile-first, take the IAP hit and price for it.

8.3 RevenueCat — The IAP De Facto Standard

Do not handle iOS and Android IAP directly. Use RevenueCat. It exposes both stores' events through a unified API and provides analytics, cohorts, and experiments on top.

// iOS — buying a subscription through RevenueCat
import RevenueCat

Purchases.shared.purchase(package: package) { transaction, customerInfo, error, userCancelled in
  if customerInfo?.entitlements["pro"]?.isActive == true {
    // entitlement active
  }
}

Pricing: free up to $2.5k per month in tracked revenue, then 1 percent of revenue.


9. Fee Math — The Real Delta at $5k MRR

9.1 Assumptions

9.2 Cost Matrix at $5k MRR

ItemStripe DIYLemon SqueezyPolarPaddle
Processing fee$5,000 × 2.9% + 167 × $0.30 = $195$5,000 × 5% + 167 × $0.50 = $334$5,000 × 4% + 167 × $0.40 = $267$5,000 × 5% + 167 × $0.50 = $334
Stripe Tax (0.5%)$25IncludedIncludedIncluded
Accountant (monthly equivalent)About $167NoneNoneNone
Invoicing and B2B toolingAbout $30IncludedIncludedIncluded
Monthly totalAbout $417$334$267$334
% of revenue8.3%6.7%5.3%6.7%

Surprise conclusion: at the $5k MRR band, MoR can actually be cheaper than DIY. Once you add up the time and cost of accountants, registrations, and operations, the 5 percent fee turns from insurance into a discount.

9.3 At $50k MRR

ItemStripe DIYLemon SqueezyPolarPaddle
Processing feeAbout $1,950About $3,335About $2,667About $3,335
Stripe Tax$250IncludedIncludedIncluded
Tax ops (fraction of headcount)About $1,500000
Monthly totalAbout $3,700$3,335$2,667$3,335
% of revenue7.4%6.7%5.3%6.7%

Even at $50k MRR, Polar and Lemon Squeezy still come out similar or slightly cheaper. The genuine break-even is usually somewhere around $200k to $500k MRR. Past that point, dedicated tax and legal headcount is cheaper than the 5 percent MoR fee.

9.4 Break-Even — Single-Line Summary


10. Webhooks and Dunning — A Payment System That Does Not Break

10.1 Webhooks Must Be Idempotent

In a payments system, webhooks never arrive exactly once. Stripe, Polar, and Paddle all guarantee:

Solution: bake idempotency into the handler.

// Next.js Route Handler — idempotent Stripe webhook
import { headers } from 'next/headers'
import Stripe from 'stripe'
import { db } from '@/lib/db'

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!)

export async function POST(req: Request) {
  const body = await req.text()
  const sig = (await headers()).get('stripe-signature')!

  let event: Stripe.Event
  try {
    event = stripe.webhooks.constructEvent(body, sig, process.env.STRIPE_WEBHOOK_SECRET!)
  } catch {
    return new Response('Bad signature', { status: 400 })
  }

  // Idempotency: INSERT event.id as PK, skip on conflict
  const inserted = await db.webhookEvent.create({
    data: { id: event.id, type: event.type, payload: body },
  }).catch(() => null)

  if (!inserted) return new Response('Already processed', { status: 200 })

  switch (event.type) {
    case 'checkout.session.completed':
      await activateSubscription(event.data.object)
      break
    case 'invoice.payment_failed':
      await enterDunning(event.data.object)
      break
    // ...
  }

  return new Response('ok', { status: 200 })
}

Core idea: store event.id as a primary key, return 200 immediately on conflict. Business logic runs exactly once.

10.2 Dunning — The Art of Recovering Failed Payments

About 5 to 10 percent of SaaS revenue fails every cycle to expired cards, exceeded limits, and bank declines. Recovering this revenue is the dunning loop. Raise recovery by 30 percent and you immediately grow revenue by 2 to 3 percent.

A standard scenario:

  1. Payment fails (invoice.payment_failed) — retry once immediately.
  2. After 24 hours, check the Card Updater service for a refreshed card (Stripe Card Updater or MoR auto-update).
  3. Retry on days 3, 5, and 7, spaced across times of day.
  4. Day 7: email the user with an update-payment link.
  5. Day 14: downgrade or pause.
  6. Day 30: terminate the subscription.

You can build this yourself, or hand it to Stripe Smart Retries, Stripe Workflows, or Retain by Paddle. For a solo dev, hosted always wins.

10.3 Chargebacks and Disputes

A chargeback is the cardholder telling their card network that the charge is fraudulent. The network gives you (or the MoR) a window of 7 to 14 days to respond.

Cost of one chargeback: refund of the transaction plus a fee ($15 on Stripe; MoRs like Paddle typically absorb it). Chargeback ratio above 1 percent and the card network can suspend you.

Mitigation:


11. Korean Payments — One Line of Card Code Is Not Enough

11.1 Why Korea Is Different

Korean payments run on rails that are largely separate from the global stack:

11.2 Options for Korea

PortOne (formerly Iamport, by NHN KCP)

// PortOne v2 — request a payment
import PortOne from '@portone/browser-sdk/v2'

const response = await PortOne.requestPayment({
  storeId: 'store-xxx',
  channelKey: 'channel-kakaopay',
  paymentId: `order-${Date.now()}`,
  orderName: 'Pro Monthly Plan',
  totalAmount: 11000,
  currency: 'KRW',
  payMethod: 'EASY_PAY',
  easyPay: { easyPayProvider: 'EASY_PAY_PROVIDER_KAKAOPAY' },
})

if (response.code != null) {
  // payment failed
}

TossPayments

Direct KakaoPay/NaverPay Integrations

11.3 Stripe in Korea

Stripe expanded its acquiring license in Korea in 2024, and Korean entities (sole proprietors and corporations) can now create proper Stripe accounts. That said, Korean card-payment flows are more natural through PortOne or TossPayments. Stripe shines for global cards and USD/EUR revenue; PortOne/Toss shines for Korean cards plus simple-pay. Running both in parallel is common.

11.4 Realistic Setup for a Korean SaaS

A simple regional branch in code keeps operations clean.

// Branch the checkout by user region
async function getCheckoutUrl(user: User, plan: Plan) {
  if (user.country === 'KR') {
    return await createPortOneCheckout(user, plan)
  }
  return await createStripeCheckout(user, plan)
}

12. Subscriptions vs One-Time vs Usage-Based

12.1 Fitting the Model to the Product

ModelFitsBest Platforms
One-timeDesktop app licenses, eBooks, coursesLemon Squeezy, Gumroad, Polar
SubscriptionSaaS, content, membershipsStripe, Polar, Paddle, Lemon Squeezy
Usage-basedLLM APIs, cloud infra, messagingStripe Billing (meters), Polar
Hybrid (seats plus usage)Collaboration SaaS, data analyticsStripe Billing, Paddle
Annual plus commitEnterprise B2BPaddle, Stripe Invoicing

12.2 The Traps of Usage-Based Billing

Usage-based pricing for things like LLM APIs is seductive: "tokens consumed times unit price in real time." Traps:

Stripe Billing meters and Polar usage events expose similar APIs. The hard part is splitting event ingestion plus aggregation plus billing across three reliable layers.

12.3 The Safety Net for Price Changes

When you change pricing, do existing subscribers keep the old price, move to the new price on renewal, or prorate immediately?

Stripe, Polar, and Paddle all let you version pricing. Skip versioning and overwrite, and you regret it later.


13. Failure Modes and Anti-Patterns

The recurring failures:


14. The Decision Tree

Question 1: What is your revenue stage?
  ├─ Under $5k MRR
  │   └─ Start on an MoR (Lemon Squeezy or Polar)
  ├─ $5k to $200k MRR
  │   ├─ Korean-heavy → PortOne/Toss plus Stripe (global)
  │   ├─ EU/NA-heavy → Polar (price) or Lemon Squeezy (stability)
  │   ├─ Serious B2B (NET-30, multi-year) → Paddle
  │   └─ Open source patron model → Polar plus GitHub Sponsors
  └─ Over $200k MRR
      ├─ Dedicated tax headcount → Stripe DIY plus Stripe Tax
      └─ No dedicated headcount → Stay on Paddle (enterprise)

Question 2: Mobile app?
  ├─ Web first → see above
  └─ Mobile first → RevenueCat plus IAP. External-payment workarounds carefully.

Question 3: Pricing model?
  ├─ One-time → Lemon Squeezy/Gumroad
  ├─ Subscription → Stripe/Polar/Paddle
  └─ Usage-based → Stripe Billing meters or Polar usage events

Epilogue — Pick Once, Live with It for Six Months

Migrating your payment stack hurts. You collect cards again. You move expired subscriptions. Your invoice numbering breaks. So pick well the first time and do not touch it for a year.

The good news is that payment infrastructure in 2026 has never been better. Polar entered at 4% + $0.40. Stripe Workflows lets you draw dunning logic without code. Stripe acquired Lemon Squeezy yet kept it running so indie hackers were not abandoned. In Korea, PortOne v2 is the standard aggregator. Mobile IAP at 30 percent still hurts, but the EU DMA and US rulings opened external-payment lanes.

A 30-Day Checklist for a Solo Developer

Anti-Patterns (Recap)

Coming Up Next

In the next post we walk through operational automation as MRR grows — drawing dunning with Stripe Workflows, piping payment events into Slack, and syncing invoices into QuickBooks and Xero. Payments you set once and leave for six months; ops automation you touch every week.


References

Comments

No comments yet.

Sign in to leave a comment