---
title: "QuickPay Payments"
description: "QuickPay is a Danish payment service provider used widely across Denmark and the broader Nordic region."
url: "https://docs.j2commerce.com/v6/payment-methods/payment_quickpay"
markdown_url: "https://docs.j2commerce.com/v6/payment-methods/payment_quickpay.md"
last_updated: "2026-10-23T03:39:01+00:00"
version: "J2Commerce 6"
breadcrumbs:
  - title: "Home"
    url: "https://docs.j2commerce.com/"
  - title: "J2Commerce 6"
    url: "https://docs.j2commerce.com/v6"
  - title: "Payment Methods"
    url: "https://docs.j2commerce.com/v6/payment-methods"
  - title: "QuickPay Payments"
    url: "https://docs.j2commerce.com/v6/payment-methods/payment_quickpay"
---

# QuickPay Payments

QuickPay is a Danish payment service provider used widely across Denmark and the broader Nordic region. A single QuickPay account gives you Dankort (Denmark's national debit card), Visa, Mastercard, MobilePay, Vipps, Swish, Klarna, iDEAL, SOFORT, Trustly, Apple Pay, Google Pay, and a range of other regional methods without integrating each one separately.

## Requirements

- J2Commerce 6.0 or later installed and active
- Joomla 6.0 or later
- A QuickPay account (free to create; see below)
- Your site must be publicly reachable over HTTPS so QuickPay can deliver callback notifications

> **Info:** QuickPay uses **one** API host for both testing and production — there is no separate sandbox URL. The account you connect to (a test/demo account or your live merchant account) determines whether transactions are real. See [Set Up a QuickPay Account](https://docs.j2commerce.com/v6/payment-methods/payment_quickpay#set-up-a-quickpay-account) below.

## Set Up a QuickPay Account

If you already have a QuickPay account and API credentials, skip ahead to [Purchase and Download](https://docs.j2commerce.com/v6/payment-methods/payment_quickpay#purchase-and-download).

### Create a QuickPay Account

1. Go to [quickpay.net](https://quickpay.net) and sign up for an account.
2. Complete the onboarding steps — business details, address, and bank account information.
3. QuickPay reviews and activates your account before you can accept live payments. You can also request a free test/demo account to try the integration first.

### Get Your Credentials

All of your plugin credentials come from the **QuickPay Manager** (your account dashboard):

1. Log in to the [QuickPay Manager](https://manage.quickpay.net).
2. Note your **Merchant ID** — shown at the top of the QuickPay Manager.
3. Go to **Settings** -> **Users** (or **API keys**, depending on your account) to create an **API User** with a Payments-scoped key. This is your **API User Key**.
4. Go to **Settings** -> **Integration** to find your **Private Key** — used to verify that callback notifications really came from QuickPay.
5. If you plan to build a classic HTML Payment Window form instead of the default Payment Link flow, also note the **Agreement ID** and **Payment Window Key** from the same Integration page.

> **Tip:** Most stores only need the **Merchant ID**, **API User Key**, and **Private Key**. The **Payment Window Key** and **Agreement ID** are only required if you build a custom classic HTML payment form — the plugin's default Payment Link flow does not need them.

## Purchase and Download

This plugin is a separate add-on available from the [QuickPay](https://www.j2commerce.com/extensions/payment-plugins/quickpay). It is not included with the core J2Commerce 6 component.

**Step 1:** Go to the [J2Commerce website](https://www.j2commerce.com/extensions) **->** **Payment Plugins**

**Step 2:** Locate the **QuickPay** plugin **->** click **View Details** **->** **Add to Cart** **->** **Checkout**

**Step 3:** Go to **My Downloads** under your profile button at the top right corner. Click **Available Versions -> View Files -> Download Now**

## Install the Plugin

In the Joomla Administrator, go to **System** **->** **Install** **->** **Extensions**.

Upload the `plg_j2commerce_payment_quickpay.zip` ZIP file or use the Install from URL option.

![Joomla System Dashboard with System in the sidebar and the Install Extensions link highlighted to open the extension installer](https://docs.j2commerce.com/images/docs/shared/install.webp)

## Enable the Plugin

The plugin installs and enables itself automatically. No separate enable step is needed. However, it's important to know where to go to enable or disable it in the future.

There are **two** ways to reach the Payments list.

**Option A:** Go to the **J2Commerce** icon at the top right corner **-> Setup -> Payment Methods**

**Option B:** Go to **Components** on the left sidebar **-> J2Commerce -> Setup -> Payment Methods**

![J2Commerce Payment Methods list reached via Components > J2Commerce and the J2Commerce menu's Setup > Payment Methods, both highlighted, with 2Checkout listed](https://docs.j2commerce.com/images/docs/shared/culqi.webp)

To help you narrow down the list, you can do a search for **QuickPay**, click the **X,** and it will turn into a green checkmark. It is now enabled and ready for setup.

## Configure the Plugin

Click the **QuickPay** title next to the green checkmark to open settings.

> **Tip:** Click the **Toggle Inline Help** button at the top of any plugin screen to reveal a description below every field.

![Quickpay plugin edit screen with Toggle Inline Help highlighted and help text under Payment Option Title, Status Enabled, Access Public](https://docs.j2commerce.com/images/docs/shared/quickpay_toggle.webp)

### Display Settings

![Quickpay plugin, Plugin tab highlighted: an empty Payment Option Title field and the quickpay logo as Payment Image](https://docs.j2commerce.com/images/docs/shared/quickpay_display.webp)

**Payment Option Title** — The label shown to customers at checkout. Leave blank to use the default name "QuickPay."

**Payment Image** — An optional image shown alongside the payment option at checkout. Defaults to a bundled QuickPay checkout icon.

### Account Credentials

![QuickPay plugin account credentials: empty Merchant ID, API User Key, Payment Window Key, Agreement ID and Private Key fields](https://docs.j2commerce.com/images/docs/shared/quickpay_credentials.webp)

**Merchant ID** — Your QuickPay account/merchant number, shown in the QuickPay Manager.

**API User Key** — The server-side API User key used to authenticate REST API calls. QuickPay uses HTTP Basic authentication with a blank username and this key as the password.

**Payment Window Key** — The agreement API key used only if you build a classic HTML Payment Window form. Not required for the default Payment Link flow the plugin uses.

**Agreement ID** — The Payment Window agreement ID shown in the QuickPay Manager. Only needed alongside the Payment Window Key.

**Private Key** — Used to verify inbound QuickPay callback notifications (via the `QuickPay-Checksum-Sha256` header). Keep this value secret — anyone with it could forge payment notifications to your store.

> **Info:** There is no test/live toggle in this plugin. Whether transactions are real depends entirely on which QuickPay account (test/demo or live merchant account) the credentials above belong to.

### Auto-Capture

![QuickPay plugin settings: Auto-Capture Yes, Enabled Payment Methods Visa, Mastercard and Credit Card, Supported Currencies US Dollar (USD)](https://docs.j2commerce.com/images/docs/shared/quickpay_cc.webp)

**Auto-Capture** (default: **No**) — Controls whether an authorized payment is charged immediately or held for manual review:

| Setting | Behavior |
| --- | --- |
| **No** (default) | QuickPay authorizes the payment but does not take the money. You capture it manually from the order view once you are ready to fulfill the order. |
| **Yes** | QuickPay captures the payment automatically right after authorization, just like a normal one-step card charge. |

See [Capturing Payments](https://docs.j2commerce.com/v6/payment-methods/payment_quickpay#capturing-payments) below for how manual capture works.

### Payment Methods

**Enabled Payment Methods** — Select which QuickPay payment methods to offer at checkout. Leave this field empty to allow all methods that are enabled on your QuickPay account.

| Method | Notes |
| --- | --- |
| **Credit Card** | Generic card option (Visa/Mastercard/etc. grouped) |
| **Dankort** | Denmark's national debit card |
| **Visa** | International |
| **Visa Electron** | Debit variant |
| **Mastercard** | International |
| **Mastercard Debit** | Debit variant |
| **Maestro** | International debit |
| **American Express** | International |
| **Diners Club** | International |
| **JCB** | Primarily Japan/Asia |
| **MobilePay** | Popular Danish/Nordic mobile wallet |
| **MobilePay Subscriptions** | MobilePay's recurring-payment variant |
| **Vipps** | Norwegian mobile wallet |
| **Vipps via QuickPay** | Alternate Vipps integration path |
| **Swish** | Swedish mobile payment method |
| **PayPal** | Requires PayPal activation in QuickPay |
| **Klarna** | Buy now, pay later / installments |
| **iDEAL** | Netherlands bank transfer |
| **SOFORT Banking** | Austria, Belgium, Germany, Switzerland |
| **Trustly** | Bank payments across the Nordics and Europe |
| **ViaBill** | Danish buy now, pay later |
| **Resurs Bank** | Nordic consumer financing |
| **ANYDAY Split** | Installment payments |
| **Unzer Pay Later Invoice** | DACH invoice-based payment |
| **Paysafecard** | Prepaid voucher, popular across Europe |
| **Forbrugsforeningen af 1886** | Danish consumer association payment card |
| **Apple Pay** | Requires HTTPS and a compatible device |
| **Google Pay** | Requires HTTPS |

> **Info:** Payment methods must also be enabled on your QuickPay account before they appear at checkout — selecting them here only filters the list; it does not activate them at QuickPay. Check your QuickPay Manager account settings for which methods are available to you.

**Supported Currencies** — Only offer QuickPay for carts in these currencies. Leave empty to offer QuickPay in every currency.

> **Info:** QuickPay can only process currencies that your active acquirer supports. Check **QuickPay Manager -> Settings -> Acquirers** before assuming a currency will work — a mismatch causes the payment to be rejected. See [Currency not supported by acquirer](https://docs.j2commerce.com/v6/payment-methods/payment_quickpay#currency-not-supported-by-acquirer) in Troubleshooting.

![QuickPay plugin settings: Enable Saved Cards Yes, Enable Subscriptions Yes, Confirmed Payment Status Confirmed](https://docs.j2commerce.com/images/docs/shared/quickpay_cards.webp)

**Enable Saved Cards** (default: **Yes**) — Allow customers to save a card for future non-scheduled purchases. Saved cards are also used for automatic subscription renewals. See [Saved Cards and Subscription Renewals](https://docs.j2commerce.com/v6/payment-methods/payment_quickpay#saved-cards-and-subscription-renewals) below.

**Enable Subscriptions** (default: **Yes**) — Allow this payment method to be used for recurring subscription products via the QuickPay Subscriptions API. Requires the J2Commerce **Subscription Product** app.

### Order Status

![QuickPay plugin order statuses: Change Status on Refund Yes with Refunded, Change Status on Cancel Yes with Cancelled](https://docs.j2commerce.com/images/docs/shared/quickpay_order.webp)

**Confirmed Payment Status** — Order status to set when QuickPay confirms a captured payment.

**Change Status on Refund** — Automatically update the order status when a refund is issued.

- **Refund Order Status** — Order status to set after a successful refund.

**Change Status on Cancel** — Automatically update the order status when a payment is cancelled/voided.

- **Cancel Order Status** — Order status to set after a payment is cancelled/voided.

> **Tip:** If the status you want is not listed in a dropdown, create a new one first by going to **J2Commerce** -> **Setup** -> **Order Statuses**.

### Callback URL

![QuickPay Callback URL section: read-only Callback URL field with a copy button, and an empty Callback URL Override (dev) field](https://docs.j2commerce.com/images/docs/shared/quickpay_url.webp)

**Callback URL** — This read-only field displays the URL QuickPay uses to notify your store when a payment, subscription, or card status changes. The URL is generated automatically and sent automatically with every payment/subscription/card request — no manual dashboard registration is required.

Click the **Copy URL** button next to the field to copy it to your clipboard if you need it for reference.

**Callback URL Override (dev)** — Advanced/development only. When the site runs behind a tunnel (for example, ngrok), enter the full public callback URL here so QuickPay can reach it. Leave this empty in production.

> **Info:** QuickPay cannot deliver callbacks to a local development server or private address. Until your store is running on a live, publicly accessible domain, the automatically generated Callback URL will not be reachable by QuickPay.

### Template Style and Geo Zone

![QuickPay plugin settings: Template Style dropdown set to Bootstrap5 (customer-facing layout framework)](https://docs.j2commerce.com/images/docs/shared/quickpay_style.webp)

**Template Style** — Select the CSS framework for this plugin's customer-facing templates (defaults to Bootstrap 5).

![QuickPay plugin settings: Geo Zone restriction multi-select set to All, so the method shows for every location](https://docs.j2commerce.com/images/docs/shared/quickpay_geozone.webp)

**Geo Zone** — Restrict QuickPay to customers in a specific geographic zone. Select a geozone you have defined in J2Commerce. Leave blank to show QuickPay to all customers regardless of location.

### Surcharge

![QuickPay plugin surcharge fields: empty Surcharge Label, Surcharge (%) and Surcharge (Fixed), Surcharge Tax Class set to Not Taxable](https://docs.j2commerce.com/images/docs/shared/quickpay_surcharge.webp)

Add an optional extra fee for customers who pay via QuickPay. Check your local laws before using surcharges — they are regulated in some countries.

**Surcharge Label** — The name shown for the surcharge line item at checkout. Leave blank to use the default label "QuickPay Payment Surcharge."

**Surcharge (%)** — A percentage of the order subtotal added as a surcharge.

**Surcharge (Fixed)** — A flat amount added to every order.

**Surcharge Tax Class** — A tax profile to apply to the surcharge. Leave blank if no tax applies.

### Order Value Restrictions

![QuickPay plugin order value limits: empty Minimum Order Subtotal and Maximum Order Subtotal fields](https://docs.j2commerce.com/images/docs/shared/quickpay_min.webp)

**Minimum Order Subtotal** — Hide QuickPay when the order subtotal is below this amount. Leave blank for no minimum.

**Maximum Order Subtotal** — Hide QuickPay when the order subtotal exceeds this amount. Leave blank for no maximum.

### Custom Messages

![QuickPay plugin messages: empty text boxes for method selection, before payment, after successful payment, pending payment and error/cancellation, plus a Thank You Article picker](https://docs.j2commerce.com/images/docs/shared/quickpay_messages.webp)

These text fields let you set messages shown to customers at different points in the payment process. Leave any field blank to use the built-in default message.

**Text on Method Selection** — Shown when the customer selects QuickPay as their payment method.

**Text Before Payment** — Shown on the confirmation screen before the customer is redirected to QuickPay.

**Text After Successful Payment** — Shown after the customer returns from QuickPay with a successful payment.

**Text for Pending Payment** — Shown while QuickPay is still processing the payment asynchronously.

**Text on Payment Error / Cancellation** — Shown when the payment fails or is canceled by the customer.

### Thank You Article and Pay Button

**Thank You Article** — Select a Joomla article to display as a thank-you message after payment. Leave blank to use J2Commerce's default confirmation message.

![QuickPay plugin settings: Pay Button Label field showing the placeholder Pay Now, and Debug Mode set to No](https://docs.j2commerce.com/images/docs/shared/quickpay_icon.webp)

**Pay Button Label** — The label on the button that redirects the customer to QuickPay. Default: **Pay Now**.

### Debug Mode

**Debug Mode** — When set to **Yes**, the plugin writes QuickPay API calls to the Joomla log file. Enable this only while troubleshooting, then set it back to **No** for production.

---

## How the Checkout Works

QuickPay uses a hosted redirect flow:

The customer adds items to the cart and proceeds to checkout.

At the payment step, **QuickPay** (or your custom display name) appears as an option.

If a returning, logged-in customer has a saved payment method, they see it listed first with an option to use a new method instead. Otherwise, if multiple payment methods are configured, a method selector lets them pick Dankort, Visa, MobilePay, or another available method.

The customer clicks the pay button (labeled **Pay Now** by default) and is redirected to QuickPay's secure hosted payment window to complete payment.

QuickPay redirects the customer back to your site once payment is complete or canceled. The browser return alone does not finalize the order — it simply shows a pending/processing message.

Separately, QuickPay sends a server-to-server **callback** notification to the Callback URL. J2Commerce verifies the notification's checksum and uses it to set the final order status, so the order finalizes correctly even if the customer's browser return is interrupted.

> **Info:** Saved-card charges are the one exception — when a returning customer pays with a saved card, the charge result comes back synchronously in the same request, so the order can often be marked paid immediately without waiting on the callback. The callback still fires as a safety net for cases like a required 3-D Secure step.

---

## Capturing Payments

When **Auto-Capture** is set to **No** (the default), QuickPay only authorizes the payment at checkout — the customer's card or account is not charged yet.

To capture a payment manually:

1. Go to **J2Commerce -> Sales ->** **Orders** and open the order.
2. Look for the **Payment** section on the order detail screen.
3. Click **Capture** to charge the authorized amount.
4. Confirm the capture.

Once captured, the order status updates to the **Confirmed Payment Status** configured in the plugin settings. A captured payment can no longer be canceled — use [Refunds](https://docs.j2commerce.com/v6/payment-methods/payment_quickpay#refunds) instead.

If **Auto-Capture** is set to **Yes**, this step is not needed — QuickPay captures automatically right after authorization.

---

## Going Live

When you are ready to accept real payments:

1. Confirm your QuickPay account is fully verified and approved for live transactions in the QuickPay Manager.
2. Enter your live **Merchant ID**, **API User Key**, and **Private Key** in the plugin settings (replace any test/demo account credentials).
3. Click **Save**.
4. Place a small real transaction to confirm the payment flow works end-to-end.
5. Set **Debug Mode** to **No**.

**Going live checklist:**

- [ ] Live **Merchant ID**, **API User Key**, and **Private Key** entered in the plugin settings
- [ ] Debug Mode set to **No**
- [ ] Payment methods you want to offer are enabled on your live QuickPay account
- [ ] Supported Currencies match the currencies your acquirer actually supports
- [ ] Your site is publicly accessible over HTTPS so QuickPay can deliver callbacks
- [ ] You have tested at least one real payment end-to-end

---

## Refunds

You can issue a full or partial refund directly from the order in the J2Commerce admin:

1. Go to **J2Commerce -> Sales -> Orders** and open the order.
2. Look for the **Payment** section on the order detail screen.
3. Click **Refund (Full)** to return the entire captured amount, or **Refund (Partial)** to enter a specific amount up to the maximum refundable amount shown.
4. Confirm the refund.

J2Commerce sends the refund request to QuickPay via the API. Refunds can only be issued against a **captured** payment — an authorized-but-not-yet-captured payment must be [canceled](https://docs.j2commerce.com/v6/payment-methods/payment_quickpay#capturing-payments) instead.

If **Change Status on Refund** is enabled, the order status updates automatically after the refund is processed.

---

## Saved Cards and Subscription Renewals

When **Enable Saved Cards** is turned on (the default), the plugin supports saved payment methods and automatic subscription renewals:

- The customer can add a card from their account without making a purchase, or save a card during checkout. QuickPay confirms the card is valid through a hosted card authorization step, then the card is stored for future use.
- On subsequent orders, logged-in customers see their saved payment method at checkout and can pay without re-entering details.
- QuickPay card tokens are single-use, so behind the scenes the plugin mints a fresh charge token from the stored card each time it is used — this is transparent to the customer.
- On each **subscription renewal**, J2Commerce charges the subscription automatically through QuickPay's recurring payment API — no redirect to QuickPay is needed for automatic billing cycles.

This requires the J2Commerce **Subscription Product** app. The customer must complete an initial payment to establish the subscription (or saved card) before automatic renewals can be processed.

> **Info:** If a saved card requires additional bank verification (Strong Customer Authentication), it cannot be charged in one click. In that case the customer sees a message asking them to choose "Use a new payment method" and complete the payment in QuickPay's secure window instead.

---

## Troubleshooting

### Payment methods do not appear at checkout

**Cause:** No payment methods are enabled on your QuickPay account, or your credentials are incorrect.

**Solution:**

1. Verify the **Merchant ID**, **API User Key**, and **Private Key** in the plugin settings are correct.
2. Log in to the QuickPay Manager and confirm at least one payment method is enabled on your account.
3. Enable **Debug Mode** and check the Joomla log for API errors.

---

### Order status does not update after payment / callback unreachable

**Cause:** QuickPay could not reach your site's Callback URL, so the payment notification was never received.

**Solution:**

1. Confirm your site is publicly accessible over HTTPS — QuickPay cannot deliver callbacks to a local development server or a site behind a password-protected staging environment.
2. If you are testing locally, use the **Callback URL Override (dev)** field with a public tunnel URL (for example, from ngrok).
3. Enable **Debug Mode** and reproduce a test payment to see whether the callback is being received and processed.
4. Verify that no server firewall or CDN WAF rule is blocking POST requests to `index.php?option=com_ajax&...` from QuickPay's servers.

---

### Capture failed

**Cause:** The payment was already captured, canceled, or expired before you clicked Capture, or the QuickPay API was temporarily unavailable.

**Solution:** Refresh the order view to see the current payment state. If the state still shows "authorized," enable **Debug Mode**, retry the capture, and check the Joomla log for the specific error returned by QuickPay.

---

### Currency not supported by acquirer

**Cause:** QuickPay can only process currencies that your active acquirer supports. A currency enabled in J2Commerce but not supported by your acquirer will be rejected by QuickPay.

**Solution:** Log in to the QuickPay Manager and go to **Settings** -> **Acquirers** to see which currencies your acquirer accepts. Update the **Supported Currencies** field in the plugin settings to match, or leave it blank only if all of your active currencies are supported.

---

### Saved card cannot be charged (SCA required)

**Cause:** The saved card requires additional bank verification (Strong Customer Authentication) that cannot be completed without the customer present in QuickPay's payment window.

**Solution:** This is expected behavior for certain cards, especially in the EEA. Direct the customer to choose "Use a new payment method" at checkout so they can complete the 3-D Secure step directly with QuickPay.

---

## FAQ

**Does QuickPay require a separate sandbox environment?** No. QuickPay uses one API host for both testing and live payments — connect to a test/demo QuickPay account to test, and to your live merchant account to accept real payments. There is no key-prefix or URL toggle like some other gateways.

**Does QuickPay require a separate callback registration in the QuickPay Manager?** No. The Callback URL is generated automatically and sent with every payment, subscription, and card request the plugin makes — you do not need to register a static callback endpoint in the QuickPay Manager.

**Can I offer only specific payment methods instead of all of them?** Yes. Use the **Enabled Payment Methods** field in the plugin settings to select the methods you want. Leave it blank to show all methods enabled on your QuickPay account.

**What is the difference between Auto-Capture Yes and No?** With Auto-Capture off (the default), QuickPay authorizes the payment and you capture it manually from the order view when ready. With Auto-Capture on, QuickPay captures the payment automatically right after authorization.

**Can I use QuickPay with multiple currencies?** Yes, as long as your acquirer supports them. Use the **Supported Currencies** field to restrict QuickPay to currencies your acquirer accepts.

**What happens if the customer's browser closes mid-redirect?** J2Commerce checks the payment status when the customer returns to your site. If the return is interrupted, QuickPay's callback notification will still finalize the order once your site is reachable.

---
