Providers
The gateways with a built-in driver — what each one accepts, how its webhooks are authenticated, what externalReference maps to, and which operations it simply does not expose.
Every built-in driver speaks the same PaymentsDriver contract — charge, refund,
createSubscription, parseWebhook, … — so your services never learn a gateway's shape.
What the drivers cannot do is make the gateways identical: one settles cards worldwide,
another only moves Pix; one deduplicates on a header, another on a field in the body; one
has no subscription-update endpoint at all.
These pages are the per-gateway cheat sheet for exactly those differences.
Using one gateway? Pick it at the top of the page and this page highlights what yours sends.
What each one does
| Gateway | Methods | Charge | Refunds | Subscriptions | Invoices | Disputes | Webhook auth | Card tokenization |
|---|---|---|---|---|---|---|---|---|
| AbacatePay | pix, boleto, any | server | ✅ | ✅ | ✅ | — | ✅ | — |
| Adyen | credit card, any | server | ✅ | — | — | — | ✅ | — |
| Asaas | pix, boleto, credit card, debit card, any | server | ✅ | ✅ | ✅ | — | ✅ | ✅ |
| Dodo Payments | credit card, debit card, pix, upi, wallet, bank transfer, bank debit, bnpl, any | server | ✅ | ✅ | ✅ | — | ✅ | — |
| Efí | pix | server | ✅ | — | — | — | — | — |
| InfinitePay | pix, credit card | checkout only | — | — | — | — | — | — |
| Lemon Squeezy | any | checkout only | ✅ | ✅ | ✅ | — | ✅ | — |
| Mercado Pago | pix, boleto, credit card, debit card | server | ✅ | ✅ | — | — | ✅ | — |
| Mollie | credit card, bank transfer, bank debit, wallet, bnpl, voucher, any | server | ✅ | ✅ | — | — | ✅ | — |
| Paddle | any | checkout only | ✅ | ✅ | ✅ | — | ✅ | — |
| Pagar.me | pix, boleto, credit card, debit card | server | ✅ | ✅ | ✅ | — | ✅ | — |
| PagBank | pix, credit card, debit card, boleto | server | ✅ | — | — | — | ✅ | — |
| PayPal | wallet, any | server | ✅ | ✅ | — | — | ✅ | — |
| Polar | credit card, any | checkout only | ✅ | ✅ | ✅ | — | ✅ | — |
| Razorpay | any | server | ✅ | ✅ | ✅ | — | ✅ | — |
| Square | credit card, debit card, wallet, bank debit, bnpl, any | server | ✅ | ✅ | ✅ | — | ✅ | — |
| Stripe | pix, credit card, boleto, any | server | ✅ | ✅ | ✅ | ✅ | ✅ | — |
| Woovi (OpenPix) | pix, any | server | — | ✅ | — | — | ✅ | — |
"Any" means the gateway decides at its own checkout — set method on the charge only when the
driver lists a specific one. A dash is not a missing feature to add later: it is an endpoint the
gateway does not expose, and the driver refuses the call rather than reporting a change that never
happened.
Charge is the column to read first. server means you can create a payment from your own
backend; checkout only means the gateway collects through its own hosted page and charge()
throws — every other column on that row is reached through createCheckout() instead.
When it is a dash
A refusal is not a dead end. Each gap has a way through it that does not involve forking the driver, and the error the driver throws names it — these are the same routes, collected:
| Gap | Gateways | What happens if you call it | What to do instead |
|---|---|---|---|
| Server-side charge | InfinitePay, Lemon Squeezy, Paddle, Polar | charge() throws — as merchants of record (or, for InfinitePay, a payment-link product) they collect through their own hosted page | createCheckout() and redirect the payer; the payment still reaches you as a webhook, and the billing tables fill from it the same way. There is no server-side charge for invoice: true to attach to |
| Refunds | InfinitePay, Woovi | refund() throws — neither gateway exposes one | Move the money out-of-band (a Pix transfer, the gateway's own app), then record it and revoke access in your tables: no webhook is coming. See Recovering |
| Subscriptions | Adyen, Efí, InfinitePay, PagBank | createSubscription() throws, naming that gateway's reason | Charge each cycle from your own scheduler — Adyen tokenizes (storePaymentMethod: true, then charge({ paymentMethodId })); or name a different provider for that one call. See Subscriptions |
| Invoices | Adyen, Efí, InfinitePay, Mercado Pago, Mollie, PagBank, PayPal, Woovi | listing the gateway's invoices throws — most have no invoice resource at all, and Mollie's is one, for the fees it bills you | Nothing to work around — this column is about the gateway's own invoice resource, not about emitting one. invoice: true on a charge goes through the configured invoice provider, and works on every gateway that charges server-side — dash in this column included. See Invoices |
| Disputes | every gateway but Stripe | findDispute / submitDisputeEvidence are omitted from the driver — so the call site writes ?. — except Adyen, which defines both and throws with the reason | No dispute events will arrive — a chargeback reaches you as an email from the gateway. Reconcile from its console, and keep the money-out path (revoke, refund) independent of the dispute one. See Disputes |
| Webhook auth | Efí, InfinitePay | nothing — these gateways sign nothing, so the driver declares 'unsupported' and there is no boot refusal to satisfy | Put the authenticity in front of the app: an IP allowlist, mTLS, or a secret in the path. The endpoint is otherwise open to anyone who knows the URL. See Configuration |
The gateway is a per-call argument, not a deployment decision
getPayments().driver('stripe') names a provider for one call, and the routing map binds a
method to a provider — so "this gateway cannot do subscriptions" costs you one argument, not a
migration. Keeping Pix on Asaas and cards on Stripe is the ordinary configuration, not an advanced
one.
What that does not do is move a payment between gateways after the fact: a subscription created at one gateway is updated and cancelled at that same gateway, and its webhooks arrive from there.
If none of the routes above fit, the driver contract is the last one: extend a bundled driver or write your own as a config factory — Custom providers.
Picking one
Three questions decide it, in this order:
- Which methods must you accept? A driver declares
supportedMethods, and routing a method a gateway does not support fails at the manager rather than at the gateway. A Pix-only provider will refuse a card before a request leaves your process. - Who is the merchant of record? Paddle, Lemon Squeezy, Polar and Dodo Payments sell on your behalf and handle sales tax; Stripe, Adyen and the Brazilian gateways leave that to you. This is a business decision the library cannot make and does not model — it only changes which driver you configure.
- What does it not do? The gap that hurts is never the feature list; it is the operation the API does not expose. Those are named on each page, and the driver throws rather than reporting a change the gateway never saw.
Routing picks the provider AND the method
payments.driver('pix') resolves which gateway handles Pix in your config, and hands back
that driver bound to pix — so a charge made through it is created as Pix without
repeating yourself. An explicit method on the charge still wins; routing is a default, not
an override.
driver() with no argument consults the routing map too. One method routed to the default
provider is bound; several is ambiguous, and charge()/createSubscription() refuse rather than
guessing which one you meant. See Routing.
Every one of these needs its webhook credential before it boots
Sixteen of the eighteen can authenticate a webhook delivery, and each declares whether it was given
what it needs to. A driver that can verify and has nothing configured refuses the boot: with nothing to check
against, POST /payments/webhook/<provider> would accept any body anyone posted to it.
Efí and InfinitePay are the two exceptions — their gateways sign nothing at all, so they declare
'unsupported' and there is no credential to forget. Each page names the config key and the env
fallback; Configuration
has the opt-out for a deployment that terminates verification upstream.
Nothing here is region-locked
The contract has no notion of a country: money is an integer in the currency's smallest unit, a payment method is a name a driver either supports or refuses, and a webhook is a signature to verify and an event to normalize. A euro-area card charge and a Brazilian Pix charge differ in which driver you route to — not in the code that calls it.
Multi-currency gateways take a required currency; the single-currency ones take no
such option, because there is nothing to choose. See Money.
Adding one that is not here
A driver is a config factory, not a fork: implement PaymentsDriver, hand it to
defineConfig, and every part of the library — routing, the billing layer, the webhook
ledger, the dashboard — works with it unchanged. See
Custom providers.
Configuration
The config/payments.ts reference — named providers built with lazy factories, method routing with capability checks, the invoice section, and the billing layer (who owns the schema, how a webhook is processed, where business handlers live).
Asaas
The Brazilian workhorse — Pix, boleto, card and debit, native recurring billing and NFS-e, with externalReference propagated to every installment.