Bulk QR code generation: from CSV to print-ready files
Paolo Matias Tonello8 min read
One QR code is a five-second job. Four hundred codes — one per table, per asset, per ticket, per SKU — is a data problem. The batch either comes out of a spreadsheet with predictable filenames, or someone spends a day renaming PNGs by hand and still ships two duplicates.
How to structure the CSV
Every batch generator, ours included, reads a flat table: one row is one code. Two columns do the real work — the label that becomes the filename, and the payload that becomes the code. Everything else is metadata for your own sanity.
| name | content | notes (optional) |
|---|---|---|
| table-01 | https://example.com/menu?t=1 | Ground floor |
| table-02 | https://example.com/menu?t=2 | Ground floor |
| asset-A1043 | https://example.com/assets/A1043 | Maintenance log |
- Use UTF-8 and a comma separator; export from Sheets or Excel as CSV, not XLSX
- Keep names filesystem-safe: letters, digits, dashes. No slashes, no accents, no spaces
- Never leave a name blank — blank names collide into code-1, code-2 and prepress loses the mapping
- Validate the URLs before generating: a typo repeated 400 times is 400 dead codes
Which rows should be dynamic
A static batch encodes the destination directly into each code: free, unlimited, and permanent — but frozen. A dynamic batch encodes a short redirect per row, which you can repoint and measure later. The deciding question is not the volume, it is the lifespan of the printed object.
| Batch | Lifespan | Recommended mode |
|---|---|---|
| Event badges, single-day tickets | Hours | Static |
| Table tents for a seasonal menu | Weeks | Dynamic |
| Asset tags, plaques, machinery labels | Years | Dynamic |
| Packaging print run | Months to years | Dynamic |
SVG or PNG for a print run
Send SVG to prepress. Vector files stay sharp at any size, so the printer rasterises the modules at the press resolution instead of upscaling your pixels. PNG only makes sense when the destination is a screen, a slide or a system that cannot import vector — and then you export at the exact final pixel size, never scaled up afterwards.
- Print, labels, packaging, signage: SVG (or PDF where the workflow demands it)
- Screens, decks, in-app display: PNG at the final size, 1:1
- Never JPEG: its compression softens exactly the edges the scanner reads
Quality control before the press
- Count the files: the ZIP must contain exactly as many codes as the CSV has rows.
- Spot-check the first, middle and last row by scanning the actual exported file.
- Check the smallest planned print size against the minimum module size, not against how it looks on screen.
- Print one physical proof on the real substrate and scan it in the real lighting.
- Only then release the full run.
Tracking a batch without one report per code
Four hundred dynamic codes produce four hundred scan streams, which is unreadable. Group them: put the batch in a folder, tag the rows by location or campaign, and read the aggregate. Individual rows only matter when you are hunting for the one table tent nobody ever scans.
Put it into practice
Keep reading
- How to print QR codes: size, format and best practicesPrinting a QR code is not just about dropping a PNG into a layout. Format, size, contrast and material all decide whether the code scans reliably.
- Static vs dynamic QR codes: the definitive guideThe difference isn't a marketing tier, it's a difference in what is physically encoded in the pixels — and it decides whether you can ever change the destination.
- QR code error correction and minimum print sizeHow much damage a QR code can survive is a number you choose at generation time, and it directly decides the smallest size you can safely print it.