Appearance
Options Reference
Complete reference of all toggle states and select dropdown options. Use this to understand what each option means and does.
Toggle Fields
Toggles are boolean (on/off) switches. Here's what each toggle controls:
Location & Settings
| Field ID | When ON | When OFF |
|---|---|---|
business_hours.{day}.is_available | Location open on this day | Location closed on this day |
restricted_dates.*.yearly | Date repeats every year (e.g., Christmas) | One-time closure |
Online Ordering
| Field ID | When ON | When OFF |
|---|---|---|
takeout.enabled | Customers can order for pickup | Pickup not available |
delivery.enabled | Customers can order for delivery | Delivery not available |
custom_availability | Use custom schedule (not business hours) | Use location business hours |
minimum_order_amount.enabled | Require minimum order value | No minimum order |
pick_up_instructions.enabled | Show pickup instructions field | No pickup instructions |
schedule_order_for_future_days.takeout.enabled | Allow scheduled pickup orders | Only ASAP pickup |
schedule_order_for_future_days.delivery.enabled | Allow scheduled delivery orders | Only ASAP delivery |
Order Capacity
| Field ID | When ON | When OFF |
|---|---|---|
order_capacity.enable_flexible_limit_order_per_time_slot | Allow more orders if value is low | Strict order limit |
order_capacity.enable_limit_specific_categories | Set limits per category | No category limits |
limit_orders_per_time_slotandlimit_items_per_time_slotare stored booleans but are not exposed as toggles. The merchant types a number into Max orders per slot / Max items per slot, where 0 means no limit, and the boolean is derived from it (limit_orders_per_time_slot = numValue > 0). The component says so directly:<!-- Basic Limits - No toggles, 0 = no limit -->(OrderCapacityManagement.vue:324).
Tips & Notes
| Field ID | When ON | When OFF |
|---|---|---|
collect_tips.enabled | Show tip options at checkout | No tip collection |
allow_notes.enabled | Customers can add notes to items | No notes allowed |
Menu Items
Items have no available or track_stock toggle:
- Visibility / orderability is the
statusenum (Active/Inactive/Unavailable/Hidden), not a boolean.Unavailablekeeps the item visible but un-orderable (shows sold out);Hiddenremoves it from the menu. See menu-items. - Inventory tracking is derived:
track_quantityis true when an inventory record exists for the item+location — there is no stored toggle. See inventory.
Modifiers
| Field ID | When ON | When OFF |
|---|---|---|
settings.is_mandatory | Customer must select from this group | Selection is optional |
settings.allow_select_more_than_one | Customer can pick multiple options | Single selection only |
settings.allow_same_modifier_more_than_one | Same option can be added multiple times | Each option at most once |
There is no required field (it is settings.is_mandatory) and no per-option "default/pre-selected" toggle. See modifiers.
Payments
There are no per-method or per-provider payment toggles on the payment profile:
- Stripe payment-method availability (cards, iDEAL, Bancontact, …) is driven by the connected Stripe account's capabilities, not by
stripe.*_enabledtoggles. There is nostripe.enabledorstripe.live_mode. - Test vs live is a per-location flag,
payment_test_mode(notstripe.live_mode). - Viva Wallet is configured through Upvendo's ISV connection (no
viva_wallet.enabledtoggle); terminals are assigned per device.
See payments, stripe, and viva-wallet.
Loyalty
| Field ID | When ON | When OFF |
|---|---|---|
birthday_bonus | Give bonus on customer birthday | No birthday bonus |
using_minimum_spend | Require a minimum spend to earn points | Earn on any order |
do_points_expire | Points expire after a set period | Points never expire |
There is no top-level enabled toggle — loyalty is activated by a per-location subscription. birthday_bonus is a plain required|boolean; the reward itself lives in the sibling object birthday_bonus_details (type bound to RewardTypes, plus discount, discount_unit, eligible_items). There is no birthday_bonus.enabled or birthday_bonus.value. See loyalty.
Receipts
| Field ID | When ON | When OFF |
|---|---|---|
show_order_level_discounts_on_item_level | Show discounts per item | Show discount as total |
show_tax_summary | Show tax breakdown | Hide tax details |
show_price | Show prices on receipt | Hide prices |
show_address | Show location address | Hide address |
display_contact_information | Show phone/email | Hide contact info |
display_qr_code | Show QR code on receipt | No QR code |
custom_footer_text | Show custom footer message | No custom footer |
KDS
| Field ID | When ON | When OFF |
|---|---|---|
filter.order_source.all | Show orders from all sources | Filter by source |
filter.order_source.kiosk | Show kiosk orders | Hide kiosk orders |
filter.order_source.online_ordering | Show online orders | Hide online orders |
orders.strike_through_individual_modifier | Strike through completed modifiers | No strike through |
orders.reset_timer_on_recall | Reset timer when order recalled | Keep original timer |
orders.automatically_hold_scheduled_orders | Hold scheduled orders until prep time | Show immediately |
sound.mute_order_sound | Mute all sounds | Sounds enabled |
Integrations
An integration is turned on/off by connecting / disconnecting it (an integration record with is_active), not by a settings toggle. The only real per-integration toggle here is Square's auto-sync:
| Field ID | When ON | When OFF |
|---|---|---|
square.enable_auto_sync | Auto-sync the catalog from Square on a schedule | Manual sync only |
There is no square.connected / square.sync_menu / square.sync_orders, and no deliveroo.* / uber_eats.* enabled or auto_accept toggle. Marketplaces auto-accept incoming orders by default; POS catalogs sync one-way. See integrations and the per-provider docs under shared/integrations/.
Select Fields (Dropdowns)
Time Slot Duration
Field ID: order_capacity.time_slot_duration_min
A dropdown with seven options. The backend rule is permissive (required|numeric|gt:0, StoreOnlineSettingsRequest.php), but the back office restricts the merchant to these values (OrderCapacityManagement.vue:54-56). Default 15 (Constants.php:192, $DEFAULT_ORDER_CAPACITY_SETTINGS).
| Value | Notes |
|---|---|
5 | 5 minutes |
10 | 10 minutes |
15 | Default |
20 | 20 minutes |
30 | 30 minutes |
45 | 45 minutes |
60 | 60 minutes |
Accept Orders Until
Field ID: accept_orders_untilEnum: App\Enums\AcceptOrdersUntil (AcceptOrdersUntil.php:7-8)
Edited only on the Table QR Ordering page, as a toggle — not a select. The online-ordering control was retired in favour of
takeout.last_slot_at_closing_time(see scheduled-orders.md). The sole remaining UI is a single switch on QR ordering; see qr-ordering.md for the toggle-to-value mapping.
| Option | Stored Value | Description |
|---|---|---|
| Closing Time | Closing Time | Accept orders until location closes — online-ordering default (Constants.php:609) |
| Closing Time Minus Prep Time | Closing Time Minus Prep Time | Stop accepting before closing to allow prep — QR ordering default (Constants.php:306) |
The two channels default to opposite values, so always say which channel you mean when quoting the default.
Example: If closing at 22:00 with 20 min prep time:
- "Closing Time" → Accept until 22:00
- "Closing Time Minus Prep Time" → Accept until 21:40
Delivery Region Type
Field ID: delivery_region.typeEnum: App\Enums\DeliveryRegionOptions (DeliveryRegionOptions.php:7-9)
| Option | Stored Value | Description |
|---|---|---|
| Radius | Radius | Deliver within X km of location (default, Constants.php:629) |
| Postal Code | Postal Code | Deliver to specific postal codes only |
| Distance | Distance | Deliver within a maximum driving/route distance |
Delivery Fee Type
Field ID: delivery_fee.typeEnum: App\Enums\DeliveryFeeTypes (DeliveryFeeTypes.php:7-9)
| Option | Stored Value | Description |
|---|---|---|
| Free delivery | Free delivery | No delivery fee (default, Constants.php:635) |
| Charge delivery fee for all orders | Charge delivery fee for all orders | Fixed fee for all deliveries |
| Free delivery for orders over a certain amount | Free delivery for orders over a certain amount | Free if order exceeds minimum |
Calculate Tips
Field ID: collect_tips.calculate_tipsEnum: App\Enums\CalculateTipsOptions (CalculateTipsOptions.php:7-8)
The validation binds to CalculateTipsOptions, whose stored values are the human-readable strings Before taxes / After taxes (StoreOnlineSettingsRequest.php:169, StoreInHouseSettingsRequest.php:61). Note: a separate, unused App\Enums\CalculateTips enum exists with values before_taxes/after_taxes — that one is not what this field stores.
| Option | Stored Value | Description |
|---|---|---|
| Before taxes | Before taxes | Calculate tip on subtotal only |
| After taxes | After taxes | Calculate tip on total including tax (default, Constants.php:246) |
Example (15% tip on €25 subtotal + €5.25 tax):
- "Before taxes" → €25 × 15% = €3.75 tip
- "After taxes" → €30.25 × 15% = €4.54 tip
Idle Timeout Type
Field ID: idle_timeout_typeEnum: App\Enums\IdleTimeoutTypes (IdleTimeoutTypes.php:7-8)
Only two options exist. When custom is chosen, idle_timeout_seconds and show_warning_for_seconds become required (StoreDeviceProfileRequest.php:223-225, StoreOnlineOrderingRequest.php:201-203).
Standard resolves to a different value in each context — do not quote one number for both.
| Option | Context | Stored Value | Seconds | Description |
|---|---|---|---|---|
| Standard | Device profile (kiosk) | standard | 45 + 15s warning | DeviceProfile::getIdleTimeoutSeconds() returns 45 whenever the type is not Custom |
| Standard | Online ordering | standard | 120 + 15s warning | Constants.php:660-662 |
| Custom | both | custom | variable | Uses idle_timeout_seconds (any value >= 1) |
Print Settings
Field ID: print_settingsEnum: App\Enums\PrintSettingOptions (PrintSettingOptions.php:7-8)
| Option | Stored Value | Description |
|---|---|---|
| Based on pickup time | pickup_time | Print ticket relative to the pickup time (default, Constants.php:659) |
| When order is placed | when_order_is_placed | Print ticket as soon as the order is placed |
Send to POS
Field ID: send_to_posEnum: App\Enums\SendToPosOptions (SendToPosOptions.php:7-8)
| Option | Stored Value | Description |
|---|---|---|
| Pickup/delivery time | pickup_delivery_time | Send to POS based on the scheduled pickup/delivery time (default, Constants.php:663) |
| Order placed | order_placed | Send to POS as soon as the order is placed |
Customer Name Format
Field ID: customer_information_full_nameEnum: App\Enums\CustomerInformationFullNameOptions (CustomerInformationFullNameOptions.php:7-8)
| Option | Stored Value | Description |
|---|---|---|
| First & last name | first_last_name | Collect both first and last name |
| First name only | first_name | Collect first name only |
Customer Contact Details
Field ID: customer_information_contact_detailsEnum: App\Enums\CustomerInformationContactDetailsOptions (CustomerInformationContactDetailsOptions.php:7-8)
Only two options exist (there is no "Phone Only").
| Option | Stored Value | Description |
|---|---|---|
| Phone & email | phone_email | Collect both phone and email |
| Email only | email | Collect email only |
Snooze Out of Stock Items
⚠️ Not verified in current code. The field
snooze_time_out_of_stock_itemsand the enumApp\Enums\SnoozeOutOfStockItemOptionsare not present in the current backend (onlyApp\Enums\SnoozeOptionsexists, for the online-ordering channel pause — accept / 20 / 40 / 60 min / rest-of-day / dont_accept). The option table below is unconfirmed pending dev review (removed vs never shipped). See stock-management.
Field ID: snooze_time_out_of_stock_itemsEnum: App\Enums\SnoozeOutOfStockItemOptions (SnoozeOutOfStockItemOptions.php:7-15)
| Option | Stored Value | Description |
|---|---|---|
| Do not snooze | do_not_snooze | Show "Out of stock" but keep visible |
| 30 minutes | 30 | Hide item for 30 minutes |
| 1 hour | 60 | Hide item for 1 hour |
| 2 hours | 120 | Hide item for 2 hours |
| 3 hours | 180 | Hide item for 3 hours |
| 6 hours | 360 | Hide item for 6 hours |
| 12 hours | 720 | Hide item for 12 hours |
| 24 hours | 1440 | Hide item for 24 hours |
| Infinite | infinite | Hide until manually restocked |
Receipt QR Code Type
Field ID: display_qr_code_applies_toEnum: App\Enums\ReceiptQRCodeAppliesTo (ReceiptQRCodeAppliesTo.php:7-8)
| Option | Stored Value | Description |
|---|---|---|
| Online Ordering | online_ordering | QR links to online ordering page (default, Constants.php:721) |
| Custom Link | custom_link | QR links to a custom URL |
KDS Layout
Field ID: layoutEnum: App\Enums\KDSLayouts (KDSLayouts.php:7-10)
| Option | Stored Value | Description |
|---|---|---|
| Tiled | Tiled | Tiled grid of order cards |
| Split | Split | Split view (default, Constants.php:392) |
| Take Out | Take Out | Take-out focused layout |
| Rail | Rail | Rail / single-column layout |
Birthday Bonus / Reward Type
Field ID: birthday_bonus_details.type (also reward type) Enum: App\Enums\RewardTypes (RewardTypes.php:7-8)
Bound via Rule::enum(RewardTypes::class) in CreateIntentRequest.php (e.g. OnlineOrdering/CreateIntentRequest.php:287, Kiosk/Payment/CreateIntentRequest.php:268).
| Option | Stored Value | Description |
|---|---|---|
| Discount | Discount | Percentage or amount off order |
| Free Item | Free Item | Free item from eligible list |
Order Number Display
Field ID: order_number_displayEnum: App\Enums\OrderNumberDisplayOptions (OrderNumberDisplayOptions.php:7-9)
Bound in StoreOnlineOrderingRequest.php:173 and StoreDeviceProfileRequest.php:214.
| Option | Stored Value | Description |
|---|---|---|
| Queue number | queue_number | Show the queue number only |
| Order number | order_number | Show the order number only |
| Both | both | Show both (default, Constants.php:682) |
Preferred Language
Field ID: preferred_language
This field does NOT store an ISO code. It stores a MongoDB ObjectId referencing a document in the languages collection. Validation requires the value to exist as an _id in that collection (StoreLocationRequest.php:91-99, ExistsInConnectionWithModel), and it is resolved through LanguageRepository::retrieve() (RawModels/Location.php:522). New languages are created/looked up and their getId() stored (e.g. SquareLocationSync.php:257, MplusKassaIntegrationService.php:4593).
The available languages and their ISO codes come from Constants::$LANGUAGE_CONVERTER (Constants.php:42-50); the default language name is English (Constants.php:20). The codes below are the language codes, not the value stored in preferred_language:
| Language | ISO Code |
|---|---|
| English | en |
| Dutch | nl |
| French | fr |
| German | de |
| Spanish | es |
| Portuguese | pt |
| Italian | it |
Country
Field ID: address.country
The country field is validated as required|string (StoreLocationRequest.php:116) and stores the full country name (e.g. Belgium), not the ISO code. Two distinct lists exist in code:
1. Selectable list — Constants::getSupportedCountries() / $SUPPORTED_COUNTRIES (Constants.php:104-110, 119-128)
This is what actually limits the picker (used in RegisterRequest.php:72, NewPaymentProfileRequest.php:45, ConstantController.php:20):
| Country | ISO Code |
|---|---|
| Belgium | be |
| France | fr |
| Netherlands | nl |
| United States | us |
For payment profiles,
getSupportedCountries(true)excludesUnited States(Constants.php:123-124).
A separate
$SUPPORTED_COUNTRIES_PRODarray (Constants.php:113-116) lists Belgium only as the intended production-only set, but it is not referenced anywhere in the code —getSupportedCountries()always returns$SUPPORTED_COUNTRIES.
2. Full name→ISO mapping — Constants::$COUNTRY_CONVERTER (Constants.php:131-143)
Used for code/name conversion (getCountryCodeByName, getCountryNameByCode). Wider than the selectable list:
| Country | ISO Code |
|---|---|
| Austria | at |
| Belgium | be |
| Finland | fi |
| France | fr |
| Germany | de |
| Ireland | ie |
| Italy | it |
| Netherlands | nl |
| Portugal | pt |
| Spain | es |
| United States | us |
Default country code is be (Constants::DEFAULT_COUNTRY_CODE, Constants.php:16).
Branding Fonts
Field ID: heading_text_font / body_text_font (also promo_code_font) Constant: Constants::$BRANDING_FONT_OPTIONS (Constants.php:466-478)
Both fields are validated as free strings (required|string, UpdateBrandingProfileRequest.php:54-55); $BRANDING_FONT_OPTIONS is the canonical list of intended values. Default is Poppins (Constants::$DEFAULT_BRANDING_PROFILE, Constants.php:450-451; promo_code_font at :458).
| Stored Value | Description |
|---|---|
| Poppins | Default |
| Arial | Classic, widely supported |
| Roboto | Google sans-serif |
| Raleway | Thin sans-serif |
| Lato | Sans-serif |
| Verdana | Sans-serif |
Courrier New | Monospace — note the backend typo (double "r") |
| Lora | Serif |
| Gelasio | Serif |
| Cormorant Garamond | Serif |
| Oswald | Bold display |
Front-end discrepancy: the back-office font picker (
upvendo-backofficeAppFontSelect.vue:16-27) listsCourier New(correct spelling) and omitsGelasio(10 options vs. the backend's 11). The backend$BRANDING_FONT_OPTIONSvalue (Courrier New, plusGelasio) is the source of truth for what is actually stored.
Days of Week
Used in: business_hours, delivery_available_days, pickup_available_days, time_specific_rules.active_days
Stored as the capitalized English day name (see defaults in Constants.php:589-606 and Constants.php:214-222).
| Option | Stored Value |
|---|---|
| Sunday | Sunday |
| Monday | Monday |
| Tuesday | Tuesday |
| Wednesday | Wednesday |
| Thursday | Thursday |
| Friday | Friday |
| Saturday | Saturday |
Multiselect Fields
Allergens
Field ID: allergensConstant: Constants::$ALLERGENS_LIST_OPTIONS (Constants.php:481-514), stored as the label value.
Tree nuts: Tree nuts, Almonds, Brazil nuts, Cashews, Hazelnuts, Macademia (note backend typo, missing one "a"), Pecans, Pistachios, Walnuts, Queensland nuts
Other allergens: Peanuts, Milk, Eggs, Fish, Crustaceans, Molluscs
Gluten: Gluten, Wheat, Barley, Rye, Oats, Spelt, Kamut
Other: Soy, Celery, Mustard, Sesame, Lupin, Sulphites
Dietary Preferences
Field ID: dietary_preferencesConstant: Constants::$DIETARY_PREFERENCES_OPTIONS (Constants.php:517-544)
- Alcohol-free
- Dairy-free
- Decaffeinated
- Gluten-free
- Halal
- High protein
- Keto
- Kosher
- Lactose-free
- Low fat
- Low sodium
- No added MSG
- No artificial colors
- No artificial flavors
- No artificial sweeteners
- No preservatives
- Non-GMO
- Nut-free
- Organic
- Paleo
- Single origin
- Soy-free
- Sugar-free
- Vegan
- Vegetarian
- Wholegrain
Dietary Supplements
Field ID: dietary_supplementsConstant: Constants::$DIETARY_SUPPLEMENTS_OPTIONS (Constants.php:547-557)
- Aloe vera
- Caffeine
- Calcium
- Electrolytes
- Fiber
- Iron
- Magnesium
- Probiotics
- Protein
Item Tags
Field ID: tagsConstant: Constants::$ITEM_TAGS (Constants.php:31-39)
- Vegan
- Vegetarian
Glutten-free(note backend typo, double "t")- Nut-free
- Kosher
- Halal
- Dairy-free
Tip Percentage Options
Field ID: collect_tips.options
This is not a fixed set — it is a merchant-defined array of percentages. Each entry is validated as a number (online: min:1|max:100, StoreOnlineSettingsRequest.php:167-168; in-house: min:0|max:100, StoreInHouseSettingsRequest.php:59-60). Any combination within that range is allowed.
Social Media Options
Field ID: social_linksConstant: Constants::$SOCIAL_MEDIA_OPTIONS (Constants.php:736-746)
social_links is a keyed object; each platform key accepts a nullable URL (UpdateBrandingProfileRequest.php:65-72). Available platform keys:
- tiktok
- x
- youtube
- snapchat
- tumblr
Additional production enums
These are used by merchant-facing settings and were previously undocumented. Values read directly from app/Enums/.
Channel Snooze
Enum: App\Enums\SnoozeOptions
| Option | Stored Value |
|---|---|
| Accept orders | accept |
| Pause 20 minutes | 20 |
| Pause 40 minutes | 40 |
| Pause 60 minutes | 60 |
| Pause for the rest of the business day | rest_of_the_day |
| Stop accepting orders | dont_accept |
POS Customer Name Format
Enum: App\Enums\PosCustomerNameFormatOptions
| Option | Stored Value |
|---|---|
| First + last name | first_last_name |
| First name only | first_name |
Discount Units (expanded)
Enum: App\Enums\DiscountUnitsExpanded — used by BOGO / reward discounts.
| Option | Stored Value |
|---|---|
| Percentage | percent |
| Fixed amount | amount |
| Free | free |
Loyalty Program Type
Enum: App\Enums\LoyaltyPrograms
| Option | Stored Value |
|---|---|
| Visit based | Visit Based |
| Amount based | Amount Based |
Loyalty Point Expiry
Enum: App\Enums\LoyaltyMonthsToExpirePoints — integer values, not strings.
| Option | Stored Value |
|---|---|
| 3 months | 3 |
| 6 months | 6 |
| 12 months | 12 |
| 18 months | 18 |
| 24 months | 24 |
Reward Type
Enum: App\Enums\RewardTypes — used by birthday_bonus_details.type and rewards.*.type.
| Option | Stored Value |
|---|---|
| Discount | Discount |
| Free item | Free Item |
Menu Item Columns
Field ID: menu_item_columns (device profile)
nullable|integer|in:2,3, default 2 (StoreDeviceProfileRequest.php:211, :64). Only 2 or 3 columns — there is no 4-column option.