Skip to content

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

General Concepts

This page describes shared mechanisms that appear across multiple entities in the Mando system.

External IDs link Mando entities to records in external systems (accounting, e-commerce, loyalty, etc.). They are stored in an entity’s data.ext_id array and are not generally for end users — they are used internally by integrations.

{
"ext_id": [
{
"id": "netvisorkey",
"data": 3469,
"system": "netvisor"
},
{
"id": "id",
"data": "12345",
"system": "procountor"
}
]
}
FieldTypeDescription
idstringKey name within the external system (e.g. "netvisorkey", "id")
dataanyThe external identifier value (number, string, or object)
systemstringExternal system name (e.g. "netvisor", "procountor", "fennoa")

There is no type restriction on the data value. The system and id fields can be any string values.

External IDs are available on: Customer, PLU (product), Dpt (department), Grp (product group), * Location*, and POS.

Additional fields let administrators define custom per-entity fields without code changes. Unlike ext_id, additional fields are visible to end users and appear in forms and detail views.

  • Field definitions are stored at company.data.additional_fields[entity_type] — an array of field descriptors.
  • Field values are stored on each entity at entity.data.additional_fields[field_id] — keyed by the field’s GUID.
{
"additional_fields": {
"customer": [
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"name": "Allergies",
"group": "Health",
"type": "textarea",
"description": "Known food allergies",
"required": false
}
],
"plu": [
{
"id": "a1b2c3d4-...",
"name": "Origin Country",
"type": "text",
"required": true
}
]
}
}
FieldTypeDescription
idguidUnique identifier for the field
namestringDisplay label
groupstring?Optional group heading (fields with the same group are shown together)
typeenumField type (see below)
refstring?Reference to external system
descriptionstring?Placeholder / help text
requiredboolean?Whether the field is mandatory

text, number, amount, textarea, date, datetime, selection, multiselect, checkbox, measurement, image

Additional fields can be defined for: company, customer, plu, dpt, grp, location, pos, * salesorder*.

Sales channels can also define their own additional fields that apply to entities sold through that channel.

On each entity, the values are stored as a flat map keyed by the field’s GUID:

{
"data": {
"additional_fields": {
"550e8400-e29b-41d4-a716-446655440000": "Peanuts, shellfish"
}
}
}

Sales channels represent different ways products are sold — e.g. POS (in-store), kiosk, web shop, or delivery platforms like Wolt. They control which products and menus are available in each channel.

Sales channels are defined at company level in company.data.sales_channels:

{
"sales_channels": [
{
"id": "aaa-...",
"active": true,
"name": "In-store",
"type": "mando"
},
{
"id": "bbb-...",
"active": true,
"name": "Wolt",
"type": "mando"
},
{
"id": "ccc-...",
"active": true,
"name": "Web Shop",
"type": "mando"
}
]
}
FieldTypeDescription
idguidUnique identifier
activebooleanWhether the channel is active
namestringDisplay name
typestringChannel type, currently any value is accepted
additional_fieldsobject?Additional field definitions specific to this channel

Entities store an array of sales channel IDs to indicate which channels they belong to:

EntityFieldEffect
PLU (product)plu.data.sales_channelsProduct is available only in listed channels
Menumenu.data.sales_channelsMenu is shown only in listed channels
POSpos.data.sales_channelsPOS terminal operates in listed channels
Wolt integrationlocation.data.wolt.sales_channelSingle channel ID used for Wolt data sync

When a POS terminal loads its data, the backend filters products and menus based on the POS’s assigned sales channels. If a product has sales_channels defined, it is only included if at least one channel matches the POS’s channels. Products without any sales channel assignment are available everywhere.

The Sales Channel page provides a matrix view where administrators can assign products, menus, and POS devices to channels using checkboxes.


Mando supports per-field translations for multilingual environments. Finnish is always the default source language.

Available languages are configured at company.data.languages — an array of language codes:

{
"languages": [
"en",
"sv"
]
}

This tells the system which additional languages are available. Finnish (fi) is implicit as the source language.

Certain fields on entities support per-language translations. Common translatable fields include name and description on products, menus, and other user-facing entities.

Translations are stored in a translations object on each entity, keyed by field path and language code:

{
"name": "Kahvi",
"translations": {
"name": {
"en": "Coffee",
"sv": "Kaffe"
},
"description": {
"en": "Fresh brewed coffee",
"sv": "Nybryggat kaffe"
}
}
}

The base field value (e.g. name) holds the Finnish text. The translations object provides the other languages. Fields without translations fall back to the Finnish value.

The UI provides a field editor for translating fields. If the user has access to Mando AI, the editor also provides machine translation suggestions.


Service periods define named time ranges within a business day at a location — for example breakfast, lunch, happy hour, or dinner. They are stored at location.data.service_periods.

{
"service_periods": [
{
"id": "aaa-...",
"name": "Breakfast",
"start_time": "06:00",
"end_time": "11:00",
"description": "Morning service",
"weekdays": [
"MON",
"TUE",
"WED",
"THU",
"FRI"
],
"color": "#F59E0B"
},
{
"id": "bbb-...",
"name": "Happy Hour",
"start_time": "15:00",
"end_time": "17:00",
"weekdays": [
"MON",
"TUE",
"WED",
"THU",
"FRI"
],
"color": "#8B5CF6"
}
]
}
FieldTypeDescription
idguidUnique identifier
namestringPeriod name (e.g. “Breakfast”, “Lunch”)
start_timestringStart time in HH:MM format
end_timestringEnd time in HH:MM format
descriptionstring?Optional description
weekdaysstring[]?Days when active: MON, TUE, WED, THU, FRI, SAT, SUN. If omitted, active every day.
colorcolor?UI color for visual representation
  • Reporting: Weekly reports can be segmented by service period to compare breakfast vs. lunch vs. dinner performance.
  • Operations: Track which time periods generate the most revenue or require the most staff.
  • Menu scheduling: Service periods can inform which menus or products are relevant at different times of day.

Service periods are defined per location, so different locations (e.g. a restaurant vs. a cafe) can have different period definitions.