Zen QR
Zen QRScan with calm.

Generating hundreds of QR codes without going mad

Sometimes you need one QR. Sometimes you need 500: one per asset, one per seat, one per package. Here's how teams handle batch QR generation today, and where the Zen QR generator fits.

Start with a clean spreadsheet

One row per QR. Required columns: a stable unique identifier (asset ID, seat number, SKU), the QR payload (URL, text, etc.), and a human-readable label that gets printed next to the code. Bad spreadsheets are the source of 90% of batch-QR pain — sort by identifier early, dedupe early.

Pick the right payload pattern

Encode the unique identifier in a stable URL: example.com/asset/{id}. The destination page can change behavior without reprinting any QR. Don't encode raw asset metadata in the QR — your asset metadata changes; your QR pattern can't.

Print layout matters

Avery sheet templates (5160, 5263, etc.) work for ~30-200 codes per sheet. For 500+, switch to roll-printable labels and a label printer. Always include the human-readable identifier under the QR — it's invaluable when someone's phone fails to scan and they have to type the ID manually.

Zen QR's role in batch

The on-page generator is one-at-a-time today. The /api/qr/generate endpoint takes a single text + style and returns a PNG — script around it with curl or Node.js to batch through your spreadsheet rows. A native batch UI (CSV upload → ZIP of PNGs) is on the roadmap; reach out if you'd find it useful.

How to use it

  1. 1

    Prepare a clean spreadsheet

    One row per QR. Required columns: a stable identifier (asset ID, SKU, seat number), the QR payload (URL, text, etc.), and a human-readable label printed next to the code.

  2. 2

    Pick a stable URL pattern

    Use example.com/asset/{id}. The destination page can change behavior without reprinting any QR. Don't bake metadata into the QR — it changes; the QR can't.

  3. 3

    Script the generation

    Loop your CSV rows, POST each row's text to /api/qr/generate, save the returned dataUrl as a PNG. A bash + curl script fits in ~20 lines.

  4. 4

    Lay out for printing

    Avery sheet templates (5160, 5263, etc.) work for ~30–200 codes per sheet. Bigger runs go on roll-printable labels with a label printer.

  5. 5

    Include the human-readable ID

    Print the identifier under each QR — invaluable when a phone fails to scan and the user has to type it manually.

Who uses it

Asset tagging

Office furniture, lab equipment, IT hardware — each gets a unique QR pointing at its inventory record.

Event seating

Per-seat QR for ticket validation, allergies, or post-event feedback specific to the seat.

Retail inventory

Per-SKU QR for stock checks, price lookups, or product details on shelves.

Print-on-demand

Postcards, packaging inserts, gift tags — each batch personalized with a unique QR linking to a per-recipient page.

Frequently asked

Can I generate from a CSV today?
Not in the UI yet — but you can script it. Loop your CSV rows, POST each row's text to /api/qr/generate, save the dataUrl as a PNG. A bash/Node example fits in 20 lines.
What's the API rate limit?
No rate limit currently. Generation is computationally cheap (each call is single-digit milliseconds), so batches of a few thousand finish in seconds. We'll add limits if abuse appears.
Should each QR be unique?
If the destination is the same ("open our home page"), one QR works on every print. If the destination varies per asset (per-asset registration link), each QR must be unique. There's no middle ground that's also useful.
What about printing with cutter marks?
Use your label-template software (Word, LibreOffice, dedicated label tools) to lay out the codes. Zen QR's job ends at producing one good PNG per row — the layout is a separate problem.

Sometimes you need one QR. Sometimes you need 500: one per asset, one per seat, one per package. Here's how teams handle batch QR generation today, and where the Zen QR generator fits.

Batch QR Code Generation — Patterns and tools | Zen QR