Payments
One payments plugin for Vendure: eleven payment systems — Stripe, Adyen, PayPal, Mollie, Square, Braintree, GoCardless, Checkout.com, crypto, bank transfer and pay-later — behind a single contract, with a hosted checkout page, wallets, 3-D Secure, captures, refunds, disputes, saved cards, subscriptions, pay-by-link, routing and one ledger.
What it does
Built for production from day one.
Vendure ships a Stripe plugin, a Mollie plugin and a Braintree plugin, each with its own shape, its own gaps and no view across them. Payments gives you four providers behind one contract: the storefront asks which to offer and gets a session; the provider's client renders cards, Apple Pay, Google Pay, iDEAL, Klarna and the rest; the plugin verifies the result with the provider before Vendure records the payment. Manual capture, partial captures and refunds work the same way on every provider. Webhooks are signature-checked and idempotent, disputes land in the ledger and alert ops, signed-in customers can save a card, any product variant can become a subscription (billed natively by Stripe, PayPal or Mollie, or by the plugin's scheduler from an Adyen token), and any unpaid order can be settled by a payment link. Provider order, fallback on decline, eligibility rules and surcharges are per channel. Everything lands in one ledger with a dashboard under Sales → Payments.
Hosted checkout page
One mutation and a redirect. The plugin serves a branded payment page that lists every enabled method, drives each provider's own client (Stripe Payment Element, Adyen Drop-in, PayPal buttons, Square, Braintree, hosted redirects, bank-transfer instructions) and sends the customer back to your storefront paid. No provider code in your storefront at all.
Eleven payment systems, one contract
Stripe, Adyen, PayPal, Mollie, Square, Braintree, GoCardless, Checkout.com, Coinbase Commerce (crypto), bank transfer and pay-later / invoice — all as Vendure payment method handlers with the same capture, refund, webhook, ledger and admin behaviour. Connect any of them from the Payments page: paste the keys, the plugin checks them, sets up the webhook and creates the method.
Wallets and local methods included
Apple Pay, Google Pay, Link, iDEAL, Bancontact, Klarna, SEPA, PayPal, Venmo and Pay Later — whatever each provider enables shows up in its hosted element with 3-D Secure handled by the provider.
Verified server-side
The storefront never decides a payment state. The plugin re-reads the intent, session or order from the provider and checks amount, currency and order code before addPaymentToOrder.
Capture control
Automatic or manual capture per method, partial captures, cancels, full and partial refunds — all from the normal Vendure order and refund screens.
Signed, idempotent webhooks
Stripe signatures, Adyen HMAC, PayPal verification, Square and Checkout.com HMAC, GoCardless and Coinbase signatures, Mollie fetch-back. Duplicate deliveries are ignored; payments, refunds and subscriptions are updated; a webhook log shows every delivery.
Disputes
Chargebacks and reversals from any provider land in the ledger with their reason and alert ops by webhook or email.
Saved cards
Stripe Customers and Adyen stored payment methods for signed-in customers, listed and removed through the shop API.
Subscriptions
Set a billing interval on any product variant. The order charges the first period; Stripe, PayPal and Mollie bill natively, Adyen renewals are charged by the plugin from the stored card. Dunning, MRR, customer self-service cancel, admin pause / resume / cancel.
Pay by link
One click creates a provider-hosted payment link for any unpaid order — draft orders, accepted quotes, phone orders — and the webhook settles it.
Routing, rules and surcharges
Provider order per channel with fallback on decline, an eligibility checker (amount band, currencies, countries, customer groups, signed-in only) for any payment method, and optional per-provider surcharges.
One ledger, one dashboard
Authorisations, captures, refunds, disputes, failures, renewals and pay-links by provider and day, success rate, subscriptions and settings under Sales → Payments. Light and dark themes.
No SDKs, PostgreSQL ready
Each provider is a handful of REST calls on the platform fetch; tables are created on boot on MySQL, MariaDB and PostgreSQL.
MySQL, MariaDB & PostgreSQL
The plugin follows whatever database your Vendure `dbConnectionOptions` use — no configuration. Verified against PostgreSQL 17; MySQL/MariaDB installs are unchanged.
Buy & activate from the admin
Start the 14-day free trial, subscribe or buy lifetime from the plugin's admin page — checkout opens in a new tab and the key installs itself within a minute, renewals included. The same card shows your plan, first-charge date and a <strong>Manage billing</strong> link to the Stripe portal (update card, cancel, switch plan). Already have a key? Paste it into the same banner. No `.env` edit, no redeploy; environment keys still take precedence for infrastructure-as-code setups.
One-click in-app updates
When a new version ships, an update banner shows current → latest with a What's-new link to the changelog. "Update now" installs the registry-verified release via your project's own package manager (yarn/npm/pnpm auto-detected) and gracefully restarts under pm2/systemd. Disable with `HULO_SELF_UPDATE=off`.
Install
Four steps, five minutes.
Add the package
Or run the one-line installer that does steps 1–3 for you:
Prefer to do it by hand?
Register it
In your vendure-config.ts:
Compile the admin UI
Add the extension to your compileUiExtensions call so the plugin's page appears in the admin:
Run the migration
The plugin registers its own entities. Generate and run the migration like any other:
That's it. Restart Vendure and the plugin's page is in the admin. Without a key it runs in the free tier; open the page and click Start 14-day free trial to switch everything on — the key installs itself, no .env edit, no redeploy.
Free tier vs licensed
Try the whole thing, keep the core for free.
Install without a key and everything on the left works indefinitely. The 14-day trial switches the right-hand column on with your real traffic; a licence keeps it on.
Free, no key
- Stripe: sessions, wallets, 3-D Secure, automatic or manual capture, refunds, disputes, signed webhooks
- Bank transfer and pay-later / invoice methods
- The hosted checkout page
- The payments ledger, dashboard and webhook log
- The hulo-payment-rules eligibility checker
Trial + licensed
- Adyen, PayPal, Mollie, Square, Braintree, GoCardless, Checkout.com and Coinbase Commerce
- Subscriptions and the renewal scheduler
- Saved cards and pay-by-link
- Provider routing, fallback on decline and surcharges
HTTP endpoints
Every route exposed.
/hulo-payments/pay/:tokenPublic: the hosted checkout page for one order/hulo-payments/webhook/:providerProvider webhooks (stripe, adyen, paypal, mollie, square, gocardless, checkout-com, coinbase)/hulo-payments/dashboardAdmin: KPIs by provider and day, subscriptions/hulo-payments/transactionsAdmin: the ledger, filterable/hulo-payments/providersAdmin: configured methods, capabilities, webhook URLs/hulo-payments/subscriptionsAdmin: subscriptions (cancel / pause / resume actions)/hulo-payments/pay-linkAdmin: payment link for an unpaid order (licensed)/hulo-payments/settingsAdmin: routing, surcharges, ops per channelhuloHostedCheckoutShop: URL of the hosted checkout page for the active orderhuloPaymentProvidersShop: providers to offer for the active orderhuloCreatePaymentSessionShop: client secret / session / checkout URLhuloMySubscriptionsShop: the customer's subscriptions (+ cancel)/payments/licence/statusAdmin: licence + evaluation + update status/payments/licence/activateAdmin: activate a licence key from the admin UI/payments/update/runAdmin: one-click in-app update + graceful restartFAQ
Common questions.
How do I get a licence key?
Buy here — Stripe Checkout — monthly, annual (two months free) or lifetime. You'll receive the JWT key by email. Paste it into the plugin's admin settings (Activate) — no redeploy — or set it as HULO_LICENCE_KEY_PAYMENTS in your .env if you prefer config-as-code; the env key wins when both are present.
Does it work without a key?
Yes — every subscription starts with a 14-day free trial. Install the plugin, open its admin page and click Start 14-day free trial: a card is required, nothing is charged until day 15, and you can cancel any time before then. The licence installs itself and every premium feature is on for the whole trial with your real traffic.
Which databases are supported?
MySQL, MariaDB and PostgreSQL (verified against PostgreSQL 17). The plugin follows your Vendure dbConnectionOptions automatically — there is nothing to configure.
How do updates work?
The plugin checks the npm registry daily. When a newer version exists, the admin dashboard shows an update banner with a What's-new link to the changelog and an "Update now" button that installs the registry-verified release via your own package manager and gracefully restarts under your process supervisor. Prefer manual control? Copy the install command instead, or set HULO_SELF_UPDATE=off.
Where is data stored?
In your Vendure database. The plugin adds its own tables (created on boot, or via a migration for the plugins that register entities) — your data never leaves your server.
Will it survive a Vendure upgrade?
Tested against Vendure >=3.5.0 <4.0.0 — 3.5, 3.6 and 3.7 are all covered by CI. A boot-time compatibility check emits a non-fatal warning if @vendure/core is outside that range, so upgrades to a future 3.x are safe to try. The 4.0 line will be tested and re-declared once its changelog lands.
Ready to ship?
Install in five minutes, run the trial on real traffic, keep it if it earns its place.