Bulk QR Code Generator from CSV — Free, ZIP Download
Paste a list or upload a CSV — generate up to 500 custom QR codes at once and download them all as a ZIP.
Turn a spreadsheet of links into a folder of QR codes
This bulk QR code generator takes a list you paste or a CSV you upload and produces up to 500 QR codes in one batch — each styled the same way and named the way you choose. It is built for the jobs where making codes one at a time would eat an afternoon: product labels, event tickets, inventory tags, office asset tagging, educational materials, and branded marketing campaigns. Pick PNG or SVG, add a logo, choose your colours and dot pattern, and download every code as a single ZIP. It is free, with no account and no signup.
Everything runs in your browser in JavaScript — your URLs, text, and logo never leave your device and are never sent to a server, so the batch is limited by your machine, not an upload cap. If you only need one code, the single QR code generator with 14 content types is the quicker path; this page is for doing it in batch.
Formatting your list: content before the comma, label after
The input is deliberately simple: one entry per line. The tool splits each line on the first comma — everything before it becomes the QR code’s content, and everything after it becomes the label used as the filename. Leave the comma off and the code still generates; it just gets an automatic name like QR-1, QR-2, and so on.
So a CSV exported straight from a spreadsheet works as-is. Here is a valid list mixing several content types — a website URL, a phone number, an email, and a Wi-Fi join string:
https://example.com,Example Website
https://github.com/your-org/repo,GitHub Repo
tel:+15551234567,Call Sales
mailto:hello@example.com,Email Us
WIFI:T:WPA;S:GuestWiFi;P:welcome123;;,Guest WiFiThat produces five codes named Example Website.png, GitHub Repo.png, and so on, all zipped together. You can encode anything that is text: website URLs, plain text, tel: phone numbers, mailto: email addresses, or WIFI: strings. Not sure of the layout? Click Sample CSV in the tool to download a ready-made file you can edit. If your data lives in a JSON export, convert the JSON array to a CSV first, then upload it here.
One honest limit: this is a two-column, split-on-the-first-comma reader, not a full RFC-4180 parser. It does not understand quoted fields, so if the content itself contains a comma, everything after that first comma is read as the label. Keep your URLs and content comma-free — they almost always are — and you will never hit it. The cap is 500 rows per batch; extra lines beyond 500 are ignored.
Branding the whole batch: colours, dot patterns, and a centre logo
Open Customize and every visual choice applies to all 500 codes at once, so the batch stays consistent. Two colour pickers set the foreground and background — the default is safe black-on-white — and a Dot Style menu changes the shape of the modules: Square is the classic look, Rounded softens the corners, and Dots renders each module as a circle. The dot pattern is purely cosmetic and carries through to the finder squares too, so a rounded or dotted style stays coherent across the whole code.
You can also drop in a logo (PNG, JPG, or SVG). It sits in the centre of every code at about 40% of its width, with a little clear margin so it reads cleanly, and error correction switches to H automatically so the covered centre never costs you a scan. Whatever colours or dot pattern you choose, keep strong contrast — dark modules on a light background — and print one to test, because the rounded and dots styles trim the module edges slightly and want a touch more size to stay reliable.
Sizing each code and choosing an error-correction level that survives print
Error correction is the redundancy that lets a code still read when part of it is dirty, damaged, or covered. The tool offers four levels — L recovers about 7% of the code, M about 15%, Q about 25%, and H about 30%. Higher levels add more modules, which makes a small printed code denser and, paradoxically, harder to scan — so don’t just crank it to H for everything. On a screen, where pixels are pristine, L or M is plenty. In print — glare, ink bleed, curved surfaces, handling, or an embedded logo — bump it up. (Upload a logo and the tool moves you to H automatically.)
Size matters just as much. A reliable rule of thumb is the 10:1 ratio: a code scans comfortably from up to about ten times its own width. Work backwards from how far away the scanner will be:
| Where the code appears | Minimum printed size | Reliable scan distance (~10:1) | Suggested level |
|---|---|---|---|
| Business card / label sticker | 2 × 2 cm (0.8 in) | up to ~20 cm | M — or H with a logo |
| Product packaging (curved, glossy) | 2.5 × 2.5 cm | ~25 cm | Q or H — glare and curve cost modules |
| Flyer, brochure, table tent | 3 × 3 cm | ~30 cm | M |
| Wall poster or window (arm’s length) | 10 × 10 cm | ~1 m | M |
| Trade-show banner / signage | 20 × 20 cm | ~2 m | M–H |
| Screen only (no print) | ~120 px and up | on-screen | L or M |
These are print guidelines, not limits the tool enforces — always print one and test it at the real distance before committing a batch. SVG output is vector, so it scales to any print size without pixelating; PNG is fixed at 512px or 1024px.
The codes are static — how to still track every scan
Every code this tool makes is a static QR code: the destination is encoded directly into the black-and-white pattern. Scan it and the phone goes straight to whatever you typed — no middle-man redirect. For a batch that is usually what you want, because the codes work forever, offline, with no subscription and nothing that can expire.
The trade-off is the flip side of the same coin. Because the URL is baked into the pixels, you cannot edit where a printed code points after the fact, and there is no built-in dashboard counting scans. If you genuinely need to swap a destination after printing, or want a live scan-count panel, that is a dynamic QR code, and it needs a redirect service that owns the short link — dedicated dynamic-QR platforms and URL shorteners do this well, typically on a paid plan. Concede that to them: for edit-after-print and scan analytics, a dynamic platform wins.
You can still get per-asset tracking out of static codes, though, without paying anyone — you bake the analytics into the URL yourself with UTM parameters, which is exactly what the next section walks through.
Worked example: four placements, one campaign, separate scan counts
Say you are launching a product and want to know whether the flyer, the poster, the table tent, or your Instagram bio drove each scan. Give every placement its own URL with distinct UTM tags, and put the filename in the second column:
https://shop.example.com/launch?utm_source=flyer&utm_medium=print&utm_campaign=spring24,flyer-spring
https://shop.example.com/launch?utm_source=poster&utm_medium=print&utm_campaign=spring24,poster-spring
https://shop.example.com/launch?utm_source=tent&utm_medium=print&utm_campaign=spring24,table-tent
https://shop.example.com/launch?utm_source=ig-bio&utm_medium=social&utm_campaign=spring24,instagram-bioOpen Customize, drop in your logo and set your colours and dot pattern as covered above, choose PNG at 1024px for print, and click Generate. Four on-brand codes come out in a ZIP as flyer-spring.png, poster-spring.png, table-tent.png, and instagram-bio.png. Because each destination carries a different utm_source, your analytics show four separate rows, so you know precisely which physical asset earned each visit — the tracking a paid dynamic code gives you, minus the subscription. Before sending 500 of these to the printer, scan a sample code to confirm it resolves to the right link.
Where bulk QR runs go wrong
- Codes printed too small to scan
- The single most common failure. Apply the 10:1 rule, keep printed codes to roughly 2 cm and up, and physically test one at the distance people will actually hold their phone.
- Low contrast or inverted colours
- Most scanners expect dark modules on a light background. A light foreground on a dark background, or two mid-tones, often fails. Keep the foreground dark and the background light, and skip gradients that flatten the contrast.
- Dead links you only find after printing
- A typo or 404 in one row means every printed copy of that code is wrong. Verify the URLs in your sheet, then scan a couple of codes from the results grid before the print run.
- Logo too dominant, or error correction dropped
- At about 40% of the code’s width the logo needs level H. If you override the level lower while a logo is present, the covered centre loses data and scans fail — leave it on H, which the tool already selects for you.
- A comma inside your content
- The parser splits on the first comma, so a value that contains one gets truncated and the remainder becomes the filename. Keep the content comma-free, or drop the label column entirely.
- Generating all 500 before testing one
- Codes are created in batches of 10 with a progress bar, so it is quick to run a handful first. Confirm they scan on a real phone, then generate the full batch and download the ZIP.
Frequently asked questions
Click ‘Upload CSV/TXT’ and pick your .csv or .txt file — one entry per line. The tool reads everything before the first comma as the QR code content and everything after it as the label used for the filename. Then click Generate; all codes are created in your browser and you can download them as a ZIP in seconds. Up to 500 rows per batch.
Yes. Open Customize and upload a logo (PNG, JPG, or SVG); it is embedded in the centre of every QR code at about 40% of its width, with no watermark. Adding a logo automatically raises error correction to H so the codes stay scannable — and unlike many free generators that reserve branded codes for a paid tier, there’s no paywall here.
Yes. In Customize you can set the foreground and background colours and pick a dot pattern — Square, Rounded, or Dots — and every choice applies to the whole batch so the codes stay consistent. Keep dark modules on a light background for reliable scanning, and the rounded or dots styles read best at a slightly larger printed size.
L recovers about 7%, M about 15%, Q about 25%, and H about 30%. Use M for plain codes on screen, and step up to Q or H when you print small, print on curved or glossy surfaces, or embed a logo. Higher levels add density, so don’t over-spec a tiny printed code.
Static — the destination is encoded directly into the pattern, so the codes never expire and work offline with no subscription. You can’t edit where a printed code points afterward or see a scan dashboard; for that you need a dynamic redirect service, typically on a paid plan. For per-asset tracking without one, add UTM parameters to each URL in your list.
After generation finishes, click ‘Download ZIP’ to get every code in a single archive, each file named from its label. Or click any individual code in the grid to download just that one as a PNG or SVG.
Yes. The bulk generator is completely free with no account and no signup, and every code is generated client-side in your browser — your URLs, text, and logo are never uploaded to any server.
From Our Blog
QR Codes for Restaurant Menus: Print Size, Design, and Mistakes to Avoid
A practical print-and-design guide for menu and table-tent QR codes: minimum size for the distance people scan from, the quiet-zone margin, matte-vs-glossy glare, where to place it, and the mistakes that silently kill scans.
Read article →QR Codes15 QR Code Marketing Ideas That Actually Work
15 proven QR campaign ideas across retail, print, events, and loyalty — each with a quick how-to and the reason it actually converts.
Read article →