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
| Country | Common local method | Note |
|---|---|---|
| Sweden | Swish | Phone payment in kronor, through a provider or a bank's Swish agreement |
| Norway, Denmark, Finland | Vipps MobilePay | Phone payment, offered by the same providers |
| Netherlands | iDEAL, moving to Wero | Bank payment, migration planned to end by 2027 |
| Belgium | Bancontact | Debit card and app payment |
| Poland | BLIK | Six-digit code from the banking app |
| Switzerland | TWINT | Phone payment in francs |
| Germany, Austria | SEPA direct debit and bank transfer | Settles 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.
Related rules
- PAY-18 Let provider events move the order in Payments and billing
- PAY-19 Wait for payment methods that settle later in Payments and billing
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.