Data fields & formatting

The one idea that makes the software worth using: design a label once, and it fills itself in differently for every product.

The basic idea

Anywhere you can type text, a column name in square brackets is replaced with that product's value. Everything outside the brackets prints exactly as written.

[Product Name]        →  Neon Tetra 3cm
SKU: [SKU]            →  SKU: AQ-0142
$[Price]              →  $12.95
[Brand] · [Category]  →  AquaWorld · Freshwater Fish

Column names match your spreadsheet headings. Capitalisation and stray spaces do not matter — [price], [Price] and [ PRICE ] all find the same column.

A missing column prints nothing, never the word "undefined". If a product has no sale price, [Sale Price] produces an empty space rather than an error on the label.

Formatting filters

A vertical bar after the column name applies a filter. This is what turns raw spreadsheet data into something that belongs on a price ticket.

[Price]              →  4.5        ← raw, and wrong for a shelf
[Price|money]        →  $4.50      ← what you actually want
Do not type a dollar sign in front of |money. The filter supplies its own, so $[Price|money] prints $$4.50. Either use [Price|money] on its own, or use $[Price|number] where you provide the symbol yourself.

Filters can be chained, applying left to right:

[Product Name|upper|truncate:20]  →  NEON TETRA 3CM

Money and numbers

FilterWhat it does
|moneyFormats as currency. 4.5 becomes $4.50. Add arguments to change the symbol or decimals: |money:€ or |money:$:0 for whole dollars.
|numberThe number with decimals but no currency symbol. Use when the $ is a separate design element.
|dollarsWhole dollars only — 12.95 becomes 12.
|centsCents only, always two digits — 12.95 becomes 95, and 12.50 becomes 50 rather than 5.
|unitprice:1:kgPrice per unit — $12.50 per kg. Required on many grocery lines.
|saving:[Sale Price]The percentage saved between two prices. Prints nothing if there is no genuine saving.
The split-price layout every supermarket uses — big dollars, small raised cents — is built from [Price|dollars] and [Price|cents] as two separate elements, so you can size them independently. Every price template in the library is built this way.

Text

FilterWhat it does
|upperUPPERCASE.
|lowerlowercase.
|titleTitle Case.
|truncate:20Shortens long text and adds an ellipsis. The number is the character limit.
|trimRemoves surrounding spaces. Useful when a spreadsheet has been edited by hand.
|pad:6Pads with leading zeros — 42 becomes 000042. Batch and lot numbers usually want this.
|prefix:Ref Adds text before the value, but only if there is a value.
|suffix: eaAdds text after the value, but only if there is a value.
|default:N/ASubstitutes a fallback when the column is empty, so a label never prints a blank gap.

Dates

FilterWhat it does
|dateFormats a date, day-first by default: 25/12/2026.
|date:dd mmm yyyyA named month: 25 Dec 2026.
|date:mmm yyyyMonth and year only — the usual form for a medicine expiry.

Use dd, mm, mmm and yyyy in any arrangement.

Filters that reference another column

A filter's argument can itself be a column, written in square brackets. This is how the saving calculation works:

[Price|saving:[Sale Price]]   →  23%

It reads the regular price, compares it to the sale price, and prints the percentage difference. If either is missing, or the "sale" price is higher, it prints nothing rather than a nonsense figure.

Conditional elements

Some things should only appear on some products. A "SAVE 20%" starburst on a label for a product that is not discounted is worse than useless — it is misleading.

Select the element, then in Properties → Show only when… choose a column and a test.

The tests available

TestWhen it matches
is not emptyThe most common by far. Show this element only when the column has a value.
is emptyThe reverse. Useful for a "RRP" label that only shows when there is no special.
equals / does not equalExact match, ignoring capitalisation.
containsThe column includes this text anywhere.
is greater than / is less thanNumeric comparison. Currency symbols are stripped first, so $5.00 compares correctly against 10.

A worked example

Building a price tag that adapts to whether a product is on special:

  1. Add a text element reading WAS $[Price|number], strike it through, and set it to show only when Sale Price is not empty
  2. Add the main price using [Sale Price|dollars] and [Sale Price|cents]
  3. Add a star with SAVE [Price|saving:[Sale Price]], also conditional on Sale Price is not empty

Products with a sale price get the full treatment. Products without one print a clean label with no empty badge and no crossed-out phantom price — from a single design and a single print run.

The Price Tag with Sale Flash and A6 Two Prices templates are both built exactly this way, if you would rather start from one.

In the designer, conditional elements show faded rather than hidden when they would not print for the previewed product. That way you can still select and edit them.

Which columns are available

The standard set the import wizard recognises:

[Product Name]  [SKU]        [Barcode]     [Price]
[Sale Price]    [Category]   [Brand]       [Supplier]
[Stock]         [Weight (g)] [Description] [Unit]
[Expiry Date]   [Batch Number]

Your own columns work too

Any column the wizard did not recognise is still stored. A spreadsheet column headed Tank Size becomes [Tank Size] in the designer. Nothing is discarded just because it was not on our list.

Seeing it work

The Preview data toggle in the toolbar switches between showing the field names and showing real values from the first product you have queued.

Turn it on to check that a long product name actually fits. Turn it off when you need to see which field an element is bound to. The status bar always lists every field the design uses, whichever way the toggle is set.

Always preview with a long product name before printing a big run. Text that fits "Neon Tetra" may overflow badly on "Premium Australian Wagyu Beef Scotch Fillet MB3+". Turning on Shrink text to fit solves it permanently.