Scan barcodes from other systems - ION Manual
Using a regex expression
Use expression when your external barcode encodes data as a formatted string. ION uses regular expressions with named capture groups to extract field values from the scanned string.
Regex example
Suppose you have an inventory barcode that follows a pattern similar to a GS1 barcode:
(01)<Part number>(17)(10)<Serial number>
The equivalent regular expression is:
\(01\)(?P<part_partNumber>.*)\(17\)\(10\)(?P<serialNumber>.*)
If your regex includes escape characters, double every backslash when passing the value as a JSON string. For example, \(01\) becomes \\(01\\) in the API input.
Use the GraphQL explorer in ION to run this mutation:
mutation CreateBarcodePattern($input: CreateBarcodePatternInput!) {
createBarcodePattern(input: $input) {
barcodePattern {
id
_etag
entityType
expression
}
}
}
With these variables:
{
"input": {
"entityType": "PARTS_INVENTORY",
"expression": "\\(01\\)(?P<part_partNumber>.*)\\(17\\)\\(10\\)(?P<serialNumber>.*)"
}
}
Using a JSON field mapping
Use barcodePatternJson when your external barcode scanner emits structured JSON rather than a formatted string. The value is a JSON string where each key is an ION field name and each value is the corresponding key in the scanned barcode’s JSON payload. Use the part_ prefix to reference a field on the related part. For example, part_partNumber refers to the partNumber field of the inventory item’s part.
JSON field mapping example
Suppose your scanner emits:
{"pn": "EX-PART-001", "lot": "L-42"}
To map this to PARTS_INVENTORY, create a pattern that maps the scanner’s keys to ION’s field names:
mutation CreateBarcodePattern($input: CreateBarcodePatternInput!) {
createBarcodePattern(input: $input) {
barcodePattern {
id
_etag
entityType
barcodePatternJson
}
}
}
{
"input": {
"entityType": "PARTS_INVENTORY",
"barcodePatternJson": "{\"part_partNumber\": \"pn\", \"lotNumber\": \"lot\"}"
}
}
When ION scans a barcode that emits {"pn": "EX-PART-001", "lot": "L-42"}, it looks up the inventory item whose part number is EX-PART-001 and lot number is L-42.
Partial matching
Append a match mode suffix to an ION field name to match partial values:
| Suffix | Behavior |
|---|---|
__prefix |
Field value starts with the scanned value |
__suffix |
Field value ends with the scanned value |
__contains |
Field value contains the scanned value |
For example, to match any part number that contains the scanned value:
{
"input": {
"entityType": "PARTS_INVENTORY",
"barcodePatternJson": "{\"part_partNumber__contains\": \"pn\", \"lotNumber\": \"lot\"}"
}
}
Match mode suffixes also work in regex patterns. Add the suffix to the field name inside the named capture group, for example (?P<part_partNumber__prefix>.*).
Ignoring barcode keys
A JSON pattern matches only when the scanned payload’s keys, after removing the _ignored keys, exactly equal the set of keys you mapped. If your scanner emits keys that you don’t use for matching, list them in the _ignored array:
{
"input": {
"entityType": "PARTS_INVENTORY",
"barcodePatternJson": "{\"part_partNumber\": \"pn\", \"lotNumber\": \"lot\", \"_ignored\": [\"checksum\"]}"
}
}
ION ignores the checksum key in the scanned JSON and matches only on pn and lot.
Account for every key in the payload. A key you neither map nor add to _ignored causes the pattern to silently fail to match. When your scans don’t resolve, first check that the mapped keys plus _ignored cover the full set of keys in the scanned JSON.
The iuid key is reserved for ION’s own barcode labels and can’t appear in a JSON field mapping. When a scanned payload contains an iuid key, in any letter case, ION uses it to look up the matching ION label directly and doesn’t evaluate custom patterns. If the iuid value isn’t exactly 32 characters, the scan fails with a validation error, so don’t use iuid as a key name in external barcodes.
List existing patterns
To retrieve all barcode patterns configured for your organization:
{
barcodePatterns {
edges {
node {
expression
barcodePatternJson
entityType
id
_etag
}
}
}
}