Crypto payment QR code generator
A crypto payment code carries a wallet address and, optionally, an amount, in the format wallets expect. Scanning it opens the wallet with the recipient filled in, so nobody retypes a 42-character address.
That is the real argument for these codes: an address typed by hand is an address typed wrong, and a mistyped crypto payment cannot be recalled.
What should it do
Request a payment to a wallet address.
Content
Design
Bitcoin uses BIP-21, where the amount is decimal BTC
A Bitcoin request is bitcoin: followed by the address, with the amount and a label as query parameters. The amount is written in whole BTC as a decimal — 0.01 means one hundredth of a bitcoin — which is the one case in crypto payments where the number in the code reads the way a human would write it.
The label rides along as a note the wallet may display, so the payer sees who they are paying rather than an address alone. It is not signed or verified by anything, so treat it as a convenience, not a guarantee.
Ethereum uses EIP-681, where the amount is wei
An ether request is ethereum: followed by the address and a value parameter — and that value is an integer count of wei, not a decimal of ether. One ether is 10^18 wei, so a request for half an ether carries the value 500000000000000000.
This is a genuine trap. A decimal in that field is invalid, and a wallet lenient enough to parse 0.5 would read it as half a wei rather than half an ether. This generator converts for you using exact string arithmetic, because 0.1 ether is 10^17 wei and a floating point number cannot hold that value exactly.
USDT is a token transfer, not a payment to an address
A token request does not point at the person being paid. It points at the token contract and passes the recipient and the amount as arguments to a transfer call, because that is how a token moves on Ethereum. A request that named the recipient directly with a value would be asking for ether instead, which is a different asset entirely.
USDT also uses six decimal places rather than eighteen, so fifty USDT is the integer 50000000. Getting either of those wrong produces a request a wallet either rejects or, worse, interprets as something you did not intend.
What a printed crypto code cannot do
It cannot expire, cannot be cancelled, and cannot tell you who paid. Anyone who photographs it can pay it later, or pay it twice. For a donation address on a poster that is fine; for an invoice it is not, and you should be generating a fresh request per transaction rather than printing one.
Reusing a single address also links every payment made to it into one public history, which is a privacy cost for you and for everyone who paid. If you are taking regular payments, most wallets will generate a new address per request for exactly this reason.
Common questions
- Why is the Ethereum amount such a long number?
- Because EIP-681 measures value in wei, and one ether is 10^18 wei. Half an ether is 500000000000000000. A decimal in that field is invalid, so the amount you type is converted to whole wei before it is encoded.
- Why does a USDT code show a different address than mine?
- The address in the payload is the USDT token contract, because a token transfer targets the contract and passes you as the recipient argument. Your address is in the request too. Pointing the request at you directly would ask for ether instead of USDT.
- Can I cancel a crypto payment QR code?
- No. It is a printed address, not a session. Anyone who photographed it can pay it later or pay it twice, and there is no expiry. For invoicing, generate a fresh request per transaction rather than printing one that lives forever.
- Is it safe to print my wallet address as a QR code?
- A receiving address is public by design, so nothing is leaked by printing it. The real cost is privacy: reusing one address links every payment to it into a single public history that anyone can read.
- Does the amount have to be in the code?
- No, and leaving it out is often better. Without an amount the payer enters their own, which suits donations and tips. Include one when you are requesting a specific sum and want to avoid the payer getting it wrong.
Other generators
- SEPA transfer QR code generatorCreate an EPC QR code that pre-fills a European bank transfer with your IBAN, name and amount. Free, no account, print-ready.
- UPI QR code generatorCreate a UPI QR code that works with GPay, PhonePe, Paytm and any UPI app. Add an amount or let the payer choose. Free and print-ready.
- URL QR code generatorTurn any web address into a QR code you can print. Free, no account, no watermark, and no expiry on the code you download.