Bulk Static code Runs in your browser

Bulk QR Code Generator

Generate hundreds of QR codes from a CSV and download a ZIP.

Your data is processed locally in your browser and is not uploaded to our servers.
QR codes created with this tool are static. Once generated, their encoded content cannot be changed.

What this tool does

Turns a spreadsheet into a folder of QR codes. Upload or paste a CSV, map your columns to the fields the QR type needs, check the validation report, pick a design, and download every code as a ZIP. Links, plain text, Wi-Fi networks and contact cards are all supported.

Getting your CSV ready

Download a template for the type you have chosen and you will get the exact column names the mapper recognises. Your own file works too: headers are detected automatically, common names are matched for you (link and website both map to URL), and anything unmatched can be assigned by hand. Comma, semicolon and tab delimiters are all detected, and UTF-8 with or without a byte-order mark is handled so accented names survive.

Validation before generation

Every row is checked with the same rules as the single generator: bad URLs, blocked schemes, invalid email addresses and empty required fields are listed with their row numbers before you generate anything. Exact duplicates can be skipped automatically. Invalid rows are excluded rather than silently producing broken codes, and you can download an error report as CSV to fix your source data.

File names

Map a column to "File name" and each code is named from it — room-101.png, jane-doe.svg — which is the difference between a usable batch and 300 files called qr-1 to qr-300. Names are sanitised and de-duplicated automatically, and no data from the encoded content ever ends up in a file name unless you map it there yourself.

It really does run in your browser

The CSV is read with the FileReader API, the codes are drawn on a canvas, and the ZIP is assembled with a small archive writer built into the page. No file, row or generated image is uploaded. That is worth knowing when the spreadsheet is a customer list, a guest Wi-Fi roster or an unreleased product catalogue.

Limits and performance

Batches are capped at 500 rows so the browser's memory stays sane; split larger jobs. Generation is chunked so the page stays responsive and the cancel button works instantly. SVG output is vector and usually smaller for simple codes; PNG suits anything being placed into a document or a print layout.

Preparing the CSV

Press Download a CSV template above to get a file with the right headers for the code type you picked, already filled with two example rows. Editing that is more reliable than building a file from scratch.

Column names are matched case-insensitively and common aliases are accepted — a column called name, label, title or id is all understood as the filename column — and anything the tool cannot place automatically you can map by hand in the dropdowns after uploading. Extra columns are ignored rather than treated as an error, so you can upload an export from another system without stripping it first.

Three things that cause most upload problems:

  • Save as CSV, not as a spreadsheet. "Excel Workbook (.xlsx)" renamed to .csv is not a CSV.
  • Keep the header row. Without it the first record becomes column names and disappears from the output.
  • Quote fields containing commas. "Acme, Inc" — most spreadsheet exports do this for you.

What happens to rows that are wrong

Nothing is generated until every row has been checked, and a bad row never silently becomes a broken code. Validation runs the moment the file is mapped and reports:

  • Rows ready — how many passed.
  • Rows skipped — with the row number and the specific reason: "Not a valid http or https URL", "The SSID column is empty", "A contact needs at least a name, email or phone number". The first six are listed on screen.
  • Duplicates skipped — rows whose encoded data is byte-for-byte identical to an earlier row. Controlled by the Skip rows whose data is an exact duplicate checkbox; turn it off when you genuinely want two copies.

After generating, Download error report gives you a CSV of every rejected row with its row number, the offending value and the reason — open it beside your source file, fix the rows, and re-upload. It is a partial-success model on purpose: 480 good codes now and 20 rows to fix beats an all-or-nothing failure on a 500-row list.

File names, collisions and the row limit

Each image is named from the filename column if you mapped one, and from the encoded value if you did not. Names are sanitised for the filesystem: accents are normalised, characters that are illegal in a filename are replaced with hyphens, and the result is capped at 60 characters.

That sanitising means two different rows can want the same name — Room 101 and Room/101 both reduce to room-101. Nothing is overwritten: the second file becomes room-101-2.png, the third room-101-3.png, and so on. All your codes are in the ZIP.

What you lose is the ability to match files back to rows by name, which matters when the ZIP is going to somebody who has to apply the labels. If the filename column is not naturally unique, prefix it with a row number or an SKU before uploading — a spreadsheet's Remove duplicates on that column alone will tell you in seconds whether you need to.

The limit is 500 rows per batch. If the file has more, the first 500 valid rows are generated and you are told so. This is a memory limit, not an arbitrary one: every code is rasterised in the browser and held until the ZIP is assembled, and a few thousand images will exhaust a phone's available memory and lose the whole job. Split larger lists — by store, by date, by SKU range — and run several batches.

Generation happens in chunks that yield to the browser between batches, so the page stays responsive and the job stays cancellable. Leave the tab in the foreground: some browsers throttle background tabs enough to stall a long run.

Why the list never leaves your device

The CSV is read with the browser's FileReader API, the codes are drawn on a canvas, and the ZIP is assembled by an archive writer built into the page. There is no upload endpoint in this site to receive the file, so the data physically cannot reach us.

That matters more here than anywhere else on the site, because bulk files are exactly the sensitive ones: a customer list, an unreleased product range, hotel guest Wi-Fi credentials room by room, employee contact cards. Uploading any of those to a third-party generator means handing over the whole list. Here the file is opened by your own browser and the ZIP is written on your own disk.

The practical consequence is that we cannot help you recover a job — close the tab and it is gone. Download the ZIP before you navigate away.

Frequently asked questions

Is my CSV uploaded to a server?

No. It is read in your browser, the codes are drawn locally, and the ZIP is built on your device.

How many codes can I generate at once?

Up to 500 per batch. That keeps browser memory reasonable — run several batches for larger lists.

Can I name each file from a column?

Yes. Map any column to "File name" and it is used, sanitised and de-duplicated.

What happens to rows with bad data?

They are listed with their row number and reason, excluded from the ZIP, and downloadable as an error-report CSV.

PNG or SVG?

SVG for print and anything that will be resized; PNG for documents, slides and systems that cannot read vectors.

How many codes can I generate at once?

500 rows per batch. Every code is rasterised in the browser and held until the ZIP is written, so a few thousand would exhaust available memory and lose the job. Over 500, the first 500 valid rows are generated and you are told.

What happens to rows with bad data?

They are skipped, not guessed at. You get the row number and the specific reason on screen, and a downloadable error-report CSV listing every rejected row. The valid rows still generate — 480 good codes plus a list of 20 to fix.

Two rows produced the same file name.

File names are sanitised for the filesystem, so rows differing only in punctuation reduce to the same name — "Room 101" and "Room/101" both become room-101. Nothing is lost: the second becomes room-101-2. But you can no longer match files to rows by name, so make the filename column unique before uploading if that matters.

Is my CSV uploaded anywhere?

No. It is read by your browser, the codes are drawn on a canvas and the ZIP is assembled on your device. There is no upload endpoint. Download the ZIP before closing the tab — nothing is recoverable afterwards.

Curious how we build and check these codes? Read our methodology.