One payments plugin for Vendure. Stripe, Adyen, PayPal, Mollie, Square, Braintree, GoCardless, Checkout.com, Coinbase Commerce, bank transfer and pay-later behind a single contract, so every provider gets the same features and every payment lands in the same ledger:
Hosted checkout page — one mutation and a redirect; the plugin's own page shows every enabled method, drives each provider's client and brings the customer back paid. Nothing provider-specific in your storefront.
Hosted / embedded sessions — Stripe Payment Element, Adyen Drop-in, PayPal buttons, Mollie hosted checkout; cards, Apple Pay, Google Pay, Link, iDEAL, Klarna, Bancontact, SEPA and whatever the provider enables. 3-D Secure / SCA handled by the provider.
Server-side verification — the storefront never decides a payment
state; the plugin re-reads the intent / session / 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 from the normal Vendure refund flow.
Signed, idempotent webhooks — Stripe signatures, Adyen HMAC (+ basic auth), PayPal signature verification, Mollie fetch-back. Duplicate deliveries are ignored; results update Vendure payments and refunds.
Disputes — chargebacks land in the ledger and alert ops.
Saved cards — Stripe Customers and Adyen stored payment methods for signed-in customers; list and remove from the shop API.
Subscriptions — mark any product variant as billed daily / weekly / monthly / yearly (with a trial); the order charges the first period, then Stripe, PayPal and Mollie bill natively and Adyen renewals are charged by the plugin's scheduler from the stored card. Customers see and cancel their subscriptions through the shop API; admins pause, resume, cancel and see MRR.
Pay by link — one click in the admin creates a provider-hosted payment link for any unpaid order (draft orders, accepted quotes, phone orders); 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) usable on any payment method, and optional per-provider surcharges.
Ledger + dashboard — authorisations, captures, refunds, disputes, failures, renewals and pay-links by provider and day, success rate, webhook deliveries, subscriptions, settings — under Sales → Payments.
Works on MySQL, MariaDB and PostgreSQL. No provider SDKs: each provider is
a few REST calls on the platform fetch.
Then open Sales → Payments → Providers and click Connect on a provider: paste the keys from its dashboard (linked from the card), click Test connection to see which account they belong to, then Connect. The plugin verifies the keys with the provider, registers the webhook itself (Stripe, PayPal, and Adyen when the credential has the Management API webhook role), stores the signing secret, and creates the Vendure payment method on the channel you chose — nothing to copy back by hand. Mollie needs no webhook setup at all.
Prefer the standard route? Settings → Payment methods → Create and pick
the handler HULO Payments — Stripe / Adyen / PayPal / Mollie; every field
explains where to find its value. Tables are created on boot; the only
migration is Vendure's own for the three subscription custom fields on
ProductVariant (npx vendure migrate on installs that use migrations).
The simplest integration is the hosted page:
For an embedded checkout, drive the providers yourself:
| Provider | Client library | metadata for addPaymentToOrder |
|---|---|---|
| Stripe | @stripe/stripe-js Payment Element with clientSecret | { paymentIntentId } |
| Adyen | @adyen/adyen-web Drop-in with sessionId + sessionData, clientKey, environment | { sessionId, sessionResult } from onPaymentCompleted |
| PayPal | @paypal/paypal-js buttons with createOrder: () => sessionId | { paypalOrderId } |
| Mollie | redirect to checkoutUrl; on return | { molliePaymentId } (the sessionId) |
| Square | Web Payments SDK with config.applicationId / locationId | { sourceId } (the card token) |
| Braintree | Drop-in with clientSecret as the authorization | { nonce, deviceData } |
| GoCardless | redirect to checkoutUrl; on return | { billingRequestId } (the sessionId) |
| Checkout.com | redirect to checkoutUrl; on return | { sessionId } |
| Coinbase Commerce | redirect to checkoutUrl; on return | { chargeCode } (the sessionId) |
| Bank transfer / pay later | show instructions | {} |
Also available: huloSavedPaymentMethods, huloRemoveSavedPaymentMethod,
huloMySubscriptions, huloCancelSubscription(id, atPeriodEnd),
huloApplyPaymentSurcharge(methodCode).
Set Subscription billing interval (and optionally every N intervals
and free trial days) on a product variant. Its price is the price per
period. When an order containing it is paid through a HULO method the
plugin creates the subscription with the provider (or schedules it itself
for Adyen), records renewals in the ledger, alerts on failed renewals and
cancels after the configured number of failed daily attempts. PayPal
subscriptions need one customer approval; the approval link is exposed on
huloMySubscriptions and in the admin.
| Free tier | Licensed |
|---|---|
| Stripe: sessions, wallets, 3-D Secure, automatic/manual capture, refunds, disputes, signed webhooks; bank transfer; pay later | Adyen, PayPal, Mollie, Square, Braintree, GoCardless, Checkout.com, Coinbase Commerce |
| Hosted checkout page | |
| Ledger, dashboard, webhook log | Subscriptions and the renewal scheduler |
hulo-payment-rules eligibility checker | Saved cards, pay-by-link, provider routing, surcharges |
Unlicensed installs run everything for 14 days; the trial (card required, nothing charged until day 15) and the licence are bought from the admin banner. Details and pricing: https://huloglobal.com/vendure-plugins/payments/
Stripe payment_intent.succeeded / amount_capturable_updated / payment_failed / canceled, charge.refunded, charge.refund.updated, charge.dispute.created / closed, checkout.session.completed, invoice.paid / payment_failed, customer.subscription.updated / deleted / paused.
Adyen AUTHORISATION, CAPTURE, CAPTURE_FAILED, CANCELLATION, REFUND, REFUND_FAILED, CHARGEBACK, NOTIFICATION_OF_CHARGEBACK, CHARGEBACK_REVERSED, RECURRING_CONTRACT.
PayPal CHECKOUT.ORDER.APPROVED, PAYMENT.CAPTURE.*, PAYMENT.AUTHORIZATION.*, CUSTOMER.DISPUTE.*, BILLING.SUBSCRIPTION.*, PAYMENT.SALE.COMPLETED.
Mollie: every payment webhook (status, refunds, chargebacks, subscription payments).
All notable changes to @huloglobal/vendure-plugin-payments are
documented here. The format follows
Keep a Changelog and this project
adheres to semantic versioning.
vendureOrderId stamp) are acknowledged and ignored instead of being applied to the order; the plugin never adds a payment to an order that already carries another method's payment.POST /hulo-payments/methods { provider, channelId } behind it (admin, CreatePaymentMethod), idempotent per provider and channel.huloHostedCheckout(methodCode): the storefront can preselect one of the enabled methods, so a "Pay with PayPal" button opens the hosted page straight on PayPal. Without it the page opens on the first method in the channel's order, as before.?tab= and ?connect=<provider> deep links.huloHostedCheckout(returnUrl) returns a URL the storefront redirects to; the page shows every enabled method in the channel's preferred order, drives each provider's own client (Stripe Payment Element, Adyen Drop-in, PayPal buttons, Square Web Payments, Braintree Drop-in, hosted redirects, bank-transfer instructions), records the payment and sends the customer back with ?order=&result=. No provider code in the storefront. Branding (name, colour, logo) per channel in Settings./hulo-payments/webhook/<provider>, updating payments, refunds and subscriptions; disputes recorded and alerted.hulo-payment-rules eligibility checker, optional surcharges.