Skip to content

Search is only available in production builds. Try building and previewing the site to test it out locally.

POS Features

This page covers the core POS-related entities: how discounts and campaigns work, how payment methods are configured, how infocodes collect information from cashiers, and how sales targets track performance.

Discounts define automatic or manual price adjustments applied at the POS.

ValueDescription
PLU_PCT_DISCPercentage discount on a product
TOTAL_PCT_DISCPercentage discount on the receipt total
PLU_EUR_DISCFixed amount discount on a product
TOTAL_EUR_DISCFixed amount discount on the receipt total
SET_PRICEOverride product price to a fixed value
MIXNMATCHMix-and-match: buy a combination of products at a special price
BUNDLEProduct bundling (pack deals)

Controls how the discount is activated:

ValueBehavior
ALWAYSAutomatically applied whenever conditions match
SUBSCRIBEOptional — cashier or customer opts in permanently
CAMPAIGNLinked to a campaign period (see Campaigns below)
ValueApplies to
PLUSpecific products
RECEIPTEntire transaction
TENDERPayment method
CUSTOMERIndividual customer
CUSTOMERGROUPCustomer group
FieldTypeDescription
discount_typeenumDiscount mechanism (see types above)
targetenumWhat the discount applies to
subscription_typeenumHow the discount is activated
percentnumber?Percentage value (for percentage discounts)
amountnumber?Fixed amount (for amount discounts or set price)
prioritynumber?Priority when multiple discounts apply (higher = first)
manualboolean?Requires cashier to activate (coupon mode)
matchobject?Match rules for MIXNMATCH / BUNDLE
valid_from / valid_todate?Validity period
time_restrictionstring?Time-of-day restriction
tender_idstring?Linked tender for tender-targeted discounts
invoicingobject?Invoicing configuration for discount billing
hide_on_receiptboolean?Suppress discount line on printed receipt

For MIXNMATCH and BUNDLE discounts, the match object defines which products qualify and how they are priced:

{
"match": {
"salesLines": [
[
{
"dpt": [
3
],
"discount": {
"type": "PERCENT",
"amount": 50
},
"order": "PRICE_DESC"
}
],
[
{
"plu": [
"1001",
"1002"
],
"discount": {
"type": "PRICE",
"amount": 0
},
"optional": true
}
]
],
"sell": [
{
"productId": "1001",
"qty": 2
}
],
"order": "PRICE_DESC"
}
}

Each salesLines entry is a group of product matchers. Within each matcher:

FieldTypeDescription
dptarray?Match products by department number
pluarray?Match products by product number
grparray?Match products by group name
deliveryenum?Filter by delivery type
discountobjectPricing rule: type (PRICE, AMOUNT, PERCENT) + amount
orderenum?Price ordering: PRICE_ASC or PRICE_DESC
optionalboolean?Whether this product group is optional
bundlingboolean?Enable bundling behavior

The sell array defines what is actually sold (added to the receipt) when the match triggers, with explicit product IDs and quantities.


Tenders represent the available payment methods on a POS terminal.

ValueDescription
cashCash payment
cardCard payment (attended)
card_selfserviceCard payment (self-service terminal)
lunchvoucher / voucherLunch voucher
epassiePassi benefit payment
eazybreakEazybreak benefit payment
mobilepayMobilePay (attended)
mobilepay_selfserviceMobilePay (self-service)
prepaidPrepaid / advance payment
invoiceInvoice (sale + invoice)
only_invoiceTransfer to invoice (no sale recorded)
otherOther debt
giftcardGift card
FieldTypeDescription
tender_typeenumPayment type (see above)
printout_typeenumReceipt style: receipt, no_receipt, bill, invoice
tender_useenummultiple (many payments per receipt), single (one per receipt), only_this (exclusive)
cashdrawerenumCash drawer behavior: ignore, force_open, force_close
change_typeenumChange handling: none, tender (give change), overpay (handle overpayment)
change_tenderguid?Which tender to use for giving change
eftboolean?Requires EFT (electronic funds transfer) terminal
roundingnumber?Rounding precision (e.g. 0.05 for 5-cent rounding)
over_tenderboolean?Allow paying more than the total
under_tenderboolean?Allow partial payment
require_commentboolean?Require cashier comment when using this tender
lunch_voucherenum?Voucher type: edenred, smartum, generic, eazybreak, or mobile variants
commission_tenderstring?Commission tender ID for commission tracking
commission_percentagestring?Commission percentage
invoice_customerguid?Default customer for invoice payments
invoice_customergroupguid?Customer group restriction for invoice payments

Infocodes prompt the cashier or customer to enter information at specific points during a transaction — for example, a refund reason, a product serial number, or a customer’s age verification.

Infocodes are triggered by specific POS events:

ValueTriggered when
SELL_PRODUCTSelling a specific product
SELL_DPTSelling any product in a department
SELL_GRPSelling any product in a group
RECEIPT_STARTStarting a new receipt
RECEIPT_ENDFinalizing a receipt
SUBTOTALPressing subtotal
RECEIPT_TRASHVoiding a receipt
RECEIPT_REFUND / REFUNDProcessing a refund
OPEN_PRICEEntering an open price
SCHEDULEDScheduled/automatic trigger
RECEIPT_COMMENTAdding a receipt comment
TENDERUsing a specific payment method
EXTERNAL_PRODUCTExternal product event
EXTERNAL_PAYMENTExternal payment event
EXTERNAL_DISCOUNTExternal discount event
ValueDescription
textFree text input
textfunctionlistText input with function list
dateDate picker
numericNumeric input
productProduct selector
customerCustomer selector
staffStaff member selector
functionbuttonsPredefined function buttons
agelimitAge verification
buttonsandotherButtons with free-text option
FieldTypeDescription
promptstringText shown to the cashier
descriptionstringDescription of what is being collected
input_typeenumHow the cashier provides the answer (see above)
subscription_typestringActivation mode
validationenum?Validation rule: minlen, maxlen, minval, maxval, required
prioritynumber?Display priority when multiple infocodes trigger
once_per_receiptboolean?Only ask once per transaction
printingenum?What to print: printprompt, printinput, printtype
linkstring?Linked code or group
defaultstring?Default value
plu_id / dpt_id / grp_id / tender_idguid?Entity that triggers this infocode

For functionbuttons and textfunctionlist input types, the infocode has an array of sub-codes — predefined answers the cashier can select:

FieldTypeDescription
namestringButton label
descriptionstringDescription
functionstringAction to perform
targetstringTarget entity ID (product, discount, etc.)
amountnumberAssociated amount

Campaigns group promotional discounts into time-bound marketing events with performance tracking.

FieldTypeDescription
namestringCampaign name
start_datedateCampaign start
end_datedate?Campaign end (null for ongoing)
location_idid?Specific location, or null for all locations
data.discountsarrayLinked discounts (see below)
data.reference_periodsarrayHistorical periods for comparison
data.report_dptsarrayDepartments to include in reports
data.report_plusarrayProducts to include in reports
data.notesstring?Campaign notes

Each campaign links to one or more discounts with their own validity windows within the campaign period:

{
"discounts": [
{
"discount_id": "abc-123",
"is_coupon": false,
"start_date": "2025-06-01",
"end_date": "2025-06-30"
}
]
}

Discounts used in campaigns should have subscription_type: "CAMPAIGN".

Reference periods define historical date ranges for comparing campaign performance against past sales:

{
"reference_periods": [
{
"start_date": "2024-06-01",
"end_date": "2024-06-30",
"weight": 1
}
]
}

The weight factor adjusts how much each reference period contributes to the comparison calculation.


Cashiers represent POS terminal users.

FieldTypeDescription
cashier_numintUnique cashier number
namestringCashier name
location_idid?Assigned location
passwordstring?Login password (hashed)
FieldTypeDescription
trainingboolean?Training mode — transactions are not recorded in reports
managerboolean?Manager privileges (void, refund, etc.)
selfserviceboolean?Self-service mode on login
cardnumberstring?NFC/barcode card number for quick login
pos_layoutguid?Override the default POS layout
layout_pagenumber?Start on a specific layout page after login
pos_languagestring?Override POS language
netvisor_worker_idstring?Worker ID for timesheet integration

Layouts define the button grid shown on POS terminals.

A layout contains pages, each with a grid of buttons. Each page defines its dimensions (columns × rows) and each button has a grid position (x, y) with optional spanning (span_x, span_y).

Buttons have an action field that determines behavior (sell product, apply discount, change page, open tender, etc.) and reference the target entity via object_id. Visual properties include text lines, colors, icons, and images.

Pages can be typed as NORMAL, DPT (auto-populated from department products), SUBTOTAL, DISCOUNT, or MASTER.


A POS type is a configuration template assigned to one or more POS terminals.

ValueDescription
flowposFlowPOS Windows application
androidAndroid POS
pos2POS 2026 (next generation)
castles / castles-pat / castles-pp / castles-uptCastles payment terminals
printerReceipt printer
kdsKitchen display
orderdisplayOrder status display

The configuration includes hardware settings (payment terminal mode, printer type, scale, customer display), feature flags (table service, delivery, kitchen printing, order numbers, etc.), and receipt template assignments.


Sales targets set performance goals for a location over a time period, tracked daily against actual sales.

ValueDescription
TOTAL_SALES_AMOUNTTotal sales revenue
AVG_SALES_AMOUNTAverage transaction amount
TOTAL_CUSTOMERS_QTYNumber of customers
PRODUCT_SALES_QTYUnits sold of specific products
DISCOUNT_SALES_QTYNumber of discount applications
FieldTypeDescription
namestringTarget name
location_ididLocation this target applies to
start_datedateTarget period start
end_datedate?Target period end (null for ongoing)
typeenumTarget type (see above)
data.targetobject?Scope: plu (product GUIDs), dpt (department GUIDs), grp (group GUIDs)
data.campaignstring?Associated campaign
data.discount_idid?Specific discount for DISCOUNT_SALES_QTY targets
data.multipliernumber?Calculation multiplier

Each sales target has daily data entries (sales_target_data) that track progress:

FieldTypeDescription
target_datedateThe date
target_amountnumberGoal amount for this day
total_amountnumberActual achieved amount
grp_id / dpt_id / plu_idid?Breakdown by product hierarchy

Sales targets are location-specific and are sent to POS terminals for the current week (±7 days) so cashiers can see their daily goals.