# How to generate QR codes in bulk from a spreadsheet

> Export a CSV with one row per code, upload it, and download a ZIP of images, a grid PDF, or Avery-format label sheets. Verify every code decodes before printing — a systematic error found after 5,000 labels is expensive.

Source: https://useqr.app/docs/how-to/how-to-make-qr-codes-in-bulk · Last reviewed 2026-08-21 · UseQR is free forever, MIT licensed, no signup.

---

## 1. Prepare the CSV

One row per code. At minimum a column with the data; add a filename column so the outputs are
identifiable:

```csv
name,data
table-01,https://example.com/menu?table=1
table-02,https://example.com/menu?table=2
table-03,https://example.com/menu?table=3
```

Practical rules:

- **Non-sequential tokens** for anything that must not be guessable. `c/0001`, `c/0002`
  invites enumeration.
- **Avoid ambiguous characters** if a human might type the value as a fallback: no `0`/`O`,
  no `1`/`l`/`I`.
- **Keep values short.** Every character adds modules, and in a bulk run you are printing
  the same mistake thousands of times.
- **UTF-8 without a BOM**, or the first row will carry invisible characters.

## 2. Upload and set the style once

Style applies to the whole batch. Set the colours, module shape, error-correction level and
size before generating, not after.

For labels, match the error-correction level to the environment: **Q** for anything handled
or outdoors, **M** for clean indoor use.

## 3. Choose an output

| Output | For |
|---|---|
| **ZIP of PNG or SVG** | Feeding into a design or variable-data print workflow |
| **Grid PDF** | Printing and guillotining |
| **Avery label sheets** (5160, 5163, L7160) | Printing directly onto label stock |

For label sheets, check your printer's margins before running the whole sheet — office
printers drift, and a code clipped by a margin is dead.

## 4. Verify the whole batch

This is the step that separates a bulk run from a bulk mistake. Every code should be
rasterised and decoded before it goes to press. UseQR's [bulk tool](/bulk) does this
automatically and reports any row that failed.

A systematic encoding error — an unescaped character, a truncated column, a payload too long
for the chosen size — is invisible in a preview and obvious after 5,000 labels.

## 5. Print a stress proof

Print one sheet at 90%, 80% and 70% of the intended size and scan each. If the intended size
only just works, you have no margin for press variation across a long run.

## Doing it programmatically

```bash
curl -X POST "https://useqr.app/api/v1/qr/batch" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"data":"one"},{"data":"two"}]}'
```

Up to 100 items per call, no key required. Chunk larger runs.

## FAQ

### How do I make hundreds of QR codes at once?
Prepare a CSV with one row per code and run it through a bulk generator that returns a ZIP, a grid PDF or label sheets. UseQR's bulk tool is free with no row limit.

### Should I verify bulk-generated codes?
Yes, every one. A systematic encoding error is invisible in a preview and becomes obvious only after the print run. Decode-verification catches it in seconds.

### What should my CSV contain?
At minimum a data column. Add a name column so outputs are identifiable. Use UTF-8 without a BOM, and non-sequential tokens for anything that should not be guessable.

### Can I print bulk QR codes onto label sheets?
Yes — Avery 5160, 5163 and L7160 layouts are supported directly. Test one sheet first, because office printer margins drift.

## Try it

- https://useqr.app/bulk
- https://useqr.app/sticker-sheet
- https://useqr.app/validate
