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
Section titled “Discounts”Discounts define automatic or manual price adjustments applied at the POS.
Discount Types
Section titled “Discount Types”| Value | Description |
|---|---|
PLU_PCT_DISC | Percentage discount on a product |
TOTAL_PCT_DISC | Percentage discount on the receipt total |
PLU_EUR_DISC | Fixed amount discount on a product |
TOTAL_EUR_DISC | Fixed amount discount on the receipt total |
SET_PRICE | Override product price to a fixed value |
MIXNMATCH | Mix-and-match: buy a combination of products at a special price |
BUNDLE | Product bundling (pack deals) |
Subscription Types
Section titled “Subscription Types”Controls how the discount is activated:
| Value | Behavior |
|---|---|
ALWAYS | Automatically applied whenever conditions match |
SUBSCRIBE | Optional — cashier or customer opts in permanently |
CAMPAIGN | Linked to a campaign period (see Campaigns below) |
Discount Targets
Section titled “Discount Targets”| Value | Applies to |
|---|---|
PLU | Specific products |
RECEIPT | Entire transaction |
TENDER | Payment method |
CUSTOMER | Individual customer |
CUSTOMERGROUP | Customer group |
Key Fields (discount_data)
Section titled “Key Fields (discount_data)”| Field | Type | Description |
|---|---|---|
discount_type | enum | Discount mechanism (see types above) |
target | enum | What the discount applies to |
subscription_type | enum | How the discount is activated |
percent | number? | Percentage value (for percentage discounts) |
amount | number? | Fixed amount (for amount discounts or set price) |
priority | number? | Priority when multiple discounts apply (higher = first) |
manual | boolean? | Requires cashier to activate (coupon mode) |
match | object? | Match rules for MIXNMATCH / BUNDLE |
valid_from / valid_to | date? | Validity period |
time_restriction | string? | Time-of-day restriction |
tender_id | string? | Linked tender for tender-targeted discounts |
invoicing | object? | Invoicing configuration for discount billing |
hide_on_receipt | boolean? | Suppress discount line on printed receipt |
Match Rules (MIXNMATCH / BUNDLE)
Section titled “Match Rules (MIXNMATCH / BUNDLE)”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:
| Field | Type | Description |
|---|---|---|
dpt | array? | Match products by department number |
plu | array? | Match products by product number |
grp | array? | Match products by group name |
delivery | enum? | Filter by delivery type |
discount | object | Pricing rule: type (PRICE, AMOUNT, PERCENT) + amount |
order | enum? | Price ordering: PRICE_ASC or PRICE_DESC |
optional | boolean? | Whether this product group is optional |
bundling | boolean? | 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.
Payment Methods (Tenders)
Section titled “Payment Methods (Tenders)”Tenders represent the available payment methods on a POS terminal.
Tender Types
Section titled “Tender Types”| Value | Description |
|---|---|
cash | Cash payment |
card | Card payment (attended) |
card_selfservice | Card payment (self-service terminal) |
lunchvoucher / voucher | Lunch voucher |
epassi | ePassi benefit payment |
eazybreak | Eazybreak benefit payment |
mobilepay | MobilePay (attended) |
mobilepay_selfservice | MobilePay (self-service) |
prepaid | Prepaid / advance payment |
invoice | Invoice (sale + invoice) |
only_invoice | Transfer to invoice (no sale recorded) |
other | Other debt |
giftcard | Gift card |
Key Fields (tender_data)
Section titled “Key Fields (tender_data)”| Field | Type | Description |
|---|---|---|
tender_type | enum | Payment type (see above) |
printout_type | enum | Receipt style: receipt, no_receipt, bill, invoice |
tender_use | enum | multiple (many payments per receipt), single (one per receipt), only_this (exclusive) |
cashdrawer | enum | Cash drawer behavior: ignore, force_open, force_close |
change_type | enum | Change handling: none, tender (give change), overpay (handle overpayment) |
change_tender | guid? | Which tender to use for giving change |
eft | boolean? | Requires EFT (electronic funds transfer) terminal |
rounding | number? | Rounding precision (e.g. 0.05 for 5-cent rounding) |
over_tender | boolean? | Allow paying more than the total |
under_tender | boolean? | Allow partial payment |
require_comment | boolean? | Require cashier comment when using this tender |
lunch_voucher | enum? | Voucher type: edenred, smartum, generic, eazybreak, or mobile variants |
commission_tender | string? | Commission tender ID for commission tracking |
commission_percentage | string? | Commission percentage |
invoice_customer | guid? | Default customer for invoice payments |
invoice_customergroup | guid? | Customer group restriction for invoice payments |
Infocodes
Section titled “Infocodes”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.
Trigger Types
Section titled “Trigger Types”Infocodes are triggered by specific POS events:
| Value | Triggered when |
|---|---|
SELL_PRODUCT | Selling a specific product |
SELL_DPT | Selling any product in a department |
SELL_GRP | Selling any product in a group |
RECEIPT_START | Starting a new receipt |
RECEIPT_END | Finalizing a receipt |
SUBTOTAL | Pressing subtotal |
RECEIPT_TRASH | Voiding a receipt |
RECEIPT_REFUND / REFUND | Processing a refund |
OPEN_PRICE | Entering an open price |
SCHEDULED | Scheduled/automatic trigger |
RECEIPT_COMMENT | Adding a receipt comment |
TENDER | Using a specific payment method |
EXTERNAL_PRODUCT | External product event |
EXTERNAL_PAYMENT | External payment event |
EXTERNAL_DISCOUNT | External discount event |
Input Types
Section titled “Input Types”| Value | Description |
|---|---|
text | Free text input |
textfunctionlist | Text input with function list |
date | Date picker |
numeric | Numeric input |
product | Product selector |
customer | Customer selector |
staff | Staff member selector |
functionbuttons | Predefined function buttons |
agelimit | Age verification |
buttonsandother | Buttons with free-text option |
Key Fields (infocode_data)
Section titled “Key Fields (infocode_data)”| Field | Type | Description |
|---|---|---|
prompt | string | Text shown to the cashier |
description | string | Description of what is being collected |
input_type | enum | How the cashier provides the answer (see above) |
subscription_type | string | Activation mode |
validation | enum? | Validation rule: minlen, maxlen, minval, maxval, required |
priority | number? | Display priority when multiple infocodes trigger |
once_per_receipt | boolean? | Only ask once per transaction |
printing | enum? | What to print: printprompt, printinput, printtype |
link | string? | Linked code or group |
default | string? | Default value |
plu_id / dpt_id / grp_id / tender_id | guid? | Entity that triggers this infocode |
Sub-codes
Section titled “Sub-codes”For functionbuttons and textfunctionlist input types, the infocode has an array of sub-codes — predefined answers
the cashier can select:
| Field | Type | Description |
|---|---|---|
name | string | Button label |
description | string | Description |
function | string | Action to perform |
target | string | Target entity ID (product, discount, etc.) |
amount | number | Associated amount |
Campaigns
Section titled “Campaigns”Campaigns group promotional discounts into time-bound marketing events with performance tracking.
Structure
Section titled “Structure”| Field | Type | Description |
|---|---|---|
name | string | Campaign name |
start_date | date | Campaign start |
end_date | date? | Campaign end (null for ongoing) |
location_id | id? | Specific location, or null for all locations |
data.discounts | array | Linked discounts (see below) |
data.reference_periods | array | Historical periods for comparison |
data.report_dpts | array | Departments to include in reports |
data.report_plus | array | Products to include in reports |
data.notes | string? | Campaign notes |
Campaign Discounts
Section titled “Campaign Discounts”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
Section titled “Reference Periods”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
Section titled “Cashiers”Cashiers represent POS terminal users.
| Field | Type | Description |
|---|---|---|
cashier_num | int | Unique cashier number |
name | string | Cashier name |
location_id | id? | Assigned location |
password | string? | Login password (hashed) |
Key Data Fields (cashier_data)
Section titled “Key Data Fields (cashier_data)”| Field | Type | Description |
|---|---|---|
training | boolean? | Training mode — transactions are not recorded in reports |
manager | boolean? | Manager privileges (void, refund, etc.) |
selfservice | boolean? | Self-service mode on login |
cardnumber | string? | NFC/barcode card number for quick login |
pos_layout | guid? | Override the default POS layout |
layout_page | number? | Start on a specific layout page after login |
pos_language | string? | Override POS language |
netvisor_worker_id | string? | Worker ID for timesheet integration |
POS Screen Layout
Section titled “POS Screen Layout”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.
POS Type Configuration
Section titled “POS Type Configuration”A POS type is a configuration template assigned to one or more POS terminals.
Terminal Platform Types
Section titled “Terminal Platform Types”| Value | Description |
|---|---|
flowpos | FlowPOS Windows application |
android | Android POS |
pos2 | POS 2026 (next generation) |
castles / castles-pat / castles-pp / castles-upt | Castles payment terminals |
printer | Receipt printer |
kds | Kitchen display |
orderdisplay | Order 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
Section titled “Sales Targets”Sales targets set performance goals for a location over a time period, tracked daily against actual sales.
Target Types
Section titled “Target Types”| Value | Description |
|---|---|
TOTAL_SALES_AMOUNT | Total sales revenue |
AVG_SALES_AMOUNT | Average transaction amount |
TOTAL_CUSTOMERS_QTY | Number of customers |
PRODUCT_SALES_QTY | Units sold of specific products |
DISCOUNT_SALES_QTY | Number of discount applications |
Structure
Section titled “Structure”| Field | Type | Description |
|---|---|---|
name | string | Target name |
location_id | id | Location this target applies to |
start_date | date | Target period start |
end_date | date? | Target period end (null for ongoing) |
type | enum | Target type (see above) |
data.target | object? | Scope: plu (product GUIDs), dpt (department GUIDs), grp (group GUIDs) |
data.campaign | string? | Associated campaign |
data.discount_id | id? | Specific discount for DISCOUNT_SALES_QTY targets |
data.multiplier | number? | Calculation multiplier |
Daily Tracking
Section titled “Daily Tracking”Each sales target has daily data entries (sales_target_data) that track progress:
| Field | Type | Description |
|---|---|---|
target_date | date | The date |
target_amount | number | Goal amount for this day |
total_amount | number | Actual achieved amount |
grp_id / dpt_id / plu_id | id? | 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.