How the bulk QR code generator builds a batch
The bulk QR code generator turns a spreadsheet, or an auto-numbered sequence, into up to 1,000 QR codes that share one brand style, then hands them back as a ZIP of PNG and SVG files or a print-ready PDF sticker sheet. Every step runs in your browser; the spreadsheet is never uploaded.
The two ways to load your data
1. Upload a CSV
Use Download CSV Template for a file with the expected columns:
| Column | Required? | What it holds |
|---|---|---|
Type | Recommended | The payload type: url, text, vcard, wifi, email, sms, phone, location, bitcoin, calendar |
Content | Yes | The data to encode for that row |
Filename | Optional | The name for that code's file. Blank rows become qr_001, qr_002, … |
ForegroundColor, BackgroundColor | Optional | A per-row hex color that overrides the batch-wide color |
After you drop the file in, a Map CSV Columns panel appears. It guesses which of your columns is the content, filename, type, and caption from their headers, and you can correct any of them. The file limit is 5 MB and 1,000 rows.
2. Content template; build each link from several columns
In the mapper, the Content template field takes {ColumnName} tokens and fills them from each row. Given columns SKU and Campaign, a template of:
https://shop.example.com/p/{SKU}?ref={Campaign}produces a unique, fully-formed URL for every row. The template overrides the mapped Content column, so your spreadsheet only needs the raw values, not the assembled links. Pair it with the UTM builder to work out the tracking part of the pattern once.
3. Numbered series: no CSV at all
Generate Numbered Series builds the batch from a pattern. Put {n} where the number goes (https://example.com/table/{n}, or SKU-{n}; with no {n}, the number is appended), then set Start Number, Total Codes (1–1,000), and a Filename Prefix. Press Populate Batch Sequence and it fills the batch directly.
What each type produces
The Type value decides how the Content cell is turned into a payload:
| Type | What you put in Content | What gets encoded |
|---|---|---|
url, text, vcard, calendar | The final string (a URL, plain text, a BEGIN:VCARD block, a BEGIN:VEVENT block) | Encoded exactly as given |
wifi | SSID:MyWiFi;Password:pass123;Encryption:WPA | A properly escaped WIFI: payload |
email | support@example.com?subject=Inquiry or a full mailto: | mailto: is added if missing |
sms | +15551234567?body=Hello | sms: is added if missing |
phone | +15551234567 | tel: is added if missing |
location | 37.7749,-122.4194 | geo: is added if missing |
bitcoin | The wallet address | bitcoin: is added if missing |
Leave Type blank and the tool marks the row url if the content starts with http:// or https://, otherwise text.
The batch style settings
Step 3 applies to every code in the run, except where a CSV row sets its own color:
- Logo: up to 200 KB, centered on every code at about a third of its width. Raise the error correction level if you add one.
- Foreground / Background color: batch-wide, unless a row's
ForegroundColor/BackgroundColoroverrides it. - Size: 300, 500 (default), 1000, or 2000 px. Use 1000 or 2000 for anything that will be printed.
- Export format: PNG only, SVG only, or both (default).
- Error correction: L (7%), M (15%, default), Q (25%), H (30%). Every code in the batch uses the same level.
- Brand Shape: module (dot) style, corner-frame style, and corner-center style, applied uniformly so a batch looks like a set. Square is the most reliable; the rounded and classy styles trade a little scan margin for looks.
Each code is drawn with roughly a 6% margin. That percentage does not establish an adequate quiet zone: a standard QR symbol needs at least four clear modules on every side. Inspect the exported symbol and add a light, empty border where necessary before printing. There is no live per-code preview beyond the first five rows, so check one finished code before you commit a large run.
Example: numbering 20 restaurant tables
Riverside Café wants a QR on each of 20 table tents, each pointing at the menu with its table number attached. You open Generate Numbered Series and enter:
| Field | Value |
|---|---|
| URL / Content Pattern | https://riverside-cafe.example/menu?table={n} |
| Start Number | 1 |
| Total Codes | 20 |
| Filename Prefix | table_ |
Populate Batch Sequence fills 20 rows (table_1 … table_20), the preview shows the first five, and you set a rounded module style, the café's brand color, size 1000, PNG + SVG, error correction M. Generate QR Codes produces:
bulk_qr_codes_2026-09-11.zip
├─ png/table_1.png … table_20.png
├─ svg/table_1.svg … table_20.svg
└─ manifest.csvThen Print Sticker Sheet (PDF) → A4, the 2 × 4 layout (8 large cells per page, sized for table tents), captions on → qr_stickers_sheet_2026-09-11.pdf, three pages.
The ZIP and the PDF Sticker Sheet
The ZIP holds a png/ folder, an svg/ folder (whichever formats you chose), and manifest.csv; one row per code with its filename, type, the first 100 characters of its content, colors, timestamp, and a success or error status. Files keep the names from your Filename column.
The PDF sticker sheet reuses the codes from your last generate, so run the batch first. In its dialog you pick:
| Option | Choices |
|---|---|
| Paper size | A4 (210 × 297 mm) or US Letter (8.5 × 11 in) |
| Grid layout | 2 × 4 (8 large stickers or table tents), 3 × 7 (21 cells; verify dimensions and offsets against your label stock), or 4 × 10 (40 compact labels) |
| Caption under each code | On by default: uses the mapped Caption column, or the filename |
| Cutting guide lines | On by default |
Who uses this
- Events: one code per ticket or badge, numbered or drawn from an attendee export, printed straight onto an Avery sheet.
- Retail and packaging: a code per SKU built with a content template from a product spreadsheet, so the link carries the SKU and a campaign tag.
- Warehousing and asset tracking: sequential asset tags with a consistent prefix, exported as SVG for a label printer.
- Restaurants and venues: a per-table or per-room code, numbered, on the 2 × 4 tent layout.
- HR and operations: a vCard code per employee from a staff list, all in one brand style.
Tips, limits, and common mistakes
- The limits: 1,000 rows per batch, a 5 MB CSV, a 200 KB logo. Split a larger job into runs.
- These are static codes. The content is baked into each code and can't be changed after printing. If a destination might move, point the codes at a redirect you control and edit the redirect later.
- A mistyped
Typeisn't flagged. The tool doesn't stop on a bad type value; it just encodes the raw content as text. Check the preview and one finished code before a full run. - Numbered-series filenames aren't zero-padded.
table_1,table_2…table_10sort out of order in a file browser. Start at a higher number, or rename after export, if order matters. - Wi-Fi content has its own shape. For
wifirows, the Content cell isSSID:name;Password:pass;Encryption:WPA, not a rawWIFI:string. - Large batches are heavy. 1,000 codes at 2000 px in PNG + SVG is a big ZIP and takes a while; the browser is doing all of it. Drop to 1000 px or one format if you don't need both.
- Test before you print. Run one generated code through the QR Code Validator, especially if you chose a rounded style, added a logo, or used brand colors.
Decide on redirects before you generate
Once a batch is printed, the only way to change where a code goes is to have pointed it at a URL you control. If there's any chance the destinations will change (a menu, a campaign page, an event schedule) encode short redirect links now and repoint them later. Read static vs. dynamic QR codes first.