Three ways to turn a sheet into QR codes
| Method | Best for | Editable after print | Bulk validation | Ongoing management |
|---|---|---|---|---|
| In-cell formula | A handful of static images | No | Limited | No |
| Google Sheets add-on | Automation inside the spreadsheet | Depends on the add-on | Depends | Depends |
| CSV → bulk QR platform | Large structured batches | Yes, with dynamic codes | Yes | Yes |
Some commercial QR platforms do offer a native Sheets add-on. VastQR does not, and this guide will not pretend otherwise. What VastQR is built for is the case where the spreadsheet is the input and the ongoing job is managing hundreds of printed codes afterwards.
- Google Sheets
- Export CSV
- Preview + validate
- Create dynamic batch
- Manage destinations
What the sheet actually needs
One row per QR code, and one column holding the destination. That is the minimum. A human-readable title is not required, and you will regret leaving it out the first time you need to change one code out of three hundred.
| title | destination_url |
|---|---|
| Downtown Menu | https://example.com/downtown |
| Richmond Menu | https://example.com/richmond |
| Store 014 — Window Sign | https://example.com/store-014 |
Which header names are accepted
The importer looks at the first line for a destination column. This is what it recognises, taken from the parser rather than from a marketing page:
| Field | Accepted header names | Notes |
|---|---|---|
| Destination | destination_url, destination, url | Naming any one of these on the first line is what marks the file as headered |
| Title | title, name | Optional; trimmed and length-capped |
| No header row at all | — | Every line is treated as data, with the destination first and an optional title second |
Richmond — Table 14 can be found. QR 037 cannot. When a menu changes and you need to repoint eleven specific codes, the title is the only thing standing between you and opening every code to check.
A sample file to start from
Download the sample CSV — five rows using the exact columns the importer reads. Replace the contents and keep the header line.
Exporting the sheet as CSV
- Check the header row
The first line must name the destination column using one of the accepted header names above. Everything below it is data.
- One destination per row
If a placement needs its own QR code, it needs its own row — even when several rows share the same destination URL.
- Confirm the cells hold complete URLs
A bare host such as
example.com/summeris normalized tohttps://example.com/summeron import. Anything that is not a usable web destination stays invalid instead of being guessed at. - Download the sheet as CSV
In Google Sheets: File → Download → Comma Separated Values (.csv). Only the active sheet is exported, so check you are on the right tab.
If your sheet uses formulas, confirm the export contains the computed values you expect rather than anything stale.
- Paste or upload it into VastQR
Both routes run through the same parser, so a pasted file and an uploaded file produce the same rows, the same normalized destinations and the same ready count.
Validate before you create anything
A spreadsheet is very good at repeating a mistake three hundred times: a missing https://, a trailing space, a smart quote pasted from a document, a blank cell in the middle of a block. Discovering that after the labels are printed is the expensive version.
The VastQR batch preview parses the file and separates ready rows from rows that need attention, before signup and before payment. Take a deliberately broken file:
| title | destination_url | Verdict |
|---|---|---|
| Valid One | https://example.com/one | Ready |
| Valid Two | example.com/two | Ready — normalized to https:// |
| Broken Row | not-a-valid-url | Needs attention |

What changes at 10, 100 and 500 rows
The workflow is the same at every size. What changes is how much of it a human can still verify by eye.
| Batch size | What a person can verify | What has to be systematic |
|---|---|---|
| 10 rows | Every row, by reading it | Nothing — scan two or three finished codes and ship |
| 100 rows | Only the flagged rows | Consistent titles, automated URL validation, sample scanning |
| 500 rows | Only the exceptions and a sample | Naming convention, validation, active-code budget, retained source sheet, a defined process for later changes |
At 500 rows, creation is the easy part. The current VastQR plan covers up to 500 active dynamic codes, so a batch that size is also your whole allowance — worth knowing before you commit a print run to it.
Keeping the row-to-QR mapping intact
The failure that hurts months later is not a broken URL. It is losing the relationship between a spreadsheet row, a QR record, and a physical object in the world. A good mapping answers two questions without anyone scanning anything:
- Which row created this code?
- Which physical asset is this code stuck to?
- One row per QR code, always — even when destinations repeat.
- Titles that name a real-world placement, not a sequence number.
- Include an identifier your business already uses: store ID, SKU, asset number, campaign code.
- Keep the source sheet after generation; it is the project record.
- Do not repurpose a row's meaning after its code has been printed.
- Note which print job each batch went to.
The sheet and the live redirect are two different systems
Before generation, the spreadsheet is the source of truth for what you intend. After the codes are live, it is not — the redirect state is. Those two drift apart the moment somebody edits one of them.
The practical discipline is to treat the sheet as the place you prepare changes — reviewing them, getting them approved, catching the bad ones — and VastQR as the place you apply them. When a group of codes all move to the same new destination, you can select them and apply that destination in one action.
Six ways spreadsheet QR projects go wrong
Using a formula when the job needed dynamic codes
An in-cell formula renders an image. It does not give you a managed redirect, so the destination is fixed the moment it is printed.
Assuming “bulk generation” means “bulk management”
Producing 500 images is one step. Naming them, finding one later, changing its destination, pausing it and seeing whether it is used are the other five.
Publishing a bad URL at scale
A single wrong column becomes hundreds of broken printed codes. Validate first.
Deleting the source sheet after generation
It holds the project context — who each row was for, what it was meant to do, which print job it went to. That context is unrecoverable once it is gone.
Expecting a Sheets edit to reach the live code
Two systems, no wire between them. See the section above.
Losing the physical mapping
If nobody can say which sign carries which code, every future change becomes a walk-around-and-scan exercise.
Frequently asked questions
Can Google Sheets generate QR codes?
Does VastQR sync directly with Google Sheets?
What columns do I need?
Can I create hundreds of QR codes from one spreadsheet?
Can I change destinations after printing?
Does editing a cell in my sheet update the live QR code?
Why validate URLs before generating?
Already have the spreadsheet?
Paste or upload the CSV, see exactly which rows are ready and which need attention, and preview the batch before you pay for anything.