Bulk QR code generator

Turn a list or spreadsheet into hundreds of QR codes at once. Map a column, style the codes, then download a ZIP of PNG or SVG files, or a PDF ready for label sheets. It all happens in your browser: no sign-up, no upload, no watermark.

1 Your data

0 rows · 0 ready

2 Code type & look

Error correction

3 Preview & export

First 0 of 0. Everything is generated in your browser.

Add some rows in step 1 and your labels appear here.

·

From spreadsheet to printed labels in three moves

  1. Bring the rows

    Paste straight from Excel or Google Sheets (tabs are detected), upload a .csv or .xlsx, or generate a numbered sequence. Header row optional.

  2. Map and style

    Choose the column to encode, or build a URL template from several columns. Set colours, error correction, quiet zone, a centred logo and a caption.

  3. Export the batch

    One ZIP with every file named from your data, plus a manifest. Or a PDF laid out on Avery 5160, 5163, L7160 and more.

Not sure which code or settings? Ask the label desk

Describe the job — what you're labelling, how it's scanned, what you print on — and get a plan: code type, what goes inside, spreadsheet columns and print size. AI-written; check it against your scanner before a big print run.

0/800

Getting a batch right the first time

Most failed QR print runs come down to four things, and the generator warns you about each:

  • Size for the scan distance. A code should be about one tenth as wide as the distance it's scanned from: 2 cm for a business card, 10 cm on a poster read from a metre away. Work it out with the QR code size calculator.
  • Contrast. Dark code on a light background. Below roughly 3:1 contrast many scanners give up, and inverted (light-on-dark) codes trip older readers.
  • Quiet zone. Leave a clear margin of four modules around every QR code. Trimming it to save space is the classic reason a code "works on screen but not on the flyer".
  • Shorter data, simpler code. Every extra character adds modules. A 25-character URL produces a far airier, easier-to-scan code than a 120-character tracking link. See how QR codes work to watch it happen.

Adding a logo? Error correction is locked to level H (about 30% of the code can be covered), and you'll see a warning if the logo grows past the safe size. Why that works.

Questions people ask

Is this bulk QR code generator really free?
Yes. There is no account, no watermark and no per-code limit apart from 5,000 rows per batch (run another batch for more). Codes are generated by your own browser, so there is no server cost to pass on.
How do I generate multiple QR codes at once?
Paste one value per line (or whole spreadsheet rows) into step 1, or upload a CSV or .xlsx file. Pick which column to encode, style the codes, then press Download. You get a ZIP with one image per row plus a manifest.csv listing which file holds which value.
Are these static or dynamic QR codes? Will they expire?
They are static: the URL or text is stored inside the pattern itself, so they never expire and work without this site. The flip side is that you can't change the destination after printing. If you need that, point each code at a URL you control (for example yoursite.com/go/{ID}) and redirect it yourself.
Is my spreadsheet uploaded anywhere?
No. Files are read and codes are drawn entirely in your browser tab. Nothing is sent to a server except the optional planner text box, which sends only what you type into it.
How many QR codes can I make in one go?
Up to 5,000 rows per batch. A few hundred PNGs usually take seconds on a laptop; the exact time is shown after each export. Phones work too, just more slowly for very large batches.
PNG or SVG — which should I download?
SVG for print and design tools (it scales to any size without blur). PNG for web pages, email, documents and anything that doesn't accept SVG. Choose "PNG + SVG" to get both in one ZIP.
Can I add a different URL parameter to each code?
Yes. Choose "Custom template…" in the Encode menu and write something like https://shop.example/p/{SKU}?utm_source=flyer&utm_content={#}. {Column} is replaced from each row and {#} with the row number.