QR wins on a small or curved label, Code 128 wins when the readers already on your floor are lasers, and an NFC tag only pays where a printed label cannot survive.
A label is not decoration for a shelf. It exists for the ten seconds when someone pulls three units out of a bin and either records the movement or does not. Every choice below — barcode or QR, paper or polyester, front face or top — is a choice about whether that movement gets recorded.
On this page
If recording that movement means scrolling a list, working out which of two near-identical SKUs this one was, and typing a quantity, a fair share of movements never get recorded — and your on-hand, your thresholds and the alert that should have fired drift with them. A code collapses that into one action, which is the discipline behind the practices that stop stockouts.
There are four ways to identify a physical item, each with a trigger rule.
Price the scheme before you argue about it. The consumables are trivial; the labor is not.
Cost of a labeling scheme = (labels or tags × unit cost) + (items × minutes to apply ÷ 60 × hourly rate)
Compare that against the cost of one drifted bin a year, not against zero: correcting a drifted quantity costs a count of that bin, and every threshold set against the wrong number fires late until somebody does it.
The RFID column is really two. 13.56 MHz NFC is what a phone reads and what Stockout supports; UHF is what people mean by "read a whole cart as it goes through the door", and Stockout does not support it at all. Different tags, different readers, no overlap.
| Attribute | 1D barcode (Code 128) | QR code | NFC tag (13.56 MHz) | Passive UHF RFID |
|---|---|---|---|---|
| Consumable cost per item | ~$0.02 (assumed) — the code itself is free | ~$0.02 (assumed) — same label, no extra cost | ~$0.15 (assumed), about 7.5× the label | Tag plus a fixed or handheld reader |
| Read range | A few inches to about 2 ft with a laser reader | A few inches, phone camera | Touch to about 1.5 in | Feet, through cartons |
| Line of sight | Required | Required | Not required, but you must touch the tag | Not required |
| Bulk read | No | No | No — one tap per tag | Yes, this is the whole point |
| Survives abrasion or partial damage | A scratch across the bars kills it | Error correction recovers 7–30% of the symbol depending on level | The chip survives what the label does not | Same |
| Metal and liquid nearby | No effect once printed | No effect once printed | Metal and liquid degrade the read; metal detunes a plain inlay and needs an on-metal (ferrite-backed) tag | Metal and liquid degrade the read; metal needs an on-metal tag |
| Label real estate | About 1.73 in wide for an 8-character SKU at a 10 mil X-dimension | About 0.5 in square for the same SKU at a 15 mil module | Tag footprint, no printed area needed | Larger antenna |
| Effort to apply | Print, peel, apply, test-scan | Identical | Tap once per tag to encode, then apply | Same, plus commissioning |
| Works in Stockout | Yes — generated as Code 128, read by the Android camera or a keyboard-wedge reader on Windows and the web | Yes — standard QR; the Android camera reads it, and on Windows or the web only a 2D imager in keyboard-wedge mode (a 1D laser reader ignores it) | Yes — Android only, one tag at a time | No |
Three things read across the rows.
Code 128 encodes full ASCII, carries a mandatory check character, and has a Set C mode that packs digit pairs into a single character. It is the right default for an internal SKU, it is what Stockout generates, and its width is predictable.
Code 128 width in modules = 11 × data characters + 35
Code 39 width in modules at N:1 = (6 + 3N + 1) × (data characters + 2) − 1
Printed width = modules × X-dimension
An 8-character SKU is 11 × 8 + 35 = 123 modules, 1.23 in at a 10 mil X-dimension. The same SKU in Code 39 at a 3:1 ratio is 16 × 10 − 1 = 159 modules, 1.59 in — 29% wider. On a 2.5 in label, Code 128 leaves room for quiet zones and a human-readable line; Code 39 does not. Code 39's case is that it reads on nearly every legacy scanner; against that, it has no check digit by default and a base set of only 43 characters (uppercase, digits and a handful of punctuation). Use it only if a reader you cannot replace demands it.
UPC-A and EAN-13 are not a design choice, they are numbers you are issued: they need a GS1 company prefix, and a UPC exists so a retailer's till can identify your product, not so your bin can. If a supplier's carton carries one, add it as an additional SKU so the carton scans, and keep your internal SKU as the primary.
ITF-14 and GS1-128 carry application identifiers for lot, quantity and dates on cartons and pallets. They are out of scope here because there is nowhere in Stockout for that structured data to land: an item has no lot, batch, expiry or serial field.
Numbers-only SKUs are the cheapest way to buy label space. Set C encodes an all-numeric SKU as digit pairs, so 12 digits becomes 6 data characters: 11 × 6 + 35 = 101 modules, 1.01 in at 10 mil, against 167 modules and 1.67 in for a 12-character alphanumeric SKU — about 40% narrower (101 ÷ 167 = 0.60).
Code 128's check character catches a corrupted scan. It cannot catch a perfectly-scanned code that belongs to the wrong item, and nothing in the product will tell you. Wrong-label errors are caught by counting, not by symbology.
QR has two advantages over a 1D symbol, and both are measurable.
Footprint. A QR Version 2 symbol is 25 × 25 modules and holds 38 alphanumeric characters at error-correction level M — far more than any SKU needs — and with its quiet zone it is half an inch square.
QR printed size = (symbol modules + 8 quiet-zone modules) × module size
Area ratio = (barcode width × height) ÷ (QR side)²
Damage tolerance. QR carries Reed-Solomon error correction at four levels: L recovers about 7% of the symbol, M about 15%, Q about 25%, H about 30%. A scuff or a staple hole that would break a 1D symbol's bar sequence is recoverable. Use M as the default; higher correction needs more modules for the same data, so the symbol grows. QR also reads at any rotation, which matters for a label applied by hand.
QR's alphanumeric mode covers uppercase A–Z, the digits, and nine symbols (space $ % * + - . / :) — 45 characters in total. A single lowercase letter forces the whole symbol into byte mode, and Version 2 at level M drops from 38 alphanumeric characters to 26 bytes — about 32% less capacity (26 ÷ 38 = 0.68). Uppercase your SKUs and the symbol stays small.
Where QR loses is the reader. It needs a camera or a 2D imager, and an older laser scanner will not read it at all — a keyboard-wedge laser on a Windows PC will read your Code 128 all day and silently ignore your QR. Confirm what is on the floor before standardizing.
Four things earn their place, in the order the label is read top to bottom: the item name, the SKU as human-readable text, the code, and the storage spot if the item has a fixed home. A fifth line — a standing instruction — is worth it only if it will never change.
The printed SKU is the one people cut first and should not. Every scanner fails eventually, and the printed string is what lets a person find the item by hand: search in Stockout is live case-insensitive partial matching across name, SKU and category, so the string on the label is directly typeable into the box.
What to leave off, and why:
Then hold yourself to the size discipline. A 2.5 × 1.5 in label is 3.75 sq in, and the code plus its quiet zones claims between 0.25 and 0.9 sq in of that. Three text lines and one code is a full label; a fourth means shrinking something below the size at which it does its job.
Stockout matches a scan by SKU string, which makes the SKU the primary key of your physical world: a SKU change is a relabel job, not a data edit.
Seven rules for the string, each with its reason.
Encoding the site, the supplier, the shelf or the year into the SKU makes every one of those changes a reprint. Category and Storage Spot are already separate fields — Storage Spot is free text such as "Aisle 1, Shelf A" — and Inventory's funnel sheet filters by both. Put the changeable facts there and keep the SKU meaningless.
When a SKU has to change anyway, there is a trick specific to this product. An item can carry multiple SKUs and a scan matches any of them, so add the new one alongside the old rather than replacing it: old labels keep scanning, new labels carry the new string, and you relabel at your own pace. The same trick handles a supplier's UPC — add it as an extra SKU and the incoming carton's code matches the item.
Each location keeps its own item record for the same product and matching is by SKU string, so WDG0042A at one site and WDG-42A at another is two schemes pretending to be one — one of the traps in running inventory across sites.
Three numbers decide whether a printed code scans, and all three are usually wrong on a first attempt.
X-dimension is the width of the narrowest bar, or of one QR module. Bigger scans from further away and survives worse printing; smaller fits more on the label. 10 mil is a sane default for a handheld or phone read at arm's length; below about 7.5 mil you are depending on a good printer and a clean surface.
Quiet zone is the blank margin the symbol needs, and it is the single most common reason a code will not read. Code 128 wants 10 × the X-dimension on each side with a practical floor of 0.25 in; a QR symbol wants 4 modules on every side. Use 0.25 in — it turns a 1.23 in symbol into 1.73 in of committed label width, and in Stockout the label width is a number you type, so it is the one dimension you can trade against symbol width. A border, a fold, a staple or the next line of text inside that margin breaks the read as surely as a scratch across the bars.
Bar height should be at least 15% of the symbol's length or 0.25 in, whichever is greater — for the 1.23 in example that is 0.18 in, so the 0.25 in floor governs. Short bars force the reader to aim precisely, and precise aiming slows every scan.
Quiet zone (Code 128) = 10 × X-dimension, floor 0.25 in each side
Committed width = symbol width + 2 × quiet zone
Bar height ≥ max(0.15 × symbol length, 0.25 in)
Printer dot = 1 ÷ dpi; usable X-dimension = whole dots × dot size
The print-resolution rule catches almost everyone. A thermal printer can only place whole dots, so an X-dimension that is not a whole number of dots gets rounded and every bar comes out slightly the wrong width. At 203 dpi one dot is 4.93 mil, so the usable X-dimensions are 9.85 mil (2 dots) and 14.78 mil (3 dots) — not 10 mil. At 300 dpi, 3 dots is exactly 10.0 mil. Choose the X-dimension as a whole number of printer dots first, then check the symbol still fits.
An 8-character Code 128 therefore commits 1.73 in of a 2.5 in label and leaves 0.77 in of slack. Drop to a 2.0 in label and the quiet zones alone eat a quarter of it.
Text legibility follows a separate rule of thumb: a common signage guide is one inch of cap height per ten feet of reading distance. At arm's length that is 0.25 in; reading a tag from eight feet down the aisle would need 0.8 in, which does not fit alongside a code on a 1.5 in tall label. Aisle signage and item labels are two different printed things. Print one, walk away from it, and see.
Two independent choices get conflated here: what the label is made of, and how the image got onto it. Both fail quietly. Three failure modes the table below cannot hold:
Direct thermal has no ribbon — heat darkens the paper — so treat it as a months-not-years medium and keep it off anything that lives outdoors, near a heater, or in a vehicle. Application temperature and service temperature are two different numbers on the adhesive's data sheet, and only one usually gets checked: a label applied below its minimum application temperature releases a week later even if the storage temperature was always fine. And an oily surface has to be wiped with isopropyl and dried first, or nothing will hold.
| Environment | Face stock | Print method | Adhesive | Watch out for |
|---|---|---|---|---|
| Dry indoor shelf | Coated paper | Direct thermal | Permanent acrylic | Fading near heat or sunlight |
| Cold store or freezer | Polypropylene or polyester | Thermal transfer, wax-resin | Freezer-grade, rated for the application temperature | Applying a warm-rated adhesive to a cold surface |
| Oily or greasy workshop | Polyester | Thermal transfer, resin | High-tack | Surface not cleaned before application |
| Outdoor or vehicle | Polyester, matte | Thermal transfer, resin | Permanent acrylic, UV-stable | Direct thermal, which will not last a summer |
| Curved stock, pipes, drums | Conformable polypropylene | Thermal transfer | High-tack | Symbol across the curve — rotate to ladder orientation and prefer QR |
On a curved surface, rotate the code so the bars run around the circumference — perpendicular to the cylinder's axis — with the symbol reading along the axis. That is ladder orientation: it puts the bar-width direction on the flat axis of the cylinder, where curvature cannot distort it, and only the bar height wraps. Keep whichever dimension does wrap under about an eighth of the circumference — 0.79 in on a 2 in pipe, 1.18 in on a 3 in drum. A ladder-oriented Code 128's 0.25 in bar height clears both, and so does a QR's 0.495 in side. QR still wins on cylindrical stock for a different reason: a half-inch square sits on a flatter patch of surface, where a 1.73 in symbol has to span far more of the curve whichever way you turn it.
Apply a single label to a real item in the real environment and leave it. A label that survives a bench test but not the freezer is a discovery worth making at a cost of one label rather than four hundred.
Consistency beats cleverness: the same face, the same corner, the same orientation on every unit of the same item, so nobody scanning fifty boxes has to rotate one to find the code. Pick a convention — bottom-right of the front face is a common one — write it down, and hold new hires to it.
RFID's economic advantage is bulk reading without line of sight: walk a cart past a portal, get a hundred reads. That belongs to UHF hardware, and it is the only scenario in which the tag price is repaid quickly. The three unit figures below are assumptions, stated so you can replace them.
Tag program cost = (items × tag price) + (items × seconds to write ÷ 3600 × hourly rate)
Because a tag in this product is read by tapping a phone against it, one at a time, the read workflow is identical to scanning a printed code: several times the material cost plus a commissioning pass, for the same number of taps.
One material rule comes first. A plain NFC inlay stuck to metal detunes and usually will not read — a metal asset needs an on-metal (ferrite-backed) tag at several times the price, so re-run the arithmetic above with that figure. Liquid does the same by absorbing the field.
Which leaves three narrow cases where a tag still wins. A surface where a printed label will not survive or cannot be seen — greasy, washed down, under a cover, or metal with an on-metal tag. An item that is picked up by hand anyway, so the tap costs nothing extra. And no label printer on site but a box of tags. Outside those, print the label.
RFID in Stockout is 13.56 MHz NFC read through an Android phone, one tag at a time; writing a tag puts a single text record on it, and Windows and the browser report that no reader is present. The features page covers where the RFID screen sits.
A tag is matched to an item by treating its whole payload as the SKU, so changing an item's SKU breaks the link to a tag already written. A printed label survives a multi-SKU transition; a tag has to be rewritten.
Everything above is label craft you could apply anywhere. This is the boundary.
The designer. You type a width and a height in inches, and the lines stack top to bottom: a stack, not a canvas, with no free positioning. The available fields are Name, SKU, Category, Cost, Retail, Quantity, Location, Custom text, QR code and Barcode, each with its own size, weight, alignment and optional field-name prefix.
The code. Barcodes are generated as Code 128 and QR codes as standard QR, with no symbology choice and no error-correction setting. The code encodes exactly one of two things — the item's SKU or its Name — chosen with a two-state toggle. It is not a URL, not a record id, and it does not open anything. Leave it on the SKU, because a scan matches by SKU.
Output and scope. Labels are produced for Items, Kits and Equipment only, one record at a time, and a filled-in label exports as a PNG. There is no batch or category-wide print — see designing and printing a label.
Templates are shared team-wide and sync in real time across every location, so one person designs the label and everyone has it, including at other sites.
Scanning works two ways, and the line is hard: the device camera on Android, and a USB or Bluetooth reader in keyboard-wedge (HID) mode on Windows and the web. The camera reads all common symbologies and has no format picker. A scan looks the item up by SKU and moves stock in one tap; an item can carry several SKUs and a scan matches any of them. Making recording a two-second job covers the workflow side; setting up a reader takes five minutes.
Three scope facts save wasted planning. Scanning applies to inventory items only — the buttons live in the Inventory footer, and there is no scanning in Equipment, Checklists, Work Orders, Kits or Folders. Those buttons are hidden for Viewers, so whoever scans needs write permission. And scan history is local to the session: clearing it changes no data.
The unknown-code path is not an error. When a scanned code matches nothing, Stockout offers "Create New Item" with the SKU pre-filled, or "Add to Existing Item" — one of the faster routes through getting inventory off a spreadsheet.
The craft is yours. These four steps are what the app does with it.
Start with the arithmetic that kills the all-at-once plan. The design is done once, so the per-item work is select, print, peel, wipe, apply, test-scan — call it three minutes. For 1,200 SKUs that is 60 hours. Nobody has 60 hours, which is why an all-at-once labeling push usually stalls part-way and leaves you with a half-labeled catalog — the worst of both states.
Total first-pass labor = SKUs × minutes per SKU ÷ 60
1,200 × 3 ÷ 60 = 60 hours
Sequence it in three waves instead.
Wave 1 — new receipts. From a chosen date, every item that comes through the door gets a label as it is put away. The marginal labor is close to zero because the item is already in someone's hands, and your fastest-moving items pass through the door soonest, so the items scanned most get labeled first. Treat any 20/80 split as a planning assumption to replace with your own movement data.
Wave 2 — the A items you cannot wait for. Take the roughly 20% of SKUs that carry most of your movement — ranking items by annual usage value is the same list you would build for counting — 240 of the 1,200, and batch them at two hours a week: 240 × 3 min = 12 hours, so six weeks. Put it in the diary as a recurring block, not a project.
Wave 3 — the tail. Label on first touch. When someone picks a slow-moving item and it has no label, they print one. Many never get touched, and that is the correct outcome: you never spend the labor.
Two rules stop the scheme fragmenting: one template for all items, not one per category, and the same label applied the same way at every site. If a second site labels the same product with a different SKU, the two records were always separate and now the labels hide it.
If the catalog is still being created, scan first and create second: a code that matches nothing offers Create New Item with the SKU pre-filled, so a pallet of unrecognized stock becomes a scan-then-type loop.
The first place labels visibly pay back is the count round. The printed SKU is what somebody at the shelf types into search, which removes the find-it-in-the-list guesswork from every line — most of what makes a regular counting program survivable.
Work the causes cheapest first. Most failures are the quiet zone or the printer, not the symbology — and the one that confuses people most, a good beep and nothing happening, is neither.
| Symptom | Likely cause | Fix |
|---|---|---|
| No read at any distance | Something is inside the quiet zone — border, fold, staple, the next text line | 0.25 in blank on each side |
| Reads intermittently, worse at an angle | Bars shorter than 0.25 in | Raise bar height to 0.25 in |
| Every label reads badly, straight off the printer | X-dimension is not a whole number of printer dots | 203 dpi: use 9.85 or 14.78 mil. 300 dpi: 10.0 mil |
| Voids down the same column of every label | Dirty printhead or low ribbon | Clean the head, change the ribbon |
| Reads on the bench, not on the item | Across a seam, flap or curve | Rotate to ladder orientation, or move to a flat face |
| Was fine, now faded | Direct thermal near heat or sunlight | Reprint on thermal transfer |
| Glare washes the code out | Gloss face stock or laminate | Matte stock |
| QR grew past the space allowed | A lowercase character forced the symbol into byte mode | Uppercase the SKU and regenerate |
| Scans, matches nothing | The SKU changed since printing, or a comma or semicolon in the SKU field split it into two SKUs | Add the old SKU back alongside the new one; strip the punctuation |
| Good beep, nothing happens | Not on the Inventory screen, or signed in as a Viewer | Scanning applies to inventory items only, and the footer buttons are hidden for Viewers |
| Reader types nothing | Not in keyboard-wedge (HID) mode, focus outside the box, or no Enter suffix | Set HID mode and an Enter suffix |
| No camera option | Windows or the browser | Camera scanning is Android; use a USB or Bluetooth reader |
| NFC write fails | Tag is read-only, too small, or not NDEF | Use an NDEF tag with capacity for the SKU string |
There is always a fallback. When a scanned code matches nothing, Stockout offers Create New Item with the SKU pre-filled, or Add to Existing Item — so an item whose label is beyond reading can be brought back into the system by attaching a fresh code to the existing record, instead of hunting for the old one.
Code 128 for an internal SKU. It encodes full ASCII, carries a mandatory check character, and packs digit pairs in Set C, so it is the narrowest of the common 1D symbologies — an 8-character SKU is 11 × 8 + 35 = 123 modules, 1.23 in at a 10 mil X-dimension, against 1.59 in for the same SKU in Code 39 at a 3:1 ratio (about 29% wider). Use Code 39 only if a reader you cannot replace demands it. UPC-A and EAN-13 are not a design choice: they require a GS1 company prefix and exist so a retailer's till can identify your product, not so your bin can. If a supplier's carton carries a UPC, add it as an extra SKU on the item rather than renumbering your catalog. Stockout generates Code 128 for barcodes and standard QR for QR codes, with no symbology picker in the designer.
On a small label, usually yes. A QR Version 2 symbol is 25 × 25 modules and holds 38 alphanumeric characters at error-correction level M; with its required 4-module quiet zone on each side it occupies 33 modules, which at a 15 mil module is 0.495 in square. An 8-character Code 128 with 0.25 in quiet zones is 1.73 in × 0.5 in — 0.865 sq in against 0.245 sq in, about 3.5 times the label area for the same data. QR also recovers from damage (roughly 7% of the symbol at level L up to 30% at level H) and reads at any rotation, which matters for a label applied by hand. The catch is the reader: it takes a 2D imager or a phone camera, and an older laser scanner will not read QR at all. In Stockout the camera path is Android only — on Windows and the web you scan with a USB or Bluetooth reader in keyboard-wedge mode, and it has to be a 2D imager to read QR. Check what is already on your floor before standardizing.
No. The code encodes exactly one of two things — the item's SKU or its Name — chosen with a two-state toggle in the designer. It is not a URL, not a record id and not a custom string, and scanning it does not open anything. Leave it on the SKU, because a scan in Stockout looks the item up by SKU. That also means the SKU is effectively the key to your physical stock: if you change an item's SKU, existing printed labels stop matching. An item can carry multiple SKUs and a scan matches any of them, so the safe way to change one is to add the new SKU alongside the old and relabel at your own pace.
Run the arithmetic before deciding. For 1,200 items, tags at an assumed $0.15 each are $180 against $24 for printed labels at an assumed $0.02 — 7.5 times the material cost — plus a commissioning pass: at one tap per tag and 20 seconds per item, 1,200 tags is 24,000 seconds, 6.67 hours, about $167 at an assumed $25 an hour. Substitute your own three figures. RFID repays that only when it buys bulk reading without line of sight, and that is UHF hardware. In Stockout, RFID is 13.56 MHz NFC read through an Android phone, one tag at a time, writing a single text record, and Windows and the browser report that no reader is present. A tag still wins where a printed label cannot survive or cannot be seen — a greasy or washed-down surface — but a plain NFC inlay on metal detunes and usually will not read at all, and an on-metal tag costs several times a plain one.
No. Labels are produced one record at a time, for Items, Kits and Equipment — there is no batch print, no print-a-whole-category, no sheet or multi-up layout and no orientation setting. A filled-in label exports as a PNG. Plan the rollout around that: 1,200 items at three minutes each (select, print, peel, apply, test-scan) is 60 hours, so label new receipts as they are put away, then batch your ~240 highest-movement SKUs at two hours a week (240 × 3 min = 12 hours, about 6 weeks), and let the tail get labeled on first touch. The template itself is designed once and shared team-wide in real time across every location, so only the printing is per item.
Check the cheapest things first. Quiet zone: Code 128 wants 10 × the X-dimension clear on each side, with a practical floor of 0.25 in, and a border, fold, staple or the next text line inside it will break the read. Printer resolution: a thermal printer places whole dots, so at 203 dpi one dot is 4.93 mil and your usable X-dimensions are 9.85 mil (2 dots) or 14.78 mil (3 dots) — asking for 10 mil gets rounded and distorts every bar; at 300 dpi, 3 dots is exactly 10.0 mil. Bar height should be at least 0.25 in or 15% of symbol length, whichever is greater. Then check the label itself: across a seam or a curve, applied to an unwiped oily surface, or direct thermal that has faded in sunlight. If the code scans but nothing happens, you are probably on a screen other than Inventory (scanning covers inventory items only), signed in as a Viewer (the scan buttons in the Inventory footer are hidden), or using a reader that is not in keyboard-wedge mode. Camera scanning is Android only — Windows and the browser need a USB or Bluetooth reader.
Design one label template, share it with the whole team, and let a scan find the item by SKU and move stock in a single tap.