Print & production

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.

Minimum CSV shape for a batch of URL codes
namecontentnotes (optional)
table-01https://example.com/menu?t=1Ground floor
table-02https://example.com/menu?t=2Ground floor
asset-A1043https://example.com/assets/A1043Maintenance 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.

Choosing the batch mode
BatchLifespanRecommended mode
Event badges, single-day ticketsHoursStatic
Table tents for a seasonal menuWeeksDynamic
Asset tags, plaques, machinery labelsYearsDynamic
Packaging print runMonths to yearsDynamic

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

  1. Count the files: the ZIP must contain exactly as many codes as the CSV has rows.
  2. Spot-check the first, middle and last row by scanning the actual exported file.
  3. Check the smallest planned print size against the minimum module size, not against how it looks on screen.
  4. Print one physical proof on the real substrate and scan it in the real lighting.
  5. 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.

Author

Paolo Matias TonelloFounder, Qreator

Founder of MT Digital Services LLC and builder of Qreator. Writes about QR codes, print production and privacy-friendly analytics.

Put it into practice