Google Sheets is a genuinely good place to keep an inventory count. It is free, everyone already knows how to use it, and you can pivot or chart the result without exporting anything. The hard part is not the spreadsheet — it is getting a barcode off a physical item and into a row without someone typing thirteen digits by hand.
There are three practical ways to do it. This guide covers all three honestly, including the ones that cost nothing, so you can pick based on how many people are scanning and how much a lost scan actually costs you.
Method 1: a Google Form (free, best for simple cases)
A Google Form writes every submission straight to a Sheet, and it costs nothing. This is the right answer more often than software vendors like to admit.
- Create a form with one short-answer field per column you want (barcode, quantity, location).
- Under Responses, link the form to a Google Sheet.
- Open the form on a phone and bookmark it, or print its QR code so staff can reach it quickly.
- For each item, tap the barcode field and scan.
The catch: a Google Form has no camera scanner of its own. To fill the barcode field you either type the value, or scan with a separate app and paste it in. That is two apps and a paste per item, which is fine for fifty items and painful for five hundred.
Use a form when the volume is low, the people scanning are patient, and connectivity is reliable. It has no offline buffer, so a submission attempted with no signal is simply lost.
Method 2: an Apps Script web app (free, you own the code)
Google Apps Script can host a small web page with a real camera scanner in it, usually by pulling in a JavaScript barcode library, and append rows directly to your Sheet. Several excellent public tutorials walk through this, and the result is genuinely free and completely yours.
- You control every field, every validation rule, and the whole layout.
- No third-party service holds your data or your credentials.
- No per-user or per-device cost, ever.
The trade is maintenance. You own the camera permission edge cases, iOS Safari quirks, in-app browser problems when someone opens the link inside a messaging app, duplicate suppression when a code sits in front of the lens, retry behaviour when the venue wifi drops, and Apps Script quota limits under concurrent use. None of that is hard in isolation. All of it together is a small project, and it tends to surface on the day of the count rather than during setup.
Choose this if you enjoy owning the code, or if policy prevents third-party services touching the data.
Method 3: a hosted scanner link
The third option is a hosted scanner that writes to your Sheet, where you configure it once and share a URL. This is what QR to Sheets does, so treat this section as interested but specific.
You connect a Google Sheet, create a scanner link, and send the URL to whoever is counting. They open it in a phone browser, allow the camera once, and scan. Every scan appends a timestamped row. Nobody installs an app or creates an account, which matters when the people counting are temporary staff or a crew you will not see again next month.
Comparing the three
| Free / do it yourself | Hosted scanner link | |
|---|---|---|
| Cost | Free (Form or Apps Script) | Free to 300 scans, then $7 per device per month |
| Built-in camera scanner | Form: no. Apps Script: yes, if you build it | Yes |
| Setup time | Form: 10 minutes. Apps Script: hours to days | Under 5 minutes |
| Offline scanning | No buffer; a failed submit is lost | Saved on device, syncs on reconnect |
| Several people at once | Possible, but no per-person accountability | One device licence per scanner |
| Duplicate suppression | You build it | Code must leave the frame before re-accepting |
| Who maintains it | You | Hosted |
| Data ownership | Your Sheet | Your Sheet |
Getting the row right, whichever method you pick
This is the part that determines whether the count is usable afterwards, and it is independent of tooling.
- Capture who scanned. A count with no attribution cannot be spot-checked when a number looks wrong.
- Capture location, aisle, or zone as its own column. Deriving it later from scan order never works.
- Store the barcode as text, not a number. Long numeric barcodes with leading zeros lose the zeros when treated as numbers, and EAN-13 values can hit float precision issues.
- Decide in advance whether a repeated barcode means a second unit or an accidental double scan. Both are legitimate; you just need one rule.
- Keep timestamps, and know what timezone they are recorded in before you present the numbers to anyone.
Formula injection is worth a thought if barcode values come from outside your business. A value starting with an equals sign can be interpreted as a formula by a spreadsheet. Write values as raw text rather than letting them be parsed.
A realistic recommendation
If you are counting a few dozen items occasionally, use a Google Form and keep the money. If you want to own the stack and have time, build the Apps Script version. If several people need to scan at once, on their own phones, in a building with unreliable wifi, and a redone count costs you a day, a hosted scanner link earns its keep — and that is the honest boundary between free and paid here.
Step by step
- 1
Decide what one scan means
Before any setup, write down the row you want. For a stock count that is usually barcode, quantity, location, who scanned, and when. Getting this wrong is the most common reason a count has to be redone.
- 2
Create the spreadsheet and header row
Make a Google Sheet with one column per field. Keep the header row exactly one row and avoid merged cells, because every scanning method appends by position and merged cells break that.
- 3
Choose your capture method
A Google Form for the simplest cases, an Apps Script web app if you want to own the code, or a hosted scanner link if several people scan at once and you need offline handling.
- 4
Test with ten real items before the real count
Scan ten items you can verify by hand. Check the values landed in the right columns, that a duplicate scan behaves the way you expect, and that the timestamp is in a timezone you can read.
- 5
Run the count with more than one person
Split by aisle or shelf. If your method only allows one device, this is the point where it stops scaling and you will feel it.
Frequently asked questions
Can Google Sheets scan barcodes on its own?+
No. The Google Sheets mobile app has no barcode scanner. You need something that captures the code and writes a row: a Google Form you paste into, an Apps Script web app you build, or a hosted scanner that appends to the Sheet.
Is there a completely free way to scan barcodes into Google Sheets?+
Yes. A Google Form linked to a Sheet is free, and an Apps Script web app with a JavaScript barcode library is free. Both work. The limits are no offline buffer, no device control, and you maintain the Apps Script version yourself.
Which barcode types can a phone camera read?+
Browser-based scanners typically read QR codes plus common 1D formats including Code 128, Code 39, EAN-13, EAN-8, UPC-A, UPC-E and ITF. 1D barcodes are more prone to misreads on blurry frames, so a good scanner confirms a 1D read across consecutive frames before accepting it.
What happens to scans if the wifi drops mid-count?+
That depends entirely on the method. A Google Form submission with no connection fails and is lost. A well-built scanner saves each scan to the device first and syncs when the connection returns, so counting continues uninterrupted.
Do my staff need to install an app?+
Not with any of the three methods described here. All of them run in a phone browser. That is the main reason to prefer a browser approach for temporary or rotating staff.