# Can Fishbowl print and scan 2D barcodes today?

> What Fishbowl's label designer, UPC fields, and scanning clients actually do with QR codes and GS1 DataMatrix — and where the real Sunrise 2027 work is.

Short answer: not out of the box on printing, though there are two workable paths; scanning depends on your setup; and the real work is the data inside the symbol and whether your system can produce it going out and make sense of it coming in. (The [series overview](/blog/sunrise-2027/) covers what Sunrise 2027 requires and for whom.)

## Question 1: can Fishbowl print a 2D barcode?

Not natively. Fishbowl's labels and reports run on its Jasper-based report engine, and it has no QR support out of the box. We've built a workaround that renders QR codes in Jasper label reports; it's custom report work, not a checkbox.

For serious label volume we prefer skipping the report engine and printing ZPL directly to a thermal printer. ZPL, the native language of Zebra printers, supports QR Code, GS1 DataMatrix, and PDF417 as first-class commands with proper GS1/FNC1 handling; our CloudPages platform prints ZPL natively, and that's how we deliver 2D label solutions today. A complete label printing a GS1 DataMatrix with a GTIN, expiration date, and lot number:

```
^XA
^FX GS1 DataMatrix: GTIN 00860000123457, expires 2027-06-30, lot LOT42
^FO50,50
^FH_^BXN,10,200
^FD_1010086000012345717270630_110LOT42^FS
^XZ
```

The `200` in `^BXN,10,200` selects GS1 mode, `^FH_` makes the underscore an escape character, and `_1` is the FNC1: one at the start to declare GS1 structure, one before the variable-length lot field (fixed-length AIs like `01` and `17` need no terminator; putting them first keeps separators out of the payload).


![GS1 DataMatrix encoding GTIN 00860000123457, expiry 2027-06-30, lot LOT42](/images/sunrise-2027/gs1-datamatrix-gtin-exp-lot.svg)

*The same payload as the ZPL above, rendered as a GS1 DataMatrix. Point a 2D imager at it and you'll see exactly what your system receives.*

The FNC1 matters because a plain Data Matrix and a GS1 DataMatrix are the same square to your eye. Without the leading FNC1, the symbol scans as raw text and fails GS1 validation: it passes your internal testing, then a trading partner rejects your labels. Validate with a GS1-aware verifier before they do.

## Question 2: can Fishbowl store the data?

Better than most people assume. The UPC field exists on both parts and products, is stored as text with room past 14 characters, and preserves leading zeros, so a GTIN-14 fits there. The caveat is hygiene, not capacity: the field is free text, and real databases accumulate blanks, duplicates, and vendor part numbers where the UPC should be.

The part/product split helps. A product is a sellable, per-UOM wrapper around a part, and each product carries its own UPC field. GS1 assigns a distinct GTIN to each packaging level, which maps naturally onto an each-product and a case-product holding their own GTINs.

Lot, expiry, and serial already exist as tracking fields. The question is whether a label printed at pick/pack time can pull the specific lot and expiry for the units in the box, rather than a part-level constant; what a native report can reach depends on the print point, so test at yours. We recently delivered a CloudPages label solution printing a customer's packaging artwork with a 2D symbol carrying GTIN, lot, and expiry, at their trading partners' request. Whether your data can flow from database to symbol without hand-typing is the actual project.

## Question 3: what happens when you scan one into Fishbowl?

A scanner sends Fishbowl a string of characters. A 1D UPC emits 12 digits; a GS1 2D symbol emits GTIN, lot, and expiry run together with invisible separators between variable-length fields. Fishbowl has some support for structured scan input, but it won't flexibly split that payload into part lookup plus lot plus expiry, so test your receiving and picking flows with a real GS1 symbol.

Two details decide it: whether the ASCII 29 group separators survive the path into Fishbowl (some keyboard-wedge modes strip them; test wedge and native modes), and whether the scanner can do the parsing instead. Most modern 2D imagers can be programmed to extract just the GTIN before sending, so Fishbowl sees the part identifier it expects. That's the pragmatic bridge: you lose lot and expiry at scan time, but receiving keeps working.

If the full payload needs to survive the scan, resolving the right part and packaging level and populating lot and expiry, that's the layer we build our own tools at. Our CloudPages scanning workflows and our beep1 mobile scanning app both natively understand multi-UOM and structured scans.

## The hardware question is the easy one

A laser scanner cannot read a matrix barcode like QR or DataMatrix; a laser sweeps a line, and a matrix symbol is a grid. Reading them requires a camera-based imager. Imagers read 1D barcodes fine, so you can swap hardware first; the [warehouse readiness post](/blog/warehouse-2d-scanner-readiness/) covers the audit.

## Where this leaves your Fishbowl implementation

Printing: custom report work, or ZPL to a thermal printer. Storage: the UPC field handles it; the problem is hygiene. Scanning: configure the scanner, or add a layer above Fishbowl if lot and expiry need to survive the scan. If you've printed GS1 DataMatrix labels out of Fishbowl, or scanned them into it, we'd like to hear how, and on which version.

**Related:**
- [Sunrise 2027: what it actually requires from your Fishbowl implementation (and what it doesn't)](/blog/sunrise-2027/)
- [2D scanner readiness for the warehouse, not just the register](/blog/warehouse-2d-scanner-readiness/)

---

*From Israel Lopez Consulting (ILC). Custom Fishbowl Inventory integrations and software, and Fishbowl experts since 2015. Written by Israel Lopez, published July 9, 2026. Questions about this topic, or want to reach the people who wrote it? Visit https://israellopezconsulting.com/contact*
