# 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.

## Availability

| 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 flow

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 payment

```typescript
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:

```typescript
// 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 payments

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 & timing

Bancontact payments authorize and capture in seconds and are settled to your [balance](/docs/operations/balances) immediately, following your normal [settlement](/docs/operations/settlement) schedule.

## Refunds

Refunds are returned to the customer's originating Belgian bank account, typically within one to three business days.

```typescript
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.

## Testing

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.

## Limitations

- **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 also

[Local methods](/docs/payments/payment-methods/add-payment-methods/local-methods) — Overview of all region-specific payment methods.

[iDEAL](/docs/payments/payment-methods/add-payment-methods/local-methods/ideal) — Bank redirect for Dutch customers.

[Refunds](/docs/payments/payment-operations/refund) — Issue full or partial refunds via the API.
