Skip to main content
OpenQRS
Tools
Current language: English
100% Private

Coupon QR code generator

100% Private & Local — Your data never leaves your browser. These QR codes are permanent and will never expire.

Coupon settings

A link needs a connection and a working store. Plain text works on a market stall with no signal.

In plain-text mode this is the payload. In link mode it is not encoded — print it beside the symbol so the code can still be read and typed.

Enter the coupon code.

Paste the discount link your platform generates, if it has one. The address is encoded exactly as entered.

Design

Module shape
Presets
Corner frame
Add a centre logo
Choose an image, or drop one herePNG, JPEG, WebP or GIF, up to 1000 KB

The image is read in this page and embedded in the code as a data: URL. It is not uploaded, and it stays inside the file you download.

More design options

The dark half of the code. Keep it well below the background in lightness.

Covers the quiet zone as well as the gaps between modules. A transparent background leaves it out of the file, so nothing is drawn with it.

Contrast 11.5:1 between the modules and the background.

Presets

PNG and WebP keep an alpha channel; the SVG simply omits the background rectangle. Whatever the code is placed on becomes the light half of the contrast.

Gradient

A gradient fills the dark modules only. Its lighter end sets the contrast a scanner actually gets, so both ends have to stay dark.

The second colour, used only while a gradient is selected. It is measured for contrast alongside the first.

45°

Degrees clockwise from a left-to-right sweep. A radial gradient spreads from the centre outwards, so the angle applies to a linear one only.

Module shape

Rounded shapes cover less of each cell. The centre stays covered, which is where a decoder samples, but a small print of a dense code reads more reliably as squares.

Corner frame

The ring of the three finder patterns.

Corner centre

The eye inside each finder pattern.

4 modules

The blank margin around the code, measured in modules. 4 is the specified minimum.

Higher recovery survives more damage and costs capacity, so the same content produces a denser symbol.

A logo sits at the centre and holds the level at H. Its width limit follows the symbol: 14% on the smallest code, 30% on a dense one.

Live preview & export

Export

Export

Raster, for screens

Complete the form to enable the downloads.

Export size and encoded text
Payload
Nothing encoded yet
Symbol
Not built yet
Recovery
Q

Waiting for input

Export size

Between 64 and 4096 pixels. Exporting at 1024 px.

Encoded text

Two ways to put an offer on paper: a link that opens your checkout, or the code itself as plain text that reads with no connection. Both encode the payload directly, so the printed voucher does not depend on a service staying subscribed.

When someone scans it

In link mode the reader offers to open your checkout address. In plain-code mode it shows the code, and the terms line underneath if you added one.

Two modes, two different payloads

Link mode encodes the checkout address you paste, with https:// added if you leave the scheme off, and nothing else. Plain-code mode encodes the code itself, followed by the terms line on a second line when you supply one.

The second mode is the one that keeps working at a market stall, a festival gate or anywhere with no coverage, because the payload is the voucher rather than a route to it. The first is the one that saves the customer typing, provided your platform can apply a discount from a link.

  • Link mode payload: https://example.com/discount/SPRING20
  • Plain-code payload, first line: SPRING20
  • Plain-code payload, second line: the terms line, if you added one

Why the code is not injected into your link

Platforms name their discount parameter differently. Shopify uses a /discount/CODE path. Many WooCommerce stores read a coupon_code query parameter. Others use a different name again, or apply nothing from the address at all and expect the code to be typed at checkout.

Guessing wrong produces the worst possible failure: a link that opens the store, applies no discount, and looks completely correct in every test you run until a customer complains. So link mode encodes the address you paste and leaves it alone. Generate the discount link in your own admin, paste it here, and scan it once against a real basket before the print run.

Printing on receipts, flyers and shelf edges

Recovery level Q is the default for this tool because vouchers get creased, folded into pockets and printed on paper that was never meant to last. Level Q restores about a quarter of the symbol's codewords, and for a short code it is free: an eight-character code fits version 1 — 21 modules, the smallest symbol there is — at level Q just as it would at level M.

Thermal receipt paper is the hardest surface of the three. It loses contrast with heat and age, and a roll that has spent a summer in a warm shop prints greyer than the one you tested with, so give a receipt code more printed width than a flyer would need.

Two further constraints are worth respecting on any of them. Keep the four-module quiet zone clear of borders and cut lines. And treat inverted printing — light modules on a dark background — as unsupported: it is outside the specification, and while phone cameras often cope, dedicated scanners often do not.

Questions and answers

Will the discount apply automatically at checkout?

Only if the link you paste does that on its own. This tool encodes your address unchanged rather than guessing a discount parameter, so test the link in a browser before printing it.

Which mode should I use?

Link mode when there is a working online checkout and a connection at the point of scanning. Plain-code mode when the code is redeemed by a person, or when the scan happens somewhere without coverage.

Can I change the offer after the vouchers are printed?

Not in the code — it is static by design. You can change what the code means: in link mode, change what the destination page does; in plain-code mode, change what your till accepts for that code.

Why is the terms line only available for plain text?

Because a URL is a single line with no room for a second one. In link mode the terms belong in printed text beside the symbol, where a customer can read them without scanning.

How a static QR code works

Every code on this site is static: the payload is written into the black and white modules themselves. Nothing is looked up when the code is read, no server of ours takes part, and no subscription holds the printed code up. The same property is the limit — once it is printed, what it contains cannot be changed.

Three things then decide whether a printed code reads: how many bytes the payload came to, which recovery level absorbs the damage, and how wide a single module ends up on paper. These guides work through each of them with the numbers.