Skip · PayPal · Wallet checkout and mass payouts

PayPal

Painful to build on. Use it for its reach, or to pay people, never as your default.

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

Last reviewed by Nicolas Dao

Want this stack in your AWS account?

Cloudless Labs is a Sydney consultancy. We migrate on-premises systems to AWS, build serverless apps on this stack, and coach teams to ship with Claude Code and Codex.

Contact Us

For general inquiries, please contact us at:

For e-learning capabilities, please contact: