Hulo Global
Plugins Roadmap

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.

Submitted to the Vendure plugin directoryVendure 3.5 – 3.7MySQL · MariaDB · PostgreSQLAGPL source + commercial licence

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:

curl -sSL https://huloglobal.com/vendure-plugins/payments/install.sh | bash

Prefer to do it by hand?

yarn add @huloglobal/vendure-plugin-payments # or npm install @huloglobal/vendure-plugin-payments # or pnpm add @huloglobal/vendure-plugin-payments

Register it

In your vendure-config.ts:

# vendure-config.ts import { HuloPaymentsPlugin } from '@huloglobal/vendure-plugin-payments'; export const config: VendureConfig = { plugins: [ HuloPaymentsPlugin.init({ publicBaseUrl: 'https://shop.example.com', licenceKey: process.env.HULO_LICENCE_KEY_PAYMENTS, }), // ... your other plugins ], };

Compile the admin UI

Add the extension to your compileUiExtensions call so the plugin's page appears in the admin:

// compile-admin-ui.ts import { compileUiExtensions } from '@vendure/ui-devkit/compiler'; import { HuloPaymentsPlugin } from '@huloglobal/vendure-plugin-payments'; compileUiExtensions({ outputPath: path.join(__dirname, 'admin-ui'), extensions: [HuloPaymentsPlugin.uiExtensions], });

Run the migration

The plugin registers its own entities. Generate and run the migration like any other:

yarn migration:generate AddHuloPaymentsPluginTables yarn migration:run

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
Start 14-day free trial →

HTTP endpoints

Every route exposed.

GET/hulo-payments/pay/:tokenPublic: the hosted checkout page for one order
POST/hulo-payments/webhook/:providerProvider webhooks (stripe, adyen, paypal, mollie, square, gocardless, checkout-com, coinbase)
GET/hulo-payments/dashboardAdmin: KPIs by provider and day, subscriptions
GET/hulo-payments/transactionsAdmin: the ledger, filterable
GET/hulo-payments/providersAdmin: configured methods, capabilities, webhook URLs
GET/hulo-payments/subscriptionsAdmin: subscriptions (cancel / pause / resume actions)
POST/hulo-payments/pay-linkAdmin: payment link for an unpaid order (licensed)
GET/hulo-payments/settingsAdmin: routing, surcharges, ops per channel
GQLhuloHostedCheckoutShop: URL of the hosted checkout page for the active order
GQLhuloPaymentProvidersShop: providers to offer for the active order
GQLhuloCreatePaymentSessionShop: client secret / session / checkout URL
GQLhuloMySubscriptionsShop: the customer's subscriptions (+ cancel)
GET/payments/licence/statusAdmin: licence + evaluation + update status
POST/payments/licence/activateAdmin: activate a licence key from the admin UI
POST/payments/update/runAdmin: one-click in-app update + graceful restart

FAQ

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.