Polar
Open-source Merchant of Record billing built for developers selling SaaS and digital products
Pick Polar when you want the cheapest Merchant of Record option (4% + 40¢) with the best developer experience in the category — ideal for indie hackers and small SaaS teams who value clean SDKs, open-source transparency, and global tax compliance over a long track record.
◆ Simple
195+ seller countries
4% + 40¢
Polar is an open-source (polarsource/polar on GitHub) Merchant of Record platform that launched v1.0 in September 2024 and raised a $10M Accel-led Seed round in 2025. It sits on top of Stripe Connect Express for payouts and Stripe Payments for processing while acting as the legal seller — handling VAT, GST, and US sales tax compliance in all applicable jurisdictions. Polar is positioned as a developer-first alternative to Paddle and Lemon Squeezy, with a headline 4% + 40¢ rate (covering Stripe's 2.9% + 30¢), framework adapters for Next.js/BetterAuth/TypeScript, and automated benefits like license keys, GitHub repo access, Discord roles, and file downloads.
Last full audit: April 15, 2026
Trust Score Breakdown
Account Stability
70/100Polar formalizes its review process in public docs, which is better than most competitors — KYC via Stripe Identity at first payout, asynchronous reviews at sale thresholds, clear 0.4% chargeback threshold. However, the 0.4% ceiling is strict (card networks flag 0.7%+) and unresponsiveness within 48 hours can trigger offboarding. As a young company (v1.0 September 2024), the merchant base is small enough that outlier enforcement cases get disproportionate visibility on Trustpilot and Reddit.
Developer Experience
88/100Polar's clear strength. Fully open-source codebase on GitHub, typed SDKs for TypeScript/Python/PHP/Go, 13+ framework adapters including first-class Next.js (@polar-sh/nextjs), BetterAuth, and FastAPI. Webhooks follow the Standard Webhooks spec with signature verification built into the SDK. Usage-based billing with events/meters, entitlements engine for license keys/Discord/GitHub benefits, and a clean customer portal with no server required. Documentation is modern and consistently praised in community reviews.
Payout Reliability
75/100Polar uses Stripe Connect Express for payouts, inheriting Stripe's reliable rolling payout infrastructure — significantly faster than Paddle's monthly cycle. Payout fees are passed through from Stripe at cost ($2/month active + 0.25% + $0.25 per payout) with no Polar markup. Main caveat: payouts are paused during account reviews (typically resolved within a week at first review, 1-2 days for continuous reviews), which can delay cash flow for merchants hitting sale thresholds.
Support Quality
55/100Support responsiveness is the most common complaint in 2026 community reviews. A February 2026 Reddit thread titled 'Paddle is slow and Polar.sh is non-responsive' flagged delays during disputes, and a March 2026 Trustpilot review reported a full week for a response. As a small, young team (post-$10M Seed), dedicated support staffing hasn't yet caught up to merchant growth. No published SLA tiers or premium support offering.
Track Record
58/100Young company: v1.0 shipped September 2024, $10M Accel-led Seed announced 2025 with notable angel investors from Vercel, Supabase, and Shopify. Official GitHub funding partner since 2024. No major regulatory incidents or security breaches to date, but limited history means less signal on long-term stability, regulatory compliance track record, or how the company behaves during stress events — factors that benefit older players like Stripe and PayPal.
Transparency
72/100Fully open-source platform is a genuine transparency win — merchants can inspect billing logic directly. However, the headline 4% + 40¢ rate understates reality for most SaaS: international cards add +1.5%, subscriptions add another +0.5%. An international subscription actually costs 6% + 40¢, a 50% premium over the advertised rate. These surcharges live in the separate /docs/merchant-of-record/fees page rather than the main pricing page. Payout fees are transparently passed through from Stripe with no markup.
Availability Matrix
| Region | Countries | Currencies | Payout Timing |
|---|---|---|---|
| Global (Buyers) | Global except sanctioned — buyers can purchase from virtually anywhere that Stripe Payments supports | USD, EUR, GBP + major currencies supported via Stripe Payments. Localized pricing available per product. | N/A (buyer side) |
| Global (Sellers) | 195+ countries supported for payouts via Stripe Connect Express — including Albania, Algeria, Angola, Argentina, Australia, Austria, Belgium, Canada, Chile, China, Colombia, France, Germany, India, Indonesia, Japan, Kenya, Mexico, Netherlands, Nigeria, Pakistan, Philippines, Singapore, South Africa, South Korea, Turkey, UK, US, UAE, Vietnam, and many more across Africa, Asia, Europe, Latin America, and Oceania | Payouts in USD/EUR/GBP or local currency per Stripe Connect Express; currency conversion 0.25% (EU) to 1% (other countries) | Rolling/on-demand per Stripe Connect schedule — no fixed monthly cycle. No explicit minimum threshold. $2/month active-payout fee + 0.25% + $0.25 per payout passed through from Stripe. |
| NOT Available (sanctioned countries) | Cuba, Russia, Iran, North Korea, Syria — blocked due to US sanctions | N/A | N/A |
Feature Snapshot
One-time Payments
Supports one-off purchases via hosted checkout, embedded checkout, or programmatic checkout session creation. Useful for digital downloads, one-time license purchases, and single-product sales.
Subscriptions / Recurring Billing
Full subscription support with tiered pricing, automatic benefit grants/revokes based on subscription status, and handling of subscription lifecycle via a single onSubscriptionUpdated (now customer.state_changed) webhook. Subscription payments incur a +0.5% surcharge on top of the base 4% + 40¢.
Tax Collection & Remittance (MoR)
As Merchant of Record, Polar calculates, collects, and remits VAT (EU), GST, and US sales tax in all applicable jurisdictions. Handles B2B reverse charge for VAT. Merchants do not register or file tax returns themselves for Polar transactions.
Usage-Based Billing
Events Ingestion API accepts typed events (e.g., ai_usage, video_streamed). Meters aggregate and filter events into billable units; metered prices attach to products. Includes S3 ingestion strategy for high-volume event loads.
License Keys
Automated license key issuance on purchase/subscription. Supports expiration, activation requirement before validation, device/IP/instance limits, usage quotas, and customer self-service deactivation via the customer portal.
Digital Downloads
Secure file downloads delivered as automated benefits — customers receive access on purchase. Supports files for digital products (ebooks, assets, installers).
GitHub Repo Access Benefit
Automatic invites to private GitHub repositories when customers purchase — useful for paid source access, premium templates, or private library distribution.
Discord Roles Benefit
Auto-assigns Discord roles to customers based on purchase/subscription tier. Roles are removed automatically on cancellation via the entitlements engine.
Hosted Checkout
Polar-hosted checkout page with built-in success pages and customer portal — no server required for basic payment flows.
Embedded Checkout
HTML snippet embeddable on any site or CMS. Displays a Purchase link that opens an inline checkout frame. Supports programmatic creation via the SDK.
Customer Portal (No-code)
Built-in no-code portal where customers manage subscriptions, update payment methods, cancel, and view invoices. Next-invoice preview updates automatically after plan changes, with taxes and discounts included.
Discount Codes
Discount codes applicable at checkout via discount_id or customer-entered codes. Invalid codes can be cleared to proceed with checkout (improved Q1 2026).
Webhooks
Follows the Standard Webhooks specification with HMAC-SHA256 signatures. Key events: customer.state_changed, order.created, subscription.*, checkout.*. SDK ships validateEvent() helper that throws WebhookVerificationError on mismatch. Base64-encoded secret required.
Fraud Prevention
3D Secure applied automatically per Stripe risk rules. Polar proactively monitors chargeback rates against a 0.4% internal threshold (below the 0.7% card-network flag). Chargeback Stop integration for real-time dispute alerts.
Framework Adapters / SDKs
Typed SDKs for TypeScript, Python, PHP, and Go. First-class Next.js helper (@polar-sh/nextjs) for Checkout and Webhook route handlers, BetterAuth plugin, and 10+ other framework adapters. Fully open-source.
Marketplace / Multi-party Payouts
No built-in support for marketplace-style split payments or multi-party revenue sharing. Co-founder or partner splits require manual payout division. Not a platform for third-party-seller marketplaces.
PayPal / Crypto Payments
Polar supports card payments and Stripe-supported local methods only. No PayPal, Apple Pay Cash, or crypto as of April 2026. Polar has stated intent to expand payment providers (e.g., PayPal, Wise) in the future.
In-Person Payments
Online-only platform. No POS hardware, card readers, or in-person payment capabilities.
Pricing Breakdown
Security & Compliance
Integration Prompt
✂
Copy & use this 7852-char integration prompt
Production-ready prompt for Claude / GPT / Cursor — handles setup, security, webhooks & gotchas
Copy & use this 7852-char integration prompt
Production-ready prompt for Claude / GPT / Cursor — handles setup, security, webhooks & gotchas
You are integrating Polar as a Merchant of Record (MoR) into a [Django / Next.js / FastAPI / Express] application.
## Key Concept: Polar is the Merchant of Record
Polar is NOT just a payment processor — it is the legal seller on record. Polar collects and remits VAT/GST/US sales tax globally, handles disputes, and controls refund decisions. You receive net payouts via Stripe Connect Express after fees and taxes. This means:
- You do NOT collect or remit sales tax/VAT/GST — Polar does
- Polar issues invoices to your customers (not you)
- Refunds flow through Polar's policy; the 4% + 40¢ transaction fee is NOT refunded on refunds
- Customer disputes are handled by Polar; $15 per dispute is deducted from your balance
## Setup
1. Create an organization at polar.sh and complete the seller onboarding survey
2. Generate credentials in Settings:
- `POLAR_ACCESS_TOKEN` — organization access token (server-side only)
- `POLAR_WEBHOOK_SECRET` — per-endpoint secret, base64-encoded
3. For Next.js/TypeScript: `pnpm add @polar-sh/sdk @polar-sh/nextjs`
For Python: `pip install polar-sdk`
4. Use the sandbox environment during development (`server: 'sandbox'` in SDK calls). Complete Stripe Identity KYC before your first live payout (required for payout activation).
## Fee Modeling (Read This First)
The headline 4% + 40¢ is incomplete — always model these additives:
- +1.5% for any non-US card (Stripe international pass-through)
- +0.5% for subscription payments
- $15 per dispute (non-refundable)
- Refunds lose the full transaction fee (Polar does not refund it)
Build a weighted effective-rate model based on your actual international mix and subscription ratio before committing pricing.
## Recommended Integration: Next.js Route Handlers
The cleanest pattern uses Polar's Next.js helpers for both checkout and webhooks:
```typescript
// app/api/checkout/route.ts
import { Checkout } from '@polar-sh/nextjs';
export const GET = Checkout({
accessToken: process.env.POLAR_ACCESS_TOKEN!,
successUrl: 'https://your-app.com/confirmation?checkout_id={CHECKOUT_ID}',
server: process.env.NODE_ENV === 'production' ? 'production' : 'sandbox',
});
```
Link to checkout with product IDs: `/api/checkout?products=prod_xxx&[email protected]`
## Server-Side: Create Products and Prices
Use the SDK to manage products via the API or dashboard:
```typescript
import { Polar } from '@polar-sh/sdk';
const polar = new Polar({
accessToken: process.env.POLAR_ACCESS_TOKEN!,
server: 'sandbox',
});
// Create a product with a recurring price
const product = await polar.products.create({
name: 'Pro Plan',
recurringInterval: 'month',
prices: [{
amountType: 'fixed',
priceAmount: 2000, // cents — $20.00
priceCurrency: 'usd',
}],
});
```
## Webhook Handling (Critical)
Never trust client-side checkout success alone — always confirm via webhooks.
1. In the Polar dashboard, create a webhook endpoint pointing to `https://your-app.com/api/webhooks/polar`
2. Subscribe to key events: `order.created`, `subscription.created`, `subscription.updated`, `subscription.canceled`, `customer.state_changed`, `checkout.updated`
3. Use the SDK's built-in verification:
```typescript
// app/api/webhooks/polar/route.ts
import { Webhooks } from '@polar-sh/nextjs';
export const POST = Webhooks({
webhookSecret: process.env.POLAR_WEBHOOK_SECRET!,
onOrderCreated: async (payload) => {
const order = payload.data;
// Fulfill order — use order.metadata to link to your internal records
},
onSubscriptionCreated: async (payload) => {
const subscription = payload.data;
// Grant entitlements in your app
},
onSubscriptionCanceled: async (payload) => {
// Revoke entitlements
},
onCustomerStateChanged: async (payload) => {
// Sync active benefits/entitlements to your user record
},
});
```
For Python/Django, manual verification per the Standard Webhooks spec:
```python
import base64
import hashlib
import hmac
def verify_polar_webhook(request, secret: str) -> bool:
# Polar uses Standard Webhooks headers
webhook_id = request.headers.get('webhook-id', '')
webhook_timestamp = request.headers.get('webhook-timestamp', '')
webhook_signature = request.headers.get('webhook-signature', '')
raw_body = request.body.decode('utf-8')
signed_payload = f'{webhook_id}.{webhook_timestamp}.{raw_body}'
# Secret is base64-encoded — decode before HMAC
decoded_secret = base64.b64decode(secret.split('_')[-1] if '_' in secret else secret)
expected = base64.b64encode(
hmac.new(decoded_secret, signed_payload.encode(), hashlib.sha256).digest()
).decode()
# Header format: 'v1,<base64sig> v1,<base64sig>' — check any match
for sig in webhook_signature.split(' '):
if sig.startswith('v1,') and hmac.compare_digest(sig[3:], expected):
return True
return False
```
4. CRITICAL: Do NOT parse or modify the raw request body before verification — any transformation breaks the signature
5. Deduplicate by `webhook-id` header — Standard Webhooks allows redelivery
6. Respond 200 quickly; process heavy work asynchronously
## Benefits & Entitlements
Polar's entitlements engine automatically grants/revokes benefits based on subscription state:
- **License keys** — auto-issued on purchase, with expiration, activation, device/IP limits, usage quotas
- **File downloads** — secure signed URLs
- **GitHub repo access** — auto-invites to private repos
- **Discord roles** — auto-assigned; revoked on cancellation
- **Custom benefits** — via webhooks and your own logic
Subscribe to `customer.state_changed` to mirror the full entitlement state into your database.
## Usage-Based Billing
For AI tokens, API calls, or other metered usage:
```typescript
// Ingest events via the Events API
await polar.events.ingest({
events: [{
name: 'ai_usage',
externalCustomerId: 'user_123',
metadata: { tokens: 1500, model: 'gpt-4' },
}],
});
```
Define meters in the dashboard to aggregate events into billable units, then attach metered prices to products.
## Security Best Practices
- Never handle raw card data — Polar/Stripe handles all PCI-sensitive operations; your PCI scope is SAQ-A
- Always verify webhook signatures via the SDK (or Standard Webhooks spec manually)
- Store `metadata` references (your internal user/order IDs) when creating checkouts to link Polar records back to your database
- Use sandbox (server: 'sandbox') for all development; production Stripe Identity KYC is required before first live payout
- Monitor chargeback rate against Polar's strict 0.4% threshold — stricter than card-network defaults
## Testing
- Sandbox environment: set `server: 'sandbox'` in SDK; use Stripe test cards
- Use ngrok or a tunnel for local webhook testing
- Test full subscription lifecycle: created → active → past_due → canceled → expired
- Verify entitlement grant/revoke by checking `customer.state_changed` payloads
- Smoke-test production with a low-dollar live transaction — sandbox/production behavior occasionally diverges
## Common Gotchas
- Amounts use the smallest currency unit as integers (cents) — `2000` = $20.00
- Refunds do NOT return the 4% + 40¢ transaction fee — model this into your refund policy
- Subscription +0.5% and international +1.5% surcharges stack — an international sub is 6% + 40¢, not 4% + 40¢
- Dispute fee ($15) is deducted regardless of outcome — non-refundable even if you win
- The webhook secret is base64-encoded; the SDK handles this, but manual implementations must decode before HMAC
- Account reviews pause payouts; keep a cash buffer and respond to Polar comms within 48 hours
- No PayPal, Apple Pay Cash, or crypto — cards plus Stripe local methods only
- Customer portal is hosted by Polar; you cannot fully customize the portal UI (embed-only)
Replace [Django / Next.js / etc.] with your stack. Follows PCI DSS best practices and handles common edge cases.
Common Pitfalls
8 itemsHeadline rate understates real cost for international SaaS
The advertised 4% + 40¢ is incomplete: international cards add +1.5% and subscription payments add +0.5%. An international subscription actually costs 6% + 40¢ — a 50% premium over the headline. These surcharges are disclosed in the /docs fee schedule but not on the main pricing page, so merchants modeling their margins from the front page alone will underestimate costs. Mitigation: model your effective rate using the docs fee schedule, weighted by your actual international/subscription mix.
Strict 0.4% chargeback threshold
Polar enforces a 0.4% chargeback rate ceiling — below the 0.7% flag that card networks use and stricter than most competitors. Hitting the threshold can trigger account review, payout pause, or offboarding. For businesses with high-refund categories (e.g., AI products, digital goods with buyer's remorse), this is tight. Mitigation: monitor your dispute rate weekly, use clear billing descriptors, and implement friendly-fraud prevention (email delivery confirmation, usage logs) before disputes escalate.
Support responsiveness is the top community complaint
Multiple 2026 reviews describe multi-day support response times — a February 2026 Reddit thread titled 'Paddle is slow and Polar.sh is non-responsive' and a March 2026 Trustpilot review reporting a full week for a reply. The small team size (post-$10M Seed) hasn't fully caught up to merchant growth. No published SLA or premium support tier. Mitigation: keep your integration well-documented internally so you're not blocked waiting for Polar support; use the open-source GitHub repo for self-service debugging.
Account reviews can pause payouts for days
Reviews are triggered at first payout (KYC via Stripe Identity) and at undisclosed sale thresholds. Initial reviews take up to a week on average; continuous reviews typically 1-2 days. During review, payouts are paused (customer transactions continue). Unresponsiveness within 48 hours can escalate to offboarding. Mitigation: complete KYC before launch, respond to Polar communications within 24 hours, and maintain a cash buffer so a paused payout doesn't break payroll.
Refund fees are not refundable
The 4% + 40¢ transaction fee is absorbed on every refund — card networks charge the fee regardless, and Polar does not credit it back. For products with high refund rates, the effective fee climbs meaningfully above the headline. Mitigation: tighten refund policy to a clear window, add usage confirmation before allowing refunds, and price products with an assumed refund-fee loss built in.
No PayPal, Apple Pay Cash, or crypto support
Polar accepts cards and Stripe-supported local methods only. Merchants whose audience prefers PayPal (common in some EU/LatAm segments) or crypto will see checkout drop-off. Polar has stated intent to add PayPal/Wise but there is no public date. Mitigation: confirm your target audience's preferred payment methods before committing; consider Paddle or Lemon Squeezy if PayPal volume is material.
Young track record and no SOC 2
Polar v1.0 shipped September 2024 — just ~18 months of production history at audit time. No publicly advertised SOC 2 Type I or Type II attestation. For enterprise customers with procurement/security reviews, this can be a blocker. Mitigation: for enterprise-tier product lines, pair Polar with a direct-invoicing flow or wait until formal certifications ship; for indie/SMB products, the open-source codebase is a reasonable compensating control.
Sandbox vs production inconsistencies reported
Some developers report edge-case behavior differences between the Polar sandbox and production environments — particularly around discount code handling, webhook payload shapes, and pricing integration. Mitigation: always smoke-test critical flows in production with low-dollar test transactions after sandbox validation; subscribe to GitHub issues for the polarsource/polar repo to catch regressions early.
Community Pulse
Developers consistently praise Polar's developer experience, open-source transparency, and aggressive pricing — the 4% + 40¢ headline is the cheapest in the Merchant-of-Record tier, and the Next.js/BetterAuth/TypeScript adapters are described as best-in-class for indie hackers shipping SaaS quickly. The open-source codebase (polarsource/polar on GitHub) and official GitHub funding-partner status are cited as meaningful trust signals. Criticisms cluster in two areas: support responsiveness (multi-day delays, flagged in a February 2026 Reddit thread and March 2026 Trustpilot reviews) and the gap between the advertised 4% + 40¢ and the real effective rate once international (+1.5%) and subscription (+0.5%) surcharges stack. The consensus in 2026 is that Polar is the strongest default for small SaaS and indie developers, while businesses needing PayPal/crypto, formal SOC 2, or deep marketplace features still look elsewhere.
Sentiment last updated: April 2026 · We summarize — never copy — community content. Links go to original threads.
Changelog
-
logo
Added brand logo — rendered the official logomark_black.svg from Polar's brand asset zip to a 256×256 transparent PNG via resvg_py. Brightness avg 0 (pure black) → logo_bg left empty for the default cream card.
-
pricing
Initial pricing populated: 4% + 40¢ base, +1.5% international, +0.5% subscriptions, $15 dispute, $2/month active payout, 0.25% + $0.25 per payout, 0.25–1% FX, refund fees non-refundable, no setup/monthly platform fees.
-
availability
Initial availability populated: buyers globally except sanctioned, 195+ seller countries via Stripe Connect Express, NOT Available row for Cuba/Russia/Iran/North Korea/Syria.
-
features
Initial feature matrix: 15 yes (one-time, subscriptions, tax/MoR, usage billing, license keys, downloads, GitHub/Discord benefits, hosted/embedded checkout, customer portal, discount codes, webhooks, fraud prevention, SDKs) + 3 no (marketplace, PayPal/crypto, in-person).
-
security
Initial security posture: PCI DSS Level 1 inherited via Stripe, 3DS auto, Stripe Radar + 0.4% chargeback threshold, Standard Webhooks HMAC-SHA256, Stripe Identity KYC, GDPR/CCPA. Noted no publicly advertised SOC 2 attestation.
-
pitfalls
Initial pitfalls added: headline-rate gap, strict 0.4% chargeback ceiling, slow support, review-based payout pauses, non-refundable transaction fees on refunds, no PayPal/crypto, young track record / no SOC 2, sandbox↔production inconsistencies.
-
community
Initial community pulse written: praise for DX/OSS/pricing, criticism around support and stacked surcharges. Six threads cited from HN, dev.to, Trustpilot, Product Hunt.
-
trust_score
Initial overall trust score 72 (payout_reliability 75, account_stability 70, developer_experience 88, transparency 72, support_quality 55, track_record 58). DX pulls up; support and track record pull down.
-
integration_prompt
Initial stack-agnostic integration prompt written with Next.js helpers (@polar-sh/nextjs Checkout + Webhooks), Python SDK pattern, Standard Webhooks verification for Django, entitlements/benefits, usage billing, fee modeling, and common gotchas.
-
all
Initial gateway entry created via /add-payment-gateway Polar — full audit from scratch covering logo, pricing, availability, features, security, pitfalls, community, trust score, and integration prompt.
LearnWithHasan.com · Payment Gateway Index · No affiliate links · Builder-first