How to generate QR codes in bulk from a CSV file

Last updated: July 2026 · About 7 minutes

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:

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:

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

Open the generator