Bancontact

Accept Bancontact — Belgium's leading payment method — with VINR.

View as MarkdownInstall skills

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

DetailValue
CountriesBelgium
CurrencyEUR only
FlowBank redirect or QR / app confirmation
FinalityFinal on confirmation
RefundsSupported 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.checkoutUrl

Fulfill 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

Was this page helpful?
Edit on GitHub

Last updated on

On this page