✍️ 필사 모드: Payment Infrastructure for Solo Developers and Micro-SaaS in 2026 — Stripe, Lemon Squeezy, Polar, Paddle, Creem Deep Dive
EnglishPrologue — 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:
- VAT and sales-tax filing obligations. Sell in Germany, file 19 percent MwSt. Sell in California, file 7.25 percent plus local. Sell in the UK, file 20 percent VAT. Every quarter, to every jurisdiction.
- Legal responsibility for refund policy. EU consumer law's 14-day right of withdrawal, Japan's Specified Commercial Transactions Act, and similar regimes.
- Chargeback and dispute handling. When a card network dispute arrives, the MoR gathers evidence and responds.
- Trade sanctions and KYC. Blocking sanctioned countries like Russia, Iran, North Korea is on the MoR.
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:
- Stripe Tax — rate calculation and registration guidance for some US states. Filing and remittance are still your responsibility. It calculates.
- Stripe Billing — subscriptions, invoices, webhooks.
- Stripe Invoicing — B2B invoicing.
- Stripe Connect — split payouts for marketplaces.
- Stripe Workflows (GA in late 2025) — no-code automation triggered by payment events. A GUI rule engine for "if payment failed, retry in 3 days, then downgrade in 7."
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
| Area | Stripe (DIY) | MoR (Lemon Squeezy, Polar, Paddle) |
|---|---|---|
| Card processing fee | 2.9% + $0.30 (US) | Included |
| Tax calculation | Stripe Tax (extra) | Included |
| Tax filing and remittance | Your responsibility | MoR handles it |
| B2B invoicing (EU) | Stripe Invoicing | Included |
| Refund and chargeback handling | You respond | MoR responds |
| Entity registration per country | Register where required | MoR is the seller |
| Name on customer statement | Your company | MoR's name |
| Fraud and KYC | Stripe Radar (extra) | Included |
| Currencies and local payment methods | Configure yourself | Included |
| 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:
- Automatic rate calculation for 50 plus countries and all US states.
- Threshold-crossing alerts for US economic nexus (per-state thresholds such as
$100krevenue or 200 transactions) and EU OSS (revenue past EUR 10,000 in another EU member state). - Registration guidance via partner network (TaxJar, Avalara).
- Period reports as CSV ready to feed into a filing.
What Stripe Tax does not do:
- It does not register your entity with foreign tax authorities. You register yourself.
- It does not file or remit. You or your accountant file using the CSV.
- It does not handle tax refunds, like input VAT credits.
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:
- Lemon Squeezy still operates as a Merchant of Record (Stripe processes the PSP layer underneath).
- Pricing of the two products remains separate.
- From 2025, Stripe began integrating MoR capabilities into its own stack (Stripe Tax plus Stripe Billing plus partial MoR features). As of May 2026 a unified "Stripe MoR" product is still in a pilot stage.
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):
- Fee: 5% +
$0.50per transaction (card or PayPal). - No additional fees. Tax filing, VAT, and invoicing are all included.
- Payouts: automatic on the 1st and 15th of each month.
// 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
- Taxes are genuinely fully handled. EU VAT, UK VAT, Japan consumption tax, Australia GST, US sales tax — all filed under Lemon Squeezy's name. You receive a revenue report.
- License keys are built in, which is a perfect fit for one-time license models for desktop apps and note apps.
- App variants, discounts, and affiliates are all on one screen — the indie hacker bundle.
- Operational maturity has improved since the Stripe acquisition. Payouts and KYC are faster.
3.3 Weaknesses
- Serious B2B is underbuilt. Purchase orders, net-30 billing, multi-year contracts — not strong.
- No marketplace mode. No split payouts.
- The 5% +
$0.50becomes meaningful on high-ticket transactions. A$10,000transaction pays$500in fees.
3.4 When to Use It
- Digital downloads (fonts, themes, courses, plugins).
- Small SaaS, subscriptions in the
$10to$99per month range. - Global revenue, especially heavy EU, when you want zero involvement in VAT filing.
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):
- Fee: 4% +
$0.40per transaction. Slightly cheaper than Lemon Squeezy's 5% +$0.50. - No additional fees (fully MoR).
- Payouts: monthly automatic or balance-triggered.
// 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
- Open-source and developer friendly. First-class GitHub Sponsors integration that auto-grants licenses to sponsors.
- Usage-based billing as a first-class primitive. A natural fit for LLM API wrappers and other metered products.
- Customer Portal, license keys, and file downloads are all included — the indie-SaaS essentials.
- Lower fee: 4% +
$0.40.
4.3 Weaknesses
- Younger platform. Shorter operating history than Lemon Squeezy or Paddle, so long-tail currency and payment-method coverage is narrower.
- B2B invoicing is still simple.
- In some countries the payout cycle can be longer.
4.4 When to Use It
- Commercializing an open-source project (Pro tier, hosted edition).
- LLM API wrappers and other usage-based pricing.
- Small indie SaaS where the 1 or 2 percent fee delta matters.
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):
- Fee: 5% +
$0.50per transaction, with a higher flat rate for very small transactions. Volume discounts negotiable. - Add-ons: ProfitMetrics, Retain, invoicing are separately negotiated.
- Payouts: bi-weekly or monthly.
// 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
- Deep enterprise SaaS features. Multi-year contracts, net-30 invoicing, accounting integrations (NetSuite, QuickBooks).
- Retain by Paddle — dunning-recovery service that is widely considered the best in the SaaS industry.
- 100 percent MoR on tax and invoicing. 200 plus countries and territories.
- Very broad local payment methods — UPI (India), iDEAL (Netherlands), Giropay (Germany), Konbini (Japanese convenience-store payments), etc.
5.3 Weaknesses
- Onboarding is strict. Brand-new SaaS sometimes gets rejected or asked for extra documents during sign-up.
- B2C and digital downloads are not the sweet spot. Lemon Squeezy or Gumroad fits better there.
- Pricing usually requires negotiation. The headline rate looks expensive; the real economics kick in past
$100kper year in revenue.
5.4 When to Use It
- B2B SaaS with average
$50to$500per month subscriptions. - Global revenue past 30 percent and dunning recovery starts to matter.
- Accounting integration and net-30 invoicing required.
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):
- Fee: about 5% +
$0.50(exact rates vary by currency and payment method). - Payouts: weekly available for some currencies.
- Full MoR package — VAT, invoicing, refunds all included.
6.2 Strengths
- EU-business friendly. Deep EU VAT handling, SEPA Direct Debit, iDEAL — strong European payment-method support.
- Simple UI. From sign-up to first checkout in under 30 minutes.
- Faster payouts (weekly option).
6.3 Weaknesses
- Newer means more rough edges. License keys and file-download primitives are shallower than Lemon Squeezy or Polar.
- Lower recognition in North America and Asia — customers seeing
CREEM*on a statement for the first time can drive disputes.
6.4 When to Use It
- EU/UK is your dominant customer base.
- A fallback when Lemon Squeezy or Polar rejected you or has a policy conflict.
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):
- Fee: 10 percent flat. No per-payment-method add-ons.
- Payouts: via PayPal or Stripe Connect, on business-day cycle.
- MoR — VAT and US sales tax included.
7.2 Strengths
- Five-minute setup. Fastest way to start selling a digital product.
- Taxes included. Zero filings on your side.
- Discounts, bundles, pay-what-you-want — rich creator features.
7.3 Weaknesses
- Ten percent is expensive. As you scale, other MoRs cost less.
- API and webhooks are shallow. Deep integrations are awkward.
- Operationally turbulent since 2022 (layoffs, pricing changes have been reported).
7.4 When to Use It
- Truly lightweight — one or two digital products you want to start selling tomorrow.
- Small revenue, where 10 percent in absolute dollars is small.
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):
- Apple IAP: 30 percent standard. Apple Small Business Program (annual revenue under
$1M) drops it to 15 percent for the first$1M. Subscriptions are 30 percent the first year and 15 percent on renewals after a year. - Google Play Billing: 15 percent on the first
$1Mof yearly revenue, 30 percent above. Subscriptions are 15 percent from day one.
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:
- EU (Digital Markets Act): iOS and Android allow external payments and sideloading. Apple's Core Technology Fee (CTF) applies —
EUR 0.50per install above 1 million installs per year. - US (post Epic v. Apple): Apps may link to external payment pages. Apple charges a reduced commission on external transactions (27 percent for the first 7 days, then 12 percent).
- Korea (revised Telecommunications Business Act): External payments allowed. Apple and Google still charge reduced commissions (around 26 percent and 11 percent) on external payments.
- Japan: The Mobile Software Competition Act, effective from 2025, phases in sideloading and external-payment requirements.
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
- Monthly revenue (MRR):
$5,000. - Average transaction:
$30per month subscription, roughly 167 charges per month. - Revenue mix: 40 percent US, 35 percent EU, 25 percent Japan and rest.
- If you go Stripe DIY, you also pay an accountant (about
$500per quarter) and Stripe Tax (extra 0.5 percent).
9.2 Cost Matrix at $5k MRR
| Item | Stripe DIY | Lemon Squeezy | Polar | Paddle |
|---|---|---|---|---|
| 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%) | $25 | Included | Included | Included |
| Accountant (monthly equivalent) | About $167 | None | None | None |
| Invoicing and B2B tooling | About $30 | Included | Included | Included |
| Monthly total | About $417 | $334 | $267 | $334 |
| % of revenue | 8.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
| Item | Stripe DIY | Lemon Squeezy | Polar | Paddle |
|---|---|---|---|---|
| Processing fee | About $1,950 | About $3,335 | About $2,667 | About $3,335 |
| Stripe Tax | $250 | Included | Included | Included |
| Tax ops (fraction of headcount) | About $1,500 | 0 | 0 | 0 |
| Monthly total | About $3,700 | $3,335 | $2,667 | $3,335 |
| % of revenue | 7.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
- Under
$5k MRR: MoR almost always wins. You are buying back time. $5kto$50k MRR: MoR is still the best deal. Polar at about 5 percent, Lemon Squeezy and Paddle at 6.7 percent.$50kto$200k MRR: Mixed zone. Worth piloting Stripe DIY with Stripe Tax plus an accountant.- Above
$200k MRR: Dedicated headcount and Stripe DIY usually win. Exception: very heavy EU or Japan mix can keep MoR sensible.
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:
- At-least-once delivery. The same event can fire multiple times.
- No order guarantee.
invoice.paidmay arrive beforeinvoice.created. - Retry on missed 200 within 5 seconds, with exponential backoff up to about 3 days.
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:
- Payment fails (
invoice.payment_failed) — retry once immediately. - After 24 hours, check the Card Updater service for a refreshed card (Stripe Card Updater or MoR auto-update).
- Retry on days 3, 5, and 7, spaced across times of day.
- Day 7: email the user with an update-payment link.
- Day 14: downgrade or pause.
- 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:
- Enable Stripe Radar or your MoR's built-in fraud detection.
- Make the statement descriptor clear —
ACME*SAASbeatsXYZ123. - Publish a refund policy on the website and in the receipt email.
- Respond to disputes within 24 hours, with evidence — email logs, login logs, IP records.
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:
- Korean credit cards use ISP/3DS authentication flows that differ from the global norm. Stripe and Paddle accept Korean cards, but the identity-verification step (mobile-phone or account verification) is not smooth.
- Bank transfer and simple-pay methods are huge. KakaoPay, NaverPay, and Toss can rival card-payment volume.
- Cash receipts and electronic tax invoices are obligations under Korean VAT law.
- VAT filing happens directly through HomeTax (the National Tax Service portal). MoRs only partially support Korean VAT.
11.2 Options for Korea
PortOne (formerly Iamport, by NHN KCP)
- PortOne v2 (2024 and on): a unified payments aggregator. One API covering cards, KakaoPay, NaverPay, TossPayments, PayPal, and Stripe.
- Fees: PG fee (typically 3 to 3.5 percent) plus PortOne platform fee.
- Need to accept non-Korean cards too? Use the Stripe adapter.
- VAT filing: still you, or your accountant.
// 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
- Works standalone as a PG. Cards, bank transfer, KakaoPay, NaverPay, Toss payments — all supported.
- Clean API, excellent docs. For a solo dev, standalone TossPayments is often enough — no need for PortOne aggregation.
- Provides payment widgets and hosted pages.
Direct KakaoPay/NaverPay Integrations
- Technically possible, not recommended. Each requires its own merchant screening, contract, and reconciliation.
- For a solo dev, going through PortOne or TossPayments is the sensible default.
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
- Global users: Stripe Checkout or Polar/Lemon Squeezy.
- Korean users: PortOne or TossPayments plus KakaoPay/NaverPay.
- Tax: Korean VAT filed via HomeTax yourself. Global revenue handled by the MoR or via Stripe Tax plus an accountant.
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
| Model | Fits | Best Platforms |
|---|---|---|
| One-time | Desktop app licenses, eBooks, courses | Lemon Squeezy, Gumroad, Polar |
| Subscription | SaaS, content, memberships | Stripe, Polar, Paddle, Lemon Squeezy |
| Usage-based | LLM APIs, cloud infra, messaging | Stripe Billing (meters), Polar |
| Hybrid (seats plus usage) | Collaboration SaaS, data analytics | Stripe Billing, Paddle |
| Annual plus commit | Enterprise B2B | Paddle, 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:
- Aggregation lag. Real-time aggregation is expensive; 1-minute to 1-hour lag is typical. Users find out about overages late.
- Unpredictable bills. Customers cannot easily tell what this month's bill will be. You need soft limits, prepaid credits, and daily caps as guardrails.
- Free-credit abuse. A
$10free credit on signup attracts automated abuse. Mitigate with email plus card plus phone verification, and IP rate limiting.
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?
- Grandfathering (existing users keep old prices): peace of mind, slow revenue leak.
- Migration at renewal (new price from next renewal): email customers 30 to 60 days ahead.
- Immediate proration: a source of disputes. Avoid.
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:
- Forgetting to register for tax. Once you cross a threshold in the US or EU, you have a duty to register. Discover this 18 months in and you pay penalties plus back-tax. MoRs prevent this.
- Letting the chargeback ratio exceed 1 percent. Loose card-auth settings invite fraud, and once the ratio creeps past 1 percent, the network can suspend the gateway.
- Cryptic statement descriptors.
XYZ-123invites disputes. Use your domain. - Vague refund policy. Do not write "no refunds." The EU 14-day right of withdrawal is law, and US card networks can force refunds anyway. A clear, reasonable policy is your strongest weapon in a dispute.
- Non-idempotent webhooks. Issued the same license key twice for one payment? An
event.idPK fixes this. - Mixing test and live keys. A live secret in git is one of the all-time worst incidents. Keep
STRIPE_LIVE_SECRET_KEYandSTRIPE_TEST_SECRET_KEYstrictly per environment. - Putting your company name on an MoR-issued invoice. Legally invalid. With an MoR, the issuer of record on the invoice is the MoR.
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
- Day 1: Define your revenue stage, customer geography, and pricing model in one sentence.
- Day 2: MoR vs DIY decision. Under
$5k MRR, take MoR without doubt. - Days 3 to 4: Shortlist two candidates (for example Lemon Squeezy and Polar). Register the same product on both and compare.
- Day 5: Clean up your statement descriptor.
- Day 7: Implement an idempotent webhook handler keyed by
event.id. - Day 10: Sketch the dunning scenario — failed payment, retry, email, downgrade — on paper.
- Day 14: Refund policy page; refund link in the receipt email.
- Day 21: If 10 percent or more users are Korean, run PortOne/Toss alongside.
- Day 30: If a mobile app launch is coming, integrate RevenueCat.
Anti-Patterns (Recap)
- Starting on Stripe DIY and ignoring tax filings for three months, then taking penalties.
- Building non-idempotent webhooks and issuing licenses twice.
- Reaching for external-payment workarounds on mobile and getting the app rejected.
- Slapping usage-based pricing on a
$50per month plan and confusing customers. - Putting your own company name on an MoR-issued invoice and getting a notice in the EU.
- Forcing Korean users onto Stripe-only checkout and losing 60 percent conversion.
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
- Stripe — https://stripe.com/
- Stripe Tax — https://stripe.com/tax
- Stripe Billing — https://stripe.com/billing
- Stripe Workflows — https://stripe.com/workflows
- Stripe Connect — https://stripe.com/connect
- Stripe Radar — https://stripe.com/radar
- Stripe acquires Lemon Squeezy (2024) — https://stripe.com/newsroom/news/stripe-acquires-lemon-squeezy
- Lemon Squeezy — https://www.lemonsqueezy.com/
- Lemon Squeezy Pricing — https://www.lemonsqueezy.com/pricing
- Polar — https://polar.sh/
- Polar Pricing — https://polar.sh/docs/pricing
- Polar on GitHub — https://github.com/polarsource/polar
- Paddle — https://www.paddle.com/
- Paddle Billing — https://www.paddle.com/billing
- Retain by Paddle — https://www.paddle.com/products/retain
- Creem — https://www.creem.io/
- Gumroad — https://gumroad.com/
- RevenueCat — https://www.revenuecat.com/
- Apple Small Business Program — https://developer.apple.com/app-store/small-business-program/
- Google Play Billing — https://developer.android.com/google/play/billing
- EU Digital Markets Act (DMA) — https://digital-markets-act.ec.europa.eu/
- Korean Telecommunications Business Act — https://www.law.go.kr/
- Japan Mobile Software Competition Act — https://www.jftc.go.jp/
- PortOne — https://portone.io/
- PortOne v2 SDK — https://developers.portone.io/
- TossPayments — https://www.tosspayments.com/
- KakaoPay Merchants — https://biz.kakaopay.com/
- NaverPay Merchants — https://admin.pay.naver.com/
- HomeTax (Korean VAT filing) — https://www.hometax.go.kr/
- South Dakota v. Wayfair (sales tax nexus) — https://www.supremecourt.gov/opinions/17pdf/17-494_j4el.pdf
- EU One Stop Shop (OSS) — https://vat-one-stop-shop.ec.europa.eu/
현재 단락 (1/396)
The most underestimated piece of work for a solo developer building a SaaS is **payments**. The code...