Bulk QR Code Generator

Paste a list or load a CSV and get up to 500 QR codes at once, as a ZIP of PNGs or a printable PDF sheet. Everything runs in your browser.

🌐 Español

Your list is never uploaded — the codes are drawn, zipped and laid out by JavaScript running in this browser tab.

🔒 Private by design: everything runs locally in your browser and never uploaded to any server.

The list format, one row at a time

Each line becomes one code. The first field on the line is the payload, the exact string the code will encode, and an optional second field is that row’s label. Any further fields are ignored, so a wider spreadsheet export still works as long as the two columns you care about come first.

The separator is auto-detected between comma, semicolon and tab, and a candidate only wins when every sampled line contains it. So the commonest case works almost by accident: a plain list of URLs containing no commas parses as one single-field row per line. When a payload itself contains the separator, wrap that field in double quotes, as in "https://shop.example/p?a=1,2",Shelf tag.

Windows, Unix and old-style Mac line endings all parse. Blank lines are dropped wherever they appear, including the trailing newline, and a row whose first field is empty after trimming is dropped too, so a file ending in a stray comma does not produce a blank code. Tick First row is a header and the first surviving row is skipped, which is what a CSV exported with column names needs.

Loading a list and getting the file out

  1. Paste your list into the large box, or use the file picker underneath to load a .csv, .tsv or .txt file. Loading one replaces whatever was in the box and shows the file name beside the picker.
  2. Pick ZIP of PNG files or Printable PDF sheet under Download as. The settings that only apply to the sheet appear when you choose the PDF.
  3. Set Code size (px) and Error correction, and for the sheet also Paper size, Codes per row, and whether to Print the label under each code.
  4. Check the preview table, which lists the first five rows with the payload it read and, depending on the format, either the file name it will use or the label it will print.
  5. Click Generate ZIP or Generate PDF sheet and watch the percentage. The finished file downloads on its own, with a fallback link underneath in case the browser blocked it.

Two outputs, doing two different jobs

The ZIP holds one PNG per row, drawn at the size you chose, containing nothing but the code. No text is ever rendered into a PNG, so a label only reaches the file name. Pick it when the codes are heading into a design tool, a label printer’s template, a product page or a mail merge.

The PDF sheet is the one for paper. Codes are placed left to right and then top to bottom in the order you pasted them, at 2, 3, 4, 5, 6 or 8 per row on A4 or US Letter with half-inch margins. With labels switched on, each code gets its caption directly underneath, and a row with no label of its own falls back to printing its own payload, so a plain URL list still comes out readable. A caption too wide for its cell is truncated with an ellipsis rather than colliding with its neighbour. The font is a standard WinAnsi face, so accented Latin characters print correctly while anything outside that range, Japanese or emoji for instance, prints as a question mark; the code itself is unaffected, because the payload is encoded independently of whatever is printed under it.

Row numbers keep the archive unique and in order

Every file name in the ZIP is prefixed with its row number, zero-padded to the width of the batch, so a five hundred row run produces names beginning 001 while a two row run produces 1 and 2. That prefix does two jobs. It makes names unique, so two rows both labelled Ticket become distinct files instead of one silently overwriting the other. And it makes any file manager sort the archive back into the order you pasted, which matters the moment the codes are serialised and the twentieth one has to end up on the twentieth item.

The rest of the name comes from the row’s label, or from its payload when there is no label. Letters and digits survive, accented and non-Latin ones included, because the archive is written with UTF-8 names. Slashes, colons, quotes, wildcards and whitespace become hyphens, leading dots are stripped so nothing turns into a hidden file, and the stem is truncated. A row with nothing usable left falls back to a numbered generic name.

The ceiling, the refusals, and what to check first

A batch is capped at 500 codes. Paste more and the summary line marks the list as over the limit while the generate button stays disabled until you split it, because every code is rendered one at a time on your own device rather than on somebody’s server.

Two failure shapes are worth recognising. A list that produces no usable rows, usually a file whose first column was blank rather than an empty file, simply leaves the generate button disabled and no preview table appears at all. And a file the browser cannot read prints a message suggesting you paste the contents instead, the fastest fix when a spreadsheet has exported something exotic.

Most other questions about a batch are really questions about one code. The QR code generator produces a single downloadable PNG, the QR code reader decodes one back out of a photo or screenshot so you can check a printed sheet, and the address label maker lays text onto real Avery sheets when what you are printing is not a code at all. If the campaign URLs going into the list still need tracking parameters, build them with the UTM link builder first.

See it in action

Screenshot of the Bulk QR Code Generator tool with a list typed one code per line, optionally as payload and label pairs, or loaded from a CSV or TXT file, generating a whole batch of QR codes at once
Bulk QR Code Generator mid-process: a list typed one code per line, optionally as payload and label pairs, or loaded from a CSV or TXT file, generating a whole batch of QR codes at once.
Diagram: where the work happens on a SysFenix page that has no file input at all: the tool arrives as ordinary JavaScript inside the page, works the answer out on your own device and renders it in place, so the upload, queue and server-side record a typical online tool needs never happen
Where the work happens on a SysFenix page that has no file input at all: the tool arrives as ordinary JavaScript inside the page, works the answer out on your own device and renders it in place, so the upload, queue and server-side record a typical online tool needs never happen.

Frequently asked questions

Is my batch saved if I close the tab before generating?

No. Nothing is stored, not the pasted list, not the loaded file, not the settings, so reopening the page gives you an empty box with the defaults back in place. Keep your list in the file you exported it from and load it again when you need another run.

Which error correction level should I pick for codes that get printed?

Higher levels add redundancy, so a code still scans when part of it is dirty, scratched or covered, at the cost of a denser pattern for the same payload. Medium is the default and is a fair choice for a sheet that will be handled normally. Move up towards High for codes going onto equipment, outdoors, or anywhere they will be scuffed, and consider Low only when the payload is long and the printed size is small.

What does the code size setting change, given that a QR code is scalable?

It sets the pixel width of each rendered PNG, from 100 to 1000, with anything outside that range pulled back inside it. For the ZIP that is the resolution of the images you receive, so choose something comfortably larger than the size you will print at. For the PDF sheet the printed size is decided by the paper, the margins and the codes per row instead, and the pixel width only affects how much detail is embedded in each image.

Can I add a logo in the middle of the codes, or change their colours?

No. Every code is rendered as a plain black on white PNG with a quiet zone around it, and there is no colour, styling or logo option in a bulk run. If a branded code matters more than the batch, generate the codes here and composite the artwork afterwards in a design tool, keeping the error correction high enough that whatever you overlay does not break the scan.

Do the labels change what the code encodes?

No. A label is only ever a caption or part of a file name. What the code encodes is the first field of its row, with surrounding whitespace trimmed and nothing else changed, so no shortening and no redirect stands between the scan and the text you supplied. That also means a typo in a payload survives all the way to the printed sheet, which is why the preview table shows the payload it actually read rather than what you meant.

How long does a full batch take?

It depends entirely on your device, the number of rows and the pixel size you chose, because every code is drawn locally instead of being fetched from a service. Large sizes cost noticeably more per code than small ones, and a phone will be slower than a desktop. The progress percentage updates every ten codes, so a long run always shows movement rather than looking frozen.

Related tools