Accept credit cards, digital and buy now pay later
Get access to 50+ payment options for online and in-store payments.
Donโt have an account with Pay. yet? Register now!
[!CAUTION] If you have subscribers listening to the event, update them to listen to the event instead. See below.
[!WARNING] This plugin creates orders in Medusa immediately, even if the payment has not yet been captured. If a payment expires, the associated order will be automatically canceled.
This change in flow is required to support asynchronous payment methods (e.g., SprayPay), where payment confirmation can take hours depending on customer input.
Visit the demo store here: https://pay-demo.webbers.com
Payment Method | Region(s) |
|---|---|
| iDEAL | ๐ณ๐ฑ Netherlands |
| Bancontact | ๐ง๐ช Belgium |
| Vipps | ๐ณ๐ด Norway ๐ธ๐ช Sweden |
| Bizum | ๐ช๐ธ Spain |
| Payconiq | ๐ง๐ช Belgium ๐ฑ๐บ Luxembourg |
| Twint | ๐จ๐ญ Switzerland |
| MB Way | ๐ต๐น Portugal |
| Pay By Bank | ๐ง๐ช Belgium ๐ฉ๐ช Germany ๐ฎ๐น Italy ๐ฑ๐บ Luxembourg ๐ณ๐ฑ Netherlands ๐ช๐ธ Spain |
| WeChat Pay | ๐จ๐ณ China |
Payment Method | Region(s) |
|---|---|
| Alipay Plus | ๐จ๐ณ China ๐ญ๐ฐ Hong Kong |
| MultiBanco | ๐ต๐น Portugal |
| Swish | ๐ธ๐ช Sweden |
| Satispay | ๐ฎ๐น Italy |
| Blik | ๐ต๐ฑ Poland |
| EPS | ๐ฆ๐น Austria |
| Przelewy24 | ๐ต๐ฑ Poland |
| MobilePay | ๐ฉ๐ฐ Denmark ๐ซ๐ฎ Finland |
Would you like to integrate Pay. (Soft)P0S? Get in touch!
pnpm add @webbers/pay-payments-medusaAdd the provider to the module in your file & add it as plugin:
1module.exports = defineConfig({2 projectConfig: {3 // ...4 },5 plugins: [6 // ... other plugins7 '@webbers/pay-payments-medusa'8 ],9 modules: [10 // ... other modules11 {12 resolve: "@medusajs/medusa/payment",13 options: {14 providers: [15 {16 resolve: "@webbers/pay-payments-medusa/providers/pay",17 id: "pay",18 options: {19 paymentDescription: "Your description", // optional20 atCode: process.env.PAY_AT_CODE,21 apiToken: process.env.PAY_API_TOKEN,22 slCode: process.env.PAY_SL_CODE,23 slSecret: process.env.PAY_SL_SECRET,24 returnUrl: process.env.PAY_RETURN_URL,25 testMode: process.env.PAY_TEST_MODE === 'true',26 tguApiUrl: process.env.PAY_TGU_API_URL, // defaults to https://connect.pay.nl/v127 otherSlCodes: process.env.PAY_OTHER_SL_CODE ? JSON.parse(process.env.PAY_OTHER_SL_CODE) : undefined,28 },29 },30 ]31 }32 }33 ]34})[!NOTE] You can get the API token & secret from your Pay dashboard: click Settings > Click sales channel > Copy api tokens
| Option | Description | Default |
|---|---|---|
| Your Pay AT code | Required | |
| Your Pay API token | Required | |
| Your Pay sales channel code | Required | |
| Your Pay sales channel secret | Required | |
| The URL to return to after payment | Required | |
| The URL of your Medusa server | Required | |
| Whether to enable test payments | Optional | |
| Pay TGU API Url | Optional, use if you want to use a specific or private TGU, see here. | |
| Your other Pay sales channel code and secrets | Optional, used for webhook signature validation when using multiple Pay. sales channels. Format |
Create or update your file with the following variables:
1PAY_AT_CODE="<your-pay-at-code>"2PAY_API_TOKEN="<your-pay-api-token>"3PAY_SL_CODE="<your-pay-sl-code>"4PAY_SL_SECRET="<your-pay-sl-secret>"5#PAY_TEST_MODE="true"6PAY_EXCHANGE_URL="https://your-store.com/checkout/payment"Once installed and configured, the Pay payment methods will be available in your Medusa admin. To enable them, log in to you Medusa Admin, browse to Settings > Regions, add or edit a region and select the desired Pay providers from the dropdown.
Make sure that the selected payment methods are enabled in your Pay origanization settings as well.
The plugin currently supports the following Pay payment methods:
Payment Method | Provider ID |
|---|---|
| Pay. hosted checkout | |
| Creditcards Mastercard / VISA / American Express/ Carte Bancaire / Maestro / PostePay / DanKort / Nexi / Visa Mastercard | |
| Card-on-file / recurring card payments (tokenisation) | Coming soon |
| Apple Pay | |
| Google Pay | |
| iDEAL IN3 | |
| Billink | |
| SprayPay | |
| Riverty | |
| Mondu | |
| AlmaPAY | |
| Klarna | |
| PayPal | |
| SEPA Direct Debit | |
| iDEAL | |
| Bancontact | |
| Vipps | Get in touch |
| Bizum | Get in touch |
| Payconiq | |
| Twint | |
| MB Way | Get in touch |
| Pay by Bank | |
| WeChat Pay | |
| AliPay Plus | Get in touch |
| MultiBanco | Get in touch |
| Swish | Get in touch |
| Satispay | Get in touch |
| Blik | |
| EPS | |
| Przelewy24 | |
| MobilePAY | |
| SoftPOS | |
| Gift Card |
To integrate with your storefront, you'll need to implement the payment flow according to Pay's and Medusa's documentation. Here's a basic example:
Example integration using the Medusa Next.js Starter:
https://github.com/user-attachments/assets/742ee261-5e41-4e33-9a72-faf1a424fc52
[!TIP] Use the duplicate cart endpoint in your storefront
When a customer cancels a payment or returns to the storefront without completing the Pay. checkout, a new duplicate cart should automatically be created. This allows the customer to easily start a new transaction without losing the items they had selected.
API Route:
Alter your storefront retrieve cart function(s) and check if the returned cart.completed_at value is set. If so request a new cart with the duplicate cart endpoint and update cart id in cookies accordingly.
The duplicate cart endpoint is idempotent, so it can be called multiple times with the same cart id.
To add one of the missing Pay payment methods, create a new service in that extends the class:
1import {PaymentMethod} from "@Pay/api-client";2import PayBase from "../core/Pay-base";3import {PaymentOptions, PaymentProviderKeys} from "../types";4
5class PayNewMethodService extends PayBase {6 static identifier = "Pay-new-method";7
8 get paymentCreateOptions(): PaymentOptions {9 return {10 method: PaymentMethod.newMethod,11 };12 }13}14
15export default PayNewMethodService;Make sure to replace with the actual Pay payment method ID.
Export your new service from . Then add your new service to the list of services in .
We will be working on providing all the available Pay. options in the near future.
Searching for support for Medusa v1, we have a legacy plugin available. Get in touch