Bulk QR generator — paste list or upload CSV, download as ZIP
Enter up to 200 URLs (or a CSV with Name,URL columns) → the tool generates all QRs with the same style (color, logo, dots), shows a grid preview, and downloads as a ZIP. Ideal for events, sales teams, and marketing campaigns that need many QRs with consistent branding.
Customize design
Center logo
Why use this tool
Generate at scale client-side with a progress bar — no more one-at-a-time. Saves hours of manual work.
Every QR shares foreground/background color, dot/corner style, and a center logo. Print menus/banners/cards with a unified visual.
The ZIP holds each QR PNG plus an _index.csv mapping name→URL. Open in Excel for QA or import into your printing system.
How to use
- 1Paste a URL list — one URL per line, or use 'Name, URL' format (e.g. 'Table 1, https://menu.com/table/1') to name the file from Name.
- 2Or click 'Upload CSV' to pick a .csv/.txt file — up to 1MB, one URL (or Name,URL) per row.
- 3Tune the design (color, logo, size) in the panel on the right — applies to ALL QRs.
- 4Click 'Generate' → watch the 0→100% progress (~100-200ms per QR).
- 5The preview grid appears → click 'Download ZIP' → file qr-batch-<timestamp>.zip downloads automatically.
When do you need bulk QR?
Generating QRs one by one when you need 50–200 (per restaurant table, per product, per sales rep, per unique coupon) is hugely time-consuming — ~30 seconds per QR including typing the URL, picking a style, and downloading. The bulk generator cuts this from hours to minutes.
Most common: a restaurant with 50 tables, each with its own menu QR → 50 lines of 'Table 1, https://menu.com/table/1' → one ZIP with 50 PNGs ready to print. Or 100 products with QRs pointing to detail pages — staff scan to look up info on the box.
Everything runs 100% client-side: the CSV is not uploaded, each QR is rendered by qr-code-styling in the browser, and the ZIP is built with jszip — all in-browser. Safe for sensitive lists like internal customer links.
200 QRs per batch is the cap to keep the browser CPU healthy — each QR takes ~100–200ms to render and encode PNG. 200 QRs run for about 30 seconds. Split into multiple batches for larger jobs.
- ✓Up to 200 QRs per batch
- ✓Two input modes: paste a list, or upload CSV (.csv/.txt ≤1MB)
- ✓Flexible format: one URL per line OR 'Name, URL'
- ✓Auto-detect URL type (only http/https accepted)
- ✓Same style applied to every QR (color, logo, dots, corners)
- ✓Realtime progress bar + event loop yield so the UI stays responsive
- ✓ZIP output includes _index.csv mapping name→URL
- ✓Filename auto-derived from Name or URL hostname
- ✓100% client-side — the list and QRs never leave the browser
Use cases
50 tables → 50 unique QRs to per-table menus and order pages. Staff receives orders tagged with the table_id.
100 SKUs, each with a unique QR to its detail page. Scan for video, reviews, instructions.
Generate 200 unique codes for a campaign, each with its own QR. Track conversions per customer.
20 reps × 1 URL portfolio QR each (vCard QRs must be done individually, but URL portfolios bulk fine).
One unique check-in QR per ticket. Import a CSV of attendees + verify URLs.
Warehouse with 500 bins → 500 product QRs, scanned to update bin location in your WMS.
Under the hood
Pipeline: (1) parse text/CSV into Entry[]{name, url}, (2) loop each entry → create a QRCodeStyling instance → getRawData('png') → blob → dataURL, (3) yield the event loop every 5 QRs to keep the UI responsive, (4) on completion → jszip.file(name+'.png', base64, {base64:true}) for each QR + add _index.csv → generateAsync with DEFLATE compression level 6.
Filename sanitization: characters outside [a-zA-Z0-9-_.] become underscores, max 80 chars. Duplicates get '-2', '-3' suffixes.
Memory: 200 QRs @ 320×320px PNG ≈ 5-15KB each → total ZIP ~1-3MB. Browser peak memory ~50MB during generation (canvas + dataURL). No upload, so no bandwidth limits.
Frequently asked questions
Why is the limit 200 QRs per batch?
To keep the browser CPU healthy and avoid oversized ZIPs (>10MB). For more, split into multiple batches and download separately. Or use the API (not yet public — contact developer).
What's the CSV format?
Simplest: one URL per line. To name file outputs, use 'Name, URL' (comma-separated). The Name column becomes the PNG filename. E.g. 'Table 1, https://menu.com/1' → file 'Table_1.png'.
Can I embed a logo in each QR?
Yes. Upload a logo in the Customize panel — it applies to ALL QRs. Same size (≤200KB) for every QR.
Other formats besides PNG?
Phase 1: PNG only inside the ZIP. Bulk SVG + JPG will come later. For per-QR SVG, use the single-tool /vi/tao-qr-url.
Can each QR track scan_count?
No — these are static QRs. For analytics, use /vi/qr-dong (Dynamic QR). However dynamic QRs must be created individually for now, no bulk yet.
What's in _index.csv?
A mapping of filename → original URL — useful for audit or import into other systems. Open in Excel/Numbers/Google Sheets.