Bancontact
Accept Bancontact — Belgium's leading payment method — with VINR.
Bancontact is Belgium's most widely used payment method, present on virtually every Belgian bank card and deeply embedded in Belgian shopping habits. Customers pay via a bank redirect or by scanning a QR code in the Payconiq by Bancontact app. Payments are final on confirmation — there is no chargeback path for completed Bancontact transactions.
AvailabilityAsk
| Detail | Value |
|---|---|
| Countries | Belgium |
| Currency | EUR only |
| Flow | Bank redirect or QR / app confirmation |
| Finality | Final on confirmation |
| Refunds | Supported via standard refund API |
Payment flowAsk
Bancontact offers two flows that the VINR-hosted checkout presents based on the customer's device:
Browser redirect (desktop)
Create the payment
Create a payment with methods: ['bancontact'] and a EUR amount. You receive a checkoutUrl.
Customer selects their bank and authenticates
The customer is redirected to their bank's secure site or the Bancontact network page, where they log in and approve the payment.
Bank confirms and redirects back
On approval, the bank confirms to VINR and redirects the customer to your returnUrl. The payment moves to completed.
Fulfill on the webhook
Use payment.completed as the fulfillment trigger, not the return redirect.
QR code / Payconiq app (mobile)
On mobile, the hosted checkout presents a QR code or a deep link into the Payconiq by Bancontact app. The customer scans the QR code or taps the deep link, authenticates in the app, and approves. The payment completes without a page redirect.
Creating a Bancontact paymentAsk
import { Vinr } from '@vinr/sdk';
const vinr = new Vinr({ secretKey: process.env.VINR_SECRET_KEY });
const payment = await vinr.payments.create({
amount: 7500, // €75.00 in minor units
currency: 'EUR',
description: 'Order #6640',
methods: ['bancontact'],
returnUrl: 'https://yoursite.com/payment/complete',
metadata: { orderId: '6640' },
});
// Redirect the customer to payment.checkoutUrlFulfill from the webhook:
// POST /webhooks/vinr
const event = vinr.webhooks.verify(rawBody, req.headers['x-vinr-signature']);
if (event.type === 'payment.completed') {
const payment = event.data;
// payment.method → "bancontact"
await fulfillOrder(payment.metadata.orderId);
}Recurring paymentsAsk
Bancontact supports recurring mandates via the Bancontact One-Off or SEPA Direct Debit bridge for subsequent charges. The first payment follows the standard redirect flow; subsequent charges can be off-session. Contact your VINR account manager to enable recurring Bancontact on your account.
Settlement & timingAsk
Bancontact payments authorize and capture in seconds and are settled to your balance immediately, following your normal settlement schedule.
RefundsAsk
Refunds are returned to the customer's originating Belgian bank account, typically within one to three business days.
const refund = await vinr.refunds.create({
payment: 'pay_...',
amount: 7500, // full refund; omit amount for full
reason: 'requested_by_customer',
});Because Bancontact payments are final, there are no chargebacks. A refund is the only way to return funds after the payment completes.
TestingAsk
In the VINR sandbox, Bancontact redirects open a VINR test page where you choose Approve or Fail. No real Belgian bank account or Payconiq app is required.
LimitationsAsk
- EUR only. Bancontact cannot process amounts in any other currency.
- Belgium only. The method only appears for customers with a Belgian Bancontact-enabled bank card or account; presenting it outside Belgium returns
method_not_available. - No manual capture. Bancontact captures in full at confirmation.
See alsoAsk
Local methods
Overview of all region-specific payment methods.
iDEAL
Bank redirect for Dutch customers.
Refunds
Issue full or partial refunds via the API.
Last updated on