Paddle
Merchant of Record payment platform for SaaS companies. Paddle handles all global tax compliance, VAT, and sales tax automatically — you never touch tax complexity.
Proprietary
TypeScript / Python
Why Paddle?
SaaS selling globally and needing automatic tax compliance
You want a MoR to handle legal/tax liability
Subscription billing with complex proration logic
Signal Breakdown
What drives the Trust Score
Download Trend
Last 12 months
Tradeoffs & Caveats
Know before you commitUS-only business where Stripe's simplicity wins
Marketplaces (Stripe Connect is better)
You need maximum payment method coverage
Pricing
Free tier & paid plans
No monthly fee
5% + $0.50 per transaction
Higher per-transaction than Stripe but includes tax handling
Alternative Tools
Other options worth considering
The gold standard for payments infrastructure. Handles subscriptions, one-time charges, invoicing, tax, and fraud detection. Used by millions of businesses globally — the default choice.
Often Used Together
Complementary tools that pair well with Paddle
Learning Resources
Docs, videos, tutorials, and courses
Get Started
Repository and installation options
View on GitHub
github.com/PaddleHQ/paddle-node-sdk
npm install @paddle/paddle-node-sdkpip install paddle-python-sdkQuick Start
Copy and adapt to get going fast
import { Paddle } from '@paddle/paddle-node-sdk';
const paddle = new Paddle(process.env.PADDLE_API_KEY);
const transaction = await paddle.transactions.create({
items: [{ priceId: 'pri_01abc', quantity: 1 }],
customerId: 'ctm_01xyz',
});Code Examples
Common usage patterns
Create subscription
Set up recurring billing
const subscription = await paddle.subscriptions.create({
customerId: 'ctm_01xyz',
items: [{ priceId: 'pri_monthly_pro', quantity: 1 }],
prorationBillingMode: 'prorated_immediately',
});Webhook handling
Process Paddle webhook events
const paddleSignature = req.headers['paddle-signature'];
const event = paddle.webhooks.unmarshal(req.rawBody, process.env.PADDLE_WEBHOOK_SECRET, paddleSignature);
if (event.eventType === 'subscription.activated') {
await db.users.update({ paddleSubId: event.data.id }, { where: { id: event.data.customData.userId } });
}Community Notes
Real experiences from developers who've used this tool