For SMB operators running real physical inventory (warehouses, retail counters, market stalls), barcodes are how stock-counts + sales scans actually work. AgroYield generates a scannable barcode for any product in your catalogue and gives you a print-ready label sheet sized for common label printers.
When to use this
- You stock physical inventory that needs to be counted, scanned, or matched against a sales receipt
- Your supplier doesn't issue retail barcodes (no EAN/UPC) and you need a system-generated alternative
- You want a quick reference label for warehouse bins or shelf placement
- You print invoices/receipts and want them to carry a scannable product reference
What gets generated
Per product, AgroYield generates:
- Barcode value — defaults to the first 12 hex chars of the product's internal UUID (uppercase alphanumeric). Operators can override with their own value if they have a supplier-issued EAN or an internal SKU.
- Barcode format — three supported formats:
- Code 128 (default) — variable-length alphanumeric. The right pick for AgroYield-generated values.
- EAN-13 — 12-digit numeric + check digit. Use only when you have a real EAN registration (GS1 Nigeria).
- QR code — 2D, scannable by any modern phone camera. Useful for product-detail deep-links printed on the label.
Tier gating
Barcode generation is a Growth-tier feature:
| Tier | Access |
|---|---|
| Free | Not available — see Growth pricing |
| Pro | Not available — see Growth pricing |
| Growth | ✓ Full barcode + label printing + format switching |
| Institutional | ✓ Inherits from Growth |
When operators on Free or Pro open a product's detail page, the Barcode section renders an upgrade CTA pointing at /pricing. The API endpoint enforces the same gate server-side (returns 403 { code: 'upgrade_required', required_tier: 'growth' }).
How to generate + print
- Navigate to Products → click any product name to open its detail page (
/business/products/<id>) - Scroll to the Barcode section
- The barcode renders automatically (auto-generated value from the product ID by default)
- (Optional) Switch format via the Format dropdown — Code 128 / EAN-13 / QR
- Click 🖨 Print labels → to open the print page in a new tab
- On the print page, pick the copy count (12 / 24 / 30 / 60 / 120) — 30 fits one A4 sheet at 5 × 6
- Click 🖨 Print now (or Cmd+P / Ctrl+P) → standard print dialog → choose your label printer
Bulk-print for stock-takes
Generating one label sheet per product gets tedious past a handful of products. For monthly stock-takes or post-delivery re-labelling runs, use the bulk-print flow:
- Navigate to Products → click 🏷 Bulk-print in the header
- Every active product is pre-checked with 1 copy each (the common stock-take default — one label per product). Uncheck anything you don't need, or set a higher copy count for fast-moving SKUs.
- Quick-pick controls at the top:
- Filter — narrow the list by name
- Default copies / product — set the per-product default that Select all and Apply default to checked use
- Select all / Clear all — bulk checkbox affordances
- Apply default to checked — set every already-checked product to the default copy count without changing what's checked
- Watch the sticky footer for the running label count + A4 page estimate
- Click Generate sheet → to open the print-ready grid in the same window (the selection is encoded in the URL so you can bookmark or share a specific sheet)
- Click 🖨 Print now (or Cmd+P / Ctrl+P) → same A4 5 × 6 layout as the single-product print page
A grand-total cap of 1000 labels prevents runaway prints. If a product has an EAN-13 format set but a non-numeric value, that product's label renders with an inline error chip — the rest of the sheet still prints fine, so a bad value on one product doesn't block the whole stock-take.
Label sizing
The print page is sized for A4 paper, 5 columns × 6 rows = 30 labels per sheet. Each label is roughly 38mm × 45mm — fits common label-printer rolls and adhesive label sheets.
For tighter label-printer formats (e.g. dedicated thermal label printers like the Brother QL-820NWB or Zebra GK420d), use your printer driver's scale-to-fit option in the print dialog.
Frequently asked questions
Q: Can I use my own supplier-issued barcode instead of the auto-generated one?
A: Yes. Pick the format in the dropdown that matches your existing code (EAN-13 for retail barcodes, Code 128 for internal SKUs), then call the API directly with barcode_value set to your custom string. UI for editing the value inline ships next.
Q: What if the same barcode value already exists on another product?
A: A per-business unique index prevents duplicate barcode_value within the same business. The API returns an error if you try to set a value that's already in use on another product.
Q: Can I scan barcodes back into the system? A: Yes. Open Products → 📷 Scan → grant camera permission → point your camera at any printed label. AgroYield decodes the barcode, looks up the matching product within your active business, and jumps to its detail page. Works for Code 128, EAN-13, and QR formats. Manual entry fallback is always available for cameras that don't cooperate. Growth-tier only (matches the rest of the barcode feature).
Q: Does this work on receipts / invoices? A: Invoices: yes (since AGR-335, 24 May 2026). Turn on Business settings → Invoice preferences → Show product barcodes on invoices (Growth tier only). When the toggle is on, every line item on the printed invoice carries a small scannable barcode under its description, sized to fit alongside qty + price. Manually-typed lines (not linked to a product in your catalogue) render normally without a barcode. Receipts (POS-style) are a separate follow-up.
The classic use case: the customer receives your delivery against the invoice and scans each line to confirm match — same flow as a supermarket goods-receipt clerk. Pairs with 📷 Scan on the products page for the inverse flow (warehouse → invoice).
Q: What library generates the barcode SVG? A: bwip-js (zero-dep, server-renders SVG, supports 100+ barcode formats). The render runs server-side so the SVG is print-crisp at any size + works in serverless edge contexts.
Related
- Products module — overview of the product catalogue
- Pricing — see the Growth tier

