I've built on PayPal, and I avoid it whenever I can. For a company of that size, the developer experience was shockingly poor. The documentation sent me in circles between products and generations of APIs, and every step took longer than it should have. Stripe does the same jobs with an API that's a pleasure to use, documentation that tells the truth, and more features. In Australia it's cheaper too.
To be fair, PayPal has improved since I last built on it. It has new server-side SDKs, it has deprecated the old APIs in favour of REST v2, and it ships an MCP server for agents. It's still fragmented, and Stripe still leads by a wide margin.
But PayPal isn't irrelevant, and it would be dishonest to say so. Two things keep it in the game.
Reach. Hundreds of millions of people already have a PayPal account with money or a card in it, and some of them will only pay that way. If your customers expect the button, you add it beside Stripe. In Australia that means running PayPal alongside Stripe: Stripe processes PayPal itself only in Europe.
Paying people. That's why I used it. On a platform that paid a crowd of workers about 20 cents per task, in many countries, PayPal Payouts was the only practical way: money sent to an email address, to people who already had an account, with no onboarding. Stripe Connect charges A$0.25 per payout plus identity checks on every recipient, which is more than the payment itself.
So it's choose your poison. You accept the developer experience and the risk of a frozen account in exchange for reach Stripe can't give you. Take that trade only when you need it, and never make PayPal the only way money moves through your business.
Use it when
- Your customers expect a PayPal button, and losing them costs more than the integration. Its moat is reach: about 439 million accounts that already hold a balance or a saved card.
- Paying many people small amounts: Payouts sends money to an email address or phone number in 96 countries, with no onboarding for the person paid. Stripe has nothing equivalent for that job in Australia.
Don't use it when
- As your main payment processor. Stripe is cheaper in Australia (1.65% + A$0.30 domestic), and better to build on in every way that matters.
- When a frozen balance would stop the business. PayPal can limit an account or hold a reserve on criteria it doesn't disclose.
- Subscriptions, invoices or usage-based billing: Stripe does them better, with fewer moving parts.
Pricing
Australia: 2.90% + A$0.30 per domestic payment, plus 1% from overseas, and a 3–4% spread on currency conversion. Payouts: 2% per payment, capped at A$1.25 domestic and A$60 international. Micropayments pricing (under A$10, by application): 5% + A$0.05.
In my words: what hurts
- Its documentation is spread across products, generations and sites. A search often lands on a legacy API, and a link can go nowhere.
- Product sprawl: Checkout, Braintree, Payouts, legacy Website Payments Standard, IPN, v1 and v2 REST APIs. Knowing which one you should be on is half the work.
Gotchas, with fixes
Gotcha: Tutorials and old answers point to IPN, Website Payments Standard and the v1 Payments API, which are all deprecated.
Fix: Build only on the REST v2 APIs (Orders v2, Payments v2) with webhooks, and verify every webhook with PayPal's verify-webhook-signature call.
Gotcha: A payout isn't done when the API answers. The batch completes later, and an item sent to an email with no PayPal account sits unclaimed, then comes back to you.
Fix: Give every batch a sender_batch_id (a retry with the same id is rejected as a duplicate for 30 days), process the item-level webhooks, and reconcile unclaimed items on a schedule.
Gotcha: PayPal can limit an account or hold part of your balance in reserve, and appeals are slow. A frozen balance stops your payouts too.
Fix: Withdraw the balance regularly, keep business and identity details current before large batches, and keep a second processor ready to switch to.
Gotcha: Automatic currency conversion costs 3–4% above the base rate.
Fix: Hold balances in the currencies you pay out in, and set the account to accept foreign currencies instead of converting them on arrival.
Provisioning
No provider · No Terraform provider
Nothing to provision: apps, webhooks and API credentials are set up in the developer dashboard.
Use instead
Stripe for taking payments; add PayPal beside it only when your customers expect it, or when you must pay many people small amounts.
Alternatives
- Stripe Taking payments: cheaper in Australia, a better API, test mode, a CLI and webhooks that behave as documented.
Worked examples
Where it fits
- Running the business: Don't.
Not as the payment processor: the build is slower, it costs more in Australia, and an account can be frozen. Add it beside Stripe only when customers expect the button, or to pay many people small amounts.
Instead: Stripe
Sources
- PayPal Australia: business fees
- PayPal: Payouts
- PayPal: migrate from Payments v1 to v2
- PayPal: server-side SDKs
- PayPal: MCP server
- PayPal second-quarter 2026 results (active accounts)
- Stripe: PayPal as a payment method (Europe only)
Last reviewed by Nicolas Dao