Bulk workflows

How to Create and Manage QR Codes from Google Sheets

Google Sheets is an excellent place to prepare and review QR destination data, and a poor place to run live redirects from. The practical question is not whether a spreadsheet can produce a QR image — it can — but what you will need to do with those codes six months after they are printed.

Written by
VastQR Product & Editorial Team
Last updated
On this page
  1. Three ways to do it
  2. What the sheet needs
  3. Exporting as CSV
  4. Validating the batch
  5. 10, 100 and 500 rows
  6. Row-to-QR mapping
  7. Sheet vs live state
  8. Common mistakes
  9. FAQ

Three ways to turn a sheet into QR codes

MethodBest forEditable after printBulk validationOngoing management
In-cell formulaA handful of static imagesNoLimitedNo
Google Sheets add-onAutomation inside the spreadsheetDepends on the add-onDependsDepends
CSV → bulk QR platformLarge structured batchesYes, with dynamic codesYesYes

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.

  1. Google Sheets
  2. Export CSV
  3. Preview + validate
  4. Create dynamic batch
  5. Manage destinations
The VastQR workflow. Everything up to and including validation happens before you pay.

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.

titledestination_url
Downtown Menuhttps://example.com/downtown
Richmond Menuhttps://example.com/richmond
Store 014 — Window Signhttps://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:

FieldAccepted header namesNotes
Destinationdestination_url, destination, urlNaming any one of these on the first line is what marks the file as headered
Titletitle, nameOptional; trimmed and length-capped
No header row at allEvery line is treated as data, with the destination first and an optional title second
Titles are for the operator six months from now

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

  1. 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.

  2. 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.

  3. Confirm the cells hold complete URLs

    A bare host such as example.com/summer is normalized to https://example.com/summer on import. Anything that is not a usable web destination stays invalid instead of being guessed at.

  4. 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.

  5. 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:

A three-row test file, with one row intentionally wrong.
titledestination_urlVerdict
Valid Onehttps://example.com/oneReady
Valid Twoexample.com/twoReady — normalized to https://
Broken Rownot-a-valid-urlNeeds attention
The VastQR bulk preview showing a parsed batch with a ready count, a row flagged as needing attention, and the normalized destination that will be stored for each row.
The preview reports the count it will actually create, and shows the normalized destination it will store — not the raw text you pasted.
The number to trust
The ready count is the number of codes the importer can create. If your sheet has 200 rows and the preview says 197, three rows will not become codes until you fix them — and that is the point of looking before you pay.

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 sizeWhat a person can verifyWhat has to be systematic
10 rowsEvery row, by reading itNothing — scan two or three finished codes and ship
100 rowsOnly the flagged rowsConsistent titles, automated URL validation, sample scanning
500 rowsOnly the exceptions and a sampleNaming 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.

How to keep hundreds of printed codes under control →

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 assumption to avoid
“I changed the cell, so the printed code must have changed.” Without a live integration, and VastQR has none, changing a spreadsheet cell changes nothing about a live redirect. Destination changes are made in VastQR.

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.

Changing a destination after the codes are printed →

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?
Yes. A formula can render a QR image in a cell, and add-ons can generate them in bulk. Whether those codes are editable after printing depends entirely on the method, not on Sheets.
Does VastQR sync directly with Google Sheets?
No. There is no native Sheets integration and no live sync. The supported path is Google Sheets → export CSV → paste or upload into VastQR.
What columns do I need?
A destination column is the only requirement. VastQR reads a header named destination_url, destination or url, and a title from title or name. A file with no header row is read as one destination per line.
Can I create hundreds of QR codes from one spreadsheet?
Yes. The current plan covers up to 500 active dynamic QR codes, and a batch can be prepared and validated before you pay for anything.
Can I change destinations after printing?
Yes, for dynamic codes. The printed pattern stays the same while the destination behind it changes.
Does editing a cell in my sheet update the live QR code?
No. Without a live integration those are two separate systems. The sheet records what you intend; the live redirect is changed in VastQR.
Why validate URLs before generating?
Because a spreadsheet repeats an error at scale. One malformed column becomes hundreds of broken printed codes, and the cost of that is the reprint, not the generation.

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.

Sources