Skip to content

Business experiences

QRalto business experiences turn a managed dynamic QR code into an application that can change after the QR is printed. v50.0 introduces the shared experience foundation and the first experience type: Digital Menu.

Digital menu API

Base route: /api/v1/menus

Method Route API-key scope Purpose
GET /api/v1/menus experience:read List/search saved digital menus.
GET /api/v1/menus/{id} experience:read Read one menu workspace.
POST /api/v1/menus experience:write Create a menu and its managed dynamic QR.
PUT /api/v1/menus/{id} experience:write Update menu branding/settings.
PUT /api/v1/menus/{id}/status experience:write Publish/unpublish the menu and managed QR together.
DELETE /api/v1/menus/{id} experience:delete Soft-delete the menu and retire its managed QR.
POST /api/v1/menus/{id}/categories experience:write Add a category.
PUT /api/v1/menus/{id}/categories/{categoryId} experience:write Update a category.
DELETE /api/v1/menus/{id}/categories/{categoryId} experience:write Remove an empty category.
POST /api/v1/menus/{id}/items experience:write Add an item.
PUT /api/v1/menus/{id}/items/{itemId} experience:write Update an item.
DELETE /api/v1/menus/{id}/items/{itemId} experience:write Soft-delete an item.

The public guest endpoint is GET /api/v1/public/menus/{slug}. It is anonymous, read-only, rate-limited, and returns only published menu content for a live tenant/subscription and active managed QR.

Managed QR behavior

Creating a menu automatically creates a dynamic URL QR campaign whose destination is the permanent QRalto menu URL. The QR is experience-managed: generic QR update/status/delete operations reject mutations that could break the experience. Publish/unpublish and deletion must be performed through the menu endpoints.

The managed QR continues to use QRalto redirect analytics, so the first scan is recorded before the guest is redirected to the mobile menu.

Validation and limits

  • Workspace and public names are required and bounded.
  • Currency and language use bounded codes.
  • Branding colors must be six-digit hex values; primary/surface colors are checked for readable contrast.
  • Website links are restricted to HTTP/HTTPS.
  • Phone and WhatsApp fields accept bounded international-style values.
  • Item prices are non-negative and bounded; compare-at price cannot be lower than the current price.
  • Availability end date cannot precede the start date.
  • Categories are tenant/menu scoped; an item cannot reference a category from another menu.
  • Item images are tenant-scoped inspected PNG/JPG assets up to 6 MB each, with a maximum of 40 bound menu images.
  • Publishing requires at least one visible, date-eligible item.
  • Per-plan saved experience quota is enforced inside a serializable transaction.

Security model

Every authenticated operation is tenant-isolated and requires current membership, an active subscription, the appropriate team role, and the relevant experience:* API-key scope when API keys are used. Public menu pages are intentionally noindex; only the public product acquisition page /menu-qr-code is search-indexable.

Commands, queries, and events

Digital Menu API operations are dispatched through typed mediator commands and queries. Mutations also append qralto.experience.changed.v1 to the SQL event outbox in the same save as the business change. The background dispatcher uses leases, retry scheduling, and dead-letter status and provides at-least-once delivery to idempotent notification handlers.

The event payload includes event, tenant, actor and experience identifiers; experience type; change name; optional child subject type/id; and occurrence time. The event stream is an internal integration boundary in v50.0.1, ready for explicitly configured webhooks or other subscribers in later releases.