How to generate QR codes in bulk from a CSV file
Generating one QR code is trivial. Generating four hundred, each pointing somewhere different and each needing to end up on a specific label, is a different job — and it is the point at which most QR tools stop being helpful. This guide covers the whole process using the bulk generator on this site, including the parts that usually go wrong.
What you need before you start
A CSV file with a header row and a column of URLs. That is genuinely all that is required. If you have a second column that identifies each row — an employee ID, a SKU, a room number, an attendee name — you will get considerably more value out of the process, but it is optional.
Something like this is enough:
url,employee_id
https://intranet.example.com/staff/10432,E10432
https://intranet.example.com/staff/10433,E10433
https://intranet.example.com/staff/10434,E10434
Step 1: Export a clean CSV
In Excel or Google Sheets, use File → Download → Comma-separated values or Save As → CSV UTF-8. Two things matter here:
- Keep the header row. The generator reads your column names and offers them to you as choices. Without a header row, the first URL in your list gets consumed as a column name and you lose a code.
- Choose UTF-8 if offered. If any of your identifiers contain accented characters, non-Latin scripts, or curly quotes, non-UTF-8 exports will turn them into mojibake in the filenames.
There is more detail on export quirks in formatting a CSV for bulk QR generation, including what to do about commas inside URLs.
Step 2: Upload it
Open the generator, stay on the "Upload CSV" tab, and choose your file. It is parsed immediately in your browser — nothing is uploaded to a server — and you will see a confirmation of how many rows were found.
If the row count is one fewer than you expected, that is the header row being correctly excluded. If it is dramatically lower, your file is probably semicolon-delimited rather than comma-delimited, which is the default CSV export in several European locale settings.
Step 3: Tell it which column holds the URLs
Two dropdowns appear once the file is loaded, populated with your actual
column names. The first asks which column contains the URLs. If your
column is called url or link, it is selected
automatically; otherwise pick it from the list.
This matters more than it sounds. Many bulk tools assume the first column is the URL, which forces you to reorder your spreadsheet to match the tool. Here the spreadsheet stays as it is and you point the tool at the right column.
Step 4: Choose how the files get named
This is the step that decides whether the ZIP you download is usable or merely a pile of images.
The second dropdown asks which column should name the output files. Leave
it on Numbered and you get
qr_code_1.png through qr_code_400.png — fine if
you are going to use them in row order and never touch them individually.
Pick a column, and each file is named from that row's value:
E10432.png, E10433.png, and so on.
A prefix field appears once you pick a column. It is prepended to every
filename, which is useful when the codes will be mixed into a folder with
other files — badge_E10432.png sorts and searches better
than a bare ID.
Two rules apply to the names, and both prevent silent damage:
-
Anything that is not a letter or a number becomes an underscore. An
email address like
ada@example.combecomesada_example_com.png. This is deliberate — slashes, colons and question marks are illegal or dangerous in filenames on at least one major operating system. -
Duplicate names get a numeric suffix. If three rows share the value
warehouse, you getwarehouse.png,warehouse_2.pngandwarehouse_3.png. Without this, the second and third would silently overwrite the first inside the ZIP and you would end up with fewer files than rows — a failure that is easy to miss until the labels are already printed.
The guide on filename columns goes deeper into choosing a good identifier column.
Step 5: Decide on individual files or printed sheets
The "QR codes per image" setting controls the output shape:
| Setting | What you get | Good for |
|---|---|---|
| 1 | One PNG per row, individually named | Mail merge, label software, per-item use |
| 2 or more | A grid of codes on one PNG, labelled underneath | Printing directly, cutting up by hand |
If you are feeding the codes into Word, InDesign, Avery templates or label-printing software, you want 1. Those tools want to place images individually and will find them by filename — which is exactly why step 4 matters.
If you are going to print and cut, pick a number that matches your paper. The codes are arranged in a near-square grid, so 12 per image gives you a 4 × 3 layout. Each code is labelled underneath with its name, or with its URL if you did not choose a filename column — because an unlabelled sheet of QR codes is impossible to sort out by eye once it is cut up. The label can be switched off with the checkbox if you want bare codes.
Step 6: Generate
Click Generate QR Codes. Everything happens on your
machine: each code is encoded, drawn onto a canvas, and added to a ZIP
archive which then downloads automatically as
qr_codes.zip.
Large batches take a moment — a few thousand codes will keep the browser busy for a minute or so, and the tab may look unresponsive while it works. That is normal. There is no upload step and no queue, so the only limit is your own device.
Before you print several hundred of anything
Scan-test at least three codes from the finished batch with an actual phone camera: the first, the last, and one from the middle. This catches the two mistakes that are expensive to discover later — a column misselected so that every code encodes an identifier rather than a URL, and an export where trailing whitespace or a stray quote character ended up inside every URL.
If a code refuses to scan, why your QR code will not scan works through the causes in the order they actually occur. If the upload itself misbehaved, or the batch came out with the wrong count, fixing CSV upload problems covers every error message and the silent failures that produce no message at all.
Static codes cannot be edited. The destination is encoded directly into the pattern, so there is no redirect to update later. That is what makes them permanent and untrackable — but it also means a wrong URL is a reprint. If you expect destinations to change, encode URLs on a domain you control and handle the redirect at your end.
Common problems
The ZIP has fewer files than my CSV had rows
Rows with an empty URL cell are skipped. Check for blank rows at the bottom of the spreadsheet, which Excel exports enthusiastically.
Every filename is qr_code_N even though I picked a column
The chosen column is empty for those rows, so the numbered fallback applies. This often happens when the identifier column has a formula that exported as a blank rather than a value.
The codes scan to the wrong page
Almost always the URL column contains a relative path
(/staff/10432) rather than a full URL. A QR code has no
concept of "current site", so the scheme and domain must be present:
https://intranet.example.com/staff/10432.
My scanner reads the code but nothing opens
Check the scheme. www.example.com without
https:// is encoded as plain text, and many scanners will
display it rather than open it.
Next steps
- Printing a sheet of identical codes — when every code is the same rather than different.
- QR codes for asset and inventory labels — what to encode on a physical asset tag.