Bulk QR code generator

One row, one code. A thousand rows, one ZIP.

Try a single code first

Free, no account, and the code never expires. Nothing you type is uploaded.

Making four hundred codes by hand is not a design problem, it is a data problem. The destinations already exist in a spreadsheet — one per product, per table, per room, per asset — and what you want is the same operation applied to every row, with names that let you match a code back to the thing it belongs to.

That is what a bulk run does. You upload the sheet, map its columns once, and get an archive containing a file per row plus a mapping file that pairs each filename with its destination and its short link. The mapping file is the part people underestimate: without it, four hundred images are indistinguishable from each other.

The parsing happens in your browser, so you can see exactly which rows were understood before anything is created. That matters more than it sounds, because the most common problem with a spreadsheet is not the data — it is a column that was read as the wrong field.

What the spreadsheet needs to look like

One header row, then one row per code. Only the destination column is required; everything else has a sensible default. Column names are matched loosely — case, spacing and underscores are ignored, and the obvious synonyms are accepted, so a column called “URL”, “Link” or “Target” is all understood as the destination.

  • destination — required. The address the code should point at
  • name — a label for your dashboard. Defaults to the destination's host
  • slug — a custom short link, if you want a specific one
  • campaign — the campaign to file this code under
  • utm_source, utm_medium, utm_campaign, utm_term, utm_content

Both CSV and XLSX, and the separator problem

Excel writes a semicolon between fields in every locale where the decimal separator is a comma, which is most of Europe. A tool that assumes a comma reads such a file as a single column per row and reports that the file is malformed, which is a confusing way to say “wrong punctuation”.

The separator is detected rather than assumed, so a sheet exported from a Czech or German Excel behaves the same as one from a US install. Quoted fields containing separators, line breaks and doubled quotes are handled, and a byte-order mark is stripped so the first column still matches.

Workbooks are read directly, without a conversion step. Empty cells are respected rather than collapsed — a blank in the middle of a row shifts nothing, which is the failure that turns a destination column into a name column.

A bad row fails alone

A malformed address in row 208 does not stop rows 209 onward. That row is reported with its number — the number the spreadsheet shows, not a zero-based index — and everything else proceeds. You fix eleven rows and re-run those, rather than starting a thousand again.

Entirely blank rows are skipped and counted rather than reported as errors, because a sheet with hundreds of formatted-but-empty rows under the data is completely normal and a hundred error messages about them is not useful.

Questions people ask

How many rows can one run handle?

Up to five thousand in a single upload. Larger sets are better split, mostly so that a mistake in the column mapping costs you one batch rather than all of them.

Are the generated codes static or dynamic?

Dynamic, so each destination can be changed later without reprinting. That is usually the point of a bulk run: the labels go on physical things that are expensive to relabel.

What is in the archive?

One image per row in the format you chose, named from the row's name column, plus a mapping file pairing every filename with its destination and short link. Keep the mapping file — it is how you match a code back to its row later.

Does bulk generation need a paid plan?

Yes. The single-code generator on this page is free and needs no account, but a bulk run creates dynamic codes, and those are part of a paid plan. The row limit and the formats depend on which one.

Can I add UTM parameters per row?

Yes — five UTM columns are read per row, so each code can be tagged individually. A campaign can also apply one set of parameters across every code in it, which is less work when the tagging is the same.

Related generators

Need to change it after printing?

That is a dynamic code — and ours keeps redirecting even if you cancel.