Bulk QR code generator
Forty tables, three hundred asset tags, a thousand tickets each with its own link: making those one at a time in a single-code generator is an afternoon of copy, paste, download, rename. Paste the whole list here instead and get one ZIP back, with every code named the way you asked and a CSV telling you what each file contains.
Generate the batch
Just the content, or a file name followed by a comma, semicolon or tab and then the content. Empty lines and a header row are ignored.
Quiet zone: 4 modules, as the specification requires.
The list, the images and the ZIP never leave your browser. Nothing is uploaded.
| Row | File | Content |
|---|---|---|
| — | ||
Everything runs in your browser: the list is parsed, the images are drawn and the ZIP is assembled on your machine. No row is sent to this site or anywhere else.
How to generate QR codes in bulk
Turn a list of links or texts into individual QR code images in one go: paste the list or load a CSV, choose PNG or SVG, and download every code as a ZIP with a CSV index of what each file encodes.
-
Paste the list or load a CSV
One QR code per line. Either paste the content alone, or put a file name first, then a comma, semicolon or tab, then the content. The parsed count and a preview of the first rows appear immediately, so you can see the split is right before anything is generated.
-
Pick the format and size
SVG if the codes are going to be printed, PNG if they will be shown on screens or dropped into documents. For PNG choose 256, 512 or 1024 pixels; an SVG has no pixel size and scales to whatever it is placed at.
-
Set error correction and colours
Level M is the right default for plain codes. Go to Q or H only if the codes will be laminated, scuffed or overprinted. Keep the dark colour dark and the light colour light; the whole batch shares one setting, so a poor contrast choice breaks every code at once.
-
Generate and wait for the ZIP
The codes are rendered in your browser in small chunks with a progress bar, and you can cancel at any point. Up to 1,000 rows are processed per run. Rows whose content is too long to fit in a QR code are listed at the end instead of stopping the batch.
-
Check contents.csv and test a sample
The ZIP carries a contents.csv mapping every file name to the string it encodes. Open two or three images from different parts of the list and scan them with a phone before the batch goes to print.
The input format
There is no template to fill in. Each line of the box becomes one QR code, and a line has one of two shapes: just the content, or a file name followed by a separator and then the content. The separator can be a comma, a semicolon or a tab, and it is detected per line, so a CSV exported from a German spreadsheet with semicolons works next to a hand-typed line with a comma. Only the first separator counts; everything after it, including further commas in a URL's query string, is the content.
filename,content
table-01,https://example.com/menu?t=1
table-02,https://example.com/menu?t=2
asset-4471;https://example.com/a/4471
https://example.com/p/9
That list produces four files. The first row is recognised as a header and skipped, the
next three are named as written, and the last one, which has no name of its own, becomes
qr-0004.
A line whose first field contains a colon or a slash is treated as content rather than as
a name, which is what lets a bare
WIFI:
string or a URL with a semicolon in it sit on its own line. Names are reduced to letters,
digits, dots, hyphens and underscores; anything else, including spaces, becomes a hyphen,
because a ZIP with an umlaut or a slash in a file name unpacks differently on every system.
PNG or SVG for a batch
The same rule as for a single code, only the consequences are multiplied. SVG when the codes will be printed: a vector stays sharp whether the label is two centimetres or a poster, and a thousand SVGs are a few hundred kilobytes in total, so the ZIP downloads instantly. PNG when the codes will be shown on screens, pasted into slides, attached to emails or dropped into a system that cannot place vector graphics. Pick 512 pixels for documents and 1024 if the PNG is the only artwork a print shop will get; 256 is enough for a web page. The trade-offs are laid out in more detail in the guide to QR code file formats.
Every code in the batch is written with the 4-module quiet zone the specification asks for, so the images can be placed edge to edge in a label template without a scanner losing the border. If you are unsure how large the printed codes need to be, the rule of thumb is a tenth of the scanning distance; the print size guide works it through for the usual cases.
Naming and tracking
Put the identifier you will actually search for in the file name column: the table
number, the asset tag, the ticket ID. A folder of
qr-0001 to
qr-0400 is fine while the list is open next
to it and useless six months later. The
contents.csv in the ZIP is the safety net:
it records, for every file, the exact string that was encoded, so the batch can be
audited or re-imported without scanning anything.
If the codes point at the same page and you want to know which one was scanned, give
each row its own query parameter before pasting, such as
?utm_content=table-07, and read the result
in your analytics. The guide to
tracking printed QR codes with UTM parameters
explains which parameters to use and how to keep the URLs short. Remember that every
code encodes its URL literally: there is no redirect in the middle, so the codes keep
working whether or not this site does, and equally there is no way to change a
destination after printing. If the targets may move, point the codes at URLs on a domain
you control and redirect from there.
When the image API is the better tool
This page is for a list you have in hand right now. When the list lives in a database,
changes every day or is rendered by a template, the
QR code image API
fits better: one GET per code, no key, and the same options as here as query parameters
(size,
margin,
ec,
dark,
light,
format=svg,
download and
data). An
<img> tag per row in a mail merge or
a label template needs no ZIP at all.
The two have different limits. Here a PNG is drawn in your browser and goes up to
1024 pixels; the API caps a PNG at 1024 pixels too, because it is rasterised
on a shared server, and offers SVG up to 2048 pixels for anything larger. The
API's default quiet zone is two modules, so pass
margin=4 for print;
this tool always uses four. And the API is sized for embedding codes in documents and
dashboards, not for rendering hundreds of thousands of images in one run. For that
volume its documentation points at the library both tools use, which runs on your own
machine.
Common questions
Can I paste a column straight from a spreadsheet?
Yes. Copying a column of cells and pasting it into the box gives you one link per line, which is exactly the single-column form. Copy two adjacent columns and the spreadsheet separates them with a tab, which the tool recognises as file name and content. Saving the sheet as CSV and loading the file does the same thing; a header row that starts with "filename" or "name" is skipped automatically.
Why does the batch stop at 1,000 rows?
Every code is rendered in your browser tab, and a thousand PNGs at 1024 pixels add up to many megabytes held in memory before the ZIP is built. The cap keeps that within what a normal laptop handles without the tab stalling. A longer list simply runs as several batches: paste the next 1,000 rows and generate again. If you need to render that volume routinely, a script against the image API or the qrcode library on your own machine is the better tool.
How do I know afterwards which file belongs to which link?
The ZIP contains a contents.csv with two columns: the file name as it appears in the archive and the exact string encoded in that file. Keep it next to the images. It is also the file to use when checking the batch, because it lists what was actually encoded rather than what you intended to paste.
What happens if two rows have the same file name?
The second one gets a numeric suffix, so label and label-1 both end up in the ZIP rather than one silently overwriting the other. Names are also compared without regard to case, because the archive may be unpacked on a system where Report.png and report.png are the same file. The preview table shows the final names, so you can see the suffixes before you generate.
One code at a time, with a logo and more content types