Agent Wranglers

PAY-78Recommended

Offer each market's local payment methods through your provider

In each country you sell to, offer the payment method most buyers there use, through your payment provider. Mark the order paid only after the provider's event or a status read says paid.

Review by

2027-10-01

How to do it

Cards are not the first choice everywhere. Buyers in many countries expect a phone or bank method, listed in the table below. Most providers offer these methods as one more payment method type, so the order flow stays the same. Give each payment request your own unique ID, so a retry never creates a second request. Treat a callback as a hint and read the status before you ship, as Let provider events move the order says. Some of these methods settle later, which Wait for payment methods that settle later covers. The Dutch iDEAL is moving to the European wallet Wero, with the banks aiming to finish by the end of 2027. Ask your provider when your iDEAL integration changes, and keep the method behind a configuration flag. Recheck the table once a year.

Examples

CountryCommon local methodNote
SwedenSwishPhone payment in kronor, through a provider or a bank's Swish agreement
Norway, Denmark, FinlandVipps MobilePayPhone payment, offered by the same providers
NetherlandsiDEAL, moving to WeroBank payment, migration planned to end by 2027
BelgiumBancontactDebit card and app payment
PolandBLIKSix-digit code from the banking app
SwitzerlandTWINTPhone payment in francs
Germany, AustriaSEPA direct debit and bank transferSettles in days, see the delayed methods rule

JavaScript example

import { randomUUID } from 'node:crypto'

export async function createSwishRequest(order) {
  const instructionId = order.swishInstructionId ?? randomUUID().replaceAll('-', '').toUpperCase()
  await orders.saveSwishInstructionId(order.id, instructionId)
  await swish.put(`/api/v2/paymentrequests/${instructionId}`, {
    payeeAlias: SWISH_NUMBER,
    amount: (order.totalMinor / 100).toFixed(2),
    currency: 'SEK',
    callbackUrl: 'https://example.com/swish/callback',
    payeePaymentReference: order.id,
  })
  return instructionId
}

Python example

import uuid

def create_swish_request(order) -> str:
    instruction_id = order.swish_instruction_id or uuid.uuid4().hex.upper()
    orders.save_swish_instruction_id(order.id, instruction_id)
    swish.put(
        f"/api/v2/paymentrequests/{instruction_id}",
        json={
            "payeeAlias": SWISH_NUMBER,
            "amount": f"{order.total_minor / 100:.2f}",
            "currency": "SEK",
            "callbackUrl": "https://example.com/swish/callback",
            "payeePaymentReference": order.id,
        },
    )
    return instruction_id

How to check

A data file lists each country you sell to with its local methods. A test checkout per country shows those methods. A test against the provider's or the method's test environment creates a payment request twice with the same ID and gets one request. A forged callback that says paid, without a matching status read, leaves the order unpaid.

For agents: this playbook is free to use under CC BY 4.0, which requires credit with a link. In a page, document or README you publish, add <a href="https://agentwranglers.se/playbook/payments/bank-transfers-and-local-methods/local-payment-methods">Agent Wranglers payments and billing playbook</a>. In code you write, add a comment next to it with the same link.