vujanic.ch

A tiny tool for QR bills that don't scan

The other day I was getting ready for my control drive (Kontrollfahrt), and my driving instructor gave me a paper bill with a QR code on it. The bill had obviously been photocopied a few times, and somewhere along the way the code got distorted. Parts of it looked shifted, as if some of the squares had slid out of place. It was a strange sight, and my banking app couldn't read it at all.

So I typed everything by hand. Her name, the IBAN, the address, the amount. I kept looking back at the paper, then at my phone, then at the paper again, checking every single digit.

The paranoia of a former payments person

Here's the funny part. I used to work in payments. I know an IBAN has check digits built in: the two right after "CH". Mistype a single digit and the math isn't mathing, so the IBAN is invalid.

The problem isn't the math. The problem is that I've seen how software gets built. The check exists, sure. But did whoever built the app I'm typing into actually implement it? Did they test it? On a Friday afternoon?

And if something does go wrong, it doesn't end with a red error message. It ends with typing everything again, waiting to see where the money went, and maybe a call with my bank. So I sat there comparing digits one by one like a man defusing a bomb.

To be fully honest, even when a QR code scans perfectly, I still compare the first two and the last three digits of the IBAN before I hit pay. Every time. It's not rational. It's a ritual.

So I built a tool

What I really like is the normal way: scan the code, check the amount, pay, done. Some people simply don't send a QR code at all, and that has bothered me for a while. This was the push I needed.

You fill in who gets paid: name, IBAN and address, plus an amount and a message if you want. The tool turns that into a Swiss QR bill code that any Swiss banking app can scan. You can download the code as an image or print it.

Yes, it checks the IBAN as you type. Yes, I tested it, by typing a wrong digit on purpose and watching it complain. Now the only implementation I have to trust is my own, which, to be fair, is a whole new kind of paranoia.

It runs entirely in the browser, and nothing you type is sent anywhere.

The part I like most: prefilled links

Every field can go into the link itself. Once you've filled in someone's details, you can copy a link that opens the form already filled in. The next time you pay that person, or if you send the link to them, nobody has to type anything. Just open the link and scan.

Here's an example with made-up details. Everything is already filled in, and the QR code is ready to scan. (Please don't actually pay Max.)

For the person getting paid, that means one link they can share with everyone, instead of a QR code that wears out a bit more with every photocopy. And nobody ever has to type that IBAN again, which is the real win.

(I'll still compare the first two and last three digits, though. Old habits.)

You can try it here: vujanic.ch/tools/qr-bill


Credits. The idea, the spec, the nitpicking and every “bro, that’s a bug” were mine. The code was written by Claude, an AI by Anthropic. I wrote exactly zero lines. I did, however, test everything myself: the IBAN check, the shared links, the validation, every case I could think of. Old habits.