Best way to take payments in a vibe-coded app: Polar vs Lemon Squeezy
Your AI-built app needs to charge for something, and you want a hosted checkout, a webhook you can trust when someone pays, and sales tax handled for you.
- Our pick
- Polar91/100
- Why
- Every step, from creating the product to looking up the order, worked through the API with no dashboard clicks, in both runs. Signed webhooks verified, and a tampered copy was rejected. The sandbox is fully separate from live money, and API keys can be scoped. It won a close 91 vs 87 on safe defaults.
- Not for you if
- you want to set up products by clicking in a dashboard and get paid by PayPal (Lemon Squeezy, 87/100, does both), or you want the lowest fees and will handle sales tax yourself (a processor like Stripe; not tested yet).
Short answer: Use Polar (91/100). Every step worked through its API, including creating the product. Its webhooks are signed with a timestamp, its API keys can be scoped and set to expire, and its sandbox is a separate server from live money. Lemon Squeezy (87/100) is a close second at the same 5% + 50¢ fee, but you have to create products in its dashboard, and its webhook signatures have no replay protection. Both are merchants of record, so they handle sales tax for you. Neither charged our Ontario test buyer any.
The verdict
Winner
Polar
Open-source payments and billing platform that acts as your merchant of record, with a full API and a separate sandbox.
Passed 7 of 8 checks in both runs (4 min 16 s, then 2 min 43 s) with no dashboard steps. We created the $24 product and checkout link through the API, paid with the test card on its hosted checkout, received order.created and order.paid within about 10 seconds of paying, and verified them with Polar's SDK. A tampered copy and a wrong secret were both rejected, and the sandbox key got 401 on the live API. The one miss: our Ontario test buyer was charged no tax. Score: 91/100 (both runs), winning a close race with Lemon Squeezy on safe defaults.
Runner-up
Lemon Squeezy
Merchant of record for digital products, owned by Stripe, with hosted checkouts and PayPal.
Passed 7 of 8 checks in both runs. API-made checkout, headless test purchase, signed order_created webhook about 3 seconds after paying, verified with its documented HMAC, and the order found through the API. It lost points because its API can't create products (we used the dashboard), its webhook signature covers no timestamp, and its docs offer no scoped or expiring API keys. Score: 87/100 (both runs), second to Polar on our tie-breaker.
On this page
Quick answers
What's the easiest way to take payments in a vibe-coded app?
In our test, Polar (91/100), with Lemon Squeezy (87/100) a close second. With each, we made a hosted checkout for a $24 product, paid with the test card 4242 4242 4242 4242, verified the signed webhook and found the order through the API, twice. Polar did everything through its API. Lemon Squeezy needed its dashboard to create the product. The scores were close enough that our tie-breaker decided it: fees are the same, so it came down to safe defaults, where Polar scored higher. Stripe and Paddle weren't tested.
Polar or Lemon Squeezy: which is cheaper?
Per sale, neither: both charge 5% + 50¢, plus 1.5% on non-US cards. A $24 sale costs $1.70 on a US card or $2.06 on a Canadian card with either (checked 2026-10-16). Payouts differ. Polar pays out through Stripe (which charges $2 per month with payouts, plus 0.25% + 25¢ per payout), with a $10 minimum. Lemon Squeezy pays out twice a month by bank or PayPal, with a $50 minimum, free to US banks and 1% to banks outside the US.
Do Polar and Lemon Squeezy handle sales tax?
Both are merchants of record: they resell your product and take on the liability for collecting and paying sales tax. You still pay income tax on your earnings. In our test neither charged our Ontario, Canada buyer any tax, and neither vendor's docs explain why. Polar's sandbox did charge VAT for Sweden and the UK and sales tax for New York.
Are Polar and Lemon Squeezy webhooks secure?
Both sign every webhook, and in our test both signatures verified and a tampered copy was rejected. Polar uses the Standard Webhooks scheme, which signs a timestamp along with the body, so a captured request can't be replayed later. Lemon Squeezy's X-Signature covers only the body. If you use it, record each event's ID and ignore repeats.
Can Lemon Squeezy create products through its API?
No. Its API can list and read products and variants but not create them. POST /v1/products returned 405, so products have to be made in the dashboard. Checkouts, webhooks and orders all worked through the API in our test. Also check your store's currency: ours defaulted to Canadian dollars because we picked Canada as the store's country, so our $24 product was CA$24.00.
Polar or Stripe?
We haven't tested Stripe yet. The difference that matters: Polar (91/100 in our test) is a merchant of record, so it sells to your customer and handles sales tax. A payment processor like Stripe leaves sales tax registration and filing to you.
Candidates we'll test
Stripe
Payment processor (not a merchant of record by default). Not tested: we don't have a Stripe account of our own yet.
Paddle
Merchant of record for software. Not tested: signup asks for a business address we don't have yet.
Why
Who this is for: your app works, usually built with AI, and you’re ready to charge for something: a template, a guide, lifetime access. You want a checkout page you don’t have to build, a reliable signal when someone has paid, and someone else dealing with sales tax.
Our pick: Polar (91/100). Every step worked through its API: creating the product, the checkout link and the webhook, then looking up the order. That matters if an AI agent is wiring up payments for you. Its webhooks are signed with a timestamp, its SDK verifies them in one call, its API keys can be scoped and set to expire, and its sandbox runs on separate servers from live money.
Runner-up: Lemon Squeezy (87/100). It passed the same checks: hosted checkout, test purchase, signed webhook, order lookup. Its fee is the same. It lost points because you have to create products in its dashboard, its webhook signature doesn’t include a timestamp, and its docs don’t offer scoped API keys.
It’s close. Both tools scored the same on both runs, 4 points apart. That’s under our 5-point line, so the tie-breaker decided it. Fees on a $24 sale are identical, so it came down to safe defaults, where Polar scored higher. Both are merchants of record, which means they resell your product and handle sales tax for you.
Gotchas
Both: neither charged our Ontario buyer any tax. Our test buyer in Toronto paid $24 with $0 tax on both tools, in both runs. Lemon Squeezy’s order even names the tax (HST) at a rate of 0. Neither vendor’s docs explain it. Polar’s sandbox did charge tax for Sweden, the UK and New York. Before you launch, run a test checkout with your main customers’ addresses.
Lemon Squeezy: check your store currency. We chose Canada as the store’s country at signup, and the store currency quietly defaulted to Canadian dollars, so our “$24” product was CA$24.00 (about US$16.96). If you want to charge in US dollars, change the currency on purpose before you create products.
Lemon Squeezy: guard against replayed webhooks. Its X-Signature signs only the body, not the time it was sent. Someone who captures a real webhook could send it again later and it would still verify. Store each event’s ID and ignore repeats.
Lemon Squeezy: you can’t create products through the API. Checkouts, webhooks and orders work through the API, but products and prices need the dashboard. Its webhook signing secret is limited to 40 characters (a clear error told us).
Polar: in some countries tax comes out of your price. For Swedish and UK buyers, the sandbox kept the price at $24 and took the VAT out of it ($4.80 and $4.00). For New York it added $2.13 on top. Polar lets you choose tax-inclusive or tax-exclusive pricing; decide on purpose.
Both: getting paid takes verification. Polar needs an account review (up to 14 days), an ID check and a Stripe payout account with a bank account in your business’s country. Lemon Squeezy pays out to a bank or a verified PayPal account and may ask you to verify your identity. You can build and test with either right away.
Both: verify the raw body. Signature checks only work on the exact bytes that were sent. If your framework parses the JSON first, verification fails.
Scores
Scored with our published rubric. Tested 2026-10-16. Both tools scored the same on both runs.
| Criterion | Polar | Lemon Squeezy |
|---|---|---|
| Task success (35) | 4 (7 of 8: no tax on the Ontario buyer) | 4 (7 of 8: no tax on the Ontario buyer) |
| Effort (15) | 5 (no dashboard steps) | 5 (1 dashboard step: creating the product) |
| Time (10) | 5 (4 min 16 s; 2 min 43 s) | 5 (6 min 11 s; 2 min 9 s) |
| Cost (10) | 5 ($0, no card) | 5 ($0, no card) |
| Quality, docs and developer experience (10) | 5 (5 of 5) | 4 (4 of 5: no API to create products) |
| Ownership (10) | 4 (API and CSV export endpoints; dashboard export not checked) | 5 (API, plus documented CSV export from the dashboard) |
| Safe defaults (10) | 5 (4 of 4) | 3 (2 of 4: no timestamp in webhook signatures; no scoped or expiring API keys) |
| Total | 91 (both runs) | 87 (both runs) |
The 8 checks: product at 24.00 in the store currency, hosted checkout link made through the API, test purchase with the test card, signed webhook verified, forged webhook rejected, order found through the API, sales tax collected for an Ontario buyer, and test key unable to reach live mode.
What it costs
The tests cost $0 on sandbox and test accounts, with no card on file. Real sales cost this (checked 2026-10-16):
| On a $24 sale | Polar (Starter) | Lemon Squeezy |
|---|---|---|
| Per-sale fee | 5% + 50¢ | 5% + 50¢ |
| US card | $1.70 (measured in our sandbox orders) | $1.70 |
| Non-US card (e.g. Canadian) | +1.5% → $2.06 | +1.5% → $2.06 |
| Monthly fee | $0 (paid plans from $20/month lower the rate) | $0 |
| Payout fees | Stripe’s: $2 per month with payouts, 0.25% + 25¢ per payout, plus currency conversion | Free to US banks; 1% outside the US; PayPal 50¢ (US) or 3% capped at $30 |
| Payout timing | 7-day settlement delay, $10 minimum (USD) | Twice a month after a 13-day hold, $50 minimum |
Both take the fee on the total, including any tax. A payment processor like Stripe leaves sales tax registration and filing to you. We haven’t tested it yet.
Caveats
- Sandbox and test mode, not live. No real money moved. Tax and fees may behave differently in live mode. Polar’s fee in our sandbox orders matched its published Starter rate. Lemon Squeezy’s orders don’t show a fee, so its numbers come from its pricing page.
- Different currencies. Polar charged US$24.00. Our Lemon Squeezy store was in Canadian dollars, so it charged CA$24.00. Neither affects the checks.
- Lemon Squeezy’s product was made by a person in its dashboard, because its API can’t create one. That counts as one manual step. Both of its runs used that same product.
- Order matters. Polar ran first, and its script fixes carried over to the Lemon Squeezy runs.
- Webhook receiver. Our box can’t accept incoming connections, so webhooks went to a tiny function that stored them unchanged. We checked the signatures on the box afterwards with each endpoint’s secret.
- Headless checkout. We paid on each vendor’s real hosted checkout with Playwright. Failed first attempts were our own script’s fault; details are in the test script’s amendments.
- No login in the test app. Tie each purchase to a signed-in user before you launch: see adding login to your app.
- Runs were done by an AI agent following vendor docs only. The check script is public.
Next step: store who paid. Save each verified order against the buyer’s account: see our tested pick for a database for your vibe-coded app.
Before you launch: check your app’s security. See our vibe coding security check.
Send receipts and order emails from your own domain with our tested pick for sending emails from your app.
Not tested yet
- Stripe. We don’t have a Stripe account of our own yet.
- Paddle. Signup asks for a business address we don’t have yet.
Test log
| Date | Agent | Step | Result |
|---|---|---|---|
| Oct 16, 2026 | Lando (agent) | Polar, run j09-polar-r1, sandbox. Through the API (version 2026-10): created a $24 one-time product, a checkout link and a webhook endpoint, then paid on the hosted checkout with Playwright (headless Chromium) and the 4242 test card, as a buyer in Toronto, Ontario. | Product, link and webhook created in about 1 second. After two fixes to our own script (page-load wait, custom country picker), the purchase went through and the page sent us to our success URL. order.created and order.paid arrived about 10 seconds after we paid. Working in 4 min 16 s. $0, no card on file. |
| Oct 16, 2026 | Lando (agent) | Polar: verified the webhooks offline with the endpoint secret, using Polar's SDK (validateEvent) and our own Standard Webhooks check. Tried a copy with one byte changed and a wrong secret. Fetched the order, and called the live API with the sandbox key. | All 15 deliveries verified. Tampered copy and wrong secret rejected. Order: paid, $24.00 subtotal, $0 tax, $24.00 total, Polar fee $1.70. Sandbox key on the live API: 401. |
| Oct 16, 2026 | Lando (agent) | Polar, unscored probe: created checkout sessions through the API for buyers in Ontario, Sweden, the UK and New York to see how the sandbox calculates tax (no purchases). | Ontario: $0 tax. Sweden: $4.80 VAT inside the $24. UK: $4.00 VAT inside the $24. New York: $2.13 added, total $26.13. |
| Oct 16, 2026 | Lando (agent) | Lemon Squeezy, first attempt (12:56 ET), test mode: tried to create the $24 product through the API. | POST /v1/products: 405 'Supported methods: GET, HEAD'. The API has no create endpoint for products or variants, so the run was blocked until a person made the product in the dashboard. |
| Oct 16, 2026 | Lando (agent) | Lemon Squeezy, run j09-lemonsqueezy-r1 (15:06 ET), with the product a person made in the dashboard (counted as 1 manual step). Through the API: read the variant, registered a webhook with a signing secret, created a checkout, then paid headlessly with the 4242 test card as a buyer in Toronto. | The product is priced CA$24.00: the store currency had defaulted to CAD from our Canada country choice. After fixes to our own script (secret over Lemon Squeezy's 40-character limit, which a clear 422 error explained, and the checkout form), the payment succeeded with a 'Thanks for your order!' dialog. order_created arrived about 3 seconds after the order and verified; a tampered copy and a wrong secret were rejected. Order: paid, CA$24.00, $0 tax (HST at rate 0.00). Working in 6 min 11 s. $0. |
| Oct 16, 2026 | Lando (agent) | Lemon Squeezy: asked for a live-mode checkout with the test-mode key. | Not rejected: HTTP 201, and the checkout came back in test mode. The test key can't reach live mode, but the request isn't flagged either. |
| Oct 16, 2026 | Lando (agent) | Re-runs (rubric: top two within 10 points, 91 vs 87). Polar j09-polar-r2 on a fresh product, link and webhook; Lemon Squeezy j09-lemonsqueezy-r2 on a fresh checkout and webhook with the same product. | Same results: both passed 7 of 8 again, and neither charged the Ontario buyer tax. Polar in 2 min 43 s, Lemon Squeezy in 2 min 9 s. Scores unchanged: Polar 91, Lemon Squeezy 87. The gap is under 5, so the tie-breaker applies: fees are equal on a Canadian card, and Polar wins on safe defaults (5 vs 3). |
Affiliate disclosure
This page has no affiliate links yet. Every link goes to the tool’s own homepage. Affiliate deals never decide a pick, and a tool with no affiliate program can still win. How we make money.
Sources
- Test script and amendments (BuildWithThis)
- Polar fees (checked 2026-10-16)
- Polar merchant of record and sales tax (checked 2026-10-16)
- Polar account reviews (checked 2026-10-16)
- Polar payout accounts (checked 2026-10-16)
- Polar payouts (checked 2026-10-16)
- Polar sandbox environment (checked 2026-10-16)
- Polar webhook delivery and verification (checked 2026-10-16)
- Polar organization access tokens (checked 2026-10-16)
- Polar master services terms (checked 2026-10-16)
- Lemon Squeezy pricing (checked 2026-10-16)
- Lemon Squeezy fees (checked 2026-10-16)
- Lemon Squeezy getting paid (checked 2026-10-16)
- Lemon Squeezy test mode (checked 2026-10-16)
- Lemon Squeezy webhook signing (checked 2026-10-16)
- Lemon Squeezy exporting orders (checked 2026-10-16)
- Lemon Squeezy developer guide, API keys (checked 2026-10-16)
- Lemon Squeezy API reference (no create-product endpoint) (checked 2026-10-16)
- Lemon Squeezy terms (checked 2026-10-16)
What to use now
A free weekly email.
We'll email you a link to confirm. We use Kit to send the email. Unsubscribe anytime. Privacy