Skip to content

Branding Profiles

Overview

Branding profiles control the visual appearance of your Kiosk and Online Ordering interfaces. Each profile defines a name, logos, a banner, fonts, colors, promo-code styling, social links, and Apple Wallet pass styling.

Separately, the Kiosk and Online Ordering apps each ship a standalone Branding Studio (/branding-preview) that lets you experiment with colors, fonts, logo, banner and even a custom menu against the real kiosk/storefront UI — without touching an actual branding profile. See Branding Studio below.

Purpose

This page lets you create and manage reusable visual themes that define how your brand appears to customers on kiosks and online ordering. Each location must be assigned a branding profile.

Key Concepts

  • Branding Profile: A reusable visual theme containing a name, logos, banner, fonts, colors, promo-code styling, social links, and Apple Wallet pass styling.
  • Default Profile: One profile can be flagged as the merchant default and used as the fallback.
  • Logo: Your business logo displayed in headers and online ordering.
  • Banner: Image shown at the top of the ordering menu (online and on kiosks).
  • Primary Color: Main brand color.
  • Social Links: Links to your social media profiles.

Route

  • Backoffice Route: /settings/brand (profile list, route name settings-brand)
  • Profile Detail: /settings/brand/profiles/:id (route name settings-brand-profiles-detail-id)
  • Navigation: Settings → Brand (the side-nav item is labelled "Brand")

Actions

Create New Branding Profile

On the profile list, click the New Profile button. A dialog titled "New Branding Profile" opens. Enter a name, then click Setup Profile to create the profile and open its detail page.

Edit Branding Profile

From the list, use Edit (or the "⋮" menu for non-default profiles) to open the detail page and edit settings. Click Save to persist changes.

Set as Default

From the "⋮" menu of a non-default profile, choose Set as default to make it the merchant default profile.

Delete Branding Profile

On the profile detail page, click Delete Profile. A confirmation dialog requires you to type the profile name. A profile cannot be deleted while it is assigned to one or more locations (the backend rejects it with "Cannot delete branding profile with locations").


Profile Sections

The detail page is split into six sections (matching the side menu): General, Logos & Banner, Fonts & Colors, Promo Codes, Social Links, and Apple Wallet.

Note: the branding-profile record also stores a landing page image (landing_page_imagelanding_page_content_id), used on the Online Ordering landing page. It is not edited on the Brand page — it lives under Online Ordering settings, labelled "Landing page image" ("JPG, PNG, SVG or WEBP image. Recommended size: 720 x 480").

General

  • Name: Profile name. Required and must be unique. (The form UI also enforces 5–25 characters.)
  • Slogan: Brand statement or tagline. Optional, max 100 characters.
  • Short Description: Business description used in bios and listings. Optional, max 150 characters.

Logos & Banner

  • Logo: Main logo shown on every device and website. Required. JPG, PNG or WEBP, max 10 MB.
  • Receipt Logo: Optional black & white logo for printed kiosk receipts. JPG, PNG or WEBP. Falls back to the main logo if not set.
  • Favicon: Browser-tab icon. Required. JPG, PNG, ICO or WEBP. Falls back to the logo if none is provided.
  • Banner: Image shown at the top of the ordering menu (online and kiosks). Required. JPG, PNG, SVG or WEBP, max 10 MB.

Note: every on-screen caption in this section says max 5MB, but both the client-side validator and the backend actually accept up to 10 MB (max:10240). The favicon has no server-side size rule at all — only the shared 10 MB client-side check.

Fonts & Colors

Two font selections and six colors:

  • Heading text (font) and Body text (font)
  • Primary color, Secondary color
  • Primary text color, Secondary text color
  • Primary background color, Secondary background color

All six colors are required and stored as 6-digit hex (#RRGGBB).

Promo Codes

Styles how promo codes appear on menus when active:

  • Promo code font
  • Promo code font color (required hex)
  • Promo code background color (required hex)

Add one or more social-media links. Supported platforms: TikTok, Instagram, Facebook, Pinterest, X, LinkedIn, YouTube, Snapchat, Tumblr. Each link, when provided, must be a valid URL.

Apple Wallet

Styles the loyalty member card shown in Apple Wallet:

  • Wallet Program Name: Optional, max 50 characters. Overrides the merchant name on the pass header; leave empty to use the branding-profile name.
  • Wallet Strip Image: Optional. Displayed behind the card info. JPG, PNG or WEBP (recommended 750×246 px). Falls back to the banner if not set.

Field Constraints

Backend validation (source of truth) for the update endpoint:

  • Name: required, string, unique per merchant.
  • Slogan: optional, max 100 characters.
  • Short Description: optional, max 150 characters.
  • Logo / Banner: required image, max 10 MB each.
  • Receipt Logo / Wallet Strip: optional images, max 10 MB each when supplied.
  • Favicon: optional at the request level; when supplied its file is required but carries no server-side size limit (the 10 MB ceiling is client-side only).
  • Landing page image: optional, max 10 MB. Edited under Online Ordering settings, not on the Brand page.
  • Fonts (heading, body, promo): required strings, chosen from the font list.
  • Colors (6 theme colors + promo font/background colors): required strings (hex).
  • Social Links: optional; each provided link must be a valid URL.
  • Wallet Program Name: optional, max 50 characters.

Note: The form UI additionally enforces a 5–25 character range on Name and a 5–100 / 5–150 minimum on Slogan / Short Description, but the backend only enforces the max lengths above.

Available Fonts

Backend stored font options (source of truth): Poppins, Arial, Roboto, Raleway, Lato, Verdana, Courrier New, Lora, Gelasio, Cormorant Garamond, Oswald.

Note: There is a known mismatch between backend and front-office. The backend stores Courrier New (with the double-r typo) and includes Gelasio. The back-office font picker shows Courier New (correct spelling) and omits Gelasio. The backend values are what is persisted.


Branding Studio (/branding-preview)

The page is titled Kiosk Branding Studio on the kiosk app and Branding Studio on the online-ordering app, with the sub-caption "Live preview of the real kiosk menu / online ordering storefront, using preview data from the backend."

A live, self-serve preview tool exists as a standalone page in both the Kiosk and Online Ordering apps — it is not part of the backoffice and is not reached via Settings → Brand.

  • Route: /branding-preview, opened directly on the Kiosk app's or the Online Ordering (storefront) app's own URL (e.g. the kiosk web build or the merchant's ordering domain), not inside /settings/....
  • It renders the real kiosk menu / storefront components inside a device-frame iframe, seeded from a dedicated, public "preview merchant" dataset (produced by BrandingPreviewSeeder) — not the merchant's own branding profile or menu data. Changes made here never touch a real branding profile.
  • The backend serves this dataset from two public, unauthenticated endpoints: GET /branding-preview/kiosk and GET /branding-preview/online-ordering.

Studio Controls

  • Quick themes: six one-click presets — Sunset, Forest, Berry, Ocean, Charcoal, Classic — each setting all colors (and fonts) at once. A "Custom" swatch opens a native color picker for the primary color.
  • Logo & Banner: file pickers for logo and banner. Unlike the real branding profile (uploaded and stored server-side, max 10 MB), these are read client-side with FileReader and embedded as base64 data URLs directly in the preview state — they are never uploaded to storage.
  • Colors: the same six theme colors as a branding profile — Primary, Secondary ("Accent / lines"), Primary background ("Background"), Secondary background ("Surface"), Primary text ("Text"), Secondary text ("Muted text").
  • Typography: Kiosk offers separate Heading font and Body font pickers; Online Ordering offers a single Font (body) picker. Font options match the branding-profile list: Poppins, Arial, Roboto, Raleway, Lato, Verdana, Courrier New, Lora, Gelasio, Cormorant Garamond, Oswald.
  • Layout (Kiosk only): a "Grid columns" slider (2–3, mirrors the device profile's menu_item_columns) and a Currency selector (EUR / USD / GBP).
  • Business (Online Ordering): Restaurant name and Address text fields. They are cosmetic in the preview, but they are persisted into a shared link (see Save & Share).
  • Other (Online Ordering): a Currency selector (EUR / USD / GBP).
  • A Desktop/Mobile device-frame toggle sits above the preview pane in Online Ordering (on an actual phone-sized viewport the storefront is rendered directly instead).
  • Reloading defaults is available via a Reset to fetched branding button, which discards changes and reloads the preview-merchant's original branding.

Custom Menu Upload

The Menu section lets a merchant preview their own menu content instead of the seeded dummy menu:

  • Template: downloads a sample menu-template.json showing the expected schema.
  • Export current: downloads the menu currently loaded in the preview (the seeded menu, or a previously uploaded one) as JSON in the same schema.
  • Upload JSON: uploads a .json file; on parse/shape failure it shows an inline error ("Invalid menu JSON: …") without applying the change.

The upload schema is a simplified, friendly JSON shape (converted internally to the app's real display-group/item/variant/modifier structures):

json
{
  "menu": [
    {
      "name": "Burgers",
      "description": "Hand-pressed, never frozen",
      "items": [
        {
          "name": "Cheeseburger",
          "description": "Beef, cheddar, pickles, ketchup",
          "price": 9.0,
          "tag": "Popular",
          "image": "https://example.com/cheeseburger.jpg",
          "variants": [
            { "name": "Single", "price": 9.0 },
            { "name": "Double", "price": 11.5 }
          ],
          "modifiers": [
            {
              "name": "Add-ons",
              "required": false,
              "multiple": true,
              "max": 3,
              "options": [
                { "name": "Extra cheese", "price": 1.0 },
                { "name": "Bacon", "price": 1.5 }
              ]
            }
          ]
        }
      ]
    }
  ]
}
  • Top-level menu is required and must be a non-empty array of groups (categories).
  • Each group needs name (and optional description) plus an items array.
  • Each item needs name and price (decimal, e.g. 9.0 for €9.00); description, tag, and image (a URL) are optional.
  • An item can define variants (each with name + price) instead of a flat price, and/or modifiers (each with name, required, multiple, max, and an options array of {name, price}).
  • This uploaded menu is preview-only and is never written back to the merchant's real menus.

Save & Share

  • The Save & copy link button POSTs the current state to POST /branding-preview/configs and returns a short id. The payload differs per app: kiosk saves {branding, columns, currency, menu}; online ordering saves {branding, name, address, currency, menu} — i.e. the Restaurant name and Address travel with the link, and columns is kiosk-only. The studio then builds a shareable URL of the form .../branding-preview?config={id} and copies it to the clipboard. Opening that URL reloads the same branding, layout, and custom menu via GET /branding-preview/configs/{id} (a public, unauthenticated read).
  • Saving is capped at 2 MB of JSON (strlen(json_encode($config)) > 2_000_000 → HTTP 422, "Config too large (max 2MB)."). Since the logo and banner are embedded as base64 data URLs, they are usually what pushes a config over the limit. On failure, the studio shows the backend's error message plus a size breakdown (e.g. "icon 1.20 MB, banner 0.85 MB, rest 12 KB (total 2.05 MB)") so the merchant knows what to shrink.
  • A saved config is looked up by id; an unknown/expired id returns HTTP 404 ("Preview config not found.").

Business Rules & Edge Cases

  • A branding profile cannot be deleted while it is assigned to one or more locations.
  • Every location must have a branding profile assigned — branding_profile_id is required when creating a location, and a location can have only one branding profile.
  • One profile can be marked as the merchant default.
  • A profile that has not been fully configured is flagged incomplete in the list with a warning icon.
  • Changes to a branding profile affect:
    • Kiosk: after app reload or sync
    • Online Ordering: on next page load

Customer Impact

Branding profiles affect:

  • Kiosk: Theme, colors, logo, banner display
  • Online Ordering: Logo, favicon, banner, fonts, colors, promo-code styling
  • Receipts: Logo (uses the receipt logo if uploaded, otherwise the main logo)
  • Apple Wallet: Member-card colors, logo, program name, and strip image

FAQs / Typical Questions

  • "How do I change the logo on my kiosk?"
  • "Where can I change my online ordering colors?"
  • "Can I set different branding per location?"
  • "Why can't I delete a branding profile?"
  • "How do I add my Instagram link to a branding profile?"
  • "Why do I have to pick a branding profile when adding a location?"
  • "How can I preview my branding changes before saving them?"
  • "Is there a way to test colors/fonts without editing my real branding profile?"
  • "Can I preview my own menu before publishing it?"
  • "How do I share a branding preview with someone else?"
  • "Why did my branding preview link fail to save?"

Troubleshooting

  • Logo not showing on kiosk → Refresh or restart the kiosk app to sync changes.
  • Colors not updating on online ordering → Reload the page (changes apply on next page load).
  • Can't delete branding profile → Unassign it from all locations (or delete those locations) first.
  • Profile shows an "incomplete" warning → Open the profile and complete the required fields (logo, banner, favicon, fonts, colors).
  • Can't save the profile → Logo, banner and favicon are required; all theme and promo colors are required.
  • "Config too large (max 2MB)" when saving a preview share link → The uploaded logo/banner (stored as base64 in the preview config) is too big; use a smaller image, or check the size breakdown shown next to the error.
  • "Preview config not found" when opening a shared preview link → The link's id doesn't match any saved config (typo, or the config was never successfully saved).
  • Invalid menu JSON error when uploading a menu to the Branding Studio → The uploaded file isn't valid JSON or is missing/misshapen the top-level menu array; download the Template from the Menu section for a working example.

Assistant Guidance

When answering questions about branding:

  • Use clear navigation: e.g. "Go to Settings → Brand."
  • Prefer short, step-by-step instructions.
  • Mention which channels are affected (Kiosk, Online Ordering, Receipts, Apple Wallet).
  • Remember a profile cannot be deleted while assigned to locations, and every location must have a profile.
  • If a user is confused by changes not showing, ask:
    • On which channel they expect the change.
    • When they last reloaded the page or restarted the kiosk app.
  • If a merchant wants to "try out" or "test" colors, fonts, a logo, or a menu without committing changes, point them to the Branding Studio — titled "Kiosk Branding Studio" on the kiosk — at /branding-preview on the Kiosk or Online Ordering app itself (not a backoffice page), rather than telling them to edit a real branding profile. Do not call it a "Branding & Menu Preview Studio"; that name appears nowhere in the product.
  • Be clear that the studio previews against a dummy "preview merchant" dataset and does not read or write the merchant's real branding profile or menus — nothing there is saved permanently unless they explicitly click Save & copy link, and even that only creates a shareable preview config (max 2 MB), not a real profile.

Relations

Depends On

  • Locations: Profiles are assigned to locations (required per location)

Affects

  • Kiosk: Visual appearance
  • Online Ordering: Visual appearance
  • Receipts: Logo
  • Apple Wallet: Member-card styling