# cenaly.com — full documentation > cenaly.com is a business automation platform (SaaS) for small businesses: restaurants, cafes and bars, shops and online stores, beauty salons and other appointment-based services, and hotels. It covers QR-code menus and online storefronts in 45 languages, online ordering (dine-in, delivery, pickup, WhatsApp, Telegram), POS and kitchen display (KDS), floor plan with table reservations, appointment book, hotel PMS, own-delivery courier screen, business phone system (PBX) with call log, customer directory, reviews and newsletters, staff roles and shifts, inventory with recipes and AI invoice recognition, finance dashboards, website widgets (chat, callback, booking, ordering, cookie banner), AI photo generation and a Guest API and an MCP server for AI agents. This file contains every documentation article from https://cenaly.com/docs in Markdown. Articles without an English translation are included in Russian. --- # Getting started with Cenaly Cenaly combines sales, customer service, staff, stock, finances and communication. Your business type selects the initial workflow and terminology: restaurant, store, salon, hotel, pickup point, service business, school, website or widgets. ## 1. Create your account and check the location Open the administration panel from the website you registered on. Follow [Account and sign-in](/en/docs/account), then check the location's name, business type, country, currency, time zone and working hours. A location can be a shop, branch, hotel, school or website. For a mixed business, choose the main operating model and add the required modules. Availability also depends on country, service, subscription and employee permissions. ## 2. Follow the checklist for your business [First day: choose your business type](/en/docs/first-day) is the starting point. | Business | First working scenario | |---|---| | Restaurant, cafe, bar, fast food or canteen | Menu, order, preparation and payment | | Retail or online store | Product, stock, sale, delivery or collection | | Salon or appointment services | Service, specialist, resource, time slot and visit | | Hotel | Room, rate, reservation, check-in and guest folio | | Pickup point | Carrier, parcel, storage cell and handover | | Professional services | Enquiry, customer, proposal, invoice and payment | | School | Course, group, student, attendance and family account; dedicated modules are being introduced | | Company website, blog, widgets or chat | Page, enquiry form or conversation with a visitor | ## 3. Prepare your data Import an existing catalog or start with a few representative items. Products need prices and stock, services need durations and resource requirements, hotel rooms need capacity and rates, and school courses need groups and pricing rules. Use [Catalog import](/en/docs/catalog-import) or [Switch to us](/en/docs/migrate) for existing data. Review the import preview and translations before publishing. Add employees and permissions through [Staff](/en/docs/staff). ## 4. Connect the customer entry point Share your storefront link or QR code, publish a site, or add widgets to an existing site. A restaurant may use table QR codes; a hotel uses room QR codes; a salon shares a booking link. They serve different workflows. See [QR codes](/en/docs/device-codes), [My website](/en/docs/site-widgets) and [Custom domain](/en/docs/custom-domain). ## 5. Complete a test transaction Check the whole workflow, including the employee's view and the customer's confirmation. Verify prices, availability, the location's time zone, payment status and the resulting record. Test cancellation or refund where relevant. Online payment requires a supported provider connected to your location. Creating an order or invoice does not mean it has been paid. See [Payments](/en/docs/payments) and the relevant business checklist. ## Add modules as work grows [App store](/en/docs/app-store) lists additional sections. [Finance](/en/docs/finance), [Documents](/en/docs/documents), [Telephony](/en/docs/telephony) and [Knowledge base](/en/docs/knowledge-base) support several business types. Configure the ones needed for your workflow. Schools, group classes, advanced hotel workflows and communication automation are expanding. The [First day guide](/en/docs/first-day) distinguishes current workflows from additions being introduced. Check [Subscription](/en/docs/subscription) for the current plan and [Support](/en/docs/support) for help. --- # QR Menu — Complete Guide ## What is a QR menu? A QR menu is a digital version of your venue's menu, available to guests via a QR code. The guest scans the code with their phone camera and instantly sees the full menu with photos, descriptions, prices, and translations into their language. ### Advantages over a paper menu | | Paper menu | Cenaly QR menu | |---|---|---| | Price updates | Reprint (1–3 days, from €50) | Instant, free | | Languages | 1–2, manual translation | 45 languages, auto-translation | | Photos | Expensive printing | Unlimited, free | | Hygiene | Physical contact | Contactless | | Allergens | Small print | Interactive filtering | | Analytics | Not possible | Popularity, views | | Annual cost | €200–500+ | From €0 | --- ## Menu structure ``` Location (your venue) ├── Category: Breakfasts │ ├── Item: Fried eggs with bacon │ ├── Item: Pancakes with berries │ └── Item: Granola with yogurt ├── Category: Salads │ ├── Item: Caesar │ └── Item: Greek salad ├── Category: Mains │ └── ... ├── Category: Desserts │ └── ... └── Category: Drinks ├── Subcategory: Hot drinks ├── Subcategory: Cold drinks └── Subcategory: Alcoholic drinks ``` --- ## Category management ### Creating a category 1. Go to **Menu** → **+ Add category** 2. Enter the name in the primary language 3. Upload a category photo (recommended 800×600px) 4. Set the display order (drag & drop) ### Editing - Click the category name to edit - Translate names manually or use auto-translation - Changes are saved automatically ### Deleting - Click the 🗑 icon — the category and all its items will be deleted - This action is irreversible — confirm deletion in the dialog --- ## Menu item management ### Adding an item 1. Inside a category, click **+ Add item** 2. Fill in the fields: | Field | Required | Description | |------|-------------|----------| | Name | ✅ | Dish/drink name | | Description | ❌ | Ingredients, preparation method, weight | | Price | ✅ | Price in the venue's currency | | Photo | ❌ | Dish photo (recommended) | | Allergens | ❌ | Allergen labeling | | Variants | ❌ | Sizes/portions with different prices | | Add-ons | ❌ | Additional ingredients | | Tax group | ❌ | Which rate the storefront uses for this item: "Standard", a group from your locations' tax tables, or your own — the "+ New tax group…" item asks for the name, the rate (or an exemption) and the locations and creates the group in the table (rates are set and edited in **Commerce → Taxes**) | ### Dish photos - **Format:** JPEG, PNG, WebP, HEIC/HEIF (iPhone photos), AVIF, GIF, BMP, TIFF, SVG, ICO; file size up to 10 MB - **Recommended size:** 800×600px or larger - **AI enhancement:** the system automatically optimizes the photo (brightness, contrast, cropping) - **AI generation:** if there's no photo, AI can generate an image based on the dish name ### Variants (sizes/portions) Let guests choose a size or portion: - Small portion — 200g — ₽350 - Medium portion — 350g — ₽500 - Large portion — 500g — ₽700 ### Add-ons Additional ingredients or options: - Extra cheese — +₽80 - Spicy sauce — +₽50 - Gluten-free — +₽100 --- ## Multilingual support ### How auto-translation works 1. You enter the name and description in the **primary language** 2. The system automatically translates into all **selected languages** (up to 45) 3. You can **edit** any translation manually 4. Manual edits take priority over auto-translation ### Supported languages English, Russian, Georgian, German, French, Spanish, Italian, Portuguese, Dutch, Polish, Turkish, Arabic, Chinese, Japanese, Korean, Hindi, Thai, Vietnamese, Indonesian, Malay, Filipino, Ukrainian, Hebrew, Persian, Swahili, Amharic, Nepali. ### How is the guest's language determined? 1. The system checks the guest's browser language 2. If that language is enabled in the menu — it's shown in that language 3. If not — it's shown in the venue's primary language 4. The guest can switch the language manually --- ## Design and branding ### Brand identity - **Logo** — displayed in the menu header - **Cover** — banner at the top of the menu - **Colors** — the system adapts to your brand colors ### Venue information The menu automatically displays: - Venue name - Address - Opening hours (if provided) - Contact details --- ## QR code ### Generation 1. Go to the **QR codes** section, **Guests / menu** tab 2. Configure: - QR code color - Logo in the center - Dot style (square/rounded) 3. Download in PNG or SVG format ### Where to place the QR code - **On tables** — stickers, table tents, inserts under glass - **At the entrance** — near the host stand - **On business cards** — for promotional purposes - **In Instagram/TikTok** — link to your menu - **On delivery packaging** — for repeat orders ### NFC stands In addition to QR codes, Cenaly supports NFC — a guest can tap their phone on a stand for instant access to the menu without scanning. --- ## Updating the menu - All changes (prices, descriptions, photos) **take effect instantly** - No need to reprint QR codes — they remain the same - Change history is saved --- ## Content tips 1. **Add photos** — items with photos are viewed 3× more often 2. **Write descriptions** — ingredients, weight, and preparation method help guests choose 3. **Specify allergens** — this is an EU requirement and care for guests 4. **Update prices** — instant updates without reprinting 5. **Use categories** — a logical structure simplifies navigation --- ## Stop list (out-of-stock items) If a dish or ingredient runs out, you can instantly hide the item from guests: 1. In **Menu**, find the item 2. Toggle **Available** → the item becomes inactive 3. Guests **will not see** this item in the digital menu 4. When the ingredient is back — turn it on again ### Bulk stop list - Select multiple items → **Actions** → **Hide selected** - Morning stop list: the manager checks availability → disables unavailable items - KDS automatically removes hidden items from the kitchen screen ### Notifications - Staff receive a push notification when an item is added to the stop list - If someone tries to order a hidden item (cache) — the system will show the message "Dish temporarily unavailable" --- ## Menu schedule (breakfast / lunch / dinner) Different menus for different times of day: ### Setup 1. **Menu** → **Schedule** → **+ Add schedule** 2. Set the time: breakfast (07:00–11:00), lunch (11:00–16:00), dinner (16:00–23:00) 3. Assign categories/items to each schedule ### How it works - During the specified time, guests see **only** items from the current schedule - Outside the schedule — the full menu is shown - You can create **special menus**: business lunch, brunch, bar menu, kids' menu ### Holiday and seasonal menus - Create menus for holidays (New Year, February 14, Easter) - Set active dates - The menu will automatically turn on/off --- ## Combo sets A combo set is a menu item that bundles several dishes under one price: "Burger + fries + drink", a business lunch, a kids' set. The guest sees the combo as **one item** with a single name, description, photo and price, and adds it in one tap. The [kitchen screen (KDS)](/en/docs/kds) **expands the set** into its dishes, so cooks see each element on its own line at the right station; with [inventory](/en/docs/inventory) connected, the ingredients of every dish in the set are written off from their own recipes. ### Combo slots — "build your own lunch" Besides a fixed-composition set there are **combo slots**: the guest picks one option from each slot. The classic business lunch — "Soup: borscht / cream soup", "Main: cutlet / fish", "Drink: tea / compote". | What you configure | How it works | |---|---| | Slot | a name ("Drink", "Soup") with translations | | Slot options | menu dishes the guest chooses from | | Option surcharge | an optional add-on to the combo price (e.g. +2 for fresh juice) | | Required | whether a choice in this slot is mandatory | | Default option | pre-selected, so the guest can just add the set | The final price = combo price + surcharges for the chosen options. The guest's choice travels into the order line, so the **kitchen sees the actual dishes** and stock is written off for exactly those, not for an "average lunch". ### Combo availability window If a set is only relevant at certain hours — a lunch set from 12:00 to 15:00 — give it an availability schedule. See [Schedule and Happy Hour](/en/docs/scheduled-menus). --- ## AI menu concierge Guests don't always know what they want, and scrolling 120 items takes a while. The **AI concierge** takes a request in plain words — "something light, no onions, under 30 GEL" — and answers with **two or three specific dishes** from your menu, with prices and descriptions. The concierge works **only from your catalogue**: it does not invent dishes and does not suggest anything that is not on the menu. A suggested dish can be added to the cart straight from the answer. --- ## Family cart When several people share a table, everyone can add dishes from their own phone while the order stays **one**. How it works: one guest (the "host") shows the QR code of their order, the others scan it and join. Each joiner sees and edits **their own part**, the host sees the whole order with a note of who added what. The hierarchy is strictly two levels, and up to ten people can join one order. For the venue this beats several separate orders: one kitchen ticket, one bill, one round of serving. --- ## Guest dietary profile In the menu filters the guest marks their dietary tags (vegetarian, halal, gluten-free…) and the **allergens to exclude**. The choice is saved on the device **for this venue** and survives a page reload and a return visit: a regular with a nut allergy doesn't have to tick it every time. The profile lives only in the guest's browser and is not tied to their identity. More about the tags themselves — [Allergens](/en/docs/allergens). --- ## Upsell on the storefront and at checkout Three surfaces where the menu suggests adding more: - **"Add to your order"** at checkout — a curated row of dishes that you define yourself (the heading and the item list are configurable); - **"Frequently bought together"** — computed from your own orders, with no manual setup; - **"Goes well with"** on a dish card — related items. The same principle works at the till — an upsell prompter for the waiter, see [POS](/en/docs/pos). --- ## Order history and “Repeat order” A guest sees **their previous orders at this venue** — the “My orders” item in the storefront menu. The history is kept in the guest's browser (the last ten orders per venue), so it works without any sign-up: a regular who takes the same lunch repeats it in two taps. A signed-in guest additionally sees the server-side history of their orders. The **“Repeat”** button rebuilds the basket — same options, modifiers and picks inside a combo. Before anything is added, the contents are checked against the current menu: - items that were withdrawn or put on the “86” stop list do not go into the basket — the guest sees a clear warning about which dishes are unavailable right now; - prices are taken **as they are today**, not from the past order, so a dish that went up will not go through at the old price; - everything else lands in the basket and the guest goes straight to checkout. The history builds itself when an order is placed — there is nothing to switch on. A restaurant storefront gets it exactly like a shop storefront, with no separate customer account required. --- ## NFC — contactless menu NFC (Near Field Communication) is an alternative to a QR code. The guest taps their phone on an NFC stand and instantly sees the menu. ### NFC benefits - Faster than QR (no need to open the camera) - Works even with the screen off (on some devices) - Premium impression ### NFC setup 1. Order NFC stands (recommended: NTAG215, NTAG216) 2. In the admin panel → **QR & NFC** → **Write NFC** 3. Tap the phone on the stand → write the menu link 4. Place the stands on tables ### Compatibility - iPhone (XS and newer) — works automatically - Android (with NFC) — works with an unlocked screen --- ## AI features for the menu ### AI dish photo generation No dish photo? AI will create a realistic image: 1. In the item editor, click **✨ AI Generate photo** 2. AI uses the dish name and description for generation 3. If images have already been generated for similar requests, the **"Ready-made AI images"** dialog opens first: pick one with **"Use this"** or click **"Generate new"** 4. A new generation returns **one** image and puts it into the card right away — there is no grid of variants to choose from 5. To set the style up front, open the **"Generation settings"** panel with the chevron next to the button: background, angle, lighting, mood and an extra description added to the prompt **Recommendations:** - Write a detailed description for better results - Specify plating style: "on a white plate", "rustic", "fine dining" - Generated photos can be replaced with real ones at any time ### AI photo enhancement Uploaded photos are automatically improved: - Brightness and contrast correction - Background removal (if needed) - Web optimization (conversion to WebP) - Cropping to the required aspect ratio ### AI dish descriptions AI can generate an appealing description: 1. Enter the dish name and main ingredients 2. Click **✨ Generate description** 3. AI creates an appetizing description tailored to your venue's style 4. Edit if necessary ### AI translations All texts are automatically translated into 45 languages using AI: - Translation takes context into account (culinary terminology) - You can edit any translation manually - New translations apply instantly --- ## What you need to get started - **A location with a name and an address** — the storefront is signed with them. - **Categories and items with prices** — the fast way to fill them in is import: from a photo of a paper menu, from an Excel file or from a website ([Migrate to us](/en/docs/migrate)). - **A QR code** — printed in the [QR codes and devices](/en/docs/device-codes) section: as sheets, posters or one at a time. - **Storefront languages** — translation is automatic, you only pick the languages. - **Item photos** — not mandatory, but they are what sells. --- ## Limitations - **On the free plan there is a limit on the number of items.** It is soft: you can always edit what exists, but creating items beyond the limit is blocked. A batch import does not refuse outright — it loads as many as fit and explains the remainder with a banner. - **AI features on the item card are billed to the AI balance** — when it runs out you will see a banner rather than silence. - **A separate menu per channel is something we deliberately do not build.** For an aggregator or a kiosk you can override prices and hide items, but you cannot assemble "a completely different menu". - **On the Russian brand there is no image resizing** — photos are served as they are, so heavy files are worth shrinking before upload. - **The menu editor is a very large window.** Our internal clarity review gives it 2 out of 5: there are dozens of toolbar tools, and it is cramped for a newcomer. --- ## Troubleshooting **The guest sees an old menu.** The storefront is served through a CDN: wait and reload the page with the cache cleared. **An item is missing from the storefront.** Check in order: hidden at this location, outside its [schedule](/en/docs/scheduled-menus) window, on the 86 list, or the price is not filled in. **A new item cannot be created.** The plan limit has been reached — editing remains available. **A translation did not appear.** Languages are chosen in the storefront settings; after adding a language the menu is not translated instantly. **A photo uploads but looks heavy.** On the Russian brand there is no resizing — shrink the image before uploading. --- ## Related sections - [Schedule and Happy Hour](/en/docs/scheduled-menus) — time-based availability of dishes and menus, happy hour, seasonal menus. - [Kitchen (KDS)](/en/docs/kds) — how combo orders appear in the kitchen and split across stations. - [Inventory](/en/docs/inventory) — writing off ingredients when dishes and combos are sold. - [Allergens](/en/docs/allergens) — allergen and diet tags behind the guest dietary profile. - [Orders](/en/docs/orders) — calling a waiter, pre-order slots and paying at the table. - [POS](/en/docs/pos) — the waiter's upsell prompter and splitting the bill. --- # Cenaly Use Cases Real-world scenarios for implementing a digital menu and automation in the restaurant business. --- ## Case 1. A café switches from a paper menu to QR ### Situation A small café with 40 seats. The paper menu is printed once a month; any price change or adding seasonal items means extra costs and waiting for the print shop. ### Solution with Cenaly 1. Uploaded photos of the paper menu → AI recognized all items automatically 2. Edited descriptions, added dish photos (some — AI-generated) 3. Placed QR codes on tables (stickers, table tents) 4. Set up 2 languages: Georgian + English for tourists ### Result - Menu updates — **in 30 seconds** instead of 3–5 days - Printing savings: **~200₾/month** - Tourists read the menu in their own language → average check up by **15%** --- ## Case 2. A restaurant launches online orders for delivery ### Situation A Georgian cuisine restaurant wants to accept delivery orders but isn't ready to pay a 25–30% aggregator commission (Glovo, Wolt). ### Solution with Cenaly 1. Created a digital menu with photos and descriptions 2. Enabled "Delivery" mode — the guest enters an address 3. Set up 3 delivery zones: free (up to 3 km), 5₾ (3–7 km), 10₾ (7–12 km) 4. Connected Stripe for online payments 5. Shared the link via Instagram, Google Maps, and business cards ### Result - **0% commission** (instead of 25–30% to aggregators) - Own customer base for repeat orders - Average time from order to confirmation: **45 seconds** - After 3 months — **35% of orders** come through the owned channel --- ## Case 3. A restaurant chain manages 5 locations ### Situation A chain of 5 restaurants: 3 in Tbilisi, 1 in Batumi, 1 in Kutaisi. Different menus, different prices, but one brand. ### Solution with Cenaly 1. Created the chain owner's **master account** 2. For each location — a separate menu with local prices 3. Shared items are inherited from a template; unique ones are added locally 4. Roles: owner → administrators (1 per city) → shift managers → staff 5. A unified analytics dashboard across the entire chain ### Result - Launching a new item **across all 5 locations in 2 minutes** - Comparing revenue and dish popularity between locations - ABC analysis helped remove 12 low-margin items → profit up by **8%** --- ## Case 4. A hotel implements room service via QR ### Situation A boutique hotel with 30 rooms. Room service is taken by phone — guests complain about language barriers, order mistakes, and long wait times. ### Solution with Cenaly 1. A QR code in every room (on the bedside table) 2. Guest scans → sees the menu in their language (up to 45 languages) 3. Selects dishes, enters room number → order instantly goes to the kitchen 4. Set up a night menu (23:00–07:00) with a limited assortment 5. The cost is charged to the room bill ### Result - Order errors: **from 15% to 1%** - Average time from order to delivery: **down by 40%** - Number of room-service orders: **up by 60%** (guests aren't shy about ordering via phone) - Additional revenue: **+2,500₾/month** for 30 rooms --- ## Case 5. A bar speeds up service during peak hours ### Situation A popular bar. On Friday–Saturday, the line at the bar counter is 10–15 minutes. Guests leave without waiting. ### Solution with Cenaly 1. QR codes on every table and at the bar counter 2. Guest scans → selects drinks → pays online 3. Bartender sees the order on a screen (KDS) → prepares → guest gets a push: "Your order is ready" 4. For repeat orders: a "Repeat" button in order history ### Result - Lines **reduced by 70%** - Table turnover: **+2 orders/evening** per table - Average check up by **22%** (easier to order another cocktail via phone) - Bartenders focus on preparation, not taking orders --- ## Case 6. A pizzeria with a multilingual menu for tourists ### Situation A pizzeria in central Tbilisi. 70% of guests are tourists from different countries. The paper menu is only in Georgian and English; waiters don't speak Arabic, Hindi, Chinese. ### Solution with Cenaly 1. Created the menu in Georgian → AI automatically translated it into 45 languages 2. Added descriptions: ingredients, weight, allergens, calories 3. AI photos for each item (pizza, pasta, salads) 4. The system detects the guest's browser language and shows the menu in that language ### Result - Guests from **50+ countries** read the menu without help from a waiter - Order time reduced: **from 8 to 3 minutes** - Misunderstanding-related errors down by **90%** - More Google Maps reviews (guests mention convenience) --- ## Case 7. A restaurant implements a loyalty program ### Situation A restaurant wants to increase guest retention (currently only 20% return). ### Solution with Cenaly 1. Enabled **points**: 5% of the paid check comes back as points, redemption capped at 50% of the check 2. Excluded the "Alcohol" category from earning and set a minimum check amount 3. Added a **stamp card** for coffee: the sixth drink is free 4. Enabled the **regular-guest discount** — after 10 completed orders the till suggests 10% to the cashier 5. Birthday promo codes: 20% discount (automatic campaign) > There are no tiers ("bronze → silver → gold") and no "bring a friend" referral program in the loyalty engine: earning is the same for every participant. Bringing in guests for a commission is a different tool — the [affiliate program](/en/docs/commerce) for site owners and bloggers. ### Result - Guest retention: **from 20% to 45%** in 4 months - Average check of returning guests: **+30%** vs new guests - The 50% redemption cap kept the program in check: points do not eat into revenue - Guest LTV (Lifetime Value) increased **2.5x** --- ## Case 8. A café with a floor plan and reservations ### Situation An 80-seat café with a terrace. Guests call to book — the administrator writes it down in a notebook; double bookings and confusion happen. ### Solution with Cenaly 1. Created a floor plan: main hall (15 tables), terrace (10 tables), VIP (3 tables) 2. Enabled online reservations via the website and QR 3. Auto-confirmation for regular tables, manual confirmation for VIP 4. Email reminder to the guest 2 hours before the visit (the lead time is configurable, 1 to 168 hours) 5. Reservation deposit: a flat amount or an amount per guest, free cancellation until a set hour; if the guest does not show up the deposit is forfeited, and a manager can waive it with one button > There is no guest no-show counter that would close online booking after N misses — discipline is held by the deposit and the "No-show" status in the reservations log. Reminders also declare an SMS channel, but SMS are currently not delivered — a fix is in progress. ### Result - Double bookings: **from 5–7 per week to 0** - No-shows: **down from 25% to 8%** (thanks to reminders) - Weekday terrace occupancy: **+40%** (guests see availability online) - Administrator saves **2 hours/day** managing reservations --- ## Case 9. A food court with multiple food outlets ### Situation A food court in a mall: 8 food outlets (burgers, sushi, pizza, Georgian cuisine, desserts, etc.). Each outlet operates independently; there is no unified ordering system. ### Solution with Cenaly 1. One QR code on each table → the guest sees **all 8 outlets** in one app 2. One cart for all outlets: the guest picks items from different kitchens and submits them in one tap 3. The cart splits into a **separate order for each outlet**, all linked by a shared group number (`GRP-…`); an outlet sees only its own items on its KDS screen 4. The host's commission is stamped into every order and stays invisible to the guest; the settlements between the venues themselves happen outside the platform — in cash or by invoice 5. The guest gets a notification when each order is ready ### Result - Guests order from **2–3 outlets at once** (previously they went to only one) - Food court average check: **+45%** - Lines at cash registers **disappeared** (everything via QR) - Mall management sees real-time analytics for the entire food court --- ## Case 10. A pastry shop launches cake pre-orders ### Situation A pastry shop takes cake orders via Instagram and phone. It's hard to track: who ordered, what, for when, and whether there was a prepayment. ### Solution with Cenaly 1. Created a cake catalog with photos, descriptions, and price per kg 2. Pre-order form: date, size, inscription, decor, allergens 3. Full online payment for the pre-order via Stripe (an order has no partial prepayment — a percentage is taken only for a table reservation or a service appointment) 4. Automatic notification to the pastry chef about a new order 5. Guest receives status updates: accepted → in progress → ready → picked up ### Result - Lost orders: **from 10–15% to 0%** - Average time to take an order: **from 15 minutes (chatting) to 2 minutes** - Payment upfront → **zero** cancellation rate - The pastry chef sees the order schedule a week ahead --- ## Case 11. A university cafeteria speeds up lunch ### Situation A university cafeteria: 500+ students during one lunch hour. Huge lines; students don't have time to eat between classes. ### Solution with Cenaly 1. Students open the menu via QR/link → pre-order (on the way to lunch) 2. Pre-order 15–30 minutes ahead → kitchen prepares for arrival 3. Every slot has its own capacity: a filled slot shows up as **"Full"**, so the guest picks a neighbouring time and the load spreads itself across the hour 4. Meals on the university's **corporate account**: the student has a personal ledger with a code and a daily limit, and the spending lands on the organization's account ### Result - Student lunch time: **from 35 minutes to 10 minutes** - Kitchen throughput: **+60%** (pre-orders distribute the load) - Food waste: **-25%** (kitchen knows volumes in advance) - Student satisfaction: **from 3.2 to 4.7 out of 5** --- ## Case 12. A restaurant optimizes food cost through analytics ### Situation A restaurant doesn't understand why profit is low despite good revenue. There's no control over cost of goods, ingredient write-offs. ### Solution with Cenaly 1. Filled in **recipe cards** for all 80 menu items 2. Set up automatic ingredient write-off upon sale 3. Enabled ABC analysis: A (hits) / B (average) / C (outsiders) 4. Food cost monitoring — a dedicated metric in the "Finance" section (target: 25–30%) 5. Every week they reviewed class C: recipe-card cost against the menu price > There is no threshold alert like "food cost above 35% on this item": the metric is read in "Finance", while automatic signals come from Inventory — on a low stock level. ### Result - Food cost: **from 38% to 27%** in 2 months - Identified 8 items with margin < 15% → recipes revised - Spoilage write-offs: **-40%** (thanks to inventory control) - Net profit: **+11%** with the same revenue --- ## Case 13. A takeaway coffee shop without a cashier ### Situation A small coffee shop (10 m²). One barista does everything — makes drinks, takes orders, handles payments. During rush hour — chaos. ### Solution with Cenaly 1. QR code at the counter and at the entrance → guest orders themselves 2. Online payment → no cash handling 3. Barista sees the order queue on a tablet 4. Queue screen at the counter: the order number moves from the "Preparing" column to "Ready" (order contents are never shown on a public screen — only the number) 5. Repeat order: guest opens history → "Repeat my usual" ### Result - Barista makes **40% more drinks** (no distractions at the register) - Order errors: **almost 0** (guest selects themselves) - Average check: **+18%** (people add dessert to coffee when they see photos) - The line moves **2x faster** --- ## Case 14. A restaurant uses a stop list and menu scheduling ### Situation A restaurant with breakfasts, business lunches, and dinners. Waiters forget to warn about sold-out items — guests order and then get disappointed. ### Solution with Cenaly 1. Set up a **menu schedule**: breakfast (08:00–11:00), lunch (11:00–16:00), dinner (16:00–23:00) 2. Stop list: manager removes an item with one click → it is instantly hidden for all guests 3. Auto-stop when inventory reaches zero 4. A daily "what to order" digest for the owner — push and email for every product that fell below its reorder point ### Result - "Sorry, it's sold out" refusals: **from 8–10 per day to 0** - Scheduled menu switching: **fully automatic** - Revenue loss due to stopped items: **-60%** (early notification → timely purchasing) - Guest satisfaction: **significant increase** (no disappointments) --- ## Case 15. A franchise uses a whitelabel solution ### Situation A chain of 20 restaurants plans to sell a franchise. They need a unified digital platform with the franchise brand, not Cenaly. ### Solution with Cenaly 1. Brought up the storefront under the franchise brand: **its own domain** (menu.franchise-name.com), logo, colors, font, cover, favicon and QR styling — the guest never sees the platform's name 2. One catalog for the whole network account: a new item is immediately available to any location, while each location picks its categories and items, its own price and its stop list 3. Centralized management: promotions, discounts, new items — pushed to all locations of the network at once 4. Each location sees only its own analytics; the franchisor sees the entire network 5. Automated reporting: revenue, food cost, average check per location > The network is run from **one account** with several locations and access levels: there is no roll-out of a master menu into separate franchisee accounts. An item's name and description are shared across the network; price and availability are overridden per location. See [Multi-location](/en/docs/multi-location) for details. ### Result - Launching a new franchise location: **in 1 day** (instead of a week of setup) - Unified quality standard: **100% of locations** with an up-to-date menu - The franchisor controls the brand, prices, and quality **remotely** - Cost of digital infrastructure per location: **5x cheaper** than a standalone solution --- # Switch to us The migration wizard moves your menu, products and stock from an old system in minutes: AI reads the export files, and all you have to do is review the result. Where: **Settings → “Switch to us”** (`admin.cenaly.com`). First choose where you are coming from: - **Poster POS** — with hints on which Poster screens to export from; - **Another system / any file** — Loyverse, Ecwid, iiko, an Excel price list, a PDF or even a photo: the AI understands most formats; - **A live online store** — Shopify, WooCommerce, Wix, InSales or custom-built: imported by site URL. --- ## Step 1 — menu and products Upload an export (Excel/CSV, Word, PDF, a photo of a price list) or point at your current site. The AI recognises items, prices and categories and shows an import plan you can review and correct before it is applied. You can run the import several times with different files: existing items are **matched**, not duplicated. More about file parsing: [AI catalog import](/en/docs/catalog-import). --- ## Step 2 — stock The second file is stock: ingredients and goods with quantities and purchase prices. Before importing you get a review table, and it is **editable row by row**: name, quantity, unit and price per unit can be corrected right in the table, the checkbox in the first column excludes a row from the import, and the action column lets you choose between creating a new product and merging the row into a specific existing stock item (a barcode match is flagged separately). If the unit differs, the quantity is converted and the row says so honestly. As a result, missing products are created and positive stock is received as a goods receipt document — your [inventory](/en/docs/inventory) keeps a proper trail instead of stock appearing out of nowhere. --- ## Step 3 — a live online store All we need is the storefront address: we read the public catalogue the way a search engine does — no passwords required. What can be moved (via checkboxes): - **products** — photos, prices, variants, characteristics, descriptions; - **articles and pages** — about us, delivery, returns, blog; - **design** — colours, fonts, corner radii, home page composition; - **SEO tags** — titles and descriptions; - **images** (skipping them makes the import much faster); - **legal documents from the source site** — if it is your store and you want to keep your own texts. Next to the checkboxes are two volume limits, and they are **not empty by default**: **“Products limit”** is 200 (50 / 100 / 200 / 500 / 1000 / 5000 / no limit) and **“Pages limit”** is 30 (10 / 30 / 60 / 120 / 500 / no limit). With the defaults, a store with 2000 items will only bring over the first 200 — to move the whole catalogue pick **“no limit”**. You can see the current stage (“reading the sitemap”, “parsing product cards”, “creating products and pages”) and the final counters. The import runs on our servers — **you can close the tab**. Photos keep processing for a few more minutes after the report. If the store serves our servers an empty page (some platforms do), switch on **“Read the store with my browser”**: it needs the Cenaly extension and a one-time pairing code valid for 15 minutes. ⚠️ Import only your own store, or one you have the right to move: responsibility for copied texts and images lies with the account owner. --- ## Inspired by another store A separate mode for the “I want it like theirs” case: we read the public home page and list the traits you may adopt — colours, typography, element shapes, product card style, header, layout, home page composition. You tick what you want and apply it to your storefront. Only **non-protected traits** are transferred. Texts, photos, logo, brand name and the products of someone else's site are not copied, and any added sections are created empty for you to fill with your own content. --- ## What is not moved yet Sales history, customers and debts do not migrate automatically — keep the old system in read-only mode for reference. A dedicated scenario is coming for **Loyverse** (its card sits in the source list greyed out, labelled “dedicated scenario coming soon”); **Ecwid** has no card of its own — its files already work through the “Another system” option. --- ## Related topics - [AI catalog import](/en/docs/catalog-import) — parsing price lists and photos - [Inventory](/en/docs/inventory) — what to do with stock next - [Online store](/en/docs/shop) — the storefront after the move - [Website builder](/en/docs/website-builder) — fine-tuning the design - [Data export](/en/docs/data-export) — the opposite task: taking your data out --- ## FAQ **Do you need passwords for my old store?** No. We read the public storefront. You only need your own credentials to export files from the old POS. **What happens if I import the same file twice?** Items are matched with existing ones; no duplicates appear. **How long does a large store take?** From a few minutes to an hour or more, depending on the number of products and whether images are included. The process runs in the background. --- # If the internet goes down or the cloud is unreachable Connections break: the provider, the router, a thunderstorm, an outage at the operator. The venue does not close because of it — guests are standing at the counter. Below is exactly what keeps working, what does not, and what the shift should do. Tell two failures apart, because they behave differently: | What happened | The POS in the venue | A guest from the street | |---|---|---| | **The internet is down in the venue** | Works offline: rings up, prints, builds a queue | The storefront opens (it is served from a CDN) and the order reaches the cloud — but in the venue you will only see it after the connection is back | | **The cloud is unreachable** | Exactly the same: the POS does not tell one from the other — for it this is "the write did not go through" | The storefront may open from cache, but placing an order and paying will not work | The POS deliberately does not try to guess the cause: any network error means "work locally, write to the queue". ## What keeps working **The POS (web).** This is not just a cached page but a real write queue on the device: - **an order is rung up** and goes into the order queue (it lives on the POS for **24 hours**); - **receipts and the cash shift** get their own operation queue (opening a shift, pay-ins and pay-outs, a receipt, a refund, closing a shift). Every operation carries a client-side idempotency key, so syncing never duplicates anything; - **a shift opened offline** gets a temporary number and keeps working: the gate "no payment without an open shift" applies offline too, computed from the local cache; - **the menu, prices, tables and reference data** are read from the browser's local cache — they got there while the connection was alive; - **reloading the page** does not throw you to the login screen: the POS opens in a "degraded session" from a local snapshot and reconnects itself once the network is back. **Printing.** The receipt, the kitchen ticket and the label are printed by the bridge installed on the same computer: the POS talks to it over the machine's local address — no internet needed. **The fiscal receipt.** If the fiscal printer is connected to the same computer, the receipt is issued through the bridge over that same local channel: the fiscal drive accumulates documents and the fiscal data operator catches up once the connection appears. For 54-FZ this is a normal mode, not a violation. **The login screen.** As long as the browser holds a recent session (the window is **7 days**), the cashier signs in and works; sending the accumulated data will still require real authorization once the connection is back. ## What does not work without a connection - **The kitchen display (KDS).** Tickets reach it through the cloud; without the internet new orders will not get to the kitchen — they will travel there once the connection is back. Meanwhile the kitchen works from printed tickets, if you have [kitchen printing](/en/docs/kitchen-printing) set up, or from spoken orders. - **The bank terminal.** Card payment requires authorization at the bank — it will not go through offline. Take cash. - **Online payment by the guest** (card on the storefront, paying the bill at the table, paying at the kiosk) — it needs access to the payment provider. - **A second POS and the server's tablet.** Devices do not sync with each other over the local network: each keeps its own queue and syncs it itself. We deliberately do not build a shared local contour ("LAN mode") — the product owner's decision is to cover the autonomy of one POS with printing. - **The X report.** The interim snapshot is computed on the server from sales — offline the POS will honestly refuse. You can close the shift; the Z report will be produced when the connection is back. - **Admin sections that compute on the server** — Orders, Finance, Statistics, Inventory, Staff. They read the cloud, and offline they show at best the last thing they managed to read. - **The expo screen, the queue display, the kiosk** — cloud surfaces as well. ## What staff should do 1. **Keep ringing up.** As soon as the connection drops, an amber "offline" banner and an **"N not sent"** chip appear in the POS. This is a normal mode: the order is taken, the receipt is printed, the money is collected. 2. **Print the guest's receipt as usual.** Printing is local — the paper comes out. 3. **Stay on the same device and the same browser.** The queue lives on this computer: you cannot move to a second tablet and "sync it from there". 4. **Do not clear the browser cache, do not sign out, do not open the POS in private mode** — that erases unsent orders and receipts. 5. **You may reload the page.** The queue survives a reload and a browser restart. 6. **Do not ring up the same order twice** "just in case": the system protects against duplicates on sync, but two different orders will honestly be counted as two. 7. **Do not accept cards** — the terminal cannot authorize offline. Take cash, or issue an invoice if the guest prefers to pay later. 8. **A red "N not delivered" banner** means some records did not go through even after the connection returned (they expired or the server refused). That is a reason to call the manager, not to hide the banner. ## What happens when the connection returns Syncing starts on its own — on the "network is back" event, when you return to the tab, and on a timer. - **The "N not sent" chip goes down and disappears.** Orders appear in the Orders section and on the kitchen display, receipts get numbers, stock is written off according to recipe cards. - **There will be no duplicates.** Every order carries a client-side identifier and every POS operation an idempotency key; the server recognizes a repeat and does not apply it twice. - **The offline shift is replaced by the real one.** The temporary shift number is rewritten to the real one in every receipt and movement still waiting in the queue. - **The Z report is produced** for a shift closed offline. - **Nothing is deleted silently.** Records that could not be delivered (a day expired, or the server returned an unrecoverable error) go into a separate "not delivered" list (kept for **7 days**, up to 100 records) and are shown in a red banner that can be dismissed manually. Order is preserved: the queue is sent sequentially, and on temporary server errors it retries with a growing pause. ## Limitations - **Offline covers the POS and printing — and nothing else.** The kitchen display, the bank terminal and syncing between devices over the local network do not work without the internet; a full LAN contour is deliberately not being built. - **The queue is tied to the device and the browser.** It lives in that specific browser's storage: another computer, another browser or private mode will not see it. - **The queue lives 24 hours** for orders and POS operations. More than a day without a connection and records move to the "not delivered" list instead of quietly disappearing. - **An offline session lives 7 days.** After that the POS asks for a normal login, and that is impossible without a network. - **The X report is unavailable offline** — it is computed on the server. - **Guest-facing surfaces (storefront, kiosk) keep a queue for one hour only** — they are meant for a short mobile-network gap on the guest's side, not for working without the internet. - **The Android POS.** Taking an order and issuing a local fiscal receipt work offline, but writing to the receipt registry and the cash shift offline do not yet (planned). The fiscal drive is the source of truth offline there. - **An end-to-end "pull the cable" run on a live fiscal printer has not been done yet.** The POS offline mode is covered by code and automated tests (including an "in-session offline" e2e test), while a check on real hardware by the owner is on the plan — we say this plainly instead of presenting it as done. ## Troubleshooting **The POS asks me to sign in although it used to work.** The session is older than seven days, or the browser was cleared. You cannot sign in without a network — restore the connection. **The "N not sent" chip does not go down.** Check that the connection really is back (open any website) and keep the POS tab active: syncing runs on the network event, on returning to the tab and on a timer. If the chip stays at the same number, look at the red banner — some records may have moved to "not delivered". **A red "N not delivered" banner appeared.** The records were not accepted by the server: the 24-hour limit expired or the answer was unrecoverable (for example, access was revoked). Orders and receipts from that list have to be entered manually — reconcile with the shift's paper receipts. **An order was rung up offline but the kitchen does not have it.** That is expected: the ticket will travel to the kitchen display once the connection is back. While there is no network, printed tickets feed the kitchen. **The receipt does not print offline.** Then it is not about the internet: check that the bridge on this computer is running and the printer is connected — [Cenaly Hardware Bridge](/en/docs/hardware-bridge). The bridge and the POS talk inside the same machine. **Duplicate orders appeared after the connection returned.** Syncing cannot create duplicates — check whether the same order was rung up twice by hand, and cancel the extra one in the Orders section. ## FAQ ### Does the POS work without the internet? Yes: it rings up orders, prints receipts and fiscalizes them through the bridge on the same computer. Everything that has to reach the cloud accumulates in a queue on the device and is sent automatically. ### Will data be lost? No. The queue survives a page reload and a browser restart, and whatever could not be delivered lands in a visible "not delivered" list instead of vanishing. The only way to lose it is by hand — by clearing the browser's data. ### Can 54-FZ receipts be issued offline? Yes, if the fiscal printer is connected to the same computer as the bridge: the fiscal drive accumulates documents and passes them to the fiscal data operator once the connection appears. This is a mode the law provides for. ### Why does the kitchen display not work? Tickets travel through the cloud. There is no local network between the POS and the kitchen display — a deliberate decision: we cover the autonomy of the POS with printing, not of the whole floor. While there is no network, printed tickets hold the kitchen. ### Can a guest open the menu while we have no internet? Yes — the storefront is served from a CDN and does not depend on your internet. An order placed by a guest will reach the cloud, but in the venue you will see it only after the connection is back. ### What about card payments? Take cash: the bank terminal needs authorization at the bank. ### How long can the POS hold out without a connection? Twenty-four hours for the queue of orders and POS operations, seven days for the session. In practice that means you will work through the shift calmly. ## Related articles - [POS](/en/docs/pos) — orders, payments, service modes and the "Working offline" section - [Cash shift and Z report](/en/docs/cash-shift) — opening, movements, X and Z reports - [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — the bridge on the POS computer, printers and fiscal printers - [Kitchen printing](/en/docs/kitchen-printing) — tickets by station when the kitchen display is unavailable - [Kitchen display (KDS)](/en/docs/kds) — how tickets reach the kitchen - [First day: cafe, restaurant, canteen](/en/docs/getting-started-food) — what to switch on right away --- # Mobile Apps for the Venue Team **Cenaly** provides a set of native Android apps for all restaurant team members — from the owner and manager to the waiter, chef, and courier. The apps work using the same accounts and the same backend as the admin web panel: no separate setup is required. > 💡 Guests do not need to install anything — the menu opens via a QR code in the phone's browser. Mobile apps are designed **only for the venue staff**. --- ## Available Applications The Android applications are each tailored to their specific role. On the device, they are labeled with their respective names — **Cenaly Admin**, **Cenaly Service**, **Cenaly KDS**, **Cenaly Courier**, **Cenaly POS**, **Cenaly CRM**; the signature is unified across all platform domains. Admin, Service, KDS, Courier and POS are in the download table on this site, CRM is on the [all apps](/apps) page. ### 1. Cenaly Admin — Menu and Venue Management The **Cenaly Admin** app is a mobile companion for the owner or manager. It provides full parity with the web dashboard in terms of menu management: - **Menu**: adding and editing categories and dishes, reordering menu items, multilingual names and descriptions (supports the same languages as the web dashboard), uploading photos from the camera or gallery, AI generation and enhancement of dish images. - **Schedule and availability**: marking an item as "86" (temporarily out of stock), day-of-week schedules, happy-hour rules. - **Options and modifiers**: editing option groups and add-ons for a dish. - **Recipes and combos**: linking components for inventory deduction. - **Tags**: managing custom tags and tag categories. - **Customer QR codes**: generating, editing, and sharing QR codes for tables and delivery. - **Locations**: editing venue settings — name, address, contacts, operating hours, service charge type, online ordering and delivery settings, menu page appearance. - **Account and subscription**: balance, pricing plan, top-up via web form. ### 2. Cenaly Service — Waiter and Dining Area Monitor The **Cenaly Service** app combines two operational modes in one: **"Waiter" Mode** — taking orders tableside: - Selecting a table and creating an order from the venue's menu. - Adding options, modifiers, and comments to items. - Adding items to an open table. - Tracking dish status (received → preparing → ready → served). - Payment and tips registration via the payment screen. - "My orders" / "All orders" filter. **"Monitor" Mode** — dining area overview for a manager or host: - Real-time feed of all active orders. - WebSocket updates and new order notifications. - Viewing dish statuses and actions on each order. - "Browsing now" indicator — guests viewing the menu online. The mode is selected upon first launch and can be changed in the app settings. ### 3. Cenaly KDS — Kitchen Display System The **Cenaly KDS** (Kitchen Display System) app is installed on a kitchen tablet and mirrors the "Kitchen (KDS)" web screen: - Real-time FIFO ticket queue. - Color-escalated timers (elapsed time since order receipt). - One-tap item status update: queued → preparing → ready. - Batch actions: "Start all" / "Bump" ticket. - Recalling tickets from the archive (Recall). - Filter by stations (grill station, bar, cold station, etc.). - Expanding combo meals into individual items. - Sound notification for new tickets (can be muted). - Fullscreen mode, forced landscape orientation, screen stays awake — optimal for wall mounting. ### 4. Cenaly Courier — In-House Courier App The **Cenaly Courier** app guides the courier through every delivery: - Delivery list by status: new, accepted, on the way, completed. - Step-by-step workflow: accepted → heading to restaurant → picked up order → on the way to customer → delivered. - Proof of Delivery with photo: photo at the door, recipient, PIN code. - Collecting cash on delivery (COD) directly upon handover. - Navigation: route display via built-in map with route calculation. - Live GPS tracking: courier coordinates are visible to the dispatcher in the admin web panel. - "On duty" / "Offline" toggle. ### 5. Cenaly POS — Android POS Terminal The **Cenaly POS** app turns an Android device into a point-of-sale workstation: - PIN login on a shared terminal and shift management. - Offline database on the device: orders and receipts are processed even when offline and synchronized once the connection is restored; network status is displayed on screen. - Integration and operation with MSPOS peripherals — built-in printer and other POS terminal hardware. - Payment in cash, by card on a terminal (through Cenaly Hardware Bridge), by gift card and “On credit”; shift X and Z reports, returns by receipt. - The “Courier” menu item: accept a package the courier brings back and handle a delivery that did not reach the customer. > ℹ️ There will be no **Cenaly Rider** app for contractor couriers: the Cenaly independent courier network is closed and does not register new couriers. Deliveries are handled by the venue's own couriers in **Cenaly Courier** or by a third-party delivery service (the Couriers section of the admin panel). ### 6. Cenaly CRM — Sales and Customers The **Cenaly CRM** app is designed for sales teams and provides full parity with the web version at crm.cenaly.com: - Customer database (contacts, statuses, interaction history). - Kanban-style sales pipeline — drag-and-drop deals across stages. - Customer map with geolocation and nearby search. - Flyers: creation, linking to customers, export to PDF. - Business cards and leaflets — PDF export. - Account codes — creation and management. --- ## Download and Installation Staff apps are downloaded directly from this website as an Android installation file (`.apk`) — installation from Google Play is not required. | App | Intended For | Download | |-----|--------------|----------| | **Administrator** — menu, locations, subscription | Owner, manager | [Download for Android](/apps/cenaly-admin.apk) | | **Waiter & dining area** — order taking and monitor | Waiter, hostess | [Download for Android](/apps/cenaly-service.apk) | | **Kitchen (KDS)** — kitchen display | Cook, kitchen | [Download for Android](/apps/cenaly-kds.apk) | | **Courier** — delivery and tracking | Courier | [Download for Android](/apps/cenaly-courier.apk) | | **Till (POS)** — sales, shift and receipts on a tablet | Cashier | [Download for Android](/apps/cenaly-pos.apk) | | **Cenaly Phone** — work phone for the Cenaly PBX | Employee with an extension | [Download for Android](/apps/cenaly-phone.apk) | | **Cenaly Camera** — a phone as the location’s camera: recording, archive, clips of risky POS operations | Owner, manager | [Download for Android](/apps/cenaly-camera.apk) | | **Customer display** — order items and the total at the till | Till, customer | [Download for Android](/apps/cenaly-customer-display.apk) | Each app has its own page — what it does, Android and iOS requirements and honest limits: [all apps](/apps). **How to install:** 1. Open the "Download for Android" link directly on the Android device — the `.apk` download will begin. 2. Open the downloaded file. During the first installation, Android will ask you to **allow installation from this source** — confirm it (a one-time setting for the browser). 3. Tap "Install" and wait for completion — the app will appear on the home screen. 4. Launch the app and log in: email/password or QR code (see below). > 💡 **iPhone and iPad** versions are released through the App Store: **Cenaly Phone** has been submitted for Apple review (help — [Cenaly Phone for iPhone](/docs/cenaly-phone-ios)); Admin, Service, KDS, Courier and CRM for iOS are in development. The status of each version is on the [apps page](/apps). Until then use the `admin.cenaly.com` web panel in your browser on iPhone and iPad. > ℹ️ **Cenaly CRM**, **Cenaly Support** and **Cenaly Studio** are internal tools of the platform team (sales, support, development); a venue does not need them — their installation files are on the [all apps](/apps) page for the team and partners. --- ## Logging In to Applications All applications use the **same credentials** as the admin web panel. No separate registration or separate password is required. ### Login Methods | Method | Description | |--------|-------------| | Email and password | Standard login — the same credentials as on admin.cenaly.com | | Sign in with Google | Only in the **Cenaly Admin** app | | QR login (quick) | An administrator generates a one-time QR code in the panel → the employee scans it in the app | > 💡 If the app does not let you in with the correct password, tap the **gear icon on the login screen** and explicitly select your service: by default, the device guesses the environment itself (based on the SIM card country and previous login), and while traveling or using an account on another domain, it might guess incorrectly. **QR login** is the recommended method for staff (waiters, cooks, couriers): there is no need to enter an email and password on a shared device. Device login codes are generated in the web panel under **QR codes** → the **Devices** tab (which also provides step-by-step instructions for connecting a tablet or phone). The same tab shows which devices are currently connected and when each was last active. > 💡 To use all apps except Cenaly Admin and Cenaly CRM, the employee must be added to the venue with the corresponding role — see the [Staff](/en/docs/staff) section. --- ## Who Needs Which App | Role | App | |------|-----------| | Owner, manager | **Cenaly Admin** — menu and venue management | | Waiter | **Cenaly Service** ("Waiter" mode) | | Hostess, dining area manager | **Cenaly Service** ("Monitor" mode) | | Chef, kitchen | **Cenaly KDS** — kitchen display | | Cashier | **Cenaly POS** — POS on Android | | In-house courier | **Cenaly Courier** — delivery screen | | Sales manager | **Cenaly CRM** — clients and deals | --- ## Related sections - [Kitchen (KDS)](/en/docs/kds) — kitchen web display and principles of working with the dish queue - [POS](/en/docs/pos) — order taking via web panel (tablet/computer) - [Orders](/en/docs/orders) — order lifecycle and order monitor - [In-house delivery](/en/docs/delivery) — setting up the delivery zone and working with couriers - [Staff and shifts](/en/docs/staff) — adding employees, roles, and QR login - [Getting Started](/en/docs/getting-started) — first steps with the Cenaly platform --- ## Frequently Asked Questions ### Do I need to create a separate account for mobile apps? No. Use the same email and password as for logging into admin.cenaly.com. Waiters and other staff log in via QR login — the administrator issues them a code in the "QR codes" section, under the "Devices" tab. ### Do the apps work without an internet connection? Part of the data (menu, open orders) is cached on the device. When the connection is lost, the apps continue to display cached data; changes are submitted once the connection is restored. We recommend testing full offline mode under the specific conditions of your venue. ### How do I connect a kitchen tablet? Install the Cenaly KDS app on an Android tablet, log in via email/password or QR code ("Cook" role), and select the desired location. The app will automatically connect to the real-time order queue. For a stationary setup, it is recommended to enable "Keep screen on" — this is done in the device settings; the app keeps the screen active automatically. ### Where can I download the apps? Directly from this website — see the [Download and installation](#download-and-installation) section above. Links to the installation files (`.apk`) are also available on the main page in the "Apps for your team" block. Installation from Google Play is not required: open the link on your Android device, allow installation from this source, and tap "Install". ### Are there iPhone and iPad versions? The line-up is coming to both platforms with the same account and the same data. Cenaly Phone for iPhone has been submitted to the App Store and is in Apple review; Cenaly Admin, Service, KDS, Courier and CRM for iPhone and iPad (iOS 16 or newer) are in development. App Store links will appear on the [apps page](/apps). Until then the full functionality of the admin.cenaly.com web dashboard is available in the browser on iPhone and iPad. --- # First day: choose your business type The platform grew out of restaurant QR menus, but it has long worked for a retail store, a beauty salon, a hotel, an online store, a parcel pickup point and a service business. The **business type** is chosen at registration (and can be changed later in the location settings): it sets the words in the interface (“dish” or “product”, “table” or “specialist”), the POS mode (tables or counter) and the set of sections switched on from the start. The platform has 17 business-type profiles. Several profiles share a checklist, while schools, clinic appointments and website-only businesses have additional workflows below. Start with the process you need to run each day. ## What is common to everyone 1. **Registration** — e-mail and password or sign-in with Google → [Account and sign-in](/en/docs/account). 2. **Location** — created automatically with a default name; rename it as the first step of the readiness checklist on the dashboard. 3. **Business type** — chosen in the wizard; double-check it in the location settings if unsure → [Settings](/en/docs/settings). 4. **Languages** — the panel language and the guest/customer languages; content translations are made automatically. 5. **Subscription** — everything works in trial mode at the start; the plan is chosen later → [Subscription](/en/docs/subscription). 6. **Help** — the AI assistant in the panel knows which page you are on and answers “where is setting X” → [How to get help](/en/docs/support). Everything else is in the checklist for your format. ## Pick your checklist | Business type | Formats | Checklist | |---|---|---| | 🍽️ Food service | coffee shop, cafe, restaurant with a dining room, bar, fast food, canteen | [First day: cafe, restaurant, canteen](/en/docs/getting-started-food) | | 🏪 Retail store | grocery, clothing, flowers, a bakery at the counter, any brick-and-mortar store | [First day: retail store](/en/docs/getting-started-retail) | | 💇 Salon | beauty salon, barbershop, nail studio, massage, cosmetology | [First day: salon, barbershop, studio](/en/docs/getting-started-beauty) | | 🏨 Hotel | hotel, guesthouse, apartments, hostel | [First day: hotel, guesthouse](/en/docs/getting-started-hotel) | | 🛒 Online store | online sales without a counter, dropshipping, marketplaces | [First day: online store](/en/docs/getting-started-ecommerce) | | 📦 Pickup point | parcel pickup point, locker desk, handing out carriers' orders | [First day: pickup point](/en/docs/getting-started-pickup-point) | | 🧰 Services and B2B | studios, tutors, service centres, agencies, law and accounting firms | [First day: services and B2B](/en/docs/getting-started-services) | | Clinic appointments | reception, doctors, rooms and equipment | [Appointments](/en/docs/appointments); choose appointment services and the Clinic preset | | Schools and courses | language, music, children's, sports and online schools | The school workflow below; new modules are being rolled out | | Company website or blog | pages, articles and incoming enquiries | [Pages and articles](/en/docs/cms), [Website builder](/en/docs/website-builder) | | Widgets or chat on an existing website | customer conversations, booking, orders and forms | [My website](/en/docs/site-widgets) | A mixed business can combine modules: a hotel with food service, a salon selling cosmetics, or a store with a pickup point. Check the [app store](/en/docs/app-store) for availability by business type, country and service. Some sections have restrictions; a toggle does not override them. ## Schools and courses Choose **Education** when students enrol in a group for a term and a family pays for lessons. A school combines students and payers, courses, groups, timetables, attendance and a family account. An individual trial lesson can use the [appointment book](/en/docs/appointments); regular group attendance belongs in the school register. **Availability:** the dedicated School section is being introduced. Student, group, timetable, attendance and reporting screens have been implemented; availability depends on the version deployed to your account. Finance and settings are still being completed. Do not treat a missing screen as an error in your business-type selection. Prepare the information needed for launch: 1. Courses: title, age range, level, duration and in-person, online or hybrid format. 2. Teachers, rooms, groups and the weekly timetable. 3. Students and family payers, including required parental consents. 4. Pricing: single lessons, packages, monthly fees, instalments and absence rules. 5. Opening family balances and the process for recording payments. The upcoming school workflow includes the student/parent **Study** area, online invoice payment, public timetables and trial lessons, online lessons, materials, homework, notifications and teacher pay. These additions are being integrated and checked before general availability. ## Clinic appointments Choose **Appointment services** with the **Clinic** preset. Configure doctors, their services and schedules, then rooms and equipment. The appointment engine checks the resources required by a service together. Reception can use patient visit history; doctors' access is limited by their role. This is administrative booking and customer service. Medical records, diagnoses and treatment protocols are outside this workflow. ## A website without a physical venue For a company website or blog, start with pages, contact details, a domain and the enquiry path. An existing website can connect [widgets](/en/docs/site-widgets) with one installation tag: chat, forms, callback, booking, ordering, help and consent tools. There is no need to configure tables or a kitchen. ## Upcoming capabilities Development is expanding schools and group classes, hotel payments and guest self-service, appointment CRM, customer communication automation and accounting. New functions are introduced in stages. A payment contract, external-service account, device setup or local requirement may still need your action after the software is ready. Use the current article for operating instructions and check availability before making a new function part of daily work. ## If the business type was chosen wrong The business type is changed in the location settings. It renames section labels and the location (if the name is still the default) and changes the POS mode, but it **does not delete data**: the menu, products, customers and orders stay. Sections switched on manually stay on too. ## Related sections - [Getting started](/en/docs/getting-started) — registration, the first menu and a QR code in a few minutes - [Switch to us](/en/docs/migrate) — if your data already lives in another system - [Use cases](/en/docs/use-cases) — what it looks like at working businesses - [How to get help](/en/docs/support) — if you get stuck on any step --- # First day: cafe, restaurant, canteen A coffee shop, a restaurant with a dining room and a canteen at a factory or an office building all run on the same product — what differs is the **service mode** and which sections are switched on. The venue type is chosen at sign-up and immediately tunes the system to the format: | Format | POS mode | Tables and reservations | What is on from the start | |---|---|---|---| | **Restaurant** | Tables: an order is opened on a table, the bill is closed later | Yes | POS, kitchen display, tables, staff, inventory, finance | | **Cafe / coffee shop** | Tables (you can also work "pay right away") | Yes | The same plus nutrition facts on the item card | | **Canteen** | Counter: the order is rung up and paid immediately | No — service is over the counter | POS, kitchen display, staff, inventory, finance, kiosk, queue display, nutrition facts and portion weight | | **Fast food** | Counter | No | The same as a canteen, plus delivery and takeaway | The format is a set of defaults, not a cage: any section can be switched on and off in the **App Store**, and the service mode is changed in the POS settings. ## What you need to get started You do not need to buy any special equipment to start taking orders. - **The guest's phone.** The menu opens from a QR code in a browser — the guest does not install anything, and the storefront works in 45 languages. - **Any computer or tablet for the POS.** The POS is a page in the admin panel; it installs "as an app" (PWA) and keeps working when the connection drops. A dedicated POS appliance is not required. - **A tablet or a monitor for the kitchen display** — if orders go to the kitchen. ⚠️ The kitchen screen is built for a tablet or a monitor: it is not adapted to a phone. - **A receipt printer — through the bridge.** Printing receipts, kitchen tickets and labels goes through **Cenaly Hardware Bridge**, a Windows or Linux service you install on the same computer that runs the POS. The printer connects **over the network** — Ethernet or Wi-Fi, port 9100: the bridge discovers such printers on the local network itself, while USB and Bluetooth are still in development. Without the bridge the POS works — just without paper. - **A fiscal printer** is needed where the law of the country requires it, and it connects through the same bridge. Live fiscal receipts today are Russia (54-FZ) and tax invoices for the UK, Australia, New Zealand and the UAE; for other countries see [Fiscalization](/en/docs/fiscal). You do need the internet, but losing the connection does not stop the POS — see [If the internet goes down](/en/docs/offline). ## The common frame of the first day Four steps are the same for all three formats; after that the checklists diverge. 1. **Sign-up and venue type.** After registration the system offers a step-by-step wizard or an AI copilot in a chat — both roads lead to the dashboard with a readiness checklist. The location is created automatically with a default name: renaming it and filling in the address is the first item on the checklist. 2. **The menu.** The fast path is import: **photograph the paper menu**, upload an Excel file, or give a link to a site where the menu already exists. Leaving Poster, iiko or r_keeper? Export Excel from there and import it (there is no direct connector to those systems). Details — [Migrate to us](/en/docs/migrate) and [Catalog import](/en/docs/catalog-import). 3. **Check the storefront with your own eyes.** Open the menu on a phone from the QR code: prices, photos, categories, languages. What the guest sees is the source of truth for the POS, the kitchen and the kiosk. 4. **QR codes.** Printing QR codes for tables, the counter or the entrance — the [QR codes and devices](/en/docs/device-codes) section: as sheets, posters or one at a time. ⚠️ If you chose the **light mode** at sign-up, the "POS", "kitchen display", "tables", "inventory", "staff", "finance" and "couriers" sections are switched off — deliberately, so that 44 sidebar items do not scare you in the first hour. They are switched on one by one in the App Store; the final step of the wizard says so explicitly. ## Checklist: coffee shop and cafe The goal of day one is to take payments and not lose a single order. 1. **A menu with variants and add-ons.** Cup size, type of milk, syrup — these are [modifiers and variants](/en/docs/qr-menu) of an item, not separate menu lines. 2. **The POS** — [POS](/en/docs/pos). Check the service mode: "tables" if guests sit down, and "pay right away" if they take away. Both modes work on the same POS. 3. **A cash shift.** Open the shift with a float — [Cash shift and Z report](/en/docs/cash-shift). Until a shift is open, payment is blocked. 4. **The bridge and a receipt printer** — [Cenaly Hardware Bridge](/en/docs/hardware-bridge). Verify printing with one test receipt. 5. **QR codes on tables and at the counter** — the guest orders on their own and you do not lose people from the queue. 6. **A menu schedule**: breakfast until 12:00, happy hour on coffee — [Scheduling and happy hour](/en/docs/scheduled-menus). One source of truth for the storefront, the POS and the kiosk. 7. **The 86 list** — the croissants ran out, the cashier takes the item off in one click and it disappears from the storefront. 8. **Tips** — [Tips](/en/docs/tips); presets are filled in from the location's country. ## Checklist: restaurant with a dining room The goal of day one is that the server, the kitchen and the POS all see the same order. 1. **The floor plan**: rooms, tables, zones — [Floor plan](/en/docs/tables). Without a plan the POS still works, but "table 7" will live only in the server's head. 2. **QR codes on tables** — the code knows its table, so the guest's order arrives already attached to it. 3. **The POS in "tables" mode** — [POS](/en/docs/pos): the order is open on a table, add-ons go into it, the bill is closed at the end. 4. **A kitchen display by station** — [KDS](/en/docs/kds): grill, cold station, bar. An item goes to its station according to the dish setting. 5. **Kitchen printing** (if there will be no screens in the kitchen) — [Kitchen printing](/en/docs/kitchen-printing): tickets by station through the bridge. 6. **Staff and roles** — [Staff](/en/docs/staff). A server needs a login, a cashier needs a PIN: deleting items, discounts and refunds require a manager's confirmation. 7. **The floor panel** — [Floor panel](/en/docs/hall-panel): the plan with open orders, waiter calls, the waitlist. 8. **Table reservations** — [Reservations](/en/docs/reservations), if guests book ahead. ## Checklist: canteen A canteen is about the speed of the serving line, staff meals and a production plan, not about "a menu with photos". The format already comes with counter mode on the POS, a kiosk and a queue display; reservations are off. 1. **The POS in "counter" mode** — [POS](/en/docs/pos): an item is rung up and paid for immediately, no table is opened. 2. **A menu of the day on a schedule** — [Scheduling and happy hour](/en/docs/scheduled-menus): the set lunch is visible from 12:00 to 15:00 and disappears afterwards on its own. One setting covers the storefront, the POS, the kiosk and the queue display. 3. **Price by weight.** Items priced per kilogram are weighed on the serving line: scales connect through the bridge, the POS opens a weighing dialog and calculates the amount — [Inventory: goods by weight](/en/docs/inventory), [Hardware](/en/docs/hardware-bridge). 4. **"Build your lunch" combos** — combo slots: the guest (or the cashier) picks a soup from one slot and a side from another, and the surcharge is calculated automatically — [QR menu: combos](/en/docs/qr-menu). 5. **An employee account and an employer allowance** — [Corporate accounts](/en/docs/corporate-accounts): the organization, employee accounts, a daily allowance limit, payment at the POS from that account and a spending report for the employer. ⚠️ The section is **off by default** — switch it on in the App Store. 6. **Pre-ordered lunches and a production plan** — [Meal plans](/en/docs/meal-plans): an employee subscribes to lunches by calendar, and you know in advance how many portions to cook. This section is **opt-in** too. 7. **A self-service kiosk and a queue display** — [Kiosk](/en/docs/kiosk): the guest assembles the order themselves and the number goes to the display. It takes the peak off the lunch-hour queue. 8. **Nutrition facts and allergens** — for a canteen nutrition is on by default: calories and portion weight are visible to the guest and printed on the label. ⚠️ Russian regulatory contours — EGAIS, Chestny ZNAK, VetIS (Mercury), 54-FZ — exist only on the Russian brand and appear when the location's country is set to Russia. On other brands they are absent and are not even loaded. ## What can wait None of this stops you from opening tomorrow. - **Inventory with recipe cards and cost of goods** — [Inventory](/en/docs/inventory). Set it up once the menu has settled: before that you would be rewriting recipes after every menu change. - **Financial reports** — [Finance](/en/docs/finance). Sales, purchases, cash shifts and demand analytics are supported on both the international and Russian services. Start using them after recording your first transactions; an empty period and a data-loading error are different situations. - **Own delivery and couriers** — [Delivery](/en/docs/delivery): switch it on when you actually deliver. - **Aggregators** (Wolt, Glovo, Yandex Eda, Deliveroo). The integrations are written and verified on mocks, but **there are no live partner connections yet** — you cannot plan day one around them. - **Online payment on the storefront** — [Payments](/en/docs/payments): the provider registry is large, but live connections number eight; on the Russian brand there is no online payment at the moment. Cash and card at the POS always work. - **Loyalty, gift cards, newsletters** — once you have regulars. - **Your own website and domain** — [Venue website](/en/docs/website-builder), [Custom domain](/en/docs/custom-domain). ## Troubleshooting **I do not see the "POS", "Kitchen" or "Tables" sections.** Either the light preset switched them off at sign-up, or they are not part of your venue type's set (for canteens and fast food, tables are off deliberately). Switch the section you need on in the App Store — [App Store](/en/docs/app-store). **The import did not bring in the whole menu.** On the free plan there is a limit on the number of items: a batch import does not refuse outright, it loads as many as fit and explains the remainder with a banner. Items that were selected but did not fit stay selected and will arrive after a plan change. **The POS will not take payment.** No cash shift is open — open one with a float, see [Cash shift](/en/docs/cash-shift). **The printer does not print.** Check that the bridge on this computer is "connected": without the bridge printing does not work at all. Then — [Cenaly Hardware Bridge](/en/docs/hardware-bridge) and [Kitchen printing](/en/docs/kitchen-printing). **A guest sees a dish that is not available.** Check the 86 list and the availability schedule — [Scheduling and happy hour](/en/docs/scheduled-menus). ## FAQ ### Do I need to buy hardware to start? No. The menu opens on the guest's phone, and the POS runs in a browser on any computer or tablet. A printer, scales and a fiscal printer are added later through the bridge. ### How long does launching take? Sign-up and the first location take minutes. The menu takes as long as the import: the system parses a photo of a paper menu or an Excel file itself, and then you fix prices and photos. ### Can I change the venue type later? Yes. The type sets defaults — which sections are on and which mode the POS runs in. Both can be changed manually at any time. ### Is a canteen a separate product? No, it is a venue type. It turns on counter mode on the POS, the kiosk and the queue display, turns off reservations and shows nutrition facts. Employee accounts and meal-plan subscriptions are separate sections switched on with a toggle. ### We have several locations — do we need several accounts? No. Locations live in one account, each with its own prices, menu and hardware — see [Multi-location](/en/docs/multi-location). ### What if the internet goes down on day one? The POS will keep ringing up and printing — orders and receipts will reach the cloud once the connection is back. Details: [If the internet goes down](/en/docs/offline). ## Related articles - [Quick start](/en/docs/getting-started) — sign-up, the first menu and the QR code, step by step - [Migrate to us](/en/docs/migrate) — importing menu, stock and store from another system - [POS](/en/docs/pos) — orders, payments, service modes - [Kitchen display (KDS)](/en/docs/kds) — tickets by station - [Corporate accounts](/en/docs/corporate-accounts) — staff meals on an account with an allowance - [Meal plans](/en/docs/meal-plans) — pre-orders and a production plan - [If the internet goes down](/en/docs/offline) — what works without a connection and what staff should do --- # First day: retail store A store at the counter runs on the same platform as a cafe or a salon, but the **"Retail"** business type changes three things: the till works **without tables and without a kitchen display**, the "Menu" section becomes the **"Catalog"** 🛍️, and the item card gains barcodes, stock and a retail price for the price tag. | Format | How a sale goes at the till | What is on from the start | |---|---|---| | **Grocery at the counter** | Scan → weigh → pay | Catalog, till, inventory, labels, finance | | **Non-food** (clothing, electronics, home goods) | Scan, "size/colour" variants, an open tab "until they try it on" | The same plus collections and product characteristics | | **Store with an online storefront** | The same plus the orders that arrive from the storefront | The same plus "Commerce" (coupons, shipping, taxes), "Shipments" and "Returns" | By default a store's till mode is **"Counter"**: the order is assembled (scan, weigh) and paid for right away — there are no tables and no open tabs, the receipt is closed on the spot and the till clears the ticket for the next customer by itself. If the store does need an open tab "until the fitting room", switch the **"POS mode"** segment on the location card to **"Bar"** (a counter with open tabs) or "Floor" — that is the location default, while the mode switch on the cashier's own device is hidden for a store by default (it is enabled in the till appearance settings). The format is a set of defaults, not a cage: any section can be switched on or off in the [app store](/en/docs/app-store). The "Shipments" and "Returns" sections exist only for a store and an online store — food venues do not have them at all. "Staff", "Devices", "Kitchen display", "Tables" and "Couriers", on the other hand, are off by default for a store: staff is switched on with a toggle once you have employees with their own logins. --- ## What you need to get started - **Any computer or tablet for the till.** The till is the `/pos` web page in an ordinary browser; it installs "as an app" (PWA) and keeps ringing up sales when the connection drops. - **A barcode scanner.** Any USB or Bluetooth scanner in "keyboard" (wedge) mode will do: it simply types the code into the active field, and both the till and the item card understand it. - **A receipt printer — through the bridge.** Receipts, price tags and labels are printed through [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — a Windows or Linux service on the same computer as the till. The bridge finds USB/LAN/Bluetooth devices on its own. A cash drawer is connected to the receipt printer. Without the bridge the till still works — just without paper. - **Scales** — a must for groceries and unnecessary for everyone else: they connect through the same bridge, the till opens a weighing dialog and computes the amount from the actual weight. - **A label printer** — if you print labels from a roll rather than on A4 sheets. - **A fiscal printer** — where the country's law requires it, through the same bridge. What is supported today is in [Fiscalisation](/en/docs/fiscal): Georgia and Bulgaria (Daisy eXpert SX), Poland (POSNET Thermal), Russia (ATOL, Mercury, SHTRIH-M, Pirit) plus the cloud 54-FZ till on cenaly.ru; for the UK, Australia, New Zealand and the UAE — a tax invoice instead of a fiscal receipt. - **A customer display** — a second screen for the till, optional. You need the internet, but losing the connection does not stop the till — see [If the internet goes down](/en/docs/offline). --- ## The common frame of the first day The common steps (sign-up, location, business type, languages, subscription, help) are described in the hub [First day: choose your business type](/en/docs/first-day) — here we only cover what is specific to a store. 1. **Check the location's business type.** "Retail" must be set in the location settings: the till mode, the section labels and the set of fields on the item card all depend on it. 2. **Load the catalog by import, not by hand.** Two paths in "Catalog" → "Import": a plain **CSV in a Shopify-compatible schema** (one row = one variant, a repeat upload is idempotent — you can re-upload stock only) and an **AI import** from Excel, Word, PDF, price-list photos or a website link. The AI shows a plan for confirmation: what will be created, where the duplicates are, which categories to add. In detail — [AI catalog import](/en/docs/catalog-import); moving from another system — [Migrate to us](/en/docs/migrate). 3. **Test the barcodes with a scanner.** Scan a few products at the till and in the inventory card: the code must find the product. An item can have several barcodes, and the import has a toggle "pull the name and brand by barcode" from the global barcode catalog. 4. **Open a cash shift and ring up a test receipt** — [Cash shift and Z-report](/en/docs/cash-shift). Until a shift is open, payment at the till is blocked. ⚠️ If you chose the **light mode** at sign-up, some sections are switched off on top of that — by design, so the sidebar does not overwhelm you in the first hour. Exactly what the light mode hid is listed on the "Currently off" screen in the app store, and it is switched back on there with a toggle. --- ## Checklist: grocery store at the counter The goal of day one is to ring up receipts by barcode and by weight without doing arithmetic in your head. 1. **A catalog with barcodes** — import as above; the inventory card holds the barcodes (several are allowed), the unit of measure and the purchase price. 2. **Weighed goods.** Set a **PLU** and a weight unit (kg/g/l/ml) on the item card — at the till such an item opens the weighing dialog and computes the amount from the actual weight. Scales connect through the bridge. 3. **Shelf life and storage mode** — fields on the item card; they are also printed on the label together with the date and the barcode. 4. **Price tags and labels** — the "Print labels/price tags" operation in "Inventory": an A4 sheet or a thermal printer through the bridge, a template, a set of fields, a barcode or a QR code. Batch printing — by multi-selecting rows in the stock table. 5. **Repricing** — the "Repricing" operation computes the retail price as "purchase × markup" with rounding; automatic repricing on goods receipt can be switched on. 6. **Goods receipt** — a receipt note by hand, **from a photo or PDF of the supplier invoice** (the AI recognises the lines and prices and matches them against your catalog) or against a purchase order. The reorder point (minimum stock) and the preferred supplier are set on the item card — [Inventory](/en/docs/inventory). 7. **The till** — [POS](/en/docs/pos): scan into the receipt, weighed goods, payment. For a grocery the "Counter" mode is more convenient — pay right away, with no open tab. Risky operations (voiding a line, a discount, a refund, a reprint) are gated by a manager PIN — [Loss control](/en/docs/loss-control). 8. **The fiscal receipt** — if it is mandatory in your country, connect a fiscal printer through the bridge (see the table above). Alcohol, tobacco and marked goods are only handled on the Russian contour: on cenaly.ru there is a marking section and EGAIS, on the other brands these modules do not exist and are not loaded. **Devices you need:** a PC or tablet, a scanner, a receipt printer and scales through the bridge; a fiscal printer depending on the country. **What can honestly wait:** recipes and cost of production, stocktaking (the first one is done after a week of trading, not on opening day), the online storefront. ## Checklist: non-food store The goal of day one is to keep one product in five sizes from becoming five unrelated rows. 1. **Variants instead of duplicated items.** The "Colour", "Size" and "Material" axes: every combination is its own SKU with its own price, barcode and stock. In CSV these are the `Option1..3` and `Variant SKU/Barcode/Price` columns, one row = one variant. 2. **Colour swatches** — if the same product ships as separate cards (by material, say), the storefront shows them as small circles in the category list: a click swaps the photo, the name and the price of the card. 3. **Product characteristics** — the `/features` dictionary: text, a number with a unit of measure, a single choice or multiple choice, an image per option. There is an AI wizard: it looks at your catalog and proposes a set of characteristics with translations. In detail — [Product characteristics](/en/docs/product-features). 4. **Labels** — 29 standard ones out of the box plus your own, with an icon (it can be generated by AI) and translations: [Labels](/en/docs/labels). 5. **Categories and collections** — categories are the catalog structure, collections are storefront groups for marketing: [Product collections](/en/docs/collections). In a store, collections also work at the till as carriers of schedules and promotions: a collection rule applies to an item and changes its availability and price right in the till grid. 6. **Product photos.** Several shots with captions, a "hover photo", AI-generated product shots on a white background and AI card completion with the ✨ button. 7. **The till and refunds** — [POS](/en/docs/pos) and the receipt register: a full or partial refund, an exchange, store credit as a gift card — [Receipts, refunds and exchanges](/en/docs/receipts). **Devices you need:** a PC or tablet, a scanner, a receipt printer; no scales. **What can honestly wait:** characteristics across the whole catalog at once (start with one category), your own domain, advertising feeds. ## Checklist: store with an online storefront The location has a storefront right after sign-up — a page on the brand domain with the catalog, prices and order taking. Day one here is about making sure it does not lie. 1. **Switch on storefront publishing** and check it on a phone: categories, photos, prices, faceted filters, search. The design is edited in the live visual editor in the "Websites" section (`/websites`); for locations of the "Retail" type the **Store Studio** design hub opens there as well. 2. **Fulfilment methods** — "Commerce" (`/commerce`): pickup, a flat rate, free above a threshold, local delivery by radius, zones and carriers. Coupons, tax rules and gift cards live there too: [Commerce](/en/docs/commerce). 3. **The item's tax class** — chosen on the card from the preset of the location's country (64 jurisdictions); the same selector has a "+ New tax group…" item that asks for the details (name, rate or exemption, channels, locations) and creates the group in the location's tax table, so that tax by it is actually calculated. The tax table works on the storefront and at checkout, while the till computes taxes its own way. 4. **Payment** — hosted payment by a provider for your country, or payment at the counter on collection: [Payments](/en/docs/payments). 5. **Shipments** — the `/shipments` queue: the "To ship / In transit / Completed" baskets, bulk label creation (for CDEK, Trackings.GE and Exline), an A4 handover register, and a "returned" mark that puts the goods back into stock. 6. **Customer returns** — [Returns and exchanges (RMA)](/en/docs/returns): request → decision → money (to the original payment method, as store credit, or an exchange). 7. **Your own domain and SEO** — once the storefront is filled: [Custom domain](/en/docs/custom-domain), [SEO and storefront promotion](/en/docs/seo). **Devices you need:** nothing beyond the till kit — the storefront lives on the customer's phone. **What can honestly wait:** product feeds and advertising, the customer account, abandoned carts — they make sense once the catalog is complete and the prices are verified. --- ## What can wait None of this stops you from opening tomorrow. - **Recipes and cost of goods** — [Inventory](/en/docs/inventory). A counter store needs them only if it produces something (baking, salads, repacking). - **Financial reports** — [Finance](/en/docs/finance). Sales, purchases, cash shifts and demand analytics are supported on both the international and Russian services. Start using them after recording your first transactions; an empty period and a data-loading error are different situations. - **A loyalty programme** — [Loyalty](/en/docs/loyalty): points are earned on a till sale only if the receipt carries the customer's phone number. - **Newsletters and advertising feeds** — Google Merchant Center, Meta, Yandex Products and others: [Google Product Feed](/en/docs/google-feed), [Yandex Products](/en/docs/yandex-goods). - **A website beyond the storefront** — [Website builder](/en/docs/website-builder); widgets for an existing site — [My website](/en/docs/site-widgets). - **Staff with roles** — [Staff and shifts](/en/docs/staff): on day one the owner usually runs the till. --- ## Limitations worth knowing up front - **There is no batch tracking with shelf life (FEFO).** Shelf life is a field on the item card and a line on the label; "first to expire, first out" write-offs and per-batch warnings are planned but do not work. - **Demand forecasting and expiry control are separate tools.** Demand analytics are supported on both services. Expiry tracking is a separate option; it does not imply quantity-based FEFO batches or automatic ordering through every supplier channel. - **Receipts and product returns are different workflows.** The receipt register supports both services. The separate RMA section for online-store return requests remains limited to the international service. - **There is no mobile stocktaking with a phone scanner** — the count sheet is filled in on a computer or on the till tablet. - **Label printers speaking TSPL and ZPL are implemented from the specification but have not been verified on live hardware** — if that is your printer, test printing before buying rolls. - **There are no stock reservations:** two customers can order the last item at the same time. The server will not let them pay for what is gone, but it cannot "hold" an item during checkout. --- ## Troubleshooting **The scanner does not add the item to the receipt.** Check that the scanner works in keyboard (wedge) mode and that the cursor is in the till search field, and that this barcode really is recorded on the inventory card. **The till will not accept payment.** No cash shift is open — open one with a float, see [Cash shift](/en/docs/cash-shift). **A weighed item is rung up by the piece.** The card has no PLU and no weight unit — set them in [Inventory](/en/docs/inventory). **The printer does not print price tags.** Without the bridge printing does not work at all: make sure the bridge on this computer is "connected" — [Cenaly Hardware Bridge](/en/docs/hardware-bridge). **The import did not load all the products.** The free plan has an item limit: a bulk import does not fail entirely — it loads as much as fits and explains the remainder in a banner. **The item card has no marking or alcohol fields.** They appear only for a location with the country "Russia" on the `cenaly.ru` brand — on the other brands these modules are not loaded. --- ## FAQ ### Do I have to buy a special till? No. The till is a browser page on any computer or tablet. A scanner, scales, a printer and a fiscal printer are added through the bridge and bought as you need them. ### Can I run a store and a cafe in one account? Yes. The business type is a property of the location, not of the account: one location can be "Retail" and another "Cafe", each with its own sections. ### The products are already in Excel — do I re-type them? No. A plain CSV is loaded in a Shopify-compatible schema, while Excel, PDF, price-list photos and a website link are parsed by the AI import, which shows a plan for confirmation — [AI catalog import](/en/docs/catalog-import). ### Does the customer see the exact stock level? The storefront shows an availability badge ("only a few left" / "N left"), not the stock table. The server will not let anyone pay for what is gone. ### Is an online storefront mandatory? No. A store can trade at the counter only: the storefront always exists, but you do not have to publish it. ### We have several stores — do we need several accounts? No. Locations live in one account, each with its own prices, stock and hardware — see [Managing a chain](/en/docs/multi-location). --- ## Related articles - [First day: choose your business type](/en/docs/first-day) — the common steps and the other formats - [Online store: storefront and sales](/en/docs/shop) — catalog, facets, product page, checkout - [Inventory](/en/docs/inventory) — stock, goods receipt, stocktaking, labels and price tags - [POS](/en/docs/pos) — counter mode, scanning, weighed goods, payment - [AI catalog import](/en/docs/catalog-import) — a price list from Excel, PDF, a photo or a website - [Hardware (bridge)](/en/docs/hardware-bridge) — scanner, scales, printers, fiscal printer - [Fiscalisation](/en/docs/fiscal) — what is supported by country - [First day: online store](/en/docs/getting-started-ecommerce) — if your sales are mostly online --- # First day: salon, barbershop, studio A beauty salon, a barbershop and a studio (nails, massage, cosmetology, laser) all work on the same screen — the **appointment book**: a grid of "specialists × time" for the selected day. What differs is not the features but the number of columns in that grid and what counts as a "specialist" — a person or a workplace. The business type is chosen at sign-up and immediately tunes the panel for appointments: | Format | Business type | POS mode | What is on from the start | |---|---|---|---| | **Salon with several specialists** | beauty salon | pay right away (no table is opened) | Appointments, POS, consumables inventory, staff, finance | | **Barbershop / single specialist** | beauty salon | the same | The same — just one column in the grid | | **Studio with resources** (room, chair, device) | beauty salon or appointment services | pay right away / counter | For "appointment services": appointments, staff, finance, clients; POS and inventory are off by default | For the **beauty salon** type, **tables, the kitchen display, couriers and the "Hardware" section are switched off on purpose** — this business does not need them. The wording changes too: "service" instead of "dish", "client" instead of "guest", "chair" instead of "table". > The **"appointment services"** type (studios, tutors, service centres) uses the **same** appointment book and the same slot engine, only with neutral words — "office" and "branch" instead of "chair" and "zone". There is no separate product behind it, and that is honest: see [First day: services and B2B](/en/docs/getting-started-services). Open the book: **Admin panel → Appointments** (`admin.cenaly.com/appointments`). --- ## What you need to get started You do not need to buy equipment to start booking clients. - **Any computer or tablet for the appointment book.** The book is an ordinary admin-panel page in a browser; the grid refreshes itself without a reload, so an appointment made by a client or a colleague shows up immediately. - **The client's phone.** Online booking opens in a browser — the client installs nothing. The booking widget speaks 45 languages and picks up the language of the page. - **A till — optional.** The POS is a `/pos` page in the browser: it installs "as an app" (PWA) and keeps working when the connection drops — [POS](/en/docs/pos), [If the internet goes down](/en/docs/offline). A dedicated POS appliance is not required. - **A receipt printer — through the bridge.** Printing goes through **Cenaly Hardware Bridge**, a Windows or Linux service on the same computer that runs the POS ([Cenaly Hardware Bridge](/en/docs/hardware-bridge)). ⚠️ For a salon the "Hardware" section is off by default — switch it on in the [App Store](/en/docs/app-store), otherwise there is nowhere to connect the bridge. - **A fiscal printer** — where the law of the country requires it, through the same bridge. Live fiscal receipts today are Russia (54-FZ) and tax invoices for the UK, Australia, New Zealand and the UAE; for other countries see [Fiscalization](/en/docs/fiscal). - **Online card payments — only if you need deposits.** A deposit requirement appears for the client only when a live payment provider is connected for the country and currency of your location — [Payments](/en/docs/payments). --- ## The common frame of the first day Sign-up, the location, the business type, languages and the subscription are the same for every format — they are described in the hub [First day: choose your business type](/en/docs/first-day). The salon-specific part starts here. ⚠️ If you chose the **light mode** at sign-up, some sections are deliberately switched off. The final step of the wizard says so out loud, and any section can be brought back with a toggle in the [App Store](/en/docs/app-store). --- ## Checklist: a salon with several specialists The goal of day one is for the receptionist to run the day in the book, not in a paper diary. 1. **Services in the catalog.** For a salon the catalog section is called "Services": name, price and **duration** — the duration is filled into the appointment automatically. The service also carries the buffer after the visit (cleaning the workplace), how many clients it takes at once, which specialists may perform it, its own deposit rule and "repeat after N days". Without at least one service item, online booking will not work. 2. **Specialists.** The **"Specialists"** button in the book opens the register. A specialist is an employee from the shared [staff directory](/en/docs/staff) with the specialist job role; **a login is not required** — you can add a "resource employee" that exists only as a column in the schedule. An owner who is assigned the specialist job role also gets a column. 3. **Schedules.** For each specialist: colour in the grid, active flag, list of services, weekly schedule, **daily breaks** (lunch), **holiday and sick leave** (date ranges) and **one-off days** for a specific date — a day off or special hours. A one-off day overrides the weekly schedule. 4. **Booking hours of the location.** The gear icon in the book header → **"Appointment settings"**: online booking hours from and to. This is the outer frame for all specialists at once. 5. **The first appointment by hand.** The "New appointment" button: client, phone, service, specialist, date and time, comment. The book will not let you book "into nowhere" — it checks both the location hours and the specialist's schedule. 6. **Visit statuses.** There are six: new → confirmed → in the chair → completed, plus cancelled and no-show. The "in the chair" and "no-show" marks become available no earlier than 15 minutes before the start. 7. **Online booking.** The client books themselves on your storefront, on your own website (the "Online booking" widget — [My website](/en/docs/site-widgets)) and in the location's Telegram bot. All appointments land in one book; those that came from a website carry a "from the site" badge. 8. **Reminders and confirmation.** Telegram sends the confirmation and reminders 24 and 2 hours ahead with "I'll come" and "Cancel" buttons (the windows are configured in the "Guest journey" block, and quiet hours from 23:00 to 07:00 are respected). If the client left an e-mail, a confirmation letter goes out with a "Manage appointment" link. Details — [Appointment book](/en/docs/appointments). 9. **Front-desk roles.** The receptionist job role is enough for the front desk, the specialist role for masters: an employee sees only their own workspace — [Staff and shifts](/en/docs/staff). 10. **Till and shift.** If you take payment yourself: open the shift with the float — without an open shift payment on the till is blocked ([Cash shift and Z-report](/en/docs/cash-shift)). Tips with presets by country — [Tips](/en/docs/tips). **What you need in terms of devices:** a computer or tablet for the book; a till, a printer and a card terminal only if you take payment on site. **What can honestly wait:** consumables inventory, financial reports, memberships, campaigns, your own website. --- ## Checklist: a barbershop or a single specialist One column in the grid is not a "stripped-down salon" but the fastest launch: you are 20 minutes away from taking bookings. 1. **One service and one specialist make the wizard shorter.** If there is a single service in the catalog, the client goes straight to picking a time; if a single suitable specialist matches, they are assigned automatically. The **"⚡ Earliest: today 17:30"** chip removes the day-by-day search. 2. **Add yourself as a specialist too.** The owner only needs to assign themselves the specialist job role — the column appears, no second account required. 3. **A booking landing link.** The widget tag accepts a preselected service and specialist and can open the panel right away — that turns a link in a social-media bio into a "booking page". A stale identifier does not break the widget: it quietly returns the client to the normal first step. Attributes — [My website](/en/docs/site-widgets). 4. **Notifications that do not let an appointment slip.** The 🔔 in the book header works **only while the page is open**. So the very first thing to set up is Telegram alerts — the button sits right in the book and opens the wizard in a modal without taking you to another section. 5. **A deposit against no-shows.** "Appointment settings" switch on the policy: a fixed amount or a percentage of the service and the number of free-cancellation hours. The slot is held for a limited time: if the deposit is not paid, the appointment cancels itself with the reason "deposit not paid in time" and the time goes back on sale. Rescheduling keeps the deposit. 6. **Visit marks.** "Guest confirmed" is a separate mark (including the "Confirmed by phone" button when you reached them yourself); "in the chair" and "no-show" are statuses. No-shows accumulate on the client card. 7. **Payment and the receipt.** The till in the browser, the shift and tips — as in the previous checklist. **What you need in terms of devices:** a phone or a tablet is enough. **What can honestly wait:** roles and staff (you are alone), inventory, finance, memberships. --- ## Checklist: a studio with resources A studio can require a specialist, a room and a device at the same time. **People and physical resources have separate directories.** 1. **Add specialists** with their services and working hours. A specialist may have no login if another employee manages the schedule. 2. **Add rooms and equipment** as resources, with their availability and breaks. Do not create a device as a fictitious employee. 3. **Set resource requirements for each service.** Booking checks the specialist and the required room or device together, including buffers. Test a conflicting booking before opening online availability. A service's capacity alone is not a complete group-class workflow with enrolment, attendance and billing. 4. **If the words "specialist" and "chair" do not fit** — choose the **"appointment services"** business type: the book, the slots and the widget are the same, but the labels are neutral ("office", "branch"). For that type the till and inventory are off by default, while the client directory is on right away. 5. **Memberships.** The "🎟️ Memberships" button — service packages of three kinds: a pack of N visits, a prepaid wallet and a subscription with recurring top-ups. Issuing a membership to a client and deducting visits happen there too. 6. **Waiting list.** When a day is fully booked, the client taps "Notify me if a slot opens" (an e-mail is required) and gets a message when a window opens. The request holds nothing, and the client is told so before sending. 7. **A client base from day one.** A client card with history and a **"Repeat the previous appointment"** link — the form opens pre-filled from the last visit — [Clients](/en/docs/customers). **What you need in terms of devices:** a computer at the front desk; a tablet in the room is optional. **What can honestly wait:** till and inventory (if payment happens outside the system), finance, campaigns. --- ## What can wait None of this stops you from taking your first client tomorrow. - **Consumables inventory** — [Inventory](/en/docs/inventory). Set it up once the price list has settled: before that, write-offs would have to be rewritten after every service change. - **Financial reports** — [Finance](/en/docs/finance). Sales, purchases, cash shifts and demand analytics are supported on both the international and Russian services. Start using them after recording your first transactions; an empty period and a data-loading error are different situations. - **Appointment autopilot.** The widget funnel ("how many clients saw the button and how many booked"), the "time to repeat the service" nudges and the "how did it go?" survey are a paid extension on top of the free book. The booking button itself and the book are free forever. - **Scheduled follow-ups and surveys.** Lifecycle campaigns run on both services. Enable the location's autopilot and each required campaign; available notification channels and consent requirements still apply. - **Campaigns and mailings** — [Engagement campaigns](/en/docs/campaigns), once you have regular clients. - **Your own website and domain** — [Website builder](/en/docs/website-builder), [Custom domain](/en/docs/custom-domain). Salons have their own templates in the gallery. - **Recurring card charges for memberships** — switched on separately; start with visit packs and the wallet. - **A phone blacklist** — there is none. "Frequent no-shows" are visible on the client card, but a "do not book" list does not exist yet. --- ## Troubleshooting **There is no "Appointments" section in the panel.** The book is available only to the **"beauty salon"** and **"appointment services"** business types — a hard rule that no toggle bypasses. Check the business type in the location settings; if the type is right, switch the section on in the [App Store](/en/docs/app-store). **There is no "Book" button on my website.** In order: there is not a single service item in the catalog; booking is switched off for the location; the tag was not found (press "Check installation" in [My website](/en/docs/site-widgets)); the changes have not arrived yet — widget files are served with a 5-minute cache; the button was deliberately suppressed by the multi-button if its fan contains a "Book" item. **The client sees no free time.** Free slots are calculated by the system from the specialist's schedule, breaks, one-off days and holidays, the service duration with its buffer and the location's "online booking hours". You cannot "open" a busy slot by hand — change one of those settings. **The client is not asked for a deposit.** The deposit requirement is shown only when a live online payment provider is connected for the country and currency of the location — [Payments](/en/docs/payments). **Repeat-visit messages are not arriving.** Enable the location's marketing autopilot and the relevant campaign, then check the customer's contact, consent and eligibility. Lifecycle campaigns support both services; messages are scheduled, not sent immediately when a setting changes. **The time in the grid does not match what the client booked.** The client picks the **venue's** time (the widget labels the time zone), while the book grid is drawn in the time zone of the receptionist's device. If you open the book from another time zone, check the location's time zone in its settings. --- ## FAQ ### Do I need to buy equipment to start booking? No. The book opens in a browser, the client books from their own phone. A till, a printer and a terminal come later and only if you take payment on site. ### Can I add a specialist without an account and a password? Yes. A "resource employee" exists only as a column in the grid: name, colour, services, schedule. A login is needed only for people who sign in to the panel themselves. ### How do I close a day or part of a day for a specialist? Lunch — "Daily breaks", a specific date — "One-off days" (a day off or special hours), a long period — "Holiday and sick leave". The hours of the whole location are changed in "Appointment settings". ### Can two clients book the same time with the same specialist? No. The time is locked at the moment the appointment is created: the second client gets an honest "the slot has just been taken" and the grid immediately refreshes. ### How does "beauty salon" differ from "appointment services"? Only in the wording in the interface and in the set of sections switched on: the appointment book, the slots, the widget and the reminders are shared. The salon version says "specialist" and "chair" and switches on the till with inventory; the neutral one says "office" and "branch" and switches on the client directory. ### Does booking work on the Russian brand? Yes: appointments, online booking, reminders, financial reports and lifecycle campaigns support both services. Payment and notification options depend on the location's providers and settings. --- ## Related articles - [First day: choose your business type](/en/docs/first-day) — the common frame and the other formats - [Appointment book](/en/docs/appointments) — the grid, statuses, deposits, memberships, reminders - [My website](/en/docs/site-widgets) — the online booking widget for your own website - [Staff and shifts](/en/docs/staff) — specialists, roles, workspaces - [Clients](/en/docs/customers) — the client card, history, "repeat the previous appointment" - [POS](/en/docs/pos) — paying for a service and the shift - [First day: services and B2B](/en/docs/getting-started-services) — when appointments are not enough and you need invoices --- # First day: hotel, guesthouse A hotel, a guesthouse, apartments and a hostel all run on the **built-in PMS**: floors instead of dining halls, rooms and beds instead of tables, a **folio** (the guest bill) instead of a one-off receipt. This is not a separate product but a profile of location settings: with the "hotel" business type the panel switches the wording and opens the right sections itself. | Format | How you sell | What is on from the start | |---|---|---| | **Small hotel / guesthouse** | walk-in check-in and date reservations | Rooms, POS, kitchen display, inventory, staff, finance, hardware | | **Apartments** | date reservations, selling a room type against a quota, OTA calendars | The same | | **Hotel with a restaurant** | the same plus room service by QR and "charge to room" | The same, plus a menu for guests | **Where to open it:** the **"Rooms"** section is the same section as "Floor plan" in a restaurant (`admin.cenaly.com/tables`), renamed for hotels. It opens in the floor-plan editor; **the working room board is switched on with the "🛏️ Rooms" button** in the header, and the same button takes you back to the plan. Next to it are "Room types", "Rates", "🔌 PMS" and, for Russian locations, "🛂 Migration registration". There is no separate `/hotel` or `/pms` address in the panel — do not look for one. > The hotel vertical is a **working core with open tails**: the PMS, rates, folios, the booking engine and calendar exchange with OTAs are in production, while a live two-way channel manager and connectors to external PMS systems are not. That is flagged honestly below. --- ## What you need to get started - **Any computer or tablet at the front desk.** The room board, the reservation grid and check-in are ordinary admin-panel pages in a browser. No dedicated hotel terminal is needed. - **The guest's phone.** A QR code in the room opens the menu, service requests and "My bill" in a browser — the guest installs nothing. - **A receipt printer — optional, through the bridge.** Printing goes through **Cenaly Hardware Bridge**, a Windows or Linux service ([Cenaly Hardware Bridge](/en/docs/hardware-bridge)). ⚠️ Note: **check-out does not issue a fiscal receipt** — it closes the folio with a settlement; a receipt, if required, is rung up separately on the till. - **Online card payments — not for day one.** At the direct booking step on the website **no prepayment is collected**; payment happens at your end. Card payments become relevant later, for storefront orders — [Payments](/en/docs/payments). - **Internet.** Required, but losing the connection does not stop the till — [If the internet goes down](/en/docs/offline). --- ## The common frame of the first day Sign-up, the location, the business type, languages and the subscription are the same for every format — they are described in the hub [First day: choose your business type](/en/docs/first-day). The hotel part starts here. --- ## Checklist: a small hotel and a guesthouse The goal of day one is to check a guest in inside the system and see their bill. 1. **Floors and rooms.** The plan editor works like a floor plan ([Floor plan](/en/docs/tables)), except halls are called floors and the elements are "Room" and "Bed" (for hostels and shared dorms). You do not have to add them one by one: the **"+ Add rooms"** button creates a range (for example 201–230, up to 500 rooms at a time) with an optional prefix, a live count of "N rooms · M floors" and a list of numbers that already exist and will be skipped. The onboarding wizard offers the same step when you choose the "hotel" type. 2. **Room types.** The "Room types" button: name (Standard, Deluxe…), base nightly rate and capacity. A type is assigned to a room in the properties panel on the plan, and its rate is pre-filled into the check-in form — on a particular stay you can override it. 3. **The location's time zone — check it now.** The accommodation charge is posted automatically **after 03:00 local time for your location**; if the time zone is wrong, the night "moves" to another part of the day. The time zone lives in the location settings. 4. **Tourist tax**, if it applies to you: a percentage of the rate with a minimum per night, or a fixed amount per night. It is posted to the folio as a separate line. 5. **The first check-in.** The form asks for the rate plan and the nightly price (pre-filled from the room type) and the **guest card**: phone, e-mail, ID document, citizenship, date of birth, notes. A departure date is not required at this step — a walk-in stay is open until check-out, and dates belong to the reservation. If the guest has stayed before, the system shows a "returning guest" banner. Checking in opens the **folio**. 6. **What accumulates in the folio.** Every night stayed (the arrival day is not charged twice), the tourist tax, orders placed from the room by QR, and manual operations on the till against the room bill: a charge, a service fee, a discount, a deposit, moving items between bills. The balance is visible on the room card and in the list of open bills on the [till](/en/docs/pos). 7. **Check-out.** It closes the folio with a single settlement and moves the room to "Needs cleaning"; a "Clean room N after departure" task appears on the [shift task board](/en/docs/tasks). ⚠️ A room bill is closed **by the front desk at check-out** — the till has no close button for room bills. 8. **Room statuses** — six of them: vacant, occupied, needs cleaning, cleaning, inspected, out of order. Future arrivals are not reflected in the room status: they live as reservations and are visible on the grid, so a room booked for next week stays sellable today. 9. **The reservation grid.** A view switch on the same page — a 21-day calendar with bars for reservations and current stays per room. You can create a booking without opening it: pick the room on the floor plan — its properties carry the **"Room bookings"** block and a **"📅 Book the room"** button that opens the same date-based form. A room booking is always a pair of dates, **one night minimum**; a room has no hourly booking the way a restaurant table does — neither on the "Floor plan" page nor in the hall panel at the till. Checking in by a booking happens in one window: the **"Check in"** button on the rooms board, in the reservations list and in the hall panel at the till opens the same check-in window. Early check-in and late check-out, once turned on in **"Room types" → "Check-in and check-out"**, are ticked right in the booking form — see [Hotel](/en/docs/hotel). 10. **Roles.** The front desk gets the receptionist job role, the cleaner the housekeeper role (whose workspace has no till): [Staff and shifts](/en/docs/staff). **What you need in terms of devices:** one computer at the desk. **What can honestly wait:** rate plans and the price calendar, sales channels, reports, migration registration (if your guests are local only). **Both services support the PMS, nightly accommodation charges and inbound iCal calendars.** Set the hotel's time zone and check calendar synchronization. Payment providers, live OTA connections and recently introduced screens have separate availability conditions. --- ## Checklist: apartments and selling through channels The goal of day one is to make sure the same dates are not sold twice. 1. **Rate plans.** A manager next to the room-type directory: board (room only, breakfast, half board, all inclusive), derived rates ("breakfast = base +15%"), pricing by number of guests with child age buckets and an extra bed, day-of-week surcharges, sale restrictions (minimum and maximum nights, booking window, no arrival or departure on certain days), a cancellation policy (flexible, non-refundable, first-night penalty, percentage or fixed), sales channels (all / direct only / OTA only) and a corporate access code. 2. **The price and stop-sale calendar.** A price and a sale block for specific dates, bulk editing "rate × period", a preview of the final price. ⚠️ **The calendar overrides a negotiated price entered at the front desk** — that is intended; and for a rate plan with its own price, seasons do not apply at all (seasons are the fallback for those who do not use plans). 3. **Seasonality — the simple level.** If plans are not needed yet: periods with a separate price for a room type or for all rooms at once. 4. **Selling a room type rather than a specific unit.** Such reservations stay unassigned and hold a quota (how many rooms of that type are sold for a date), and the physical room is picked with the assign button — manually or automatically. The block of unassigned reservations sits right above the grid. 5. **The booking engine on your website.** The guest picks dates and a rate, sees the calculation with restriction checks (minimum nights, booking window, stop-sale; a single reservation is capped at 30 nights) and receives a **confirmation code**. The server answers synchronously: it either confirms the reservation and locks a free room, or refuses honestly with a reason. There is no waiting for staff confirmation, and no prepayment is collected. 6. **OTA calendars — today's working path.** **iCal import**: paste an export link from Booking.com, Airbnb or another service into the room settings — external reservations start blocking those dates for you, refreshed roughly every 15 minutes, and conflicting overlaps are collected into a "sort out manually" list. **iCal export**: every room has its own feed, and the link is added as a calendar on the channel's side. 7. ⚠️ **The two-way channel manager** (rates and availability pushed to channels, reservations coming back) is written and runs **on the provider's test environment**: a live connection needs a partner account, which we do not have yet. For real date blocking in channels use iCal import and export. 8. **Letters to the guest.** Once a day the hotel writes to those **arriving tomorrow** and those who **departed yesterday**; the language is the reservation's, otherwise the location's, otherwise English. Nothing to configure, and no duplicates. If the location has a Telegram bot connected, the guest also gets arrival reminders. 9. **Manual reservations.** A reservation has a source (front desk, phone, direct from the guest, website, OTA), cancellation with a reason and a "no-show" mark; on an overlap or a too-early arrival the panel warns you. Turning a reservation into a stay is a single action on the arrival date. **What you need in terms of devices:** a computer; a phone to see the booking flow through a guest's eyes. **What can honestly wait:** the two-way channel manager (see above), corporate rate codes, reports. --- ## Checklist: a hotel with a restaurant and room service The goal of day one is for a room order to land on the guest's bill by itself. 1. **A QR code per room.** The room card has a **"Create QR and attach"** button; in bulk it is **"Create QR for all rooms without a code (N)"** across the location. Print them one by one or as A4 sheets — [Table QR codes and device codes](/en/docs/device-codes). 2. **A menu for the rooms.** Categories, items, photos, languages — [QR menu](/en/docs/qr-menu). The guest scans the code in the room and orders just like at a table. 3. **"Charge to room".** In an occupied room this payment method is available to the guest: the amount is added to the folio and paid at check-out together with the stay; before confirming, the guest sees a consent text with the exact amount and the room number. ⚠️ The rule is narrow and deliberate: **only orders from the in-room QR code land on the folio** — anything rung up on the till, in the kiosk or arriving from an aggregator will not. 4. **An order from a vacant room is blocked** by the server with the reason "room is not checked in", and the guest sees a warning before sending. 5. **Guest service requests.** Towels, cleaning, "do not disturb", a wake-up call with a chosen time, a technical problem, other. In a hotel this button takes the place of the staff call and is shown only when "staff call" is enabled in the location settings; a request cannot be placed from a vacant room. On the staff side there is a **"Guest requests"** block on the room card: a counter, a list with the type and the wake-up time, the "In progress" and "Done" actions, updates in real time. 6. **"My bill" for the guest.** An item in the guest menu: charges, payments and the balance of their folio. Before check-in it shows an empty state, after settlement a "Paid" mark. 7. **Kitchen and restaurant till.** A kitchen display by stations — [KDS](/en/docs/kds); the till and the shift — [POS](/en/docs/pos) and [Cash shift](/en/docs/cash-shift). For a hotel these sections are on from the start. 8. **Reports.** A reports tab on the room board for a period: occupancy, average daily rate (ADR), revenue per available room (RevPAR), total revenue and revenue from food and drinks separately, the number of orders and a day-by-day table broken down by currency. **What you need in terms of devices:** a computer at the desk, a tablet or a monitor for the kitchen display, a printer through the bridge if you print tickets. **What can honestly wait:** the self-service kiosk, delivery and takeaway, aggregators. --- ## What can wait - **External PMS mode** (the "🔌 PMS" button). The switching contour exists, but the adapter list currently contains **only the demonstration "Mock (demo)"** one — it is there to verify the path itself. Live connectors are in development; switching a working hotel over is premature. - **The two-way channel manager** — awaits the provider's partner account and runs on the test environment. Use iCal. - **Migration registration (Russia).** The "🛂" button on the room board: a record is created automatically at check-in, deadlines and statuses are visible, notification forms are printed and a CSV is exported. It is important to understand: this is **a register and printable forms, not electronic filing** — filing stays with you. It is enabled by the location country "Russia". - **Food service at the hotel** — [Room service and guest folios](/en/docs/hotel). Meal-plan subscriptions belong to food-service business types; they are not a default hotel feature. - **Financial reports** — [Finance](/en/docs/finance). Sales, purchases, cash shifts and demand analytics are supported on both the international and Russian services. Start using them after recording your first transactions; an empty period and a data-loading error are different situations. - **Your own website and domain** — [Website builder](/en/docs/website-builder) (hotels have their own templates in the gallery), [Custom domain](/en/docs/custom-domain). - **Your own PBX and calls** — [Telephony](/en/docs/telephony). - **Restaurant inventory and food cost** — [Inventory](/en/docs/inventory), once the menu has settled. --- ## Troubleshooting **I cannot find a "PMS" or "Hotel" section.** There is no such address. Everything lives in the **"Rooms"** section (`admin.cenaly.com/tables`): the floor plan opens right away, the working board is behind the "🛏️ Rooms" button, external PMS behind the "🔌 PMS" button. If the section is called "Floor plan", the location does not have the "hotel" business type selected. **A night was not charged.** Check the hotel's time zone, stay dates, room rate and guest folio. The nightly process runs after 03:00 local hotel time on both services. A delayed or failed charge needs investigation; changing the brand is not a remedy. **A guest cannot order from the room.** Most likely the room is not checked in: the server cancels such orders with the reason "room is not checked in". Check that the stay is open and that the QR code is attached to that exact room. **An order did not land on the room bill.** Only orders made from the **in-room QR code** go to the folio. Anything rung up on the till, in the kiosk or arriving from an aggregator does not — that is a deliberate rule. **The room bill will not close on the till.** That is intended: a room bill is closed by the front desk at check-out, and the till has no close button for it. **Dates are not blocked on Booking.com or Airbnb.** Verify both calendar links and the latest synchronization. iCal import and export work on both services and exchange occupied dates, not rates. Live channel-manager connections require separate activation; the test environment does not distribute your inventory to real channels. **A guest received the same email twice.** Check the reservation and delivery history. Failed delivery is retried; a failure after the email service accepted the message can produce a duplicate. --- ## FAQ ### Do I need to buy hotel equipment? No. The front desk works in a browser, the guest uses their own phone with a QR code. A printer and a fiscal printer come later through the bridge and only if you need them. ### Do I have to add rooms one by one? No. The "+ Add rooms" button creates a range of up to 500 rooms at a time with a prefix and a live count; existing numbers are skipped rather than duplicated. ### Is a departure date required at check-in? No. A walk-in stay is open until check-out; arrival and departure dates belong to a reservation, and an early departure automatically shortens the reservation to the actual stay. ### Is a fiscal receipt issued at check-out? No. Check-out closes the folio with a settlement and moves the room to cleaning; fiscalization is not built into that path — a receipt, if required, is rung up on the till. ### Can I sell a "room type" without choosing a specific room? Yes. Such a reservation stays unassigned and holds a quota for that type on the date, and the room is picked at check-in — manually or automatically. ### What parts of the hotel contour do not work on the Russian brand? The PMS, room reservations, guest cards, nightly charges, iCal exchange and financial dashboards support both services. Check payment-provider and external-channel availability separately. --- ## Related articles - [First day: choose your business type](/en/docs/first-day) — the common frame and the other formats - [Hotel: rooms, PMS and guest service](/en/docs/hotel) — the full guide to the vertical - [Floor plan](/en/docs/tables) — the editor for floors and rooms, QR attachment - [Table reservations](/en/docs/reservations) — the same booking mechanism applied to tables - [QR menu](/en/docs/qr-menu) — the menu for room service - [POS](/en/docs/pos) — the room bill on the till and extra orders - [Staff and shifts](/en/docs/staff) — front desk, housekeeping, cleaning tasks --- # First day: online store An online store on the platform is a location's storefront that behaves like a shop rather than a menu: a catalog with variants, faceted filters, a product page, a cart, checkout with coupons and taxes, delivery and payment collection. The **"Online store"** business type is chosen at sign-up or changed later in the location settings. | Format | Where day one starts | What to look at first | |---|---|---| | **A catalog from a file or another store** | Import the catalog → check the storefront → domain | Card completeness, duplicates, category trees | | **Online only / dropshipping** | Storefront → payment → carrier | Shipping and payment methods, order rules | | **Selling through feeds and marketplaces** | A complete catalog → feeds into ad accounts | Photo, price, barcode (GTIN), product URL | **What is on from the start:** the catalog, "Websites" (the storefront and its design), inventory, couriers, customers, staff, finance, "Commerce", "Shipments" and "Returns". The till for an online store is **off by default** — if you switch it on, it looks its own way rather than "like a restaurant's"; tables, the kitchen display and "Devices" are off too. The "Shipments" and "Returns" sections exist only for a store and an online store — food venues do not have them at all. --- ## What you need to get started An online store needs no hardware on day one — it needs a computer and a catalog. - **Any computer** to work in the panel. The storefront lives on the customer's phone; they do not install an app. - **A file with your products** — Excel, CSV, a PDF price list, price-list photos or a link to a site that already has your catalog. - **Product photos.** If you have none, the card can be completed by AI: a product shot on a white background is generated from the name, and the description and tags come from the ✨ button in the card editor. - **Payment credentials** — access to your country's payment provider account if you want to accept online payments on day one. Otherwise start with "pay on collection". - **A printer** — only once shipments appear: carrier labels and the handover register print on an ordinary printer. A receipt printer and a fiscal printer are needed if the store also has an offline counter — then see [First day: retail store](/en/docs/getting-started-retail). --- ## The common frame of the first day The common steps (sign-up, location, business type, languages, subscription, help) are described in the hub [First day: choose your business type](/en/docs/first-day). What follows is specific to selling online. 1. **Check the location's business type.** "Online store" switches the storefront into shop mode: a catalog and product pages like `/product/name` instead of a conversational menu, and product markup for search engines instead of a restaurant menu. 2. **Load the catalog by import** (see the checklists below) — there is no need to type cards in by hand. 3. **Look at the storefront as a customer.** Open it on a phone: categories, photos, prices, filters, search, the product page, the cart. What the customer sees is the source of truth for orders and shipments. 4. **Set up "Commerce"** (`/commerce`): shipping methods, tax rules, coupons. An empty tax table is pre-filled from the preset of the location's country — but it only takes effect after you press "Save". 5. **Walk the whole customer path yourself** — from the product page to payment and the order email. That is the only check that catches a forgotten shipping method or tax. ⚠️ If you chose the **light mode** at sign-up, some sections are switched off. Exactly which ones is listed on the "Currently off" screen in the [app store](/en/docs/app-store). --- ## Checklist: a catalog from a file or another store The goal of day one is to move your range without typing and without breeding duplicates. 1. **Choose the import path.** A plain **CSV in a Shopify-compatible schema** (one row = one variant; the variant id is deterministic, so a repeat upload does not create duplicates, and an unmapped column does not wipe a field); an **AI import** from Excel, Word, PDF or price-list photos; or a **site crawl** — "the whole catalog by sitemap" (up to 20,000 items, with an ETA and a "Stop the crawl" button) or a single listing page. There is a toggle for transferring photos. 2. **Review the plan before committing.** The AI import shows the items with checkboxes: you can edit the name, price and category inline, duplicates against the current catalog and inside the import itself are flagged, and category trees are created from paths like "Clothing > Men > Shirts". 3. **Moving from an existing store** — the [Migrate to us](/en/docs/migrate) wizard: an InSales or Shopify export, plus a separate "Stock" track (the dictionary and a goods receipt with purchase prices). There are no direct connectors into other admin panels — we work from exports. 4. **Variants and characteristics.** The "Colour / Size / Material" axes give every combination its own SKU with its own price, barcode and stock; the attributes for faceted filters come from the characteristics dictionary with its AI wizard: [Product characteristics](/en/docs/product-features). 5. **Categories and collections** — categories are the structure, [collections](/en/docs/collections) are storefront groups for marketing. 6. **Catalog export** into the same CSV — in case you want to keep the price list in an external file. **Devices you need:** a computer only. **What can honestly wait:** characteristics across the whole catalog (start with the one category you will filter by), editorial blocks on the cards, your own domain. ## Checklist: online only and dropshipping The goal of day one is for an order to be payable and handed over to a carrier. 1. **Storefront design** — the "Websites" section (`/websites`): a live visual editor for the design (logo, cover, colours, font), the location's WEB settings, the site's articles and pages. 2. **Shipping methods** — "Commerce" → "Shipping": pickup, a flat rate, free above a threshold, local delivery by radius from the warehouse, zone-based rates, carrier adapters (their rate is computed by the carrier itself). The first block of that tab holds the map zones of your own courier delivery: if the buyer's address falls inside a zone, the zone sets the price, not the methods from the list. 3. **Carriers and their credentials** — the "Carriers" dialog in the shipments queue or in the location's WEB settings: cards for the carriers of the location's country (CDEK, Russian Post, Yandex Delivery, 5Post, ApiShip, Trackings.GE, Exline, Kazpost, Nova Poshta), sender fields, private credentials and a "Test connection" button — the answer is honestly marked as live or as a sandbox. 4. **Payment** — [Payments](/en/docs/payments): hosted payment by a provider for your country (Stripe, PayPal, Square, Airwallex, PayTabs, iyzico, BOG and TBC in Georgia) or payment on collection. ⚠️ Eight of the 76 providers in the registry are live — check that yours is there before you announce the store. 5. **Order rules** — minimum, step and maximum quantity per item, personalisation fields (engraving, an inscription), a blocklist and a cap on unpaid orders, a "storefront closed" mode with your own text: [Online store](/en/docs/shop). 6. **Customer notifications** — the order email and the tracking email go out automatically; a tracking number can be entered by hand if the delivery does not go through our engine. 7. **Stock accounting is optional.** Dropshipping does not need it: items without stock accounting are sold without an availability check. If you do need it — [Inventory](/en/docs/inventory). **Devices you need:** a computer; a printer once labels appear. **What can honestly wait:** the customer account and the wishlist, gift cards, the affiliate programme. ## Checklist: selling through feeds and marketplaces The goal of day one is to understand what exactly will travel into the ad account — and to keep empty cards out of it. 1. **Card completeness comes first.** The feed carries the name, description, photo, price, availability, brand, barcode (GTIN) and category. A product without a photo and a price will be rejected by the platform — the completeness indicator in the editor shows what is missing. 2. **Connect the feed with a card in the app store.** The platform generates a public feed itself and refreshes it whenever a card is edited; you paste the link into the ad account once: [Google Merchant Center](/en/docs/google-feed), [Yandex Products](/en/docs/yandex-goods), [Meta](/en/docs/meta-feed), [Criteo](/en/docs/criteo-feed), [Pinterest](/en/docs/pinterest-feed), [Microsoft](/en/docs/microsoft-feed), [TikTok](/en/docs/tiktok-feed). 3. **Mind the country limits on the cards.** The Google card is hidden if no location in the account is on a Google market (the extension is unavailable in Russia, Cuba, Iran, North Korea and Syria); the Yandex Products card is shown only to accounts with locations in Russia. 4. **Remember that a feed is not a marketplace.** There are no orders inside Google, Yandex or Meta: the customer follows the link to your storefront and orders there. So the storefront, payment and delivery must be ready **before** you launch a feed. 5. **SEO and a domain** — so that a click from the feed lands on a decent address: [Custom domain](/en/docs/custom-domain), [SEO and storefront promotion](/en/docs/seo). 6. **Marketplaces as an order channel.** The app store holds a catalog of the world's product marketplaces — it answers the question "who will accept a seller in my country and under which exchange model". There is currently no live connection that brings a marketplace order into your panel, so plan your sales around your own storefront. **Devices you need:** a computer only. **What can honestly wait:** everything except one feed. Start with the platform where you already buy advertising. --- ## What can wait - **Your own domain** — [Custom domain](/en/docs/custom-domain): the storefront works on the brand domain straight away. - **The customer account, the wishlist, "notify me when back in stock"** — switch them on later; the value appears with repeat purchases. - **Gift cards and coupons** — [Commerce](/en/docs/commerce): needed for your first sale, not your first order. - **The affiliate programme and referral links** — in the same section. - **Popups and abandoned carts** — [My website](/en/docs/site-widgets). Lifecycle campaigns and abandoned-cart recovery support both services. Enable the relevant campaign and check customer consent and contact details; this does not imply parity for advertising or content autopilots. - **RMA returns** — [Returns and exchanges](/en/docs/returns): not needed on day one, but the setup takes minutes. - **Reviews, reputation and newsletters** — once the first orders are fulfilled. --- ## Limitations worth knowing up front The online store vertical works, but it has honest loose ends — plan around them. - **There are no stock reservations.** Two customers can order the last item at the same time: the server will not let them pay for what is gone (and will show which lines fell short), but it cannot "hold" an item during checkout. - **On `cenaly.ru` there is effectively no online payment.** YooKassa is implemented but not connected; the customer pays on collection or through the acquiring bank's link. - **`/returns` (RMA) are unavailable on `cenaly.ru`** — the section is hidden and the storefront has no "request a return" button. A till refund and an order cancellation do not depend on it. - **Not every carrier prints labels** — only CDEK, Trackings.GE and Exline; for the rest the adapter only quotes a rate and you take the label from the carrier's own account. - **The shipments queue is built from the last 300 rows** — when it is truncated, a note is printed under the list. - **Store Studio opens only for locations of the "Retail" type.** An online store is designed with the visual editor and the WEB settings in the "Websites" section. - **There is no bulk catalog editor and no product analytics yet** — edits go card by card or through a repeat CSV import. --- ## Troubleshooting **The products loaded but the storefront is empty.** Check that storefront publishing is on in the location settings, that the products are published (the `Published` column in CSV) and that the categories contain products. **The customer cannot place an order.** Most likely no shipping method is set, or the "storefront closed" mode is on — both live in "Commerce" and in the storefront settings. **The checkout total does not match the catalog.** The line price is computed on the server: if the catalog changed, the customer is returned to the cart with a new total. Check whether the price changed during checkout. **Payment does not start although the item is "in stock".** Before payment the server compares the cart against stock and shows which lines fell short. Check the stock levels in [Inventory](/en/docs/inventory). **The feed is connected but the platform rejects the products.** The usual causes are a missing photo, a missing price, a missing GTIN, or a link to an unreachable page. See the requirements section in your feed's own article. **The order went to the carrier but there is no tracking number.** Not every adapter can print a label (see the limitations) — enter the tracking number by hand in the "Shipment" block of the order card. --- ## FAQ ### Do I need a separate account if I already have an offline store? No. The business type is a property of the location: the offline location can be "Retail" while online sales run from the same or a separate location in the same account. ### Can I move a catalog from another website? Yes, the AI import can crawl a site by its sitemap or parse a listing page. Only move your own data and your own photos — someone else's catalog and photos must not be copied. ### Is a product in five colours five products? Whichever suits you. Variants of one product (the "Colour/Size" axes) live in a single card, while separate colour cards are shown on the storefront as swatch circles that swap the photo and the price on click. ### Do I have to accept online payments? No. "Pay on collection" always works; online payment is connected through your country's provider when you are ready. ### Does semantic search work on a small catalog? Yes. In a store, semantic search and the AI shopping assistant are on regardless of catalog size. ### What happens to orders if the connection drops? The storefront and checkout live in the cloud: the customer simply cannot place an order until the connection is back. Only the till works offline — see [If the internet goes down](/en/docs/offline). --- ## Related articles - [First day: choose your business type](/en/docs/first-day) — the common steps and the other formats - [Online store: storefront and sales](/en/docs/shop) — catalog, facets, product page and checkout in full - [Commerce](/en/docs/commerce) — coupons, shipping, taxes, gift cards, affiliates - [AI catalog import](/en/docs/catalog-import) — a price list from Excel, PDF, a photo or a website - [Migrate to us](/en/docs/migrate) — exports from InSales, Shopify and other systems - [Returns and exchanges (RMA)](/en/docs/returns) — the customer's request, the decision, the money - [SEO and storefront promotion](/en/docs/seo) · [Custom domain](/en/docs/custom-domain) - [First day: retail store](/en/docs/getting-started-retail) — if you also have a counter --- # First day: pickup point A pickup point is a separate operating model: the entity here is not an order but a **parcel**, and it has its own path — "announced → received → sitting in a cell → handed out or returned". The **"Pickup point"** 📦 business type is chosen at sign-up: the onboarding does not ask about menus or kitchens, and the **"Parcels"** section (`/parcels`) is open from the start, without switching anything on in the app store. The section is six tabs: **Receiving · Storage · Handover · Returns · Carriers · Settlements**. | Format | What you set up on day one | What to look at first | |---|---|---| | **A single-carrier pickup point** | One carrier, a storage period, the cell layout | Receiving a batch and the first handover | | **Multi-carrier** | Several carriers, each with its own handover rules and fee | The default carrier and the settlements per carrier | | **A pickup point inside a store** | Parcels plus the store's catalog, stock and storefront | Keeping transit money apart from revenue | **What is on from the start:** "Parcels", the till in counter mode (pay right away), "Hardware" (scanner, printer, terminal — the core of pickup point operations), staff and finance. Inventory, the kitchen display, tables, couriers and the marketplace are off: the store sections, if you need them, are switched on in the [app store](/en/docs/app-store). The wording changes too: a "place" is a cell, a "place group" is a rack, and a "guest" is a recipient. --- ## What you need to get started - **A computer or tablet** for receiving and handover — the section runs in a browser. The till (needed for cash on delivery) is the same `/pos` web page. - **A barcode scanner** — the main tool of a pickup point. Any USB or Bluetooth scanner in "keyboard" mode will do: you scan tracking numbers when receiving, cells during stocktaking and the parcel itself at handover. - **A printer for cell labels** — an ordinary one or a thermal printer through the [bridge](/en/docs/hardware-bridge). Labels are printed once receiving is closed. - **A receipt printer or a fiscal printer** — if you accept cash on delivery and your country requires a receipt. It connects through the same bridge; what is supported by country is in [Fiscalisation](/en/docs/fiscal). - **A card terminal** — if you accept cash on delivery by card: the bridge's terminal charges the amount, or the payment is confirmed manually. - **Racks with sensible numbering.** The cell layout in the system mirrors the physical one: rack → shelf → position (a code like `A-2-05`). Label the shelves before your first receiving — relabelling later costs more. --- ## The common frame of the first day The common steps (sign-up, location, business type, languages, subscription, help) are described in the hub [First day: choose your business type](/en/docs/first-day). For a pickup point the order is this: 1. **Fill in the location's address.** Without an address with coordinates the location cannot be published in the Cenaly pickup network, and the recipient will not see where to go. 2. **Add a carrier** — the "Carriers" tab: name, type (CDEK, Post, 5Post, Yandex, Boxberry, Ozon, WB, Cenaly or custom), storage period, whether cash on delivery is allowed, whether an ID is required at handover, your fee per parcel and percentage of COD, and the **agency scheme** (agent, commission agent or payment agent — it determines how the money is accounted for). 3. **Draw the cells** — in the same tab, the layout editor: the number of racks, shelves and cells per shelf. On receiving, a cell is assigned automatically — the first free one. 4. **Run a trial receiving and a trial handover** on one real parcel. That is the only check that catches both an unlabelled shelf and the wrong scanner mode. 5. **Open a cash shift** — [Cash shift](/en/docs/cash-shift). Cash on delivery cannot be accepted without an open shift: the handover screen will offer to open one. --- ## Checklist: a single-carrier pickup point The goal of day one is to receive the delivered batch and hand out the first parcel without holding up the queue. 1. **The source of arrivals.** Decide how parcels get into the system: **importing the carrier's manifest** (CSV/XLSX, the columns are guessed automatically, there is a CDEK preset) or **receiving by scan** — an unannounced parcel is created by the system itself, and the missing data (phone, amount, sender) is filled in later on the card in the "Storage" tab. 2. **Receiving a batch** — the "Receiving" tab: you scan the tracking numbers and the matches are highlighted. On completion a **receiving report** is produced, broken down into "matched / created on the spot / did not arrive / skipped", and cell labels are printed. 3. **The handover rule.** The carrier record defines recipient verification: checking an ID, the code from the waybill, a one-time code by SMS or email, or no check. An ID requirement overrides the other rules. 4. **Handover** — the "Handover" tab: search by tracking number or by **exactly the last four digits** of the phone number, verification, and a control scan of the parcel out of the cell (skipping the scan is possible only deliberately, with a confirmation, and it stays in the parcel's log). 5. **Cash on delivery** — cash with change calculation, a card through the bridge's terminal, or a split between both. The receipt is issued with an agent flag: the goods supplier is the sending online shop, not your point. If the till cannot handle agency fields, the handover can still go through — you mark "receipt issued on an external till". 6. **Storage periods and reminders.** The period is set on the carrier; the recipient gets a reminder in advance, and once the period expires the parcel moves to "to be returned" by itself. 7. **Returning to the carrier** — the "Returns" tab: one button builds a register of everything awaiting return; printing the register moves those parcels to "returned". **Devices you need:** a PC or tablet, a scanner, a label printer; a till with a receipt printer if there is cash on delivery. **What can honestly wait:** publishing in the Cenaly pickup network, API keys for shops, settlements (they are computed for you and matter at month's end). ## Checklist: multi-carrier The goal of day one is to keep one carrier's rules from being applied to another carrier's parcels. 1. **Add every carrier** as a separate record: each has its own storage period, ID requirement, cash-on-delivery permission and fee. The agency scheme is also set per carrier. 2. **The default carrier** is the one a parcel scanned "outside a manifest" will be created under. Choose deliberately: this is the most common source of confusion at the start. 3. **The cells are shared.** There is one cell layout per location, and parcels from different carriers sit in the same pool; the "Storage" tab has a carrier filter. 4. **Handing out "everything at once".** If a recipient has several parcels, the screen shows them together (siblings) and offers to hand out all the prepaid ones with one button — even if they are from different carriers. 5. **Settlements** — the "Settlements" tab: month by month and carrier by carrier, parcels handed out, cash on delivery collected, your fee and the amount payable; CSV export. The split of cash on delivery into cash and card lives in the cash shift report. 6. **Stocktaking** — a full scan of the cells: it shows what was found, what is missing and what is extra. Missing parcels are marked as lost row by row with the button on each row, or all at once with the "Mark all missing as lost (N)" button and a single confirmation. 7. **Staff and roles** — [Staff and shifts](/en/docs/staff): a handover operator does not need access to settlements or carrier settings. **Devices you need:** the same as for a single carrier. **What can honestly wait:** fine-tuning roles (on day one the owner usually works the counter), custom carrier types beyond the built-in list. ## Checklist: a pickup point inside a store The goal of day one is to keep parcels and store goods from mixing in one till. 1. **Parcels as the main contour** — the "Parcels" section is already open; the carrier and cell setup is the same as above. 2. **Switch on the store sections** in the [app store](/en/docs/app-store): catalog, inventory, storefront. Their checklist is [First day: retail store](/en/docs/getting-started-retail). 3. **One till, two kinds of money.** Cash on delivery is **transit money**: it belongs to the sender minus your fee, and in the shift's X/Z report it is counted on a separate line without mixing with the store's revenue. At the same time the cash that physically landed in the drawer is included in the expected till balance — [Cash shift](/en/docs/cash-shift). 4. **A quick jump to handover.** For a pickup point the till header carries a "Go to handover" button — the cashier does not hunt for the section. 5. **The Cenaly pickup network** — the "Carriers" tab: a toggle to publish the location, permission for cash on delivery, the point's code. Once published, orders from platform shops with "deliver to your pickup point" arrive on their own, with no file and no scan. 6. **API announcements** — if parcels are announced by your own online shop or a partner, issue them an API key on the same tab (it is shown once). **Devices you need:** the store's till kit plus a scanner and a label printer for parcels. **What can honestly wait:** the online storefront and the store's feeds — get handover running first, it brings the footfall. --- ## What can wait - **Publishing in the Cenaly pickup network** — once receiving and handover are running smoothly. - **API keys for principal shops** — needed only by those who announce parcels programmatically. - **Custom wording for recipient notifications** — the basic arrival notice, the storage reminder and the handover message work out of the box. - **The location's finance and statistics** — there is nothing to count without a history of handovers. - **Staff with their own logins** — [Staff and shifts](/en/docs/staff): on day one the owner usually works alone. --- ## Limitations worth knowing up front The vertical works, but it has honest loose ends — plan around them. - **There is no partial handover.** A parcel is handed out or returned only in full: trying items on and buying part of the contents is not supported. - **We have no ready-made connections into carriers' internal systems.** Parcels are created by importing a manifest, by scanning, or by an announcement through our API — the reverse direction (us reading the carrier's system) is not implemented. - **This does not replace the Wildberries, Ozon and Yandex Market apps.** Those platforms run closed partner networks with their own software and their own fiscalisation — our till takes no part in those settlements. - **Statuses after a stocktake are changed by the operator, not by the system.** Missing parcels can be marked as lost row by row or all at once, but the server never reclassifies anything from the stocktake by itself — it stays a deliberate, confirmed action. - **The return register is also the handover record.** There is no separate "the courier collected it" step: printing the register moves the parcels to "returned". --- ## Troubleshooting **The scanner does not find the parcel when receiving.** Check the scanner mode (it must act as a keyboard) and that the cursor is in the scan field. If the tracking number is not in the manifest, that is normal: the system will create the parcel under the default carrier and mark it as unannounced. **The system will not give up a cell when reassigning.** It will not release an occupied cell — free it first or pick a vacant one on the occupancy map. **The recipient is not getting the one-time code.** The code goes by SMS or to the email recorded on the parcel card: check whether the contact is filled in (for parcels created by scan it is often empty). Resending is available after a timeout. **Cash on delivery cannot be accepted.** No cash shift is open — the handover screen will offer to open one, see [Cash shift](/en/docs/cash-shift). **The till will not print an agency receipt.** The screen honestly warns that the till cannot handle agency fields. The handover can still go through if you mark "receipt issued on an external till" — the parcel's log keeps the record that fiscalisation was external. **The recipient cannot check the parcel status.** The public tracking page asks for the tracking number and **exactly the last four digits** of the phone number — if the phone is not filled in on the card, the check will fail. --- ## FAQ ### Do I need an integration with a courier company to start? No. Importing a manifest or receiving by scan is enough. If the sender is willing to announce parcels themselves, issue them an API key — then the parcels appear automatically. ### Is cash on delivery my revenue? No. It is the sender's transit money: in the shift report and in finance it is kept apart from the location's sales, and your fee is calculated on the "Settlements" tab. ### What if the recipient never comes? Once the storage period set on the carrier expires, the parcel moves to "to be returned" by itself, and the recipient gets a reminder in advance. After that you build a return register. ### Can I hand out one parcel out of several? Yes, parcels are handed out one by one, and all prepaid ones can be handed out with a single button. But part of the contents of one parcel cannot be handed out. ### Can a pickup point and a store share one location? Yes — see the third checklist. Cash on delivery and the store's revenue are not mixed in the reports. ### Is a fiscal printer mandatory? It depends on the country and on whether you accept cash on delivery. If a receipt is required, it connects through the bridge; see [Fiscalisation](/en/docs/fiscal). --- ## Related articles - [First day: choose your business type](/en/docs/first-day) — the common steps and the other formats - [Pickup point](/en/docs/pickup-point) — the whole "Parcels" section tab by tab - [Cash shift and Z-report](/en/docs/cash-shift) — where cash on delivery is kept apart from revenue - [Hardware (bridge)](/en/docs/hardware-bridge) — scanner, label printer, terminal, fiscal printer - [Staff and shifts](/en/docs/staff) — roles for handover operators - [First day: retail store](/en/docs/getting-started-retail) — if the point also sells goods --- # First day: services and B2B In a service business a client arrives along one of two paths: they either **book a time** (a studio, a tutor, a workshop, a service centre) or **leave a request**, after which come the conversation, the quote and the invoice (an agency, lawyers, accountants, consulting, contracting). Which path is your main one decides both the business type and the first-day checklist. | Format | Business type | Client path | What is on from the start | |---|---|---|---| | **Booking a service** (studio, tutor, service centre, massage) | appointment services | service → free slot → visit | Appointments, staff, finance, clients | | **B2B and professional services** (agency, lawyers, accountants, contracting) | professional services | request → lead → invoice → closing documents | Staff, finance, clients, documents, websites | Appointments and B2B share platform modules. Booking has its own model for specialists, rooms, equipment, series and multi-service visits; B2B combines counterparties, documents and settlements. Clinics use the administrative Clinic preset, while recurring student groups use Education. Repair work orders and hourly project billing remain separate limitations below. > "Appointment services" speaks in neutral words — "office" and "branch" instead of "chair" and "zone" — while "professional services" has the appointment book switched off: what they need is not a slot but a request. --- ## What you need to get started - **Any computer with a browser.** Both the appointment book and a counterparty card with an invoice are ordinary admin-panel pages. Nothing to install. - **The client's phone** — if you take online bookings or website requests: both booking and forms open in a browser. - **Your own website is not required.** A location has a public page on a subdomain; if you already have a site, the widgets go on it with a single line of code — [My website](/en/docs/site-widgets). - **A till and a printer — optional.** If you take payment on site, the POS is a `/pos` page in the browser ([POS](/en/docs/pos)) and printing goes through the [Cenaly Hardware Bridge](/en/docs/hardware-bridge). For both service business types the **till is off by default** — switch it on in the [App Store](/en/docs/app-store). - **Online card payments — only for specific jobs**: a deposit at online booking and paying an invoice by link. A deposit requirement is shown to the client only when a live payment provider is connected for the country and currency of the location — [Payments](/en/docs/payments). --- ## The common frame of the first day Sign-up, the location, the business type, languages and the subscription are the same for every format — they are described in the hub [First day: choose your business type](/en/docs/first-day). Then pick your checklist. --- ## Checklist: booking a service For a studio, a tutor, a workshop, a service centre — anyone whose client occupies a specialist's or a room's time. The working screen is **Admin panel → Appointments** (`admin.cenaly.com/appointments`). 1. **Services in the catalog.** Name, price and **duration** — the duration is filled into the appointment. The same card holds the buffer after the visit, how many clients the service takes at once (group classes), which specialists may perform it, its own deposit rule and "repeat after N days". Without at least one service item online booking is not shown. 2. **Specialists and resources.** Add specialists to [Staff](/en/docs/staff), with services and working hours; a login is optional. Create rooms and equipment separately as booking resources, then specify each service's resource requirements. Booking checks the specialist, room and equipment together. 3. **Schedules.** Weekly schedule, daily breaks, holiday and sick leave, one-off days for a specific date (a day off or special hours). A one-off day overrides the weekly schedule. 4. **Booking hours.** The gear icon in the book → "Appointment settings": the frame of hours for the whole location at once. 5. **The first appointment by hand** and a walk through the statuses: new → confirmed → "in the chair" → completed, plus cancelled and no-show. Visit marks become available no earlier than 15 minutes before the start. 6. **Online booking.** On your storefront, with a widget on your website and in the location's Telegram bot. The widget accepts a preselected service and specialist — that is how you get a landing link for a specific offering. All appointments flow into one book; those from a website carry a badge. 7. **Reminders.** Telegram: confirmation and reminders 24 and 2 hours ahead with "I'll come" and "Cancel" buttons; e-mail: a confirmation letter with a "Manage appointment" link (rescheduling and cancelling without a password or an app). Details — [Appointment book](/en/docs/appointments). 8. **All requests in one list.** The **"Requests"** section (`admin.cenaly.com/leads`) collects online bookings, callbacks, website form submissions and pop-up answers into a single stream — with a period, search, an "unprocessed only" filter and a CSV export. The section is **read-only**: the status is changed in the source section, there is no second truth about it. The same panel also lives as the "Requests" tab of the contact centre — [Chat with guests](/en/docs/chat). 9. **Clients.** A client card with visit history and a "Repeat the previous appointment" link — [Clients](/en/docs/customers). For "appointment services" the directory is on from the start. 10. **Memberships** — service packages: N visits, a prepaid wallet or a subscription with recurring top-ups. The "🎟️ Memberships" button in the book. **What you need in terms of devices:** a computer or a tablet. That is all. **What can honestly wait:** till and inventory, financial reports, deposits, campaigns, a custom domain. --- ## Checklist: B2B — request, invoice, documents For an agency, a lawyer, an accountant, a contractor — anyone whose deal lives in correspondence and is closed with documents. The working screen is **Admin panel → Venue → "Companies and invoices"** (`admin.cenaly.com/counterparties`). 1. **Your seller details first.** The **"Seller details"** tab: the legal entity (there can be several), bank accounts, signatories, the letterhead, e-mails and phones. Without this the invoice comes out without your side of the deal. 2. **The first counterparty card.** An individual or an organisation — one card type. The set of registration details and their validation (format, checksums) is filled in **by country**: dedicated profiles exist for Georgia, Russia, Kazakhstan, the United Kingdom, Australia, New Zealand, the UAE, Cyprus, Greece, Spain, Portugal, Croatia, Poland, Romania and Turkey — fifteen in total, plus a fallback for every other country. Bank fields are country-specific too (IBAN, sort code, BSB, settlement account with a bank code). The country is picked from the full directory. 3. **Contacts and an owner.** Contact persons with roles and channels (phone, e-mail, Telegram, WhatsApp) and the "primary" and "document recipient" flags; an account manager from the staff directory with a server-side "Mine" filter. 4. **A catalog of services with prices.** Document lines are taken from the catalog — the price, tax and discount are filled in by the document, not typed by hand. 5. **The first sale.** The **"Sale"** button walks you through: **quote → invoice → closing documents**. Document types and names, the numbering mask, the VAT mode and the amount in words come from the country profile. A finished document: PDF, sending by e-mail, voiding with a reason. 6. **A contract.** A four-step wizard: template → parties and signatories → terms (payment delay, credit limit, prepayment and discount percentages, minimum order, validity) → preview. Then a draft, issuing, a "signed" mark with a scan upload, termination. Active terms are shown as a banner in the card header. 7. **Settlements.** Balance, overdue amount and the oldest due date, the ledger of operations, adding a payment, allocating payments to documents — by queue or precisely to a specific invoice, with a rollback. Location reports: receivables ageing, the payments register, the shipments register — all with a CSV export. 8. **Business documents.** The **"Documents"** section (`admin.cenaly.com/documents`) is the second, non-accounting contour: free-form text documents with page layout, headers, footers and page numbers, spreadsheets "like Excel", uploaded files, a full-text search, templates with substitution, validity dates with reminders and employee acknowledgements. Details — [Documents](/en/docs/documents). 9. **Website and requests.** The public page of the location or your own site with widgets: a contact form, a callback, chat, pop-ups with a form and a quiz — [Website builder](/en/docs/website-builder), [My website](/en/docs/site-widgets), [Callback](/en/docs/callback), [Engagement campaigns](/en/docs/campaigns). All of it flows into "Requests", and each request shows where it came from: the surface, the page, campaign tags, the referral class and the device. 10. **AI parsing of a request.** A pasted e-mail, a call transcript or a PDF turns into a **draft** sale: counterparty, lines from the catalog, terms — with a confidence score per line. The model works only from your own data: anything not found in the catalog and the cards goes to "unrecognised" plus a task for the manager. Issuing a document along this path is impossible — only a draft. 11. **Access.** ⚠️ "Companies and invoices" is an **owner-only** section: an employee with their own login will be refused. Plan for that if sales are not handled by the owner. **What you need in terms of devices:** a computer. A printer only if you print invoices on paper. **What can honestly wait:** bank statements, recurring invoices, dunning, e-invoicing, the till. --- ## What a service business does not have yet A straight list so that you do not look for a button that is not there. | What is missing | What you have instead | |---|---| | Time tracking and hourly billing | a service with a price in the catalog and an invoice after the fact | | Project accounting (projects, phases, project profitability) | tasks on the counterparty card and the shift task board | | A service-centre work order: diagnostics, spare parts, repair statuses | an appointment and documents for the deal | | A status of its own for an entry in "Requests" | the status comes from the source — the reservation, the appointment, the call mark | --- ## What can wait - **Bank statements** — uploading a statement for your settlement account with operation parsing and matching to counterparties; needed once payments become numerous. - **Recurring invoices** — an issuing schedule, a log, a pause; for retainer contracts. - **Reminders and dunning** — a digest, overdue letters, expiring quotes and contracts. - **E-invoicing.** For Russian locations there is document exchange through Saby (SBIS): incoming documents become CRM documents, your own invoice is pushed to Saby, and signing stays there. It is connected with a card in the App Store. - **KSeF** (Polish e-invoices) — Poland only and on the AWS contour only: on `cenaly.ru` the panel is not mounted. - **AI filling of document templates** — works on the AWS contour; on the Russian brand the AI buttons in the document editor are hidden. - **Financial reports** — [Finance](/en/docs/finance). Sales, purchases, cash shifts and demand analytics are supported on both the international and Russian services. Start using them after recording your first transactions; an empty period and a data-loading error are different situations. - **Your own PBX and call recordings** — [Telephony](/en/docs/telephony): a call from a matched number lands in the counterparty card's activity feed by itself. - **A custom domain** — [Custom domain](/en/docs/custom-domain). --- ## Troubleshooting **The Appointments section is missing.** The appointment book is available for Beauty salon, Appointment services and Education. Check the location's business type, section settings and employee permissions. Professional services uses the B2B workflow; choose Appointment services when booking is central to your work. **An employee cannot open "Companies and invoices".** That is intended: the section is available to the account owner only. What remains for an employee is "Requests", "Clients" and "Documents" within their role — [Staff and shifts](/en/docs/staff). **The invoice comes out without seller details.** Fill in the "Seller details" tab: the legal entity, a bank account, a signatory. The details are captured into the document snapshot at the moment of issuing. **Counterparty details are not validated.** That means the chosen country has no profile of its own, and the card falls back to the generic rule: free-form fields, no checksums. **A yellow banner in "Requests" says rows may be missing.** One of the channels did not answer the read (for example, an extension is not connected). That is an honest warning rather than an empty list: requests from the other channels are still there. **AI parsing produced the wrong draft.** The model does not invent: it matches the text against your catalog and your cards. Check that the service exists in the catalog and the counterparty in the directory; anything unrecognised arrives as a task for the manager. --- ## FAQ ### Are services and B2B a separate product? They are business profiles built on shared modules. Appointment services includes specialists, rooms and equipment, while B2B uses counterparties, documents and settlements. A profile does not imply medical records, repair work orders or hourly project billing. ### Can I run both appointments and invoices at once? Yes. The business type only sets defaults: choose "appointment services" and switch on "Documents" and "Companies and invoices" — the latter is on by default for every type anyway. ### Who can issue an invoice? Only the account owner: the "Companies and invoices" section is available to them alone. ### In which countries will the document forms work? Dedicated sets of registration details, document names, numbering masks and VAT modes exist for fifteen countries; for the rest a fallback profile applies — the document will be issued, but without country-specific validation. ### Can an invoice be paid online? Payment by link is supported, and the payment receipt feeds the location's automation. You need a payment provider connected for your country and currency — [Payments](/en/docs/payments). ### Does all of this work on the Russian brand? Appointments, requests, counterparties, documents, settlements, financial reports and lifecycle campaigns support the Russian service. KSeF and AI document-filling options have their own cloud restrictions; check the relevant module before enabling them. --- ## Related articles - [First day: choose your business type](/en/docs/first-day) — the common frame and the other formats - [Appointment book](/en/docs/appointments) — slots, statuses, reminders, memberships - [Clients (CRM)](/en/docs/counterparties) — cards, invoices, contracts, settlements - [Documents](/en/docs/documents) — templates, files and spreadsheets, validity and acknowledgements - [Clients](/en/docs/customers) — the client directory and the history of enquiries - [My website](/en/docs/site-widgets) — forms, chat and callback on your own site - [First day: salon, barbershop, studio](/en/docs/getting-started-beauty) — when booking is the main client path --- # How to get help The panel offers four different routes to an answer, and they do not duplicate each other. Start at the top of the table: the higher the row, the faster the answer. | Where | When it fits | How long you wait | |---|---|---| | **The AI assistant in the panel** | “Where is this setting?”, “what does this toggle do?”, “do I need a receipt in my country?” | Instantly | | **This help centre** | Step-by-step instructions, connecting hardware, diagnosis by symptom | Instantly | | **The section tour and setup wizard** | “I have just signed up and do not know where to start” | Instantly | | **Support (`support@cenaly.com`)** | Something is broken, data went out of sync, a question about an invoice or a plan | A reply by e-mail to the account address | --- ## The AI assistant in the panel The assistant lives on the `/voice` page and as a floating button over any section — the dialogue survives navigation. It does not only execute commands (“put this item on the stop list”, “create an extension number”), it also **answers questions about the system itself**: what a section is, where a setting lives, where your data is stored. Why its answers are more precise than a generic search: - **It knows where you are.** The open section travels with your question (“Context: Menu”), so “where do I switch this on” is answered about your screen. - **It knows your country and business type.** The assistant receives the country and the vertical of each of your locations and tailors the answer: a Russian location gets 54-FZ, a Georgian one gets rs.ge and 18 % VAT. If a location has no country set, it will ask. - **It knows your hardware.** Opened from the POS, the assistant receives a snapshot of the connected equipment — fiscal device model, paper status, an unclosed receipt, printers, scanner, scales, terminal — and explains **your** model even if you did not name it. - **The ✨ spark next to a block heading.** Complex settings carry a micro-button with a spark next to the heading: it opens the assistant with the context of that exact block — what the setting does, what it risks and what it is called in the panel. The assistant can hand you a setting as a link: an address like `?settings=` opens the right setting as a modal over the current window — such a link can be shared with a colleague. ⚠️ The assistant is not a channel to humans. If it cannot carry out a request and it looks like a malfunction, it will **offer by itself** to send a report to the developers, pre-filled with your own words. --- ## Help centre, section tour and setup wizard - **The help centre** is this part of the site. Diagnosis by symptom — [Troubleshooting](/en/docs/troubleshooting), short answers — [FAQ](/en/docs/faq), unfamiliar words — [Glossary](/en/docs/glossary). - **The section tour** and the **setup wizard** are restarted by the buttons in the header of the **Settings** section (`/settings`) — the same screens you saw after signing up. Useful when a new administrator takes the system over. - **First day by business type** — [First day](/en/docs/first-day): what to switch on right away for your format and what can honestly wait. Do not confuse this with the **Support centre** ([help-center](/en/docs/help-center)) — that is your public knowledge base **for guests and customers**, not a channel to us. --- ## Contacting support The request form opens in two ways: 1. **The “🛟 Contact support” button** at the bottom of the AI assistant panel — available from any page. 2. **By voice or text to the assistant**: “contact support”, “help”, “I need help”, “there is a problem”. If you described the malfunction in words (“the button does not work, tell support”), the assistant opens the form with the description already filled in. Then three steps: decide whether to attach diagnostics → describe the problem freely → “Send”. The message goes to **support@cenaly.com**, and the team replies to the **e-mail address in your account** — make sure it is current and check your spam folder. You can also write to **support@cenaly.com** straight from your own mailbox: it is the same address. The form is only more convenient in that it attaches the technical data for you. --- ## What to attach to a request One message with full context saves three rounds of correspondence. | What | Why | Where to find it | |---|---|---| | **Panel domain** | The platform has several brands and two clouds — the domain identifies your contour | The address bar: `admin.cenaly.com`, on the Russian brand `cenaly.ru` | | **Account e-mail** | It is how the account is found | Settings → “Access” | | **Location name** | In a network, locations have different settings | The location selector in the panel header | | **Time of the event** | It is how the logs are searched | The clock plus the time zone, if it differs from the location's | | **What you did, step by step** | Reproducing is half the fix | “I clicked here → expected this → got that” | | **A screenshot or a short video** | Faster than any description | The whole screen, address bar included | | **Order, receipt or booking number** | If the problem is in one specific record | The “Orders”, “Receipts”, “Bookings” sections | | **The “details” line** | The technical reason the hardware refused | The “Receipt not issued” window on the POS — [Fiscalization](/en/docs/fiscal) | | **Hardware model** | Drivers differ between models | The “Hardware” section (`/hardware`), the device card | Before writing, it is worth walking the symptom through [Troubleshooting](/en/docs/troubleshooting): half of all cases are an unopened cash shift, an offline bridge or a storefront cache — and the answer is already there. --- ## What data goes with a request The form asks for consent explicitly, and declining breaks nothing. | Mode | What is sent | |---|---| | **With diagnostics** | Page URL, browser type and version, screen resolution, time, cookie **names** (without values), the number of keys in browser storage | | **“Description only, no data”** | Your text, the page URL and the time it was sent | **Passwords and access tokens are never transmitted** — in either mode. You do not need to send logins and passwords in the message either: support has a separate mechanism — you switch on “Support access” in the settings and revoke it when the question is closed (see [Security and data](/en/docs/security-privacy)). --- ## Reporting a vulnerability Vulnerability reports go to a **separate mailbox, not to general support**: write to **`security@cenaly.com`** — it accepts mail from any brand; the same `security@` mailboxes on brand domains (`security@cenaly.com`, `security@cenaly.ru`, `security@masamenu.tr`) are being connected. The address is read by the team responsible for platform security. Include the page URL, the steps to reproduce and what you were able to obtain; add the time and the brand. Please do not publish details before we reply and do not pull other people's data to “check the scale”. ⚠️ Do not confuse this with an incident **inside your own account** (a leaked password, someone signed in, suspicious orders): that is an ordinary support request, and the step-by-step order of actions is in [Security and data](/en/docs/security-privacy). How data access is arranged and who can see it is covered in the same article. --- ## Implementation partners If you need not “explain it” but “do it for us” — set up the menu and inventory, marry the POS to the hardware, train the shift — that is the work of an implementation partner. - **Finding a partner.** Partners work in their own countries and verticals; write to support with your format and country and we will say whether there is a partner nearby. - **Attaching a partner to your account.** The “Partner” block on the **Subscription** page (`/subscription`): by the partner's code or link. After that they manage your account as a client. - **A partner can sign into your account only with your consent** — through the same support-session mechanism our own team uses. - **Becoming a partner yourself** (you have already automated your own business and now set it up for colleagues) — [Partner program](/en/docs/partner-program): the `/partners` section is switched on in the app store, then comes the application and the terms in the cabinet. --- ## What support does not do Honest boundaries, so you do not wait in vain: - **It does not keep your books.** Entering stock, building recipes, reconciling a bank statement, closing a shift — that is work inside your business. We explain how, and we fix the tool if it is broken. - **It does not give legal or tax advice.** Whether a receipt is mandatory, which VAT rate applies, how to register a till — questions for your accountant and your tax office. What the platform knows is collected in the help centre: [Fiscalization](/en/docs/fiscal), [Who needs an online till](/en/docs/kkt-who-needs) (Russia), [rs.ge](/en/docs/rsge) (Georgia), [Legal documents](/en/docs/legal-docs), [Cookie consent](/en/docs/cookie-consent). - **It does not restore deleted data out of thin air.** Export is your tool: [Data export](/en/docs/data-export) — an archive can be built at any moment and is kept for 7 days. - **It does not configure your router, DNS and venue network.** We tell you which record is needed and which port must be open; changing it at your provider is for you or your administrator: [Custom domain](/en/docs/custom-domain), [SIP phones](/en/docs/sip-phones). - **It does not open partner connections for you.** Contracts with a payment provider or a delivery platform are signed by the business, not by us. --- ## Related articles - [Troubleshooting](/en/docs/troubleshooting) — diagnosis by symptom: “check 1-2-3” and where to go next - [FAQ](/en/docs/faq) — short answers about plans, countries, devices and data - [Account and sign-in](/en/docs/account) — registration, password recovery, QR sign-in, support sessions - [Security and data](/en/docs/security-privacy) — where data lives, who sees it, how to revoke access, what to do after a leak - [Account and location settings](/en/docs/settings) — where the tour and the setup wizard are started - [First day](/en/docs/first-day) — launch checklists by business type - [Glossary](/en/docs/glossary) — what the words in the panel mean - [Partner program](/en/docs/partner-program) — implementation partners and the partner cabinet - [If the internet goes down](/en/docs/offline) — what works without a connection and what the shift should do --- # Account and sign-in An account is the business owner and everything that belongs to them: locations, catalogue, orders, staff, subscription. There is **one account per business**, no matter how many locations it holds (see [Multi-location](/en/docs/multi-location)), and people get in differently: the owner with their e-mail, staff with their own logins or a PIN at the till, tablets and screens with a device code. --- ## What you need to get started - **A working e-mail and access to that mailbox.** The confirmation code, password recovery letters and the account handover letter all go there. - **A browser.** Sign-up and sign-in live at `admin.cenaly.com/register` and `admin.cenaly.com/login`. - **A password of at least 8 characters.** On reset and change its strength is checked: an upper-case and a lower-case letter, a digit, a special character. - Nothing else: no phone number, no card and no app are needed to register. --- ## Registration | Method | Where | Where it works | |---|---|---| | **E-mail and password** | `/register` | On every brand | | **Google** | Button above the form | cenaly.com, cenaly.com | | **Facebook** | Button above the form | cenaly.com, cenaly.com | | **VK ID, Mail, Odnoklassniki, Yandex ID, Sber ID, Gosuslugi** | Buttons above the form | Only on cenaly.ru | | **A printed QR code** (flyer, sticker) | `/register?code=…` or the camera scanner | cenaly.com, cenaly.com | **E-mail and password.** The password is at least 8 characters with a confirmation field, plus a mandatory checkbox accepting the Terms and the Privacy Policy. On cenaly.com and cenaly.com the address is confirmed by a code from an e-mail (6 digits, the form is right on the page), after which you are signed in automatically. On cenaly.ru there is no code confirmation — the account opens immediately. **Social buttons are both sign-up and sign-in.** An unknown address creates an account, a known one simply signs in; there is no separate "register with Google". **From a printed QR code** you "claim" a code from a flyer or a sticker: you can protect it with a PIN (4 digits) or a password, or deliberately leave it unprotected — there is a separate checkbox that accepts the risk. After a successful claim the system signs you in with that same code. **Acceptance of the documents is recorded.** The date and version of the accepted Terms and Policy are visible later in **Settings → General**, the "Acceptance of legal documents" block. It is read-only: this is evidence, not a setting. --- ## Signing in 1. Open `/login`, type in your e-mail and password. 2. Or press the Google sign-in button — Google renders it itself, and for a returning person it is personalised, with a name and an avatar. 3. Or sign in with a device code — see the section below. Useful details: - **There is no "remember me" checkbox.** The session is kept in the browser and lives until you press "Sign out" in the sidebar or until it is revoked. Signing out in one tab closes the session in all of them. - Someone who is already signed in is quietly moved from the sign-in page into the panel. - At the bottom of the form there are links to the Terms and the Policy: by signing in, you accept them. - **Demo data.** Any panel address with the `?demo` parameter opens a demonstration storefront with ready content; someone who is already signed in stays in their own account. --- ## Password recovery 1. On the sign-in page press "Forgot your password?" — `/forgot-password` opens. 2. Enter the account e-mail. The letter with the code is sent in the language of the page you requested it from. 3. A couple of seconds later `/reset-password` opens with the address already filled in — type the code from the letter and the new password twice. 4. After a successful reset the system takes you back to the sign-in page itself. Requirements for the new password: 8+ characters, an upper-case and a lower-case letter, a digit, a special character. --- ## Sign-in by code and QR Codes are for places where typing a login and a password is inconvenient or unsafe: a menu tablet, an order monitor, a kitchen screen, a till, a shared terminal. | What | How it looks | |---|---| | **Where to create a code** | "QR codes" → the "Devices" tab (`/client-codes?tab=devices`): the code, a sign-in link of the form `/login?code=…`, instructions and a QR image. In detail — [QR codes and device codes](/en/docs/device-codes) | | **How to sign in** | The "Scan QR" button on `/login`, the address `/login?code=…`, or the thin page `/qrlogin?code=…` | | **Protecting a code** | If the code is protected, the system asks for a PIN (4 digits) or a password | | **Codes for the panel itself** | The third tab of the section — "Admin sign-in"; it is open to the owner and to a role that has been given the "Settings" section | | **How to revoke** | Delete the code in the same section — the link stops working | ⚠️ **A code session is deliberately limited.** It does not give full access to the account and may be locked onto a single target page (the order monitor, for example) — so a shared tablet in the dining room does not turn into a full owner sign-in. --- ## Handing the account over to another e-mail Where: **Settings → Access** (`/settings/access`), the e-mail change and account handover block. 1. Enter the new address and confirm the action in the window with the warnings. 2. A letter with a link goes to the new address. 3. The recipient opens `/confirm-email-transfer`, sets their own password and gets access to the account with all its data. The link is one-time and has a limited lifetime: an expired or foreign token shows an error screen — then start the handover again. This is a **handover**, not a copy: the old address loses access. ⚠️ Limitations: on cenaly.ru there is no handover block at all, and anyone who signed in with a QR code cannot change the e-mail. --- ## Support access A support agent **cannot enter your account without your consent** — access is off by default. - It is switched on in **Settings → Support access** (`/settings/support-access`): a consent toggle plus the scope — "view only" or "view and edit". - The same place shows the **history of consents** (when granted, changed, revoked) and the **log of sessions**: the agent's e-mail, the scope, the start and the end, an "active" mark. - **Revoking consent kills the session that is running**, not only the next one. - The agent signs in under their own name, so an intercepted link is useless on its own. - An implementation partner is a separate case with its own rules; they ask for access and you grant it. The details — [Security and data](/en/docs/security-privacy). On cenaly.ru there is no log of support sessions: the circuit has not been ported there yet. --- ## Staff with their own logins There is one account and many people in it. An employee can be given their own sign-in to the panel (e-mail and password), or a 4–6 digit cashier PIN for a shared terminal is enough; a person without a login is a "resource" (a specialist in the appointment book, for example). What they see is decided by the role tier and the job title. The limit is 30 employees per account. Everything about roles, invitations, password resets and deactivation — [Staff and shifts](/en/docs/staff). --- ## Deleting the account There is no "delete account" button in the panel — deletion goes through a request, so that an accidental click does not destroy business data. 1. **Export your data first** — [Data export](/en/docs/data-export). PINs, integration keys and tokens, and passwords are not included in the archive. 2. **Then write to support** from the account owner's address — [How to get help](/en/docs/support). The request is fulfilled within **30 days** of being confirmed. After the deletion there is nothing left to take, so the export comes before the request, not after. --- ## Limitations - **Two-factor sign-in is in preparation** — with an authenticator app (SMS codes are not planned); it is not there yet. Protect the sign-in with a long password and separate staff logins instead of one shared password for everybody; on tablets and shared screens use device codes with a PIN. - **Google and Facebook** only work on the cenaly.com and cenaly.com brands; VK ID, Yandex ID, Sber ID, Gosuslugi, Mail and Odnoklassniki — only on cenaly.ru. - **Registration from a printed QR code** is available on cenaly.com and cenaly.com; signing in with a code works in both clouds. - On cenaly.ru there is no account handover to another e-mail and no log of support sessions. - There is no self-service account deletion in the panel (see above). - One person can work in several accounts with a single password of their own — when you create an employee with an already registered address, connecting the existing user is offered. --- ## Troubleshooting | Symptom | Cause | What to do | |---|---|---| | The confirmation code never arrived | The letter is in spam, or the address has a typo | Check the "Spam" folder, then request the code again; if there is a typo, register again with the correct address | | There is no "Sign in with Google" button | The Google script did not load (blocker, network) | Sign in with your e-mail and password: the fallback button that appears after 3 seconds does not complete the sign-in right now | | The sign-in page hangs | A stale session cache in the browser | Press "Clear cache and retry" on the sign-in page and sign in again | | The sidebar renders, but every section is refused | The session was closed in another tab, or it was revoked | Reload the page and sign in again | | A device code does not let you in | "Code expired" / "invalid code" / "the code exists but is not connected" | For expired and invalid ones create a new code in "QR codes"; an unconnected one will offer registration with it | | The handover link complains | The token is one-time and has a limited lifetime | Start the handover again from **Settings → Access** | | An employee cannot sign in | No "sign-in to the admin panel" checkbox, or they are deactivated | Check their row in `/staff` | --- ## FAQ **Can we work on a tablet without typing a password?** Yes, that is exactly what device codes are for: create a code in "QR codes" → "Devices" and open the sign-in link with it on the tablet. **What happens to the data if I change the e-mail?** Nothing is lost: the whole account moves to the new address. Access from the old address disappears. **I signed in with Google — can I then sign in with a password?** Yes. Set yourself a password in **Settings → Access**; the old password is not asked for in that case, and both methods work afterwards. **How long does a session live?** It renews itself while you use the panel. It is closed by the "Sign out" button in the sidebar — in all browser tabs at once. **Is there sign-in by SMS code or one-time passwords?** No. The sign-in methods are a password, the brand's social provider, and a device code. Two-factor sign-in with an authenticator app is in preparation; we promise no dates, and for now the strength comes from a long password and from every employee having their own login. **How do I take the account back from an administrator who has left?** If they were an employee — deactivate or delete their row in `/staff`. If the account is registered to their address — hand the account over to your own e-mail. **What does a support agent see when I switch access on?** Exactly the scope you chose, and only while the consent is on; every session goes into the log. In more detail — [Security and data](/en/docs/security-privacy). --- ## Related articles - [Account and location settings](/en/docs/settings) — where language, currency, country, access and export live - [Security and data](/en/docs/security-privacy) — where the data is stored and who has access to it - [Staff and shifts](/en/docs/staff) — logins, roles, cashier PINs - [QR codes and device codes](/en/docs/device-codes) — sign-in codes for tablets and screens - [Data export](/en/docs/data-export) — take everything in one archive - [Subscription](/en/docs/subscription) — plan, balance and invoices - [How to get help](/en/docs/support) — where to write if you cannot sign in --- # Account and location settings The **Settings** section (`/settings`) is not "everything you can configure" — it is the hub of account-wide parameters: language and currency, auto-translation languages, access, subscription, export. The settings of a particular location live in its own card, and the settings of a section live in that section, behind the gear in the window header. Below is the map, so that you do not have to guess. --- ## What you need to get started - **Owner rights** for most tabs: access, account handover, export and subscription are owner-level. The "Settings" section can also be granted to a staff role through the role constructor, but it is marked as sensitive — see [Staff and shifts](/en/docs/staff). - **Nothing has to be switched on:** the hub is available in every business type and on every brand. - The open tab is kept in the address, so F5, the browser's "back" button and a link someone sent you all behave as expected. --- ## The tabs one by one | Tab | Address | What is inside | |---|---|---| | **General** | `/settings/general` | Default interface language — limited to the languages your build of the admin panel ships (Cenaly.ru ships Russian only; MENU languages are picked separately in "🌐 Languages", where all 45 are available), currency, country, the free-form "Concept" field (AI features read it as context), and the read-only "Acceptance of legal documents" block | | **Interface** | `/settings?tab=interface` | The look of the panel for yourself: density, text size, how editing windows open, "less motion", reset to standard | | **Status automation** | `/settings/orders` | Auto-cancelling unpaid and auto-completing served orders, scenarios, the customer block list, return and cancellation reasons | | **Languages** | `/settings/languages` | Which auto-translation languages are on — as a sortable list or on an interactive map of countries | | **Subscription** | `/subscription` | Plan, limits, balance, invoice, AI credits — see [Subscription](/en/docs/subscription) | | **Access** | `/settings/access` | Password change, handing the account over to another e-mail, personal API keys for external AI agents | | **Support access** | `/settings/support-access` | Consent for support to sign in and its scope, the history of consents, the log of sessions, sign-in modes for partner firms | | **Personal SIP accounts** | `/settings/sip-accounts` | Your own accounts for the phone in the Cenaly Android apps — tied to your login, not to the company; for company telephony see [Telephony](/en/docs/telephony) | | **Data export** | `/settings/export` | An archive of all account data and a quick catalogue CSV — see [Data export](/en/docs/data-export) | **General settings save themselves**: an edit leaves a second after you stop typing, and immediately if you leave the page or switch the browser tab. The status is shown in the block header as "⏳ / 💾 / ✅ / ❌". ### Interface is a personal setting The "Interface" tab changes the look of the panel **for you only**: nothing changes for other people in the account. | Setting | Options | |---|---| | **Density** | "Spacious" (large targets for a finger, the default) or "Compact" (more rows fit on the screen) | | **Text size** | Smaller / Normal / Larger — the whole panel scales | | **How editing windows open** | "As designed", "Window", "Right panel", "Full screen". An individual window's mode is set by three buttons in its header, and that override wins; windows you set by hand are listed here and can be cleared one by one or all at once | | **Less motion** | Switches off slide-ins and smooth appearances | | **Reset to standard** | Brings back the usual look; the button only appears if you have changed something | ### Status automation is about statuses, not about order conditions The tab holds two fixed rules (cancel unpaid and complete served orders after N hours, from 1 to 168) and a **scenario constructor**: an order event → conditions (amount, order type, source, payment method, channel, number of items) → actions (e-mail, webhook, status change). Up to 5 conditions and 3 actions per rule. Next to them is the customer block list with anti-fraud limits and the register of return and cancellation reasons. ⚠️ **Checkout fields, pickup and delivery are not configured here** but in the location card (`/locations`) — there is a pointer line about that on the tab. --- ## What belongs to the account and what belongs to the location | Level | Examples | Where | |---|---|---| | **Account** — shared by all locations | Default language and currency, country, auto-translation languages, subscription and balance, password and account handover, support access, export | `/settings` | | **Location** — its own for each | The name the guest sees, address and phone, opening hours, taxes, tips and the service fee, delivery and pickup terms, checkout fields, the storefront cookie banner, a narrowed set of languages | `/locations` | | **Personal** — for you only | The look of the panel (density, text size, window mode), "Personal SIP accounts" | `/settings?tab=interface`, `/settings/sip-accounts` | | **Per-location inside the hub** | Status automation and return reasons — with a location selector | `/settings/orders` | If you have several locations, one rule helps: **everything the guest sees is a location setting**; everything about the account and money is an account setting. In more detail — [Multi-location](/en/docs/multi-location). --- ## How to find a setting from a working window You do not have to hunt for a setting through the help centre: the panel follows the rule "**the settings are visible from the window they belong to**". - **The gear on the right side of a window's header** is the single entry point. It shows the settings of exactly what the window displays: the floor plan, cashier permissions, the location's payments, languages, the list's appearance. - Most targets open **as a window on top of the current screen** — you do not have to leave for another section and lose your place. - Such a setting has an **address**: `?settings=` (for example, `/tables?settings=deposits`). The link can be sent to a colleague — their window will open right on the setting you meant. The parameter is one-time: it disappears from the address once it has opened. - If the target page is wider than the setting itself, the transition **highlights the right block** and scrolls to it. --- ## The section tour and the setup wizard The "Settings" header holds two restart buttons: - **The section tour** — a short walk through the panel: what is where and why. - **The setup wizard** — a step-by-step run that brings the account to a working state; the same wizard is offered right after registration. The first steps by business type — [First day](/en/docs/first-day). --- ## Notifications and sounds There is **no** separate "Notifications" section in the settings, and that is not an omission: signals are configured where the events happen. - **A new order** — the sound and browser notifications are switched on in the [Orders](/en/docs/orders) screen; the sound has two modes: play once, or repeat until the order is opened. - **Letters to guests and scenarios** — on the "Status automation" tab (the "send an e-mail" action) and in [Newsletters](/en/docs/newsletter). - **Work messages to the team** (shift publishing, reminders) arrive in the work chat — see [Chat](/en/docs/chat). --- ## Limitations - **Interface is a personal setting.** You cannot set the look of the panel "for the whole team". - **The sidebar composition does not live in settings.** Which sections are shown is decided by the [App Store](/en/docs/app-store); the "Panel profile" tab is gone. - **Plan limits are soft:** going over stops you adding something new (a language, a location) but never switches off what already exists. - **Two tabs are reduced on cenaly.ru:** there is no account handover to another e-mail and no log of support sessions. - **An API key is shown once.** Lost it — revoke it and create a new one. - The "Interface" tab is the only one without its own address: it is reached at `/settings?tab=interface`. --- ## Troubleshooting | Symptom | Cause | What to do | |---|---|---| | A setting did not save — a "❌" in the block header | The request did not get through (network, an expired session) | Repeat the edit; if the mark stays, sign in again — the failure goes to the development team automatically | | I am looking for checkout fields and delivery on the "Status automation" tab | Those are location settings | Open the location card in `/locations` | | A language is added but the storefront does not show it | The location has a narrowed set of languages | Check the languages in the location card; see [QR menu](/en/docs/qr-menu) | | I do not see the account handover block | You are on cenaly.ru or you signed in with a QR code | The handover is unavailable in those cases — see [Account and sign-in](/en/docs/account) | | A new language will not be added | The plan limit has been reached | Remove a language you do not need or change the plan — [Subscription](/en/docs/subscription) | | There is no gear in the window header | This window genuinely has no settings | The account-wide ones are in `/settings`; if you believe a setting should exist, write to [support](/en/docs/support) | --- ## FAQ **Where do I change the password?** **Settings → Access.** Those who sign in with Google will not be asked for the old password. **Can I give an employee access only to the settings of their own location?** Sections are granted to a role as a whole, while the coverage of locations is limited inside the role itself. The full model — [Staff and shifts](/en/docs/staff). **What is the "Concept" field in general settings?** A free-form description of the business. AI features read it: product and dish descriptions, newsletter texts and assistant hints come out more accurate. **What are the API keys on the "Access" tab for?** Keys for an external AI agent or your own program are issued in "Telephony → API & MCP" — see [Telephony](/en/docs/telephony). **I changed the density — why is it still spacious for my colleague?** That is by design: the look of the panel is a personal setting of whoever is signed in. **How do I share a particular setting?** Open it from the window's gear and copy the address: it contains `?settings=` and will open the same setting for your colleague. --- ## Related articles - [Account and sign-in](/en/docs/account) — registration, passwords, device codes, support access - [Security and data](/en/docs/security-privacy) — where the data is stored and who sees it - [Subscription](/en/docs/subscription) — plan, limits, balance and invoices - [Data export](/en/docs/data-export) — an archive of the whole account - [Staff and shifts](/en/docs/staff) — roles and access to sections - [Multi-location](/en/docs/multi-location) — settings for several locations - [App Store](/en/docs/app-store) — which sections are shown in the panel --- # Security and data This page is a reference: where your business data physically sits, who can see it, how that access is revoked, and what to do if something has gone wrong. Instructions about signing in and passwords are in [Account and sign-in](/en/docs/account). --- ## Where the data lives The cloud and the region are determined by the **brand** you registered through — it is not an account setting and it does not change on the fly. | Brand | Cloud | Region | What it means | |---|---|---|---| | **cenaly.com**, **cenaly.com** | AWS | us-east-1 | Account data, media files and the storefront delivery are in the AWS circuit; static content is served worldwide through a CDN | | **cenaly.ru** | Yandex Cloud | Russia | A separate circuit in full, including its own authentication: accounts of the .ru circuit are not created in the American identity provider | | The Turkish brands | AWS | eu-central-1 | A regional copy of the circuit, closer to the market. ⚠️ Honestly: eu-central-1 is Germany, not hosting inside Turkey | What follows from this in practice: - **Accounts of the two circuits are not linked.** An account on cenaly.ru is a separate account with its own data; you cannot "move" an account from one cloud to another — a move means a new account and a data import. - **Some capabilities live in one cloud only.** The cookie scanner, for example, works on the AWS brands, while on cenaly.ru starting a scan answers "not supported" by design — that is not a fault. - **Rarely read heavy media** (call recordings, for instance) is kept in a separate cold archive of the brand — cheaper and in the same circuit; access to a file stays instant. - **Storefront files** (menu, photos, public documents) are public on purpose: the guest's browser reads them without any authorisation. --- ## Who has access | Who | What they see | How to limit or revoke | |---|---|---| | **The account owner** | Everything | Only by handing the account over (`/settings/access`) | | **An employee with a login** | The sections granted to their role and the locations in its coverage | The role constructor in `/staff`, deactivating or deleting the employee | | **An employee with a PIN** | The till, within the permissions of their role | Changing or clearing the PIN in the employee card | | **A device on a code** | One target page (a monitor, a kitchen screen) without full access | Delete the code in "QR codes" → "Devices" | | **A support agent** | Only while consent is on and only within the chosen scope; every session is logged | The toggle in `/settings/support-access`; revoking kills a running session too | | **An implementation partner** | Only on an approved request, for a limited time | The firm's mode in the same section: "never" / "ask every time" / "let view-only through" | | **An external AI agent on an API key** | Whatever the account key allows | Revoke the key in `/settings/access` | ### How partner access works A partner **never enters on their own**. They send a request with a reason, a mode and a duration, and **only the account owner** decides it — not an employee and not our support. The rules that always hold: - the default mode is **view only**; "view and edit" is granted by a separate checkbox in your answer; - the time is limited (an hour by default, two at most), and **one** session is open at a time; - throughout the visit a **purple banner** hangs in the interface with the firm's name, the person's name, the mode and a countdown; - **closed in any mode**: subscription and payments, the owner's data, staff permissions, data export, integrations, mail, calls and telephony, counterparties and documents, the partner program — and the refusal comes from the server, not just from hidden menu items; - an unanswered request expires in 24 hours, and you get a letter about every sign-in; - revoking consent stops the **running** session; - on cenaly.ru partner sign-in does not exist at all. More about the program itself — [Partner program](/en/docs/partner-program). --- ## Passwords, codes and sessions | Access key | Requirements | Where it is revoked | |---|---|---| | **An owner's or employee's password** | 8+ characters, an upper-case and a lower-case letter, a digit, a symbol | `/settings/access` for a change; `/staff` to reset an employee's password | | **A cashier PIN** | 4–6 digits, unique within the account, stored on the server only as an irreversible hash | The employee card in `/staff` | | **A device sign-in code** | A `/login?code=…` link, protected with a PIN or a password if needed | Deleting the code in `/client-codes?tab=devices` | | **A QR code for the panel** | The "Admin sign-in" tab — visible to the owner and to a role with the "Settings" right | Deleting the code in the same place | | **An API key for AI agents** | Shown once, at creation | `/settings/access` | | **Personal SIP accounts** | Each person's private list: only they see their own | `/settings/sip-accounts` | Useful facts: - **Signing out closes the session in all tabs** of the browser; there is no "remember me" checkbox. - **Dismissal revokes the employee's phone extension** across all locations at once — nobody leaves with a working softphone. - **Section access levels** ("view", "edit", "configure") are set in the role. The honest boundary today: the "edit" level really does forbid writing that section's data on the server, while a "view only" mode of the screens themselves is not in place yet — so do not grant a section to someone who must not see its content. --- ## Guest data and consents | Mechanism | What it does | Article | |---|---|---| | **The cookie banner** | Four categories, blocking third-party scripts before consent, a consent log with a CSV export as proof, a ready cookie policy page | [Cookies and consent](/en/docs/cookie-consent) | | **Legal documents** | A constructor for the privacy policy, terms, returns, delivery and five more documents by country sets; publishing as pages of your site | [Legal documents](/en/docs/legal-docs) | | **The "My data" screen on the storefront** | The guest sees what is stored about them on their device, exports it as a JSON file and wipes it with one button | — | | **The 18+ age gate** | Switched on by the owner and standing in front of the storefront content as a whole | [Cookies and consent](/en/docs/cookie-consent) | Two honest notes about "My data": the screen works with the data **on the guest's device** (what sits in their browser), not with the history on the server, and deleting there clears exactly that device. If a guest asks you to remove their orders and contacts from your base, you do it — in the [Customers](/en/docs/customers) section. An important separation: **the banner and the documents the guest sees are yours, not ours.** You are responsible for their content as the business owner; the platform provides the constructor, the hosting of the pages and the consent log. --- ## Export and deletion - **Take everything** — [Data export](/en/docs/data-export): one ZIP with settings, catalogue, orders, customers and reviews. **Deliberately not included**: staff PINs, integration keys and tokens, passwords — the archive often gets forwarded to an accountant or a contractor. Photos are not packed, links to them remain; a finished archive lives for 7 days. - **Delete the account** — through a request to [support](/en/docs/support) after the export: there is no self-service button in the panel. The request is fulfilled within **30 days** of being confirmed; after the deletion there is nothing left to take, so the export comes first, not later. - **Delete one guest's data** — in the [Customers](/en/docs/customers) section. --- ## Backups There is no "restore the account to a date" button in the panel, and we do not publish retention periods for internal copies — so **make your own copy**: before a bulk import, a catalogue clean-up or a change in the menu structure, collect an [export](/en/docs/data-export). It is the most reliable rollback available. --- ## If you suspect a leak Top to bottom, in order: 1. **Change the owner's password** — `/settings/access`. 2. **Switch off "Support access"** if it was on, and look through the log of sessions: who signed in and when. 3. **Delete the device codes and the panel QR codes** you do not need right now (`/client-codes`). 4. **Revoke the API keys** on the "Access" tab and issue new ones only where they are genuinely used. 5. **Change the cashier PINs** and reset the passwords of the people you suspect; deactivate those who have left in `/staff`. 6. **Write to support** — [How to get help](/en/docs/support). Attach the time of the incident, the brand and the account address, the location, and what you saw. This is a request about YOUR account; platform vulnerabilities go through a different channel — see below. Report a vulnerability **in the platform itself** not to general support but to a dedicated address — **`security@cenaly.com`** (the address accepts mail from any brand; the same `security@` mailboxes on brand domains — `security@cenaly.com`, `security@cenaly.ru`, `security@masamenu.tr` — are being connected). In the message: the page address, the steps to reproduce and what you managed to obtain. Please do not publish the details before we reply and do not pull other people's data "to check the scale". More about the channel — [How to get help](/en/docs/support). --- ## What we do not store - **Payment card data.** Neither numbers nor CVV: the card is handled by the payment provider (Stripe with its PCI Level 1 certification, for example), and only the result of the payment reaches us — see [Payments](/en/docs/payments) and [Stripe](/en/docs/stripe). - **Secrets in the export.** PINs, keys, tokens and passwords are not included in the archive. - **Biometrics.** That class of data is forbidden in the circuit and is not collected. --- ## Work in progress A dedicated circuit for storing personal data — encryption by data class, a log of every access to it, retention driven by events — is **in progress**. We make no dates or promises about it here: when it covers another class of data, that will appear in the description of the relevant section. A portal for data subject requests (DSAR) is likewise in progress — today such requests are handled manually, through the export and the "Customers" and "Staff" sections. **Two-factor sign-in** on cenaly.ru and in the mobile apps is also in preparation — we promise no dates. --- ## Limitations - **Two-factor sign-in covers only the web workspace of AWS brands** (cenaly.com, cenaly.com and others): turn it on in Settings → Access, and a password sign-in then asks for a code from an authenticator app. The mobile apps and sign-in with Google or a QR code do not ask for the code yet, there are no backup codes, and cenaly.ru has no second factor. Everywhere, protect the sign-in with a long password and separate staff logins (one shared password for everybody is the worst option), and keep tablets and screens on device codes with a PIN. - **The split between clouds is hard:** a cenaly.ru account and a cenaly.com account are different accounts and never share a single login. - **On cenaly.ru there is no** partner sign-in, no log of support sessions, no account handover to another e-mail and no cookie scanner. - **The guest's "My data"** clears the device, not the order history on the server. - **The "view" and "configure" access levels** do not yet turn a screen into read-only mode (see above). - **There is no "which of my employees opened what" log** in the panel; logs are kept for support and partner sign-ins. - **We do not declare certified cryptographic tools or formal personal-data perimeters:** if your business is required to have them by law, discuss the task before connecting. --- ## Troubleshooting | Symptom | Cause | What to do | |---|---|---| | Support asks for access and I cannot find where to grant it | The toggle sits on its own tab | **Settings → Support access** (`/settings/support-access`): switch the consent on and choose the scope | | A partner says they cannot get in | The request was not approved, expired (24 hours), or the firm's mode is set to "never"; on cenaly.ru there is no sign-in at all | Check the mode and the history on the same tab and ask the partner to send the request again | | An employee sees a section they do not need | The section is granted to their role as a whole | Remove the section in the role constructor in `/staff`; a "view only" level does not yet apply to the screens | | The cookie scanner will not start on cenaly.ru | The feature only works on the AWS brands | That is by design; fill the cookie declaration in manually — [Cookies and consent](/en/docs/cookie-consent) | | A guest demands their data be deleted | The "My data" screen only clears their device | Delete their card in the [Customers](/en/docs/customers) section | | I need to roll back a bulk catalogue change | There is no "restore to a date" in the panel | Load the catalogue from your own [export](/en/docs/data-export) made before the change | --- ## FAQ **Which country is my data in?** It depends on the brand: cenaly.com and cenaly.com — AWS (us-east-1), cenaly.ru — Yandex Cloud in Russia, the Turkish brands — a copy of the circuit in eu-central-1 (Germany). **Can support enter my account without permission?** No. The "Support access" toggle has to be on; you choose the scope, every session is logged, and revoking consent stops even a running session. **Does a partner see our money and our staff data?** No. Subscription and payments, the owner's data, staff permissions, data export, integrations, communications, counterparties and documents are closed in any mode — the server refuses. **An employee has left — what should I revoke?** Deactivate or delete them in `/staff` (that also removes the panel sign-in and revokes the phone extension), change the PINs they knew, and delete the device codes you no longer need. **Do you store our guests' card numbers?** No. The card is handled by the payment provider; only the result of the operation stays with us. **How do I answer a guest who demands their data be deleted?** Find them in the "Customers" section and delete the card; the local data on their own device they can wipe themselves on the storefront through the "My data" screen. **Do you have a DPA and other documents for an audit?** The data-processing terms are described in [Data processing agreement (DPA)](/en/docs/dpa); ask [support](/en/docs/support) for a signed copy and the remaining documents. --- ## Related articles - [Account and sign-in](/en/docs/account) — passwords, device codes, support access - [Account and location settings](/en/docs/settings) — what is configured where - [Staff and shifts](/en/docs/staff) — roles, location coverage, PINs - [Data export](/en/docs/data-export) — take everything and make a backup - [Cookies and consent](/en/docs/cookie-consent) — the banner, the consent log, the cookie policy - [Legal documents](/en/docs/legal-docs) — privacy policy and terms - [Customers](/en/docs/customers) — deleting a particular guest's data - [Data processing agreement (DPA)](/en/docs/dpa) — what we process, on what basis and who the sub-processors are - [How to get help](/en/docs/support) — where to report an incident; vulnerabilities go to `security@` on your brand --- # Data Processing Agreement (DPA) > ⚠️ **This is a draft.** The text below describes how processing actually works here and proposes contractual wording — but it is **not an offer**, it is not signed, and on its own it creates no obligations. To obtain a signable version for your legal entity (and its Russian counterpart — an instruction to process under Federal Law 152-FZ), write to **`security@` on your brand's domain** (for example, `security@cenaly.com`) or contact [support](/en/docs/support). We reply with the same document carrying your details, the list of modules you use and the current Annex C. Why this page is useful before anything is signed: it shows **what exactly** we process, **where** it is stored, **who** it is shared with, and **what we can and cannot do** — with no promises the product does not keep. The technical side of the same question is in [Security and data](/en/docs/security-privacy). --- ## 1. Parties and roles | Party | Role under GDPR | Role under 152-FZ | |---|---|---| | **You** — the venue, the account owner | Controller | Operator of personal data | | **We** — the platform | Processor | Person processing data on the operator's instruction | What that means in practice: - **You determine the purposes.** You decide whether to collect guest phone numbers, whether to record calls, whether to keep personnel files in the panel, whether to switch on AI features. We supply the tool and carry out the instruction — the set of operations you define through account settings and your own actions in the interface. - **The legal basis is yours too.** A guest's consent, a contract with them, your statutory duty (a fiscal receipt, personnel records, hotel guest registration) — all of that is on you. The platform does not and cannot verify whether you had a basis for entering a particular person into a database. - **Notices to data subjects are yours.** The storefront privacy policy, the cookie banner, the newsletter consent text are published in your name. We provide the builder, page hosting and the consent log — see [Legal documents](/en/docs/legal-docs) and [Cookies and consent](/en/docs/cookie-consent). - **There are areas where we are an independent controller**, and they are kept separate honestly: your account and subscription payment data, technical error telemetry from the panel, and your correspondence with support. These are processed under our own policy, not on your instruction. ### What stays with you as the operator Informing data subjects and collecting the basis · lawfulness of purposes · answering data subject requests (we assist, see §9) · notifying the regulator where the law puts that duty on the operator (in Russia — notifying Roskomnadzor of processing and of an incident) · configuring roles so that staff only see what they need · deciding whether to enable AI features and the transfer of data to foreign models. --- ## 2. Subject matter, nature and purposes of processing We process data **only to run the features you have enabled** and to support those features when you ask us to. We do not use the contents of your account for advertising or profiling, we do **not train our own models on it**, we do not sell it and we do not disclose it to third parties other than the sub-processors in §6 and the recipients you choose yourself. Nature of processing: collection, recording, organisation, storage, rectification, retrieval, use, anonymisation, restriction and erasure; automated processing in the cloud. | Group of data subjects | Where this arises | Why it is processed | |---|---|---| | **Guests and customers** | orders and delivery, table reservations, appointments, storefront and shop, customer base, messenger chats, calls (recording and transcript), leads and website forms, pickup-point parcels, hotel guests | to accept and fulfil an order, reservation or appointment; to contact the guest about it; to keep history and loyalty; to answer an enquiry; to meet a fiscal duty | | **Employees** | employees and shifts, HR records, payroll, PBX extensions and SIP accounts, tasks, team chat | access to the panel and the till, time tracking, personnel records and reporting, internal communication | | **Website visitors** | "My website" widgets, cookie banner and consent log, forms and enquiries, analytics counters you have installed | to display a widget, to record consent as evidence, to accept an enquiry | | **Counterparties and partners** | CRM counterparties, documents and invoices, the partner programme | accounting for settlements, exchanging documents | The full "module → data → purpose → term" breakdown is in **Annex A**. --- ## 3. Categories of data subjects and categories of data Categories of data subjects: guests and customers · leads · employees · job applicants · account users (the owner and staff with a login) · representatives of counterparties and partners. Categories of data the product accepts: | Class | Examples | Default display in the interface | |---|---|---| | Contact | name, phone, email, messenger handle | masked | | Address | delivery address, residential address | masked | | Identity document | number, validity, issuing authority (hotel guest, personnel file) | hidden | | Employment | position, rate, schedule, length of service, salary | masked | | Financial | amounts, receipts, settlements | masked | | Payment identifiers | card mask, the provider's payment identifier | masked | | Communication content | chats, email, call recordings and transcripts | masked | | Credentials | password hash, PIN hash, tokens | **never displayed** | **Special categories** (GDPR Art. 9, 152-FZ Art. 10) are not collected by the platform itself. That said, the product does contain fields where **you can enter health data**: an employee's medical certificate and sick leave, a hotel guest's health and dietary restrictions. By entering them you accept the heightened requirements for the basis and the safeguards; our part is to keep them hidden by default and not to reveal them without an explicit purpose. **Biometrics are blocked platform-wide.** The class is marked as forbidden in the policy registry, and an attempt to store such data is rejected by code rather than by a guideline. There are no fingerprints, face templates or voiceprints in the contour. **We hold no payment card data at all** — neither the number nor the CVV: the card is handled by the payment provider and only the outcome of the transaction reaches us. --- ## 4. Term, deletion and return of data - **The term runs with your subscription** and your account. While the account is live the data is stored so that the features work. - **Deletion happens within 30 days** of your written request or of termination. This covers both deleting the account as a whole and deleting a specific data set on your instruction. - **Taking your data out before deletion is your job and our duty to help with.** The export is self-service, no support ticket needed: [Data export](/en/docs/data-export). A prepared archive lives for 7 days, and secrets are deliberately excluded from it. - **Some terms are set by law, not by your subscription.** Fiscal documents, personnel files and hotel guest registration are kept for as long as the country's rules require — and in those cases deletion "on request" is impossible before the term expires. Such records are marked in the product as being under mandatory retention. - **Backups.** We do **not publish** retention periods for internal backups — and therefore do not promise that data "disappears everywhere the same day". The right safeguard is on your side: keep your own copy via export, especially before bulk changes. - **What survives the deletion of an object — disclosed plainly.** The account's AI interaction log (the request to a model and its response, including text recognised from your document) is kept for cost accounting and incident investigation, and deleting the source document does not purge it. The answer cache and generated training materials may quote a deleted document until the next rebuild. Full erasure of these traces is available on request to support. - **Content already transmitted to an AI provider** while serving your request is subject to that provider's own retention practices and is outside our control. --- ## 5. Processor obligations **5.1 Processing only on your instructions.** The instruction consists of your account settings, your actions in the interface and any separate written instruction. If in our view an instruction infringes data protection law, we will tell you and may suspend performance. **5.2 Staff confidentiality.** Access to account data is limited to a restricted group of our employees and contractors bound by confidentiality obligations; access is granted on a need-to-perform basis and withdrawn when the work is finished. **5.3 Security measures** — the full list is in **Annex B**. In short: transport only over TLS; objects in storage are encrypted on the service side; a separate personal data contour with encrypted records and a closed read path; access separation by role, section level and location scope; account isolation by storage prefix; irreversible hashes for passwords and PINs. **5.4 Support access only with your explicit permission.** A support agent **cannot** enter your account at will: it requires the toggle in **Settings → Support access** (`/settings/support-access`), the scope ("view only" or "view and edit") is chosen by you, every session is logged (who, when, at what scope), and withdrawing consent terminates even a **live** session. An implementation partner can only sign in on a request approved by the owner, for a limited time and with a banner in the interface; money, HR, data export and integrations are blocked for them by the server in any mode. **5.5 Logging.** We keep: the log of the owner's support-access consent and the log of support sessions themselves, the partner sign-in log, the account's AI interaction log, and the access log of the personal data contour. The last one enforces an audit barrier: **no log record — no plaintext value returned**. **5.6 Assistance with data subject requests** — see §9. **5.7 Incident notification.** We notify you of a personal data breach affecting your account **no later than 72 hours after discovery**, without undue delay, and pass on what we know at that point: the nature of the incident, the categories of data and data subjects affected (as far as established), the likely consequences, the measures taken and planned, and a contact for follow-up. If the picture is incomplete by then we send a partial notification and supplement it as the investigation proceeds — staying silent "until everything is clear" is not an option. ⚠️ Notifying **the regulator and the data subjects** is the operator's duty, i.e. yours: in Russia that is 24 hours to report the fact and 72 hours to report the outcome of the internal investigation; in the EEA it is 72 hours to notify the supervisory authority. That is exactly why our deadline is set so that you can meet yours. **5.8 Assistance with impact assessments (DPIA).** On request we provide a description of the processing, the measures and the sub-processors to the extent set out in this document and its annexes — which is normally sufficient for your assessment. **5.9 Deletion or return at the end of the engagement** — see §4. --- ## 6. Sub-processors We do engage sub-processors — a cloud product cannot exist otherwise. The full list with purpose, place of processing and the data transferred is in **Annex C**. The rules we propose to put in writing: - a sub-processor is engaged under a written contract with protections **no lower** than those accepted in this agreement; - it is given the **minimum** data needed for its function; - **for a new or replacement sub-processor** we give notice by email to the account owner and by updating Annex C **at least 30 days** before the transfer begins; within that period you may object with reasons, and we will either offer an alternative or you may decline the affected feature or terminate the contract in the part that does not work without it; - we remain responsible to you for the acts of our sub-processors; - **foreign AI models are enabled only by your decision** — that consent is requested separately, not bundled with a general tick-box; on the Russian contour the model-decision step is deliberately disabled (the catalogue holds no model with confirmed 152-FZ compliance). Separately: **recipients you choose yourself** — the payment provider, the SIP number carrier, messengers, delivery aggregators, marketplaces, the fiscal data operator and government systems. They receive data because you decided to connect that channel, and in most cases they act as independent controllers rather than as our sub-processors. You accept their terms directly. --- ## 7. Residency and international transfers **The contour is determined by the brand** you registered through. It is not an account setting, it does not change on the fly, and an account cannot be "moved" from one contour to another. | Contour | Cloud and region | Physical location | International transfer | |---|---|---|---| | **International** (every brand except those below) | AWS, `us-east-1` | United States, Northern Virginia | Yes — for an EEA controller this is a transfer to a third country; the bases are performance of the contract and Standard Contractual Clauses, and for AI features your explicit consent | | **Turkish brands** (`masamenu.tr`, `cenaly.tr`) | AWS, `eu-central-1` | Germany, EU | ⚠️ To be honest: `eu-central-1` is **Germany, not Turkey**. For an operator under KVKK this is a cross-border transfer, not in-country localisation | | **Russian** (`cenaly.ru`) | Yandex Cloud, `ru-central1` | Russia | No: the contour is closed, including its own authentication; transfer outside it is blocked by configuration | Consequences worth spelling out: - **Storage is shared per contour, not per brand.** Data of different brands on the same contour sits in a shared storage system separated logically — by account prefix and permissions. We cannot promise you a dedicated bucket. - **Static assets are served worldwide through a CDN** — these are the public storefront files (menu, photos, published documents) that a guest's browser reads without authentication anyway. - **The Russian contour** is an instruction to process under 152-FZ: recording, organisation, storage and retrieval are carried out in databases located in Russia (Art. 18(5)). AI processing there is done by a Russian provider. At the same time **we do not declare certified cryptographic means or formal ISPDn boundaries**: if your business is legally required to have them, raise it before you sign up. - **Localisation in Kazakhstan and Uzbekistan.** We have no contour in Kazakhstan, and the Kazakh operator profile is honestly marked as "residency unavailable". For Uzbekistan only biometric data, genetic data and telecom subscriber data are subject to mandatory localisation — we do not accept biometrics at all, so storage in the international contour is permissible where the cross-border transfer conditions of the law are met; the basis itself (Standard Contractual Clauses or a standard from the official list) is arranged by you as the operator. --- ## 8. Audit and assurance - **On request** we complete your security questionnaire and provide a description of measures and sub-processors to the extent set out in this document and its annexes. - **An on-site audit, or an audit by your auditor**, is available by arrangement: with advance notice, during business hours, no more than once a year (more often in case of an incident or at a regulator's demand), under a confidentiality obligation, with no access to other customers' data and none to systems where such access is technically unavoidable. Costs beyond the reasonable are borne by the requesting party. - ⚠️ **Honestly about what does not exist:** we have **no** ISO/IEC 27001 certification, **no** SOC 2 report, **no** PCI DSS attestation (we do not process cards at all) and **no** ISPDn attestation. If your compliance process requires a ready-made independent auditor's report, we cannot supply one today — and we prefer to say so before signing rather than after. - Our cloud sub-processors and the payment provider do hold certifications; we will not present theirs as ours. ### Data protection contact Data protection questions, signable-DPA requests and vulnerability reports go to **`security@` on your brand's domain**; ordinary requests go through [support](/en/docs/support). We do not have a separately appointed DPO or an EU representative — another point we state plainly rather than implying otherwise. --- ## 9. Data subject rights and assistance Data subject requests are addressed to **you** as the operator — you answer, we assist. What is genuinely available today: | Right | How it is exercised | How we help | |---|---|---| | Access and portability | [Data export](/en/docs/data-export) — a single archive with settings, catalog, orders, customers and reviews | we prepare the archive and answer follow-up questions | | Rectification | editing the card in [Customers](/en/docs/customers), in [Employees](/en/docs/staff), or in the reservation or appointment | — | | Erasure ("forget me") | you delete the guest's card; deep cleaning of traces on request | we act within 30 days | | Restriction and objection | disabling a communication channel, withdrawing consent in the consent log | — | | Withdrawing marketing consent | a flag on the customer card and in the consent log; an unsubscribe link in emails | — | Honest limits worth knowing in advance: - **There is no DSAR console in the panel** — such requests are handled manually, through export and the "Customers" and "Employees" sections. - **The "My data" screen on the storefront clears the guest's device**, not the server-side order history: the guest sees and erases what is stored in their browser. If they ask you to delete their orders and contacts from your database, you do that. - **There is no "which of my employees opened what" log.** Logs are kept for support and partner sign-ins and for access to the personal data contour — so we cannot answer "who on our team looked at this guest's card" today. --- ## 10. Liability, term, governing law - The agreement is in force while your subscription is in force and while we process data on your instruction; the provisions on confidentiality, deletion and assistance survive its termination to the extent needed to perform them. - Liability is governed by the main contract (the Terms of Service) and by law; this agreement does not expand it. - **The governing law and jurisdiction depend on the brand and the legal entity** providing the service to you; the specific details are inserted into the signed version. The Russian contour is governed by Russian law and 152-FZ terminology; the international contour by the Terms of Service of the relevant brand and by GDPR/UK GDPR where they apply to you. - If this page and a signed document disagree, **the signed document prevails**. --- ## Annex A — description of processing The "Term" column states what sets the term. "Proposed" means the period is built into the product as a sensible default but has not been legally approved and is finalised in the signed version. | Module | Data subject | Data | Purpose | Term | |---|---|---|---|---| | Orders and delivery | guest | name, phone, delivery address, order contents and total, comment | accept and fulfil the order | 365 days after the order is closed (proposed) | | Table reservations, appointments | guest, employee | name, phone, time, service, provider, preferences | book and remind | until you delete it or the subscription ends | | Customer base and loyalty | guest, lead | contacts, purchase history, tags, consents | repeat sales on your legal basis | until the card is deleted | | Guest chats | guest | message contents, messenger handle, attachments | answer the enquiry | until deleted | | Calls | guest, employee | number, call recording, transcript, AI metrics and scores | communication, enquiry review, quality control | until deleted; audio lives in a separate cold archive of the brand | | Website forms and enquiries | visitor | whatever the person entered in the form, the source page | accept the enquiry | until deleted | | Cookies and the consent log | visitor | consent identifier, categories, timestamp, text version | evidence of consent | as long as you keep the log (CSV export available) | | Hotel guests | guest | contacts, identity document, address, health and dietary restrictions | accommodation and mandatory registration | contacts, address, health — 90 days after checkout (proposed); the document — per the country's rule | | Pickup-point parcels | guest | full name, phone, tracking number | hand over the parcel | until deleted | | Employees and HR | employee, applicant | full name, identity document, position, schedule, salary, medical certificate, sick leave | access to the panel and till, personnel records and reporting | per the country's rule (personnel file, medical certificate, sick-leave certificate) | | Receipts and fiscal data | guest | settlement attribute, amount, email or phone for an electronic receipt | statutory fiscal duty | per the country's rule (in Russia — the 54-FZ archive) | | Knowledge base | anyone you put into a document | the contents of the materials you upload, search queries, technical file metadata | search and answers over your documents | until the document is deleted; for residual traces see §4 | | Account users | owner, employee with a login | email, name, role, password hash, PIN hash | access to the account | the subscription term | | Counterparties and documents | counterparty representative | name, contacts, registration details, correspondence about a document | accounting for settlements and exchanging documents | until deleted; accounting periods per the applicable rule | --- ## Annex B — security measures **Transport and storage** - All traffic to the panel, the storefront and the API runs over **HTTPS/TLS**; public addresses are served behind a CDN. - Objects in storage are encrypted **on the service side** (on AWS — SSE-S3, AES-256; a customer-managed KMS key is not used by default). Records in the dedicated personal data contour are encrypted separately — **AES-256-GCM**, with a data encryption key created per "account × data class" pair and wrapped in the cloud's KMS. - Call recordings live in a **separate cold archive of the brand**, inside the same contour, and remain available by link without any "restore" delay. **Access separation** - Staff roles with a choice of sections, access level and location scope; access to a section is not access to the whole account. - Account isolation by **storage prefix**, plus server-side denial of browser writes to service prefixes. - Passwords are 8+ characters with composition requirements; **a cashier's PIN is stored only as an irreversible hash**; an API key is shown once at creation; signing out closes the session in every tab. - Dismissing an employee removes their panel login and **revokes their phone extension** across every location at once. - Device codes grant access to a single target page (a monitor, a kitchen screen), not to the account. - Reading the dedicated personal data contour is only possible through a service interface that checks the principal, the account, the scope, a proven business relation, the class and purpose, the field set and the region — and **only with a record written to the audit log**. **Our access to your data** - Support access — by the owner's toggle, at the chosen scope, with a session log, and with a live session terminated when consent is withdrawn. - Partner access — on a request approved by the owner, for a limited time, one session at a time, with a banner in the interface, and with server-side blocks on subscription and payments, owner data, staff permissions, data export, integrations, communications, counterparties and the partner programme. - Forbidden data classes: **biometrics** are rejected by code. There is no payment card data at all. **What does not exist — stated plainly** - No ISO/IEC 27001 certification, no SOC 2 report, no ISPDn attestation and no certified cryptographic means. - **There is no two-factor sign-in to the panel yet** — it is being prepared; today the login is protected by a long password, separate staff logins and device codes with a PIN. - No log of your employees' actions, no DSAR console and no point-in-time account restore. - The dedicated personal data contour **does not yet cover every section**: it has been rolled out for hotel guests (migration of existing accounts is under way), while other sections still keep personal data in ordinary account documents. It advances section by section, and we promise no dates. - On the Russian contour there is **no** support session log, no partner sign-in and no cookie scanner. --- ## Annex C — sub-processors ### Infrastructure | Sub-processor | Purpose | Place of processing | |---|---|---| | **Amazon Web Services** | data and media storage, compute, authentication, CDN, outbound email (Amazon SES) | United States (`us-east-1`); Germany (`eu-central-1`) for the Turkish brands | | **Yandex Cloud** | the same set in full for the Russian contour: storage, compute, its own authentication, CDN | Russia (`ru-central1`) | ### Artificial intelligence International contour: requests go through the **polza.ai model aggregator** rather than straight to the vendor. The available vendors are **OpenAI**, **Google**, **xAI** and **DeepSeek**; which one is in use is visible and switchable in the "AI models" section. Some features call a vendor directly: knowledge base search and answers go to OpenAI (embeddings, answers, text recognition in images), and the guest-facing AI menu concierge goes to Google Gemini (an excerpt of your knowledge base of up to 4,000 characters is included in the prompt together with the menu and the guest's question). Russian contour: **Yandex Cloud Foundation Models** (embeddings, answers, re-ranking, summaries) and **Yandex Vision OCR** (text recognition in images), with request logging disabled where the provider offers that setting. We do not apply an equivalent setting with foreign providers and rely on their standard API terms, under which API data is not used to train their models. You may connect **your own OpenAI-compatible endpoint** — in that case you choose the provider, and it becomes your recipient rather than our sub-processor. ### Speech recognition | Contour | Engines | Who chooses | |---|---|---| | International | Amazon Transcribe, Google Speech-to-Text, Microsoft Azure Speech | you — in the "Calls" section settings | | Russian | Yandex SpeechKit (two tiers — deferred and fast) | — the only one available | What is transmitted is the recording of the call or the uploaded file; what comes back is the transcript. ### Email and notifications **Amazon SES** — outbound email: staff invitations, order and reservation notifications, digests, emails to guests. The recipient address and the message contents are transmitted. SES is not used on the Russian contour — some email scenarios there work differently or not at all. ### Recipients you connect yourself The payment provider (for example, Stripe) · the SIP number and telephony carrier · messengers (Telegram, WhatsApp) · delivery aggregators · marketplaces · the fiscal data operator and government systems (in Russia — OFD, Chestny ZNAK, EGAIS) · analytics counters you installed on your site. What is transmitted to them is determined by the feature you connected; you accept their processing terms directly. --- ## FAQ **Can we sign this document as it stands?** No. It is a draft and a description of the actual state of affairs: it carries no party details, no list of your modules and no date. Request the signable version at `security@` on your brand's domain or through [support](/en/docs/support) — you will receive the same text with your details filled in. **Do you have ISO 27001 or SOC 2?** No. We hold neither a certification nor an auditor's report, and we will not pass off our cloud providers' certificates as our own. We do complete security questionnaires and provide a description of our measures. **Who is the operator of our guests' personal data — you or us?** You are. You decide what to collect and why, you inform your guests and collect their consents. We process that data on your instruction and do not use it for our own purposes. **How quickly will you delete our data if we leave?** Within 30 days of the request or of termination. We do not publish retention periods for internal backups — take your own copy via [export](/en/docs/data-export) before deletion. **Where is the data physically stored, and can we choose the region?** The brand sets the region: the international contour is in the United States, the Turkish brands are in Germany, `cenaly.ru` is in Russia. You cannot pick a region within one brand; moving means a new account in a different contour. **Data goes to the United States — how do we cover that as an EEA controller?** The bases are performance of the contract and Standard Contractual Clauses, and for AI features your explicit consent is requested separately. If a transfer to a third country is unacceptable for you, the Turkish brands run in `eu-central-1` (Germany) — but that is a different brand, not a setting. **Do you train your models on our data?** No. Account content is not used to train our models, for advertising or for profiling, and it is not sold. With the AI providers we engage we rely on their standard API terms, under which API data is not used for training by default. **Can your support staff look at our data without asking?** No. The "Support access" toggle must be on, you choose the scope, sessions are logged, and withdrawing consent terminates even a live session. **A guest demands deletion of their data — what do we do?** Delete their card in [Customers](/en/docs/customers). The "My data" button on the storefront clears only the guest's own device. For deep cleaning of residual traces (AI interaction logs, caches) ask us — we act within the same 30 days. **What about call recordings — those are sensitive?** Recordings and transcripts live in your brand's cold archive, inside the same contour, and access to the "Calls" section is configured separately, down to named individuals. Warning participants that a call is recorded is your duty as the operator, and in a number of countries recording without it is unlawful. --- ## Related topics - [Security and data](/en/docs/security-privacy) — where data lives, who has access, what to do after an incident - [Account and sign-in](/en/docs/account) — passwords, device codes, support access - [Data export](/en/docs/data-export) — take everything out before deletion - [Getting help](/en/docs/support) — requesting a signed DPA and the `security@` channel - [Subscription and plans](/en/docs/subscription) — the term of the contract - [Legal documents](/en/docs/legal-docs) — privacy policy and terms for your guests - [Cookies and consent](/en/docs/cookie-consent) — the banner and the consent log as evidence - [Customers](/en/docs/customers) — deleting a specific guest's data - [Employees and shifts](/en/docs/staff) — roles and location scope --- # Troubleshooting Find your symptom, run three checks — and only if that does not help, go to the in-depth article or to support. The order of the checks is not random: the most frequent cause is on top. | Symptom | Section | In-depth article | |---|---|---| | The guest sees no menu, or an old one | [QR storefront](#the-qr-storefront-does-not-open-or-shows-an-old-menu) | [QR menu](/en/docs/qr-menu) | | An item is missing from the storefront | [Item missing](#an-item-is-missing-from-the-storefront-although-it-exists-in-the-panel) | [Scheduling](/en/docs/scheduled-menus) | | Orders do not arrive | [Orders](#guest-orders-do-not-arrive) | [Orders](/en/docs/orders) | | Nothing prints | [Printing](#nothing-prints-or-the-wrong-thing-prints) | [Kitchen printing](/en/docs/kitchen-printing) | | Hardware is not visible | [Bridge](#the-bridge-is-offline-unpaired-or-another-location) | [Cenaly Hardware Bridge](/en/docs/hardware-bridge) | | The POS will not accept payment | [POS](#the-pos-will-not-accept-payment) | [Cash shift](/en/docs/cash-shift) | | The receipt was not issued | [Fiscalization](#the-fiscal-receipt-was-not-issued) | [Fiscalization](/en/docs/fiscal) | | No internet | [Offline](#the-internet-went-down) | [If the internet goes down](/en/docs/offline) | | The panel will not let me in | [Sign-in](#cannot-sign-in) | [Account and sign-in](/en/docs/account) | | The guest cannot pay online | [Online payment](#the-guests-online-payment-fails) | [Payments](/en/docs/payments) | | No notifications or submissions | [Notifications](#notifications-and-form-submissions-do-not-arrive) | [Campaigns](/en/docs/campaigns) | | A custom domain does not open | [Domain](#a-custom-domain-does-not-open) | [Custom domain](/en/docs/custom-domain) | | A delivery platform does not sync | [Aggregators](#no-orders-from-a-delivery-platform-or-the-menu-there-is-old) | [Integrations](/en/docs/integrations) | | A phone does not register | [Telephony](#a-phone-does-not-register-on-the-pbx) | [SIP phones](/en/docs/sip-phones) | --- ## The QR storefront does not open or shows an old menu 1. **Check it the same way a guest does** — from a phone via the QR code, not from the panel. The storefront is served through a CDN and **does not depend on the internet at the venue**: if you have no connection but the guest does, the menu will open for them. 2. **An old menu is the cache.** Wait and reload the page with the cache cleared (Ctrl+F5 on a computer, incognito mode on a phone). Price and name edits do not arrive instantly. 3. **Check that the location is not paused and that the QR points where it should.** A code is printed for a specific location and table; with several locations it is easy to hand out the wrong sheets — [QR codes and devices](/en/docs/device-codes). Still no luck — [QR menu](/en/docs/qr-menu). --- ## An item is missing from the storefront although it exists in the panel Four causes, by frequency: 1. **The stop list** — the item is marked “86” at this location. 2. **Scheduling** — the item is outside its availability window (breakfast, lunch, happy hour) — [Scheduling and happy hour](/en/docs/scheduled-menus). 3. **Visibility and price at this location** — the item is hidden at this exact location, or it has no price: without a price it is not shown. 4. **A plan limit** — the new item was not created at all. Editing stays available — [Subscription](/en/docs/subscription). If the item did not appear **in the guest's language**: languages are picked in the storefront settings, and a translation does not appear the instant a language is added. --- ## Guest orders do not arrive 1. **Check whether the order is waiting to be accepted by an operator.** A location has an intake mode: either a human accepts the order in the “Orders” section, or “straight to work” is switched on. Until it is accepted, it does not reach the kitchen — [Orders](/en/docs/orders). 2. **Switch the sound on on the “Orders” page.** The signal for a new order and a waiter call is toggled by the sound button at the top of the page; besides, a browser will not play sound in a tab that has never been clicked. 3. **Reload the page.** Statuses arrive over a websocket — when the connection drops the feed freezes, and a reload revives it. 4. **Check that there is someone to move the order on.** “Stuck in a status” usually means the kitchen display, the pickup display or the courier board is switched off or simply not open anywhere. For orders **from a delivery platform** — see [Aggregators](#no-orders-from-a-delivery-platform-or-the-menu-there-is-old). --- ## Nothing prints, or the wrong thing prints 1. **The bridge first, the printer second.** Receipts, kitchen tickets and labels print only through Cenaly Hardware Bridge on the computer that runs the POS. If the bridge is offline, the job joins the **print queue** and goes out by itself when the bridge returns: the queue survives a restart. The bridge status is in the “Hardware” section (`/hardware`), see [Bridge](#the-bridge-is-offline-unpaired-or-another-location). 2. **It prints on the wrong printer** — the station has no printer of its own, so the system chose “any available”. Map the stations explicitly — [Kitchen and floor printing](/en/docs/kitchen-printing). 3. **Hieroglyphs or empty squares instead of letters** — the printer cannot handle your script. Switch on the raster font for the device: the text is printed as an image and works in any language. 4. **Cut off on the right** — the device settings specify a paper width larger than the real one. **Labels come out the wrong size** — check the roll format and that printing goes to a label printer, not a receipt printer. --- ## The bridge is offline, "unpaired" or "another location" Open the **Hardware** section (`/hardware`) and look at the status. | Status | What it means | What to do | |---|---|---| | **Offline** | The bridge service is not running on this computer | Start the bridge (or install it: the page has downloads for your OS) | | **Searching** | The bridge is starting and polling the ports | Wait | | **Unpaired** | The bridge does not know which location it serves | Pair it with a location on the page | | **Another location** | The bridge is paired with another of your locations | The “Use here” button | | **Another brand** | The bridge was downloaded from a different platform domain | Install the bridge from your brand's CDN | Then, in order: 1. **The bridge and the panel must be on the same computer** — they talk inside the machine. A panel opened on a phone will not see a local bridge: printing from another device needs the bridge's **cloud link**. 2. **“The printer used to be there and now it is gone”** — open “PC details” in the account hardware registry: it shows every COM port with a note on which process holds it, and every drive with free space. A frequent cause is a port held by a vendor utility. 3. **An old bridge shows an empty device list** — update the bridge with the button on its page. In depth — [Cenaly Hardware Bridge](/en/docs/hardware-bridge). --- ## The POS will not accept payment 1. **The cash shift is not open.** This is cause number one: open the shift with a cash float — [Cash shift and Z-report](/en/docs/cash-shift). 2. **The POS asks for a manager PIN** — by design: deleting items, discounts, refunds and reprints above a threshold are confirmed by a manager and written to the risk log. 3. **An item is missing from the tiles** — see [Item missing](#an-item-is-missing-from-the-storefront-although-it-exists-in-the-panel): the POS and the storefront read one catalogue. 4. **The X-report will not build offline** — it is computed in the cloud. A Z-report after closing a shift without a connection will be produced once the queue of cash operations arrives. --- ## The fiscal receipt was not issued 1. **Read the “Receipt not issued” window.** It states the cause by the till's own error code and walks you through the steps; it also offers “Take a Z-report” and “Retry receipt” when the cause is visible from the cloud. 2. **The most frequent causes are at the device:** out of paper, an unclosed receipt on the till, more than 24 hours without a Z-report, an error that must be cleared with a key on the till itself. The window says so explicitly. 3. **If it is a hardware fault (modem, SIM, memory)** — no retry is offered, it would not help: a service engineer is needed. The window can be closed: the sale is already recorded and the payment is taken — the fiscal receipt can be issued from there once the till is ready. The queue should not have to wait. ⚠️ While the till is unavailable, orders and payments live on in the system, but no fiscal document appears — in most countries that is a reason to suspend sales. In depth: [Fiscalization](/en/docs/fiscal); for Russia — [Who needs an online till](/en/docs/kkt-who-needs). --- ## The internet went down 1. **The POS keeps working** — it rings up orders, prints and fiscalizes through the bridge on the same computer. Everything that has to reach the cloud piles up in a queue on the device. 2. **Watch the “N not sent” chip**: if it does not go down, check that the connection really is back and leave the POS tab active. If a red “N not delivered” banner appears, those records must be entered manually, reconciled against the shift's paper receipts. 3. **The kitchen display does not work offline** — tickets travel through the cloud. Until the connection is back, the kitchen runs on printed tickets. 4. **Card payment through the bank terminal cannot be taken** — it needs authorization at the bank. Take cash. The full picture, including the limits (24 hours for the queue, seven days for the session) — [If the internet goes down](/en/docs/offline). --- ## Cannot sign in 1. **Check the domain.** An account lives in its own brand's contour: a `cenaly.com` account will not be let into the Russian `cenaly.ru` and vice versa. The Russian contour has no Google sign-in — it has its own sign-in methods. 2. **Forgotten password** — “Recover password” on the sign-in page: a code arrives by e-mail, then a new-password form (at least 8 characters, upper and lower case, a digit, a symbol). No e-mail — check spam and check whether that is the right address. 3. **The sign-in page “hangs”** — a stuck browser cache: a button appears to clear the cache and retry, press it. Incognito mode also helps. 4. **Staff do not sign in with a password.** The owner issues a **sign-in code** to a waiter, a cashier or a device (sign-in by link or QR, with a PIN if the code is protected); codes live in the “QR codes” section, the “Devices” tab. QR sign-in is deliberately limited in rights and goes straight to the right screen. In depth — [Account and sign-in](/en/docs/account). --- ## The guest's online payment fails 1. **Check whether the “Online payment enabled” toggle is on** for the location: without it the payment button is not shown to the guest, even with the keys entered. 2. **Check the connection mode.** Real cards do not go through in test mode — live acceptance needs the provider's live keys. The reverse also happens: live keys and a test card. 3. **Check that the provider works in your country at all.** The list is filtered by the location's country and currency, and cards marked “Soon” have no live connection whatsoever. Russia currently has no ready online payment providers — what remains is payment at the till and on delivery. 4. **Check a specific order.** The status (unpaid / pending / paid / refunded) is visible in the “Orders” section; a test order with test keys is the fastest way to see where the flow breaks. In a network a provider is connected **for each location separately**. In depth — [Payments](/en/docs/payments), [Stripe](/en/docs/stripe). --- ## Notifications and form submissions do not arrive 1. **First check the section where records are guaranteed to be.** Form answers and website submissions **always** land in “Leads”, even if no e-mail went out. An e-mail, a message in the work chat and a webhook are **additional** notifications and must be switched on in the campaign settings. An auto-reply to the guest requires a subject line: without it the e-mail is not sent. 2. **Sound signals are switched on on the page.** The sound button in the “Orders” header covers new orders and waiter calls; a browser stays silent in a tab that has never been clicked. 3. **Check the recipient address** — the team replies and notifies to the account e-mail; look in spam. 4. **A widget on your own website stays silent** — check the installation (“Check installation” in the “My website” section), a foreign `data-domain` in the tag, and the 5-minute CDN cache. A tag inserted through Google Tag Manager will not be seen by the check — look at the site with your own eyes. An unpaid paid extension never reaches the page, even with the toggle on. In depth — [Campaigns](/en/docs/campaigns), [My website](/en/docs/site-widgets). --- ## A custom domain does not open 1. **Wait and press “Check now”.** DNS does not propagate instantly — at some providers the cache holds for up to an hour. A record can be checked with any online DNS lookup. 2. **Switch off the Cloudflare proxy** (the cloud icon must be grey, DNS only mode). While the proxy is on, no certificate will be issued, and the panel will show the ordinary “the record points elsewhere” — there is no separate message about the proxy. 3. **A root domain needs a second record** — the ownership challenge (`_cf-challenge…` / `_acme-challenge…`), with exactly the value shown in the panel. Without it activation never completes, even if ALIAS/ANAME is set correctly. 4. **“It opens, but shows the wrong menu”** — the domain is attached to another location. **“The domain is taken”** — it is already connected to another platform account; if the domain is yours, write to support. In depth — [Custom domain](/en/docs/custom-domain). --- ## No orders from a delivery platform, or the menu there is old 1. **There are no live partner connections to aggregators right now.** The Wolt, Glovo, Deliveroo and Yandex Eda connectors are written and tested against test data, but they cannot yet be switched on at a live location — it is too early to plan work around them. This is the first expectation to check. 2. **The platform's side needs the POS integration enabled.** Without a request to the platform itself, neither menu nor orders will start flowing, whatever toggles are set on our side. 3. **An old menu on the platform** is a catalogue push: it is done explicitly, not “by itself”. Also check the stop list and the location pause: they travel as separate events. What is ready and what is merely a request card is shown honestly in the app store. In depth — [Integrations](/en/docs/integrations), [Wolt](/en/docs/integration-wolt), [Glovo](/en/docs/integration-glovo), [Yandex Eda](/en/docs/integration-yandex). --- ## A phone does not register on the PBX 1. **The login was not entered in full** — the whole login of the form `sip-…-` is required, not just the number, and in both fields: User Name and Auth Name. 2. **The password is stale** — somebody pressed “Reset password”. Do not guess it, issue a new one. 3. **The server address is wrong** — a venue with a dedicated machine has its own address; copy it from the credentials window. 4. **The phone is completely silent (not even a rejection)** — switch the transport from TCP to UDP; check whether the router blocks UDP 5060 and whether SIP ALG is on. 5. **The wrong firmware** — units with Teams/Skype for Business/Zoom firmware will not register on an ordinary SIP PBX until SIP firmware is flashed. From the outside it is the same model. In depth — [SIP phones](/en/docs/sip-phones); every brand has its own page decoding the messages on the screen. --- ## What to tell support If the checks did not help, write with the full context straight away — it saves a round of correspondence: - the panel domain and the account e-mail, the location name; - the time of the event with the time zone; - the steps: what you clicked, what you expected, what you got, plus a screenshot or a short video of the whole screen — address bar included; - the order, receipt or booking number, if the problem is in one specific record; for hardware — the model and the “details” line from the error window. How to open the request form from the panel and what goes out with the diagnostics — [How to get help](/en/docs/support). --- ## Related articles - [How to get help](/en/docs/support) — the AI assistant, the request form, what to attach - [FAQ](/en/docs/faq) — short answers about plans, countries, devices and data - [If the internet goes down](/en/docs/offline) — what works without a connection and what the shift should do - [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — bridge statuses, devices, the print queue - [Cash shift and Z-report](/en/docs/cash-shift) — opening a shift, cash drops, reports - [Fiscalization](/en/docs/fiscal) — the fiscal receipt by country and the “Receipt not issued” window - [Account and sign-in](/en/docs/account) — passwords, sign-in codes, QR sign-in - [Security and data](/en/docs/security-privacy) — support access, revoking codes and sessions --- # Frequently asked questions Short answers. If you need a diagnosis by symptom — [Troubleshooting](/en/docs/troubleshooting); if you need a human — [How to get help](/en/docs/support). --- ## Plans and payment ### Can I start for free? Yes. There are four plans — free, Basic, Premium and Enterprise: the free one is always available and needs no card, and the paid ones can be explored during a trial period. Comparison and prices — on the [pricing](/en/pricing) page, the contents — in [Subscription](/en/docs/subscription). ### How much does it cost? Prices and plan contents live on one page — [pricing](/en/pricing); we do not duplicate them in the help centre so that they cannot drift apart. ### What exactly does a plan limit? There are five numeric limits: the number of locations, catalogue items, connected devices, orders per month and auto-translation languages. The rest of the difference between plans is not limits but the features themselves — [Subscription](/en/docs/subscription). ### What happens if I hit a limit? Limits are soft: they stop you adding beyond the plan but **never switch off what already exists**. Guest order intake is not blocked by a limit at all — you only get a warning. ### Can I change or cancel a plan? At any time. Upgrading, you pay the difference for the remaining period; downgrading, the new plan takes effect from the next payment — [pricing](/en/pricing). ### Is there a discount for paying annually? Yes, annual payment comes at a discount of about 20 % against twelve monthly payments — [Subscription](/en/docs/subscription). ### Can I pay by invoice rather than by card? Yes. The “Subscription” page has an “Issue an invoice” button — convenient for a company and bank transfers; the same page offers PayPal and redirect providers for paying by card — [Subscription](/en/docs/subscription). ### What are AI credits and how do they differ from the balance? They are a separate balance for AI features (generating photos and descriptions, analysing calls). The subscription page shows the remaining credits, the monthly spend per feature, a bill forecast and a monthly cap — [Subscription](/en/docs/subscription). ### Are paid extensions part of the plan or separate? Separate: sections and integrations are bought as cards in the [App store](/en/docs/app-store) on top of the plan, and “Own website” is a subscription per location. --- ## Countries and languages ### Which countries does the platform work in? The storefront, catalogue, POS and orders — in any country. What differs by country is **fiscalization** and **online payment**: there the list is specific — [Fiscalization](/en/docs/fiscal), [Payments](/en/docs/payments). ### How many languages does the menu work in? Forty-five, with automatic translation. How many languages **your** account gets is set by the plan — [QR menu](/en/docs/qr-menu). ### Do I need fiscalization? It depends on the country and the type of activity: in some places an online till is mandatory for food service, in others a receipt is required for any settlement. Check the exact requirements with your accountant; what the platform can do is in [Fiscalization](/en/docs/fiscal). ### In which countries is there a live fiscal receipt already? Full fiscalization currently works in Russia (54-FZ) and, as a tax invoice, in the United Kingdom, Australia, New Zealand and the UAE. For other countries see the status in [Fiscalization](/en/docs/fiscal). ### How does the Russian contour differ? Accounts on `cenaly.ru` live in a separate cloud, have their own sign-in methods (there is no Google sign-in there), have no guest online payment yet, and part of the analytics (finance, guest statistics, kitchen analytics) is unavailable. The Russian regulatory contours — 54-FZ, “Chestny ZNAK”, EGAIS — conversely exist only there. ### Can locations be in different countries? Yes. Every location has its own country, currency, set of languages, taxes, tips and service charge — [Multi-location](/en/docs/multi-location). --- ## Devices and hardware ### Does the guest have to install an app? No. The menu opens from a QR code in an ordinary phone browser — [QR menu](/en/docs/qr-menu). ### Do I need a dedicated POS appliance? No. The POS is a page in a browser on any computer or tablet, it installs “as an app” and keeps working when the connection drops — [POS](/en/docs/pos). ### How do I connect a receipt printer? Through **Cenaly Hardware Bridge** — a Windows or Linux service on the same computer as the POS. The bridge discovers USB/LAN/Bluetooth devices itself; the macOS version is “coming soon” — [Cenaly Hardware Bridge](/en/docs/hardware-bridge). ### Can I print without a computer, “straight from the cloud”? No: printing always goes through a bridge on some PC. But you can print **from another device** — the command reaches the bridge through the cloud, so a waiter prints from their own phone to the printer behind the counter. ### What hardware is supported? Receipt, kitchen and label printers, scanners, scales, customer displays, cash drawers, payment terminals, fiscal devices, cameras, SIP phones and gateways — an overview by class with the minimum kit per format: [Hardware](/en/docs/hardware). ### Are there mobile apps? Yes, for Android and **for staff only**: Admin, Service (waiter), KDS, Courier, POS, Rider and CRM. Sign-in uses the same credentials — [Mobile apps](/en/docs/mobile-apps). ### Does the POS work without the internet? Yes: it rings up orders, prints and fiscalizes through the bridge, and everything that has to reach the cloud piles up in a queue on the device. The kitchen display does not work meanwhile — tickets travel through the cloud — [If the internet goes down](/en/docs/offline). ### How many tills and bridges can I connect? Hardware is kept per location: each has its own bridge or several (universal, equipment, cameras, telephony), while the account hardware registry shows every bridge and device of every location at once. --- ## Data and security ### Where is my business data stored? In the cloud of the brand you signed up under: `cenaly.com` and `cenaly.com` are on AWS, `cenaly.ru` is on Yandex Cloud. In depth, including residency — [Security and data](/en/docs/security-privacy). ### Who on your team can see my data? Nobody by default. A support engineer enters the account only after you switch on “Support access” in the settings, and you revoke it in one click — [Security and data](/en/docs/security-privacy). ### Can I take my data with me? Yes, by yourself and without contacting support: **Settings → Data export** builds a ZIP (settings, catalogue, orders, customers, reviews), and there is also a quick catalogue CSV — [Data export](/en/docs/data-export). ### What does not go into the export? Secrets — PINs, integration keys, tokens and passwords — and photos: the files keep links to the images. A finished archive is kept for 7 days. ### Do you store guests' cards? No. The guest pays on your payment provider's side, the money goes straight to your account with them, and card details never pass through the platform — [Payments](/en/docs/payments). ### How do I delete my account? First build an [export](/en/docs/data-export) — after deletion there will be nothing left to take — then write to support. The request is fulfilled within **30 days** of being confirmed. The procedure and what gets deleted — [Account and sign-in](/en/docs/account). ### What should I do if a password may have leaked? Change the password, revoke the device sign-in codes and switch off “Support access” if it was on, then write to us — [Security and data](/en/docs/security-privacy). ### Is there two-factor authentication? Not yet — it is **in preparation** (an authenticator app). We promise no dates; until then the sign-in is protected by a long password, a separate login for every employee and device codes with a PIN on shared tablets — [Account and sign-in](/en/docs/account). ### Where do I report a vulnerability in the platform? To a dedicated address — `security@` on your brand's domain (for example `security@cenaly.com`) — not to general support — [How to get help](/en/docs/support). ### Do you make backups for me? We do not publish retention periods for internal copies and there is no “restore to a date” button in the panel, so **make your own export** before a bulk import or a catalogue clean-up — [Data export](/en/docs/data-export). ### Do I need a cookie consent banner? If you have a website and work with guests from the EU or other countries with such requirements — yes. A banner in 45 languages, automatic tracker blocking and a consent log are part of the platform — [Cookie consent](/en/docs/cookie-consent). --- ## Integrations ### Can I take orders from delivery aggregators? The Wolt, Glovo, Deliveroo and Yandex Eda connectors are written, but **there are no live partner connections yet** — it is too early to build your work on them. The state of each platform is shown honestly in the app store — [Integrations](/en/docs/integrations). ### Is there a 1C integration? Yes: importing items and counterparties from 1C:Accounting over OData (Russia, Belarus, Kazakhstan, Georgia) — [1C](/en/docs/onec). ### What works two-way right now? Evotor (catalogue, stock, orders, shifts, staff), WooCommerce (catalogue, orders, stock) and Saby Docs (EDI). Integrations with accounting systems are part of the Premium plan and above — [Integrations](/en/docs/integrations). ### My till or inventory system is not on the list — what now? Two routes: replace the third-party system with our POS (there are layout presets “like iiko” and “like r_keeper”), or move your data by file through the migration wizard — no API on the old system is needed — [Migrating to us](/en/docs/migrate). ### Can I upload a bank statement? Yes, by file already: “Counterparties” → the “Bank” tab, with operations matched to orders and documents. Direct API exchange with banks is planned. ### Is there an API and webhooks? Yes — for orders, catalogue and the till, plus a headless storefront mode: [Integrations](/en/docs/integrations), [Headless](/en/docs/headless), [Cash server API](/en/docs/cash-server-api). ### Can I sell on marketplaces? The Ozon, Wildberries and Kaspi adapters connect in pilot mode; the other platforms of the world catalogue still work as a “Soon” request — [Integrations](/en/docs/integrations). --- ## Several locations ### Do I need a separate account per location? No. Locations live in one account, each with its own prices, hours, hardware and integrations — [Multi-location](/en/docs/multi-location). ### Is the catalogue shared or per location? The catalogue is one per account: an item is created once, and a location picks what to show and overrides the price where needed. ### How many locations can I open? One on the free plan; how many Basic, Premium and Enterprise allow is on the [pricing](/en/pricing) page — we do not duplicate the numbers in the help centre so that they cannot drift apart. The limit is soft: it stops you creating a new location but does not switch off existing ones — [Multi-location](/en/docs/multi-location). ### Does this suit a franchise? Yes: co-ownership of a location, role-based rights, network-wide analytics and the franchisee's own storefront branding — [Multi-location](/en/docs/multi-location). ### Can I give a manager access to their location only? Yes, rights are configured per section and per location — [Staff and shifts](/en/docs/staff). --- ## Partnership ### Who can become a partner? Any account owner: the “Partner program” section is switched on by a card in the app store, then an application is filled in. No separate login is needed — [Partner program](/en/docs/partner-program). ### How much does a partner earn? Rates and the level are assigned by a platform representative after the application is reviewed; the current terms are visible in the partner cabinet. Until the application is approved a partner has no rates and no clients — and the section says so in plain words. ### An implementer set us up — can we attach them to the account? Yes: the “Partner” block on the “Subscription” page accepts the partner's code or link. The partner will be able to sign into your account only with your consent — [Partner program](/en/docs/partner-program). --- ## Help and onboarding ### What is the fastest way to find an answer inside the panel? Ask the AI assistant: it knows which page you are on, which country your location works in and which hardware is connected, and the ✨ spark next to a setting's heading explains that exact block — [How to get help](/en/docs/support). ### How do I reach a human? With the “🛟 Contact support” button at the bottom of the assistant panel, or by writing to `support@cenaly.com`. What to attach so you do not exchange three e-mails — [How to get help](/en/docs/support). ### Where do I start on day one? With the checklist for your format — [First day](/en/docs/first-day): what to switch on right away and what can honestly wait. --- ## Related articles - [How to get help](/en/docs/support) — the AI assistant, the request form, implementation partners - [Troubleshooting](/en/docs/troubleshooting) — diagnosis by symptom - [First day](/en/docs/first-day) — launch checklists by business type - [Subscription](/en/docs/subscription) — plan, limits, balance and invoice - [Multi-location](/en/docs/multi-location) — a network of locations, franchise, rights - [Security and data](/en/docs/security-privacy) — where data lives and who sees it - [Data export](/en/docs/data-export) — take everything as ZIP and CSV - [Hardware](/en/docs/hardware) — what connects and the minimum kit - [Glossary](/en/docs/glossary) — what the words in the panel mean --- # Glossary This page collects the words you will meet in the cenaly.com admin panel and in this help centre. The format is always the same: the term, one or two sentences, and a link to the article that covers it in full. --- ## How to read this glossary Two things are worth knowing up front, otherwise some entries will look contradictory. **Words depend on the business type.** The same entity is a "dish" for a restaurant, a "product" for a shop, a "service" for a salon or a service company and a "parcel" for a pickup point; a "guest" becomes a "customer" in a shop, a "client" in a salon and a "recipient" at a pickup point. The panel substitutes the right word on its own, and this glossary gives the neutral meaning. **Some terms are Russia-only.** KKT, the fiscal memory unit, OFD, EGAIS and Chestny ZNAK marking are flagged "Russia": these entities do not exist in other countries, while on cenaly.ru they are the backbone of till work. --- ## A–B **Add-on (extension)** — a feature or an integration switched on in the app store. Some add-ons are included in the plan, others are paid extras. → [App store](/en/docs/app-store) **Agent prompter** — hints from your knowledge base that an employee sees during a live call; they can switch the knowledge build without leaving the conversation. → [Knowledge base](/en/docs/knowledge-base) **Aggregator** — an external delivery platform (Wolt, Glovo, Yandex Eda) whose orders arrive in the panel alongside your own. → [Integrations](/en/docs/integrations) **AI credits (LLM credits)** — the remaining balance for AI tasks on the account; shown in the subscription next to the plan. → [Subscription](/en/docs/subscription) **AI secretary** — the voice robot of your own PBX: it answers the call, replies from the knowledge base and hands the conversation over to a human. → [Telephony](/en/docs/telephony) **App store** — the catalogue of the panel's add-ons and integrations: a section is switched on with a toggle there, and an integration is configured in a window over the catalogue. → [App store](/en/docs/app-store) **Barcode scanner** — almost always works as a keyboard: it "types" the code it reads wherever the cursor is, so no driver is needed. → [Hardware](/en/docs/hardware) **Booking** — a request for a specific time: a table in a restaurant or a room in a hotel. It lives on the floor panel and, for a hotel, on the booking calendar as well. → [Table reservations](/en/docs/reservations) **Booking calendar (21-day view)** — the hotel's forward view: bars of bookings and current stays across rooms, so you can see what is free and when the next guest arrives. → [Hotel](/en/docs/hotel) **Bridge (Cenaly Hardware Bridge)** — a free program on the till computer through which the browser talks to hardware: printers, scales, the fiscal register, the card terminal. Without it the till works, just without paper. → [Cenaly Hardware Bridge](/en/docs/hardware-bridge) **Business type** — the choice made at sign-up that tunes the system to your format: which sections are on, which service mode the till uses, and what everything is called. It can be changed at any time. → [First day](/en/docs/first-day) --- ## C–D **Callback** — a site widget: the guest leaves a number and the platform calls back on its own, with retries on your schedule. → [Callback](/en/docs/callback) **Cash drawer** — connects by cable to the receipt printer, not to the computer, and is opened by the printer's pulse on a command from the till. → [Hardware](/en/docs/hardware) **Cash shift** — the till's working period from opening to the Z report: sales, cash-in and cash-out land in it, and the discrepancy is calculated at closing. → [Cash shift](/en/docs/cash-shift) **Catalogue** — the section holding what you sell. A restaurant calls it "Menu", a shop "Catalogue", salons and service companies "Services", a blog "Articles". → [QR menu](/en/docs/qr-menu) **Catalogue import** — filling a menu or a catalogue from a ready-made list: a price list in Excel, Word, PDF or a photo, or a link to a site — the AI recognises the items and the prices and shows a plan of changes for review; for CSV there is a fast route without the AI. → [AI catalog import](/en/docs/catalog-import) **Collection** — a storefront group of products, assembled by hand or by a rule; in the online shop it is a page of its own with its own address. → [Collections](/en/docs/collections) **Combo** — a set built from several items ("build your lunch") with a choice inside; stock deduction expands the recipe of every item in the set. → [QR menu](/en/docs/qr-menu) **Counterparty** — a company or a private person in the CRM with whom you keep documents, contracts and settlements. Not the same as a guest: a counterparty is a party to a deal. → [Clients (CRM)](/en/docs/counterparties) **Courier** — an employee of your own delivery with their own screen and mobile app; not to be confused with an aggregator's courier. → [Own delivery](/en/docs/delivery) **Customer, guest, client, recipient** — one and the same entity in the contacts directory; the word is substituted according to the business type. → [Customers](/en/docs/customers) **Customer display** — a second screen showing the guest the total and the items: a browser page on the till's second monitor, or an app on a tablet in the same network. → [Hardware](/en/docs/hardware) **Delivery zone** — an area on the map with its own delivery fee, minimum order and delivery time. → [Commerce](/en/docs/commerce) **Deposit** — a prepayment for an online booking that holds the slot. Cancel in time and it is refunded; cancel late or fail to show up and it is kept. Moving the appointment does not reset it. → [Appointments](/en/docs/appointments) **Device login code** — a short code that connects a tablet, a kitchen screen or a monitor to the right location without a login and a password. → [QR codes and device codes](/en/docs/device-codes) **Digital worker** — a virtual employee that performs repetitive web routine in the owner's own browser — there, where somebody else's system has no API. Skills are installed for a specific person. → [App store](/en/docs/app-store) **Document** — a printable form, an invoice or a contract that the panel builds from a template and can fill in with AI. → [Documents](/en/docs/documents) --- ## E–G **EGAIS** (Russia) — the state alcohol accounting system. The till talks to its transport module (UTM) installed on the till PC through the bridge. → [Beer and EGAIS](/en/docs/kkt-egais-beer) **Expo (handover screen)** — the screen where assembled orders are checked and handed to a courier or a guest: bag stickers and a manifest with the full contents. → [Expo](/en/docs/expo) **Extension number** — an internal number of an employee or a device on your own PBX. A SIP desk phone, a DECT handset or a gateway registers with the credentials of an extension. → [SIP phone setup](/en/docs/sip-phones) **Feed (product feed)** — an export file of your products for an external platform (Google, Meta, Pinterest and others): the platform reads it on its own schedule. → [Google Merchant Center](/en/docs/google-feed) **Fiscal memory unit (ФН)** (Russia) — the protected memory block inside the till that signs receipts and has a service life; once it is exhausted, the unit is replaced. → [Choosing a fiscal memory unit](/en/docs/kkt-fn-choice) **Fiscalisation** — registering a settlement in the country's tax system and issuing the guest a fiscal receipt. Your own till does it, registered to your own legal entity; we are the transport and the queue. → [Fiscalisation](/en/docs/fiscal) **Folio** — a room account in a hotel: it opens at check-in, collects charges (including orders placed from the room QR) and is closed with a single settlement at check-out. → [Hotel](/en/docs/hotel) **Gateway** — a box between your PBX and a "non-SIP" line: a SIM card (GSM/LTE), an ordinary analogue city line (FXO) or ISDN. To the PBX a gateway looks like an ordinary extension. → [GSM gateways and city lines](/en/docs/sip-gateways) --- ## K–M **KDS (kitchen display system)** — the kitchen screen: tickets by station instead of paper slips, courses, "ready" in one tap. It is designed for a tablet and a monitor, not adapted to a phone. → [Kitchen display (KDS)](/en/docs/kds) **Kiosk** — a storefront mode on a tablet or a touch terminal in which the guest assembles and pays for the order without a cashier. → [Self-service kiosk](/en/docs/kiosk) **KKT** (Russia) — the cash register hardware that prints the fiscal receipt and passes it to the fiscal data operator. → [How to choose a KKT](/en/docs/kkt-choose-kkt) **Knowledge base** — a library of your own documents that the AI assistant, the site chat, the AI secretary, the agent prompter and staff training all draw answers from. → [Knowledge base](/en/docs/knowledge-base) **Label (badge on an item)** — a badge next to a catalogue item: "spicy", "vegetarian", "new", allergens — from the ready-made library or your own one with an uploaded icon; a label can be shown only in the locations you choose. → [Dish labels](/en/docs/labels) **Label printer** — a printer of stickers on discrete media (a roll with gaps); not the same as a receipt printer: it speaks another language and has to be calibrated. → [Hardware](/en/docs/hardware) **Lead (enquiry)** — an inbound request from the site: a form or quiz answer, a callback, an online booking, a table reservation. Everything arrives in one stream in the "Enquiries" section. → [Engagement campaigns](/en/docs/campaigns) **Location (venue)** — one venue inside the account: its own address, menu and prices, staff, hardware and settings. One account holds as many locations as you need. → [Managing a chain](/en/docs/multi-location) **Loyalty** — a retention scheme for guests: stamps ("the sixth coffee is free"), points with a redemption cap, or a discount for a regular. All three run on one journal, together with coupons and promo codes. → [Loyalty program](/en/docs/loyalty) **Market** — our own storefront where the menus of several venues are gathered in one place and the guest picks the venue. → [Market](/en/docs/market) **Marketplace** — an external product platform your shop exports products to and pulls orders from. The Ozon, Wildberries and Kaspi adapters run in pilot mode; other platforms accept a "coming soon" request for now. → [Integrations](/en/docs/integrations) **Marking (Chestny ZNAK)** (Russia) — the code on a unit of goods that the cashier scans at intake and at sale, and that the system reports to the state system. → [Marking errors](/en/docs/kkt-marking-errors) **Membership (package of visits)** — a package of services sold to a client in advance: N visits, a prepaid wallet, or a subscription with a regular charge. Visits are written off as the client comes, and the remainder is visible in their record. → [Appointments](/en/docs/appointments) **Menu schedule** — a set of items available only on chosen days and hours: business lunch, breakfasts, happy hour with a different price. → [Menu schedule](/en/docs/scheduled-menus) **Modifier** — an addition or a qualifier for an item ("no onion", "double cheese", "lactose-free milk"). It prints as its own line under the item on the kitchen ticket, the sticker and the bag manifest. → [QR menu](/en/docs/qr-menu) **Multibutton** — a floating button on your own site that gathers every contact channel (messengers, a call, chat, booking) into one menu. → [Multibutton](/en/docs/multibutton) --- ## N–P **No-show** — a visit status: the client booked and did not turn up. If there was a deposit, it is kept. → [Appointments](/en/docs/appointments) **OFD** (Russia) — the fiscal data operator: the intermediary through which receipts travel from the till to the tax authority. → [Receipts are not reaching the OFD](/en/docs/kkt-ofd-not-sending) **OTA (online travel agency)** — a hotel sales channel: Booking, Airbnb and similar platforms. Availability is synced with them through a channel manager or an iCal file. → [Hotel](/en/docs/hotel) **Parcel** — the unit of accounting at a pickup point. It is not an order: a parcel has its own carrier, waybill, storage place and recipient. → [Pickup point](/en/docs/pickup-point) **Partner** — someone who brings clients in through their own link or code and earns a reward for them; the terms are visible in the partner cabinet. → [Partner programme](/en/docs/partner-program) **Pickup point** — a business type with its own operating model: intake from carriers, storage in cells, handover to the recipient. → [Pickup point](/en/docs/pickup-point) **PMS (property management system)** — a hotel management system: room inventory, check-in and check-out, folios, the booking calendar. For us it is the "hotel" business type on top of the common core. → [Hotel](/en/docs/hotel) **Pop-up** — a message on the storefront shown by a scenario: an exit attempt, N seconds on the page, adding a product to the cart. → [Engagement campaigns](/en/docs/campaigns) **POS (point of sale)** — the till: the panel page where the order is assembled, payment is taken, the receipt is printed and the shift is run. It needs no dedicated hardware and works without the internet. → [POS](/en/docs/pos) **Pre-check** — the guest's bill before payment. The document is non-fiscal and says so on paper; at a venue with no receipt printer the pre-check is printed by the fiscal till itself. → [Kitchen and floor printing](/en/docs/kitchen-printing) **Print queue** — the queue of jobs inside the bridge that survives a restart: if the printer is off or out of paper, the job is not lost and prints once the device comes back. → [Kitchen and floor printing](/en/docs/kitchen-printing) --- ## Q–S **QR menu** — the storefront that opens on the guest's phone from a QR code on the table, in an ordinary browser: no app to install. → [QR menu](/en/docs/qr-menu) **QR sign-in** — signing in to the panel from a phone using a QR code shown on the computer screen: no password typing on the phone. → [Account and sign-in](/en/docs/account) **Rate plan** (hotel) — the plan a room is sold on: meals, price by number of guests, day-of-week surcharges, sale restrictions, cancellation policy, channels. → [Hotel](/en/docs/hotel) **Receipt clichés (header and footer)** — the lines the fiscal register prints at the top and the bottom of every receipt: the venue name, the address, the tax details, a thank-you. Edited line by line in "Register settings" — the cut, logo flags and tax rates live there too. → [Fiscalisation](/en/docs/fiscal) **Resource** — a resource employee, a room or a chair: an entity that exists in the schedule only as a column and has no login. → [Appointments](/en/docs/appointments) **Ring group** — the set of extensions your PBX rings on an inbound call; who rings and in which seconds is set by the ring plan grid. → [Telephony](/en/docs/telephony) **RMA (returns)** — a buyer's return request: the decision, the money back to the original payment method or as a gift card, and the items back into stock. → [Returns](/en/docs/returns) **Room** — the unit of a hotel's inventory: rooms and beds take the place of tables, and floors the place of halls. → [Hotel](/en/docs/hotel) **Service** — the catalogue item type for salons, hotels and service companies — the same slot a dish occupies for a restaurant and a product for a shop. → [Appointments](/en/docs/appointments) **Service charge** — the venue's own surcharge on the bill (fixed or a percentage): configured per location and added to the total as a separate line. It is not a tip — a tip is chosen by the guest and is calculated from the items only, without the service charge. → [Tips](/en/docs/tips) **Signage monitor** — a TV or a tablet showing your slideshow: item cards, promo banners, a menu board. It opens by a public link in a browser, works offline and picks up changes on its own, including the stop-list and the happy-hour price. → [Advertising monitor](/en/docs/signage) **SIP trunk** — the connection to a telecom operator that brings a landline or mobile number into your PBX. Unlike a gateway it needs no hardware. → [Connecting a provider number](/en/docs/sip-trunks) **Specialist** — the person a client is booked with: a column in the daily grid of the appointments journal. They are an employee from the common directory and do not need a login. → [Appointments](/en/docs/appointments) **Split bill** — splitting the bill at the till: by items, equally between guests, or by guest if the waiter has assigned ticket lines to G1, G2 and so on. Each part is closed with its own payment method. → [POS](/en/docs/pos) **Stop-list ("86")** — the "we are out of it" mark: the item disappears for the guest and at the till. "86" is the restaurant shorthand; set a period and the item returns to sale on its own. → [Menu schedule and stop-list](/en/docs/scheduled-menus) **Storage cell** — a parcel's storage place at a pickup point in the rack / shelf / slot scheme; it is assigned automatically at intake. → [Pickup point](/en/docs/pickup-point) **Storefront** — the public side the guest sees: the QR menu, the shop page or the location's website. The opposite of the admin panel. → [QR menu](/en/docs/qr-menu) **Sub-partner** — a partner brought in by another partner. There are exactly two tiers: a sub-partner will not have a network of their own. → [Partner programme](/en/docs/partner-program) **Subscription** — the account's plan: what is included, when the next charge happens, where the invoices and the balance are. → [Subscription](/en/docs/subscription) --- ## T–X **Table** — a place in the hall an order is attached to; in a hotel a room plays its part, and a counter format has no tables at all. → [Floor plan](/en/docs/tables) **Tips** — an extra amount from the guest: switched on with a toggle in the location settings, with percentage presets filled in by country. → [Tips](/en/docs/tips) **Vertical** — the internal name for the business type. It is configuration and terminology on top of one core rather than a separate product: almost every capability is available to any vertical. → [First day](/en/docs/first-day) **Waiting list** — a queue of guests for a time that is already taken: once it frees up, the platform offers the slot to the next in line. → [Table reservations](/en/docs/reservations) **Widget** — a cenaly.com block on your own website: chat, online ordering, booking, a pop-up, the multibutton. It goes in with a single tag and does not require changing your storefront. → [My website](/en/docs/site-widgets) **Workplace** — the switch in the sidebar (Floor, Kitchen, Till, Reception, Stock and others) that narrows the menu down to the sections you need. It is a filter on top of the role's rights, not the rights themselves. → [Staff](/en/docs/staff) **X report and Z report** — cash shift reports: X is an interim one that does not close the shift, Z is the final one that does. → [Cash shift](/en/docs/cash-shift) --- ## Related articles - [How to get help](/en/docs/support) — the AI assistant in the panel, support, what to attach to a request - [FAQ](/en/docs/faq) — short answers about plans, countries, devices and data - [Troubleshooting](/en/docs/troubleshooting) — by symptom: nothing prints, orders do not arrive - [Hardware: what connects](/en/docs/hardware) — printers, scanners, scales, fiscal devices, terminals, phones - [First day](/en/docs/first-day) — launch checklists by business type --- # Hardware: what connects You do not need to buy hardware to get started: the storefront opens on the guest's phone, and the till is a page in a browser on any computer or tablet. Hardware comes in when you need paper, weight, barcodes or a fiscal receipt. The main rule: **a browser does not talk to retail hardware on its own**. Between the page and the metal sits [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — a free program for Windows or Linux installed on the same computer where the till is opened. To see your devices: **Admin panel → Hardware** (`admin.cenaly.com/hardware`). --- ## Who needs what | Format | Minimum kit | What to add later | |---|---|---| | **Cafe, coffee shop** | a PC or tablet for the till + a receipt printer (networked) | cash drawer, payment terminal, a fiscal register if your country requires one | | **Restaurant with a dining room** | the same + a tablet or monitor for the [kitchen screen](/en/docs/kds) | a kitchen printer per station, a second printer in the bar, a floor monitor | | **Canteen, fast food** | a till at the counter + a receipt printer | scales (price by weight), a [kiosk](/en/docs/kiosk) on a tablet, an order-ready board, a [signage monitor](/en/docs/signage) | | **Shop** | till + receipt printer + a **barcode scanner** | scales for loose goods, a shelf-label printer, a customer display, a terminal | | **Salon, services** | any PC or tablet (a receipt is not always needed) | receipt printer, terminal, a fiscal register by country | | **Hotel** | a PC at reception + a receipt printer | terminal, fiscal register, a till in the hotel restaurant | | **Pickup point** | PC + a **scanner** (intake and handover by scan) + a receipt printer | a fiscal register — mandatory for cash on delivery, see [Pickup point](/en/docs/pickup-point) | A fiscal register is needed where the country's law requires one, and in that case it is not a "later" item but a day-one one — check your country in [Fiscalisation](/en/docs/fiscal). --- ## Three ways to connect | How | What works this way | What matters | |---|---|---| | **Through the bridge** | printers, cash drawer, scales, fiscal register, payment terminal, EGAIS UTM (Russia), cameras | the bridge serves **only its own computer**: a browser cannot reach the bridge on the PC next door | | **Straight in the browser** | the barcode scanner (it works as a keyboard), the till and kitchen tablets, the kiosk screen, the signage monitor, the customer display as a second screen | no drivers and no bridge needed — just a browser and the network | | **Through the cloud** | a command to the till from another device, a cloud test print, printing to a printer on **another PC**, cloud payment terminals | both bridges must serve the same location; no VPN and no shared folder needed | An account can hold several bridges, each with its own role: universal, hardware, cameras or telephony. The **account hardware registry** on the same page lists every bridge and device across the chain. --- ## Receipt and kitchen printers Through the bridge you print the sale and refund receipt, the [pre-check](/en/docs/kitchen-printing), X and Z reports, kitchen tickets per station, stickers and the bag manifest. - **The working transport is the network one:** a printer with Ethernet or Wi-Fi reachable by IP address (port 9100). The bridge can scan the local network for such printers, and the address can also be typed in by hand. - **What prints:** the **ESC/POS** language — Epson TM, Star, Bixolon, Xprinter, Rongta and compatible clones; paper width 80 mm (42 characters) and 58 mm (32 characters). - **Non-Latin scripts:** Cyrillic prints from a code page (CP1251/CP866), and a line the print head cannot render (Georgian, for instance) is drawn by the bridge **as an image** with a built-in font. Details — [Kitchen and floor printing](/en/docs/kitchen-printing). - **USB and Bluetooth are in development:** today a receipt printer connects **over the network, Ethernet or Wi-Fi, port 9100**. A printer on a USB cable or a COM port can be added in the wizard, but there is no driver for those transports yet — the device appears in the list with a note about its transport and printing falls back to the browser dialog; Bluetooth is being built alongside. "Cloud printers without a PC" (where the job goes from the server straight into the printer) will not exist at all: printing always goes through the bridge. The practical conclusion for today is to buy a model with Ethernet or Wi-Fi. Jobs are not lost: the bridge keeps its own [print queue](/en/docs/kitchen-printing) with retries that survives a restart. --- ## Label printers - **How it connects:** through the bridge, as a device with the "label printer" role. - **What prints:** item and bag stickers (60×40 mm) at handover, shelf labels and stock labels with a barcode, name, price and best-before date — [Stock](/en/docs/inventory), [Kitchen and floor printing](/en/docs/kitchen-printing). Shelf labels can also be printed as an ordinary sheet on an office printer. - **What is missing:** the native languages of label printers — **the bridge does not produce ZPL (Zebra) or TSPL (TSC, Godex)**. The sticker goes to a 60 mm-class receipt head as a narrow ESC/POS document and is torn off on the comb; this has not been verified on real label hardware yet. Scales with their own label printing (CAS, DIGI, SHTRIKH-Print) calculate weight, price and barcode inside themselves — we do not drive their printing. --- ## Barcode scanners - **How it connects:** straight into USB, **no bridge needed**. The scanner works as a keyboard: it "types" the code it has read wherever the cursor is, usually adding an Enter. - **What is supported:** any scanner in keyboard mode. Marking codes and QR need a **2D scanner** — a 1D one will not read DataMatrix. - **Where it is used:** finding a product at the till by its code, intake and stock-taking in the warehouse, marking codes (Russia), parcel intake and handover at a pickup point. - **What is missing:** a scanner in virtual COM-port mode — switch it to keyboard mode. Mobile stock-taking with the phone as a scanner is not there yet either. > The classic trap: the scanner obeys the computer's keyboard layout. With a Cyrillic layout active, Latin codes arrive in Cyrillic — switch the layout to Latin. --- ## Scales - **How it connects:** through the bridge, over a serial port (COM or USB-COM). - **What is supported:** scales that continuously emit a weight string into the port — CAS, Mettler Toledo, DIGI, SHTRIKH, Massa-K and no-name COM scales. The driver is a general one: it takes the first decimal number out of the string, so most scales work without model-specific work. - **Where it is used:** the weight of goods at intake and the weight of a dish priced by weight at the serving counter — the weight lands in the line on its own. The live weight and a stability flag are visible on the Hardware page. - **What is missing:** networked scales and USB-HID scales; scales with a truly exotic string format may need driver work. --- ## Customer display - **How it connects:** it is a **second screen**, not a bridge device. Two options: open the display page on the till PC's second monitor, or install the app on a tablet or phone in the same Wi-Fi network and pair it with a PIN from the bridge status page. - **What it shows:** the contents of the order and the amount due. - **What is missing:** classic two-line VFD/LCD pole displays — they do not work as a bridge device yet, and there is no need to add them. --- ## Cash drawer - **How it connects:** by cable **to the receipt printer** — into its **DK** socket (RJ-11/RJ-12) or over **USB**. On a command from the till the printer sends a pulse and the drawer opens; both connections are tested. - **Where it is used:** opening on a cash sale and manually by button (at the till and on the Hardware page). A fiscal register can open the drawer too — the pulse comes out of its own socket, so a separate receipt printer is not required for that. - **Worth knowing:** the drawer is opened by the device it is plugged into, so at a venue with two printers the drawer goes on the till printer, not the kitchen one. --- ## Payment terminals - **How it connects:** through the bridge. Cloud ones — **SumUp**, **Square**, **Stripe Terminal**, **Adyen**; over the local network — **Nexo/SaleToPOI** and **OPI** (Ingenico, Wincor Nixdorf and compatibles). There is also a **manual** mode: the cashier charges on their own terminal and enters the result. - **What it does:** payment from the till, several terminals at one venue with a choice at payment, and binding a terminal to the [kiosk](/en/docs/kiosk) so the guest pays by card without leaving for a provider page. - **Important:** the terminal stays yours: the provider's credentials (access key, reader id) are entered once in the device settings, and the money moves under your contract — we pass the amount across and receive the payment result. - **A terminal is not online payment.** Taking cards on the website means a payment provider; it is connected separately and depends on the country: see [Payments](/en/docs/payments). --- ## Fiscal registers by country The fiscal receipt is printed by **your** register, registered to your own legal entity; we are the transport and the queue. It connects through the same bridge. | Country | What is supported | |---|---| | 🇬🇪 Georgia, 🇧🇬 Bulgaria | **Daisy** fiscal registers (verified on a live fiscalised device) | | 🇵🇱 Poland | fiscal printers speaking the **POSNET Thermal** protocol (Posnet, Emar, Innova, Torell, Elzab) | | 🇷🇺 Russia | **ATOL**, **SHTRIKH-M**, **Pirit / Dreamkas Viki Print**, **Mercury**, plus our own 54-FZ cloud register | Other countries, cloud fiscalisation gateways and what the product does not have yet are covered in [Fiscalisation](/en/docs/fiscal). On cenaly.ru the choice of device is covered separately: [How to choose a KKT](/en/docs/kkt-choose-kkt); the EGAIS UTM lives there too and is added as an ordinary bridge device. > **A fiscal register is not a spare receipt printer.** If the venue has no separate receipt printer, the bridge will not push our documents through the register: only a test print and the pre-check are allowed. A separate receipt printer removes that limitation entirely. --- ## Tablets and PCs | Role | What works | Requirements | |---|---|---| | **Till** | any computer, tablet or phone with a browser | the layout targets a tablet; installs "as an app" and keeps working when the connection drops | | **Kitchen screen (KDS)** | a tablet or a monitor | not adapted to a phone | | **Self-service kiosk** | an Android tablet, an iPad, a Windows terminal | a screen from 10 inches, the browser pinned in kiosk mode, orientation locked, internet required | | **Signage monitor** | a TV or a tablet with a browser | works offline after the first load | | **Bridge** | the same PC the hardware is plugged into | Windows or Linux (x64/ARM64); macOS is planned | Tablets and monitors are attached to a location with a [device login code](/en/docs/device-codes) — no need to type a login and a password on a shared device. --- ## Phones, DECT and gateways Telephony runs in its own contour and needs no hardware bridge: the handset registers with the credentials of an extension directly on our PBX. - **Desk phones, DECT bases and handsets, ATA adapters, door intercoms, softphones** — [SIP phone setup](/en/docs/sip-phones): what to type into any handset plus per-brand guides (Yealink, Grandstream, Fanvil, Panasonic, Cisco, Snom, Poly, Gigaset and others). - **A SIM card, a city line, ISDN** — through a gateway: [GSM gateways and city lines](/en/docs/sip-gateways). - **An operator number with no hardware** — a [SIP trunk](/en/docs/sip-trunks). - The whole picture of the section — [Telephony](/en/docs/telephony). --- ## The venue network - **The bridge and the browser live on the same computer.** The till page finds the bridge on the local address, with no code to type. A bridge on a PC where the panel is never opened (a server in the back room) is paired with a one-time code from the panel. - **The printer sits in the same network as the bridge,** reachable by IP on port 9100. Pin its address down (a DHCP reservation or a static IP): a changed address means "the printer does not respond". - **The waiter's tablet, the kitchen screen, the kiosk and the customer display** belong in the same network; the tablet till and the display pair with the bridge using a PIN that is only shown on the till PC's screen. - **Keep the guest Wi-Fi on a separate network** from the till one — a guest has no business sitting in a network with tills and printers. - **The internet** is needed for cloud features; the till itself keeps ringing up and printing without it — [If the internet goes down](/en/docs/offline). --- ## Limitations - **The bridge prints only from its own computer.** Either a bridge on every till device, or cloud printing to a printer on another PC. - **USB and Bluetooth for printers are in development:** the network transport is what works today (Ethernet or Wi-Fi, port 9100). Cloud printers without a PC will not exist at all: printing always goes through the bridge. - **Label printer languages (ZPL/TSPL) are not supported** — the sticker prints as ESC/POS on a receipt head and has not been verified on real label hardware. - **The scanner works in keyboard mode only**, scales over COM only, the customer display as a second screen only. - **Pour control (tap flow meters) is a skeleton:** the "poured vs sold" report works, but until a physical sensor is connected the "poured" side shows demo data, and the page says so plainly. - **There is no macOS build of the bridge yet** — Windows and Linux. --- ## Troubleshooting The short version of what to check first; the full symptom-by-symptom walkthrough is in [Troubleshooting](/en/docs/troubleshooting). | Symptom | The first three checks | |---|---| | Nothing prints | the bridge is running → the printer is online and has paper → no stuck [queue](/en/docs/kitchen-printing) in the till header | | The device is not in the list | the bridge is online → "Search again" → the **"PC details"** card in the registry: it shows every piece of hardware the PC sees and every COM port with a note on who is holding it | | The till or the fiscal device does not respond | the cable and the COM port → is a vendor utility holding the port → the device state in the registry ([Fiscalisation](/en/docs/fiscal)) | | Garbled characters instead of letters | switch the device to image printing for non-Latin scripts | | The scanner types the wrong characters | the OS keyboard layout is switched to Cyrillic | | The drawer does not open | the cable is in the printer's DK socket (or USB is plugged in) → the device the drawer hangs on is online → the "Open drawer" button on the Hardware page | --- ## FAQ ### Do I have to buy a cash register? Only if your country's law requires one. The till itself is a browser page on an ordinary PC or tablet; the hardware register is for the fiscal receipt, see [Fiscalisation](/en/docs/fiscal). ### Which receipt printer should I buy? A model with Ethernet or Wi-Fi that speaks ESC/POS, 80 mm or 58 mm. USB and Bluetooth are still in development, so "the cheapest USB printer" will not print today. ### Can receipts be printed without the bridge? Till documents — yes, through the browser's ordinary print dialog. Kitchen tickets and stickers — no, only through the bridge. The exception is a venue whose only hardware is a fiscal register: there the register prints the receipt itself and the browser fallback does not kick in. ### The printer is attached to another computer — do I need to run a cable? No. The **"Print from another PC"** action in the hardware registry creates a link to that printer, and the job travels through the cloud to the bridge that owns it. All that is required is that both bridges serve the same location. ### Will an Android smart terminal (SUNMI, PAX, MSPOS) work? As a tablet with a browser — yes, the till will open on it. Our bridge does not use its built-in printer, second screen or fiscal module. --- ## Related articles - [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — installing the bridge, the device list, checks, the hardware registry - [Kitchen and floor printing](/en/docs/kitchen-printing) — stations, stickers, the print queue, code pages - [Fiscalisation](/en/docs/fiscal) — fiscal registers and cloud gateways by country - [POS](/en/docs/pos) — where all of this is used - [QR codes and device codes](/en/docs/device-codes) — attaching tablets and monitors - [Telephony: your own PBX](/en/docs/telephony) — the section this telephony hardware belongs to - [SIP phone setup](/en/docs/sip-phones) · [GSM gateways and city lines](/en/docs/sip-gateways) — telephony hardware - [Troubleshooting](/en/docs/troubleshooting) — a symptom-by-symptom walkthrough --- # Partner program The partner program is for those who bring in clients and look after them: studios and agencies, integrators and installers, automation consultants, hardware vendors, and simply owners who recommend the product to their neighbours. The partner cabinet is **a section of the same panel** where you run your own locations: there is no separate account, no second login and no separate website. You choose the partnership model in the application: **agent** (brings a client in, whose contract is with us), **reseller** (sells themselves and may become the party to the contract with the client), **referral** (shares a code or a link), **ambassador**, **integrator** (implements and maintains) or "other". The working terms for the chosen model are assigned by a Cenaly representative. Open: **Admin panel → Partner program** (`admin.cenaly.com/partners`). The section is switched on by the **Partner program** card in the [app store](/en/docs/app-store) — it is hidden by default. --- ## What you need to get started - **An account in the panel** and a sign-in as the owner: the partner card is bound to your account. An employee with limited rights cannot switch the program on. - **The "Partner program" extension enabled** in the app store. - **Data for the application**: company name (or your own name if you are an individual), contacts and, if you have them at hand, legal details — the set depends on the country. - **Acceptance of the document set**: until the current version is accepted, attaching clients and inviting sub-partners do not work (reading your own money is never blocked). --- ## Step 1. Application and status You can apply from the cabinet (enable the extension and the form opens) or from the public program page on the brand's website (`cenaly.com/partners`). The form is the same: | Block | What we ask | |---|---| | **Model and company** | the partnership model and the name | | **Contacts** | country from the common list, up to five phone numbers, website | | **Country-specific details** | legal status (company / sole trader / self-employed / individual — the set comes from the country) and its fields: for Russia — INN, KPP, OGRN, bank account, BIC, correspondent account; for Georgia — TIN and IBAN; for the EU — VAT. Plus the legal and the actual address | | **Market** | countries of distribution as chips, regions and cities in words, client types (these are the product's business types, not a separate list of "industries") | | **Preferred option** | white-label level 0–3 — asked of resellers only | **There is exactly one mandatory field — the name.** An application is not a contract: if you do not have a registration number at hand, that does not block submission. What does block it is a typo in a detail you did enter — checksums for INN, OGRN and VAT are validated immediately. The application is created in the **"awaiting decision"** status: until a Cenaly representative activates the card, the partner has neither rates nor clients — the section says so in plain words. The preferred level goes into a separate field: the terms are set by the representative, not by the applicant. You get an e-mail both when the application is accepted and if it is declined. Later the same fields are edited on the **Profile** tab — it is literally the same form. --- ## Step 2. Documents and terms The **Documents** tab holds what you work under: | Document | What it covers | |---|---| | **Partner agreement** | the framework contract: independent contractor status, the models, attachment only with the client's consent, the two-tier network, taxes, confidentiality, termination and what happens to the clients | | **Settlement, invoicing and attachment rules** | the calendar month, the calculation base, "accrual ≠ payment", the invoice lifecycle, numbering, the objection period | | **Data and confidentiality** | exactly what a partner sees about an attached client and what must not be done | | **Brand, white-label and the network** | what is allowed at levels 0–3, who runs support, who must not be invited into the network | | **Annex No. 1** | your own card: the parties, legal details, model, level, **rates**, settlement currency, payment terms, date of acceptance | | **Templates** | a sub-partner contract and a level-3 reseller contract with an end client — optional, not part of the acceptance | **The reward percentages are deliberately absent from this help: the terms are individual and live in your cabinet** — the commission (what we pay you), the wholesale share (what you pay us), the currency and the payment deadlines are shown in Annex No. 1 and in the partner card. The edition of the set depends on the contour: for `cenaly.ru` it is the Russian one (an agency construction under the Civil Code, the agent's report, personal-data law requirements), for the other brands it is the international one with a Russian translation. Acceptance is a button with a confirmation of authority; the time, the account, the language and the browser are recorded by the server. Versions: **clarifications** require no re-reading, **material changes** require acceptance again but come with a **14-day grace period**, whose end date is shown in the banner. After the grace period the attach and invite buttons do not disappear — a click opens a window "please accept the current version first" with a door to the Documents tab. --- ## Step 3. Clients: code, link, request **The client attaches themselves.** You give their e-mail address or hand out your code, and the fact that "my account is registered to partner X" is confirmed by the account owner on their own subscription page. A partner has no "attach any account" call — that would be a way to take somebody else's client just by knowing their identifier. | Path | What it looks like | |---|---| | **Request by e-mail** | the Clients tab → "Attach account": you enter the e-mail the client signs in with, plus a note for yourself. The client sees a card "partner X asks to attach your account" and accepts or declines; an e-mail is sent to them. Below the client table there is a list of requests with the fate of each one (awaiting reply / accepted / declined / expired) and a "Withdraw" button | | **Partner code** | 8 characters with no lookalike `0`/`O` and `1`/`I`/`L` — meant to be read out on the phone and printed on a business card. Issued once and never changes. Next to it there is a ready-made link of the form `…/subscription?partnerCode=XXXX`: it fills the code in automatically and the client only has to confirm | | **Manually** | a Cenaly representative or the brand root attaches the client by e-mail or by account identifier | The boundaries, all visible in the interface: - a request lives **30 days**; one partner may have no more than **200** pending at a time; **one address — one pending request**, and a second partner asking the same address is refused; - **one client — one partner**: an account already attached to someone else cannot be attached. **You cannot attach your own account** — a commission on your own subscription is a discount, not a partnership; - a suspended partner and a partner "awaiting decision" attach nobody; the code stays and works again after reinstatement; - **the client cannot detach themselves**: consent is a deal between two sides, so detaching is done by Cenaly or the brand root. **What you see about a client.** The name, plan, subscription state, monthly price and attachment date — always. Beyond that it is up to **the client's consent**: "health" (a traffic light `working / needs attention / gone quiet`, the last sign-in date to the day, the list of enabled sections) is on by default and the client may switch it off; usage counters (orders as a range `0 / 1–10 / 11–50 / 50+`, guest sessions, catalogue items, employees, devices) require their explicit opt-in. Order amounts, revenue, average ticket, order contents, personal data of guests and employees, documents and calls are **never** shown, under any consent. --- ## Step 4. Sub-partners The **My network** tab is your own **two-tier** network: you and your sub-partners; there is deliberately no third tier. What you can do: invite by e-mail address (the invitation is single-use and binds to the first account that signs in with it), set a commission **no higher than your own** and a wholesale share **no lower than your own**, suspend and resume work, hand your own client to a sub-partner and take them back, see their clients, run the settlement in both directions and issue them an invoice. What you cannot do: bring somebody else's account into the network with your own hand (a new client only ever arrives with their own consent), and lift a suspension imposed by us. **Sub-partner ceilings** live in their card: how many clients they may hold, in which countries and which business types, and the ceiling for access to client accounts (`not allowed` / `view only` / `view and change`, "view only" by default). An empty field means "no restriction". Next to it there is a feed of facts for the last three months (attachment request, client attached or detached, invoice issued or paid, plan granted, sign-in into a client's account, terms accepted) and three figures: accrued this month, owes you, last seen in the cabinet. --- ## Step 5. Settlements, invoices and disputes The **Settlements & invoices** tab. - **The period is a calendar month.** The base is computed from the subscriptions of attached clients: the fixed subscription price is taken, an annual one is divided by 12, and your rate is applied. A closed month is stored as a snapshot and is never recomputed. - **Accrual ≠ payment.** A line means "the client was on their plan at price X for the whole of September", not "the client paid X". The payment fact is shown next to it in a reference column, where empty means "no data", not "did not pay". - **An invoice goes both ways**: "I owe" (wholesale) and "I am owed" (commission). The lifecycle is draft → issued → sent → paid, with the option to void. The number is assigned at the moment of issuing, and the legal details are copied into the invoice as a snapshot: changing your bank does not rewrite documents already issued. There are two issuers: the platform (numbers like `P-2026-0007`) and a head partner invoicing their sub-partner (`N-2026-0003` — a different prefix so that two invoices cannot be confused). - **Reserve and reversal.** When the month closes, part of the accrual may be held as a reserve; a payment refunded for an already closed month is reversed in the current one. If less than the minimum payout remains after that, the remainder is carried over. - **Papers and disputes**: the **reconciliation statement** (a window with printing and CSV export), **"I have paid"** — a payment claim so that the issuer confirms it, **"Dispute"** — an objection with a reason from a closed list. For invoices you owe, two reminders arrive: three days before the due date and after it is overdue. **"Agent's report"** is a printable form for a period; the button appears only for the Russian edition of the document set and for agency models. On the "Overview" tab the balance is shown **separately per counterparty**: the platform and the head partner are different sides with different details and different paperwork. --- ## Step 6. Statistics and "Needs attention" The **Trends** block on "Overview" (a 6- or 12-month window): accrued and paid by clients per month, the number of clients in the accrual, plan shares of the last month, the attachment funnel, your overdue invoices, accrual by sub-partner, and the reserve and reversals of the last month. Two rules that are visible right in the interface: **the chart never rewrites the past** (closed months come from snapshots, so a refund in September does not move the August bar) and **accrued ≠ received** (a month the payment log does not cover in full is marked "little data" rather than shown as zero). There are no revenue forecasts, client turnover or average ticket in the statistics, and there will not be: the first is a promise we would be answerable for, the second is somebody else's money. Next to it there is a short **"Needs attention"** list: an overdue invoice, a client whose subscription expires this week, a sub-partner who has not signed in for 30 days, and an unaccepted current document version after the grace period. --- ## Access to a client's account Sometimes "take a look at what is wrong with our till" cannot be resolved any other way. Access exists, but **the partner never signs in on their own**: 1. you send a request with a reason, a mode and a duration; 2. it is decided by **the account owner** on their own subscription page — not by their employee and not by our support. An unanswered request expires in 24 hours; after a refusal the next one may be sent in 15 minutes; 3. the client sets a standing rule in advance: refuse immediately · ask every time (the default) · allow "view only" sign-ins without asking. In the same place they set their own cap in minutes and the list of locations; 4. **"view only"** is the default mode; "view and change" is granted only by a separate checkbox on the client's side. The duration is 60 minutes by default with a ceiling of 120; one open session per account. For the whole session, a banner hangs in the client's panel with your company name, the person's name, the mode and a countdown. **In any mode the following are closed**: subscription and payments, owner data, employee access rights, data export, integrations, mail, calls and telephony, counterparties and documents, the partner program — these are not merely hidden menu items, the server refuses by itself. Withdrawn consent kills the **running** session, not just the next one; both sides see the sign-in history, and the client gets an e-mail for every sign-in. Access is personal, so a firm has a list of people (Profile tab → "Employees") with roles: the "admin" and "support" roles may request access, and only "admin" may invite people. A ceiling set by the head partner overrides the client's consent. ⚠️ On `cenaly.ru` there is no access to client accounts — no buttons are shown either to the partner or to the client. --- ## The wholesale model: credit and granting a plan The third money model, switched on by the brand root along two independent axes — **who grants the plan** (the platform or the partner) and **where the client's money goes**. Here the partner pays: they buy client-months and sell them on at their own price, which we neither set nor limit. - **A price list, not a percentage.** The partner is assigned a version of the brand's wholesale price list: a fixed monthly price per plan plus, if defined, a 12-month price and personal prices. Changing the price list does not re-price what has already been granted. - **A credit account.** The partner requests a prepayment invoice, pays it, and once the payment is confirmed the amount is credited; every grant debits the amount with a reference to the client, the plan and the number of months. By default only prepayment is available: the right to go negative is granted to verified counterparties only. - **"Grant a plan"** in the client's row: the plan and the number of months (up to 12), with the cost shown before the debit. **There is no date field** — the server computes the term: from the current paid-through day plus the months. An upgrade takes effect immediately and costs the full price, a downgrade is deferred until the end of the paid term, and there are no refunds for unused time. - **The client sees who pays for them**: their subscription page states who pays and until which day it is paid, and the buttons to pay the platform are removed from that screen. **If the partner stops paying**, the platform gives the client a 7-day grace period at its own expense and writes to them with two doors: pay directly at the brand's public price, or change partner. --- ## Sales materials The **Materials** tab holds what you take to a client, kept apart from the obligations: | Item | Details | |---|---| | **Price list by market** | the brand's retail prices — exactly the ones the client sees on their own payment page. A "your cost" column appears only if wholesale terms exist; printing opens in a separate window | | **Brand files** | presentations, sales scripts and one-pagers published by the brand root (`pdf`, `pptx`, `docx`, `png`, `zip`, up to 20 MB). Your language comes first, downloads go through a signed link | | **Client onboarding checklist** | seven steps from sign-up to the first working day: registration → attachment → business type and plan → catalogue → till and devices → storefront and domain → training. It is a hint, not part of the contract | | **Support contacts and the changelog** | the phone number and addresses published by the brand root (empty fields are not shown), and the program changelog — what changed in the cabinet, the terms, the prices and the materials | | **What and how to say it** | "what to call yourself" at each white-label level with yours highlighted, verifiable statements about the product and a direct ban on promising income, order counts or a payback period; the attachment code and link are here too | --- ## Limitations - **A settlement is an accrual, not a sum of receipts.** A cash basis (paying out of actual receipts) is not implemented in this contour; every invoice goes through a draft and is confirmed by a human. - **There is no automatic attribution at sign-up.** There is no partner code field in the registration form: a client is attached when they already have an account — by request, by code, or manually by Cenaly. - **White-label levels 2–3 are not a toggle.** A client cabinet under your brand requires setting up a brand (domains, certificates, mail, a landing page); the level in the card records the agreement rather than switching a feature on. **There is no brand kit**: no logo files, no palette and no presentations are published in the product, and the Materials tab says so in plain words. - **There is no electronic document interchange.** Neither EDI nor formalised delivery notes: the invoice, the reconciliation statement and the agent's report are papers the parties exchange themselves. A partial payment does not move an invoice: it is closed only on full payment. The payment link in a head partner's invoice is just a link — no payment is processed through it by a payment system. - **Looking a client up by e-mail works for the Cenaly representative in the AWS contour only**; on `cenaly.ru` a manual attachment is done by account identifier. The consent-based paths (request by e-mail and the code) work in both clouds, while **access to client accounts does not work on `cenaly.ru`**. - **There is no cross-cloud overview.** A partner's data lives in the contour of their brand, so `.ru` and `.com` partners are each viewed in their own panel. - **No e-mails are sent about a new document version** — the banner in the cabinet tells you about it at the next sign-in. --- ## Troubleshooting | Symptom | What to check | |---|---| | **"Attach account" opens a window about documents** | the current version of the set has not been accepted, or the grace period has ended: Documents tab → "I accept" | | **The client does not see the request** | the address must be the one the client signs in with; check the request list — the request may have expired (30 days) or already been declined | | **Refusal "account taken"** | the client is already attached to another partner. We do not disclose who holds them — write to us | | **The code does not work** | the partner card is suspended or not yet active; the code will work again after reinstatement | | **The invoice will not recalculate** | an issued invoice is not recalculated: lines are editable only in a draft, and an issued one can be voided | | **The e-mail to the counterparty did not go out** | the operation still went through — a yellow notice appears asking you to forward the document yourself | | **A dash instead of a number in the network table** | that means "not calculated yet", not zero: the figures are fetched when the My network tab is opened | Cannot find the answer — [how to get help](/en/docs/support). --- ## FAQ ### Do I need a company? Not necessarily: the legal status is chosen from the set your country offers — company, sole trader, self-employed or individual. And an application is not a contract: it has exactly one mandatory field, the name. ### How much is a partner paid? The terms are individual and assigned by a Cenaly representative: the commission, the wholesale share, the settlement currency and the payment deadlines are shown in your cabinet — in Annex No. 1 on the Documents tab. The program has no fixed public percentages. ### Does a partner see a client's revenue and orders? No. Order amounts, revenue, average ticket, order contents, personal data of guests and employees, documents and calls are not shown under any consent. Anything beyond the contractual data is switched on by the client and can be switched off by them at any moment. ### What happens to the client if the partnership ends? The account stays with the client and does not disappear: they carry on directly with the platform operator. In the wholesale model the platform gives the client a 7-day grace period and an e-mail with a choice — pay directly or change partner. --- ## Related articles - [How to get help](/en/docs/support) — where to write about disputes, invoices and your application - [Account and sign-in](/en/docs/account) — the account the partner card is created under - [Subscription and payment](/en/docs/subscription) — the client page where they confirm the attachment - [Security and data](/en/docs/security-privacy) — who sees account data and on what grounds - [Employees and shifts](/en/docs/staff) — roles and permissions inside an account - [FAQ](/en/docs/faq) — short answers on plans, countries and data --- # What's new This is where we write down what has appeared in the platform and when it became available. It is not a list of fixed bugs and not a roadmap — only what already works in your panel. ## How to read this page - **One line is one capability.** If there is no line, the change was technical and you will not notice it. - **The bold text at the start of a line** is the section of the panel the item belongs to: “POS and floor”, “Telephony and calls”, “Staff and HR” and so on. - **The link at the end of a line** leads to the help article that covers the same thing step by step. No link means there is no article on that topic yet — and that is visible too. - **Newest first.** Months run from new to old, and so do releases inside a month. - Capabilities do not arrive for everyone at once: some depend on your business type, the country of the location and the extensions you have switched on. If an item is listed but you cannot find it, check the [App store](/en/docs/app-store) and your [Subscription](/en/docs/subscription). ## Where the dates come from The release date is the day the change **went to production** and became available in the panel — not the day a developer wrote it. Those two days usually differ: a round of testing on the test stand happens in between. Some older releases carry a **“date from code”** note next to the date. It means exactly what it says: no deployment record survived for that release (until the end of August 2026 the front-ends were shipped a different way, without run logs), so the date of the code change is used instead. The real deployment may have happened a day or two later. We would rather show the note than claim a precise date we cannot prove. ## How to follow updates There is **no** dedicated “what's new in the platform” newsletter — we do not want to promise a channel that does not exist. For now: - **Watch this page.** It is updated together with releases; bookmark it. - **The [blog](/en/blog)** publishes detailed write-ups of the larger capabilities and company news. The blog has an RSS feed at `/blog/rss.xml`. - **The AI assistant in the panel** knows what the system can do right now: ask “can I…” and it answers from the current version rather than from this page. - **[Support](/en/docs/support)** can tell you whether a specific change has reached your account if an item from this page has not shown up for you. --- ## October 2026 ### 15 October 2026 (date from code) — Top up AI credits right in the call analysis window - **Telephony and calls.** In “Calls”, on the “Tags” tab, the “AI call analysis” window on cenaly.ru now tops up AI credits right where you set the budget: the “Top up from main balance” button opens a transfer from the main balance on top of the window — the amount, the rate and how much reaches the AI balance are shown before you confirm. The budget and instructions you have filled in stay where they are, and the new balance shows right under the budget field. The same button is in the “Add budget” window of an analysis that has stopped because the credits ran out. Before, “Top up” took you to the “Subscription” page, and the analysis settings had to be entered again. Only the account owner can top up: instead of the button, an employee sees a note that the owner does it. Read more: [Calls: recordings and speech analytics](/en/docs/calls). ### 14 October 2026 (date from code) — Manager logbook tags with icons and colours - **Staff and HR.** In the employee card, on the “Logbook” tab, entry tags now have icons, and each tag stands out by colour at a glance: “Praise” is a green thumbs-up, “Discipline” an amber warning sign, “Incident” a red siren, “Note” a grey sticky note. The colour shows right away, not only on the tag you have already picked, and the same icon appears on the filter button and on every entry in the feed — praise and incidents are easy to tell apart without reading the labels. Read more: [Staff & shifts](/en/docs/staff). ### 10 October 2026 (date from code) — Social Fund number and tax office from the list - **Staff and HR.** In a Russian company’s details (“Payroll” → “Settings” → “Details for the tax office and Social Fund”), the “SFR registration number” field now shows the current format — 10 digits — and a note under it says that an old Pension Fund number like 000-000-000000 is accepted too. Before, the field mask, the term explanation and the report-readiness hint named only the old 12-digit number, so a 10-digit number looked wrong even though the app accepted both. The hint and the error text in the “Report signatories and SFR registration number” catalog, where the number history is kept, were fixed the same way. Read more: [Words of the Russian Payroll section: what they mean and where to get the data](/en/docs/payroll-ru-words). - **Staff and HR.** In the same window, the tax office code is now picked from the Federal Tax Service list of tax offices: start typing the code or part of the tax office name in Russian — for example “7705” or “Москва 5” — and choose a “code · name” row. The tax office name for printing fills in by itself, and the name for an entered code is shown right under the field. If the code is not in the list, the app warns you and asks you to check it against the tax registration notice. A separate division’s tax office is picked the same way. The list updates automatically from the Federal Tax Service open data; its release date is shown at the bottom of the list. Read more: [Payroll in Russia: getting started for a small company](/en/docs/payroll-ru-start). - **Staff and HR.** In an employee’s pay window (“Staff” → 💰 “Pay & tax profile”), a “Deductions and tax details” line now sits under “Tax profile”. It explains that deductions, tax residency and the person’s other tax details are set in their employee card, on the “HR file” tab, and that the monthly calculation and the take-home pay picker read them from there; the “Open tax details” link opens the card in a new tab with the edit window already open. The unsaved pay rate stays where it is; after changing deductions, pick the gross amount again. Before, the pay window said nothing about deductions, and it was unclear where to set them. Read more: [Staff & shifts](/en/docs/staff). - **Staff and HR.** The “Staff” → HR → “Vacation plan” screen now has a “🖨 Print” button: the year’s plan opens as a paper vacation schedule — with an “APPROVED” block and a line for the head’s signature, the approval date and document, columns “department, position, employee, days, vacation dates, note” and an “Acknowledged: signature, date” column, and the signature of the person responsible for HR records at the bottom. Agreed plan entries are printed; a plan that is not approved yet prints marked “Draft”, and if people belong to several legal entities you pick the legal entity above the form. Before, the vacation plan could not be printed at all. The form is the same for every country; a Russian legal entity also gets “T-7 (print)” — the unified form that used to open only from the Russian vacation schedule on the “Staff” tab. Read more: [Staff & shifts](/en/docs/staff). - **Account and access.** After you pay for a new plan, its limits apply right away in every section — locations, menu items and catalogue imports, devices, auto-translation languages, orders and hotel rooms — including tabs that are already open. Before, after moving from Basic to Premium you could add, say, a fourth location only after reloading the page. Paid extensions you buy also unlock in other sections straight away. Read more: [Subscription](/en/docs/subscription). ### 9 October 2026 (date from code) — “Update” now links to the new version - **AI assistants.** When a digital worker’s extension is out of date, the “update” note — on the “Devices” tab and in the device card — now comes with two links right next to it: “Download version …”, the package of the new version for that device’s browser (an archive for Chrome, Edge, Yandex Browser and other Chromium browsers, an .xpi file for Firefox), and “How to update”, step-by-step instructions in the help centre. Before, the archive was only in the “Connect a device” dialog, and you had to work out on your own what to do with it. If the extension was installed by your organisation or is kept by the bridge, there is no archive link: whoever installed it updates it. Read more: [Digital worker](/en/docs/digital-worker). ### 8 October 2026 (date from code) — Digital worker installs for your browser, file path as links - **AI assistants.** In the “Connect a device” window, the steps for installing the digital worker extension now match the browser you are installing it in: Chrome, Edge, Yandex Browser, Opera, Brave, Vivaldi, Firefox or Safari. The browser the admin is open in is picked already; if you are installing on another computer, pick that computer’s browser. Each browser has its own extensions page address — you can copy it and paste it into the address bar — and its own place for “Developer mode”: in Edge, for example, it is at the bottom of the left pane rather than in the top right corner. Yandex Browser gets a warning: on Windows it turns such an extension off at every launch — turn it back on at browser://tune. Read more: [Digital worker](/en/docs/digital-worker). - **Finance and documents.** In “Documents”, the path above an open file — a text document, an .md, .txt, .csv or other text file — is now made of links: click any folder in “Files / Folder / Subfolder” to open its list, while “Files” takes you to the very top. Previously the path was plain text, and getting to a neighbouring folder meant going through “Back to files”. Unsaved edits are saved before you leave, and the browser’s Back button returns you to the file. Read more: [Documents](/en/docs/documents). - **Telephony and calls.** On the subscription page, call recording retention is now changed in place: in the “Storage used” card, the “Change recording retention” button opens a window with “Auto-delete audio” and “Auto-delete transcripts” — the same fields as in “Calls” → “Settings” → “Privacy and retention”. Previously you had to leave the billing page for them. The periods apply on their own, and “Storage used” goes down once expired audio is deleted; deleting at once, digit masking and external models are one link away, in the section. Read more: [Calls: recordings and speech analytics](/en/docs/calls), [Subscription](/en/docs/subscription). - **Telephony and calls.** If a call recording failed to transcribe because of AI credits, the recording card now says so in plain words in your interface language — “Not enough AI credits: the balance has run out or the monthly AI spending cap has been reached” — and shows the owner a “Go to AI credits” button that opens the Subscription page right at the AI credits block, where you top up the balance or change the monthly cap. Top up, come back, press “Try again”. The same reason and link appear on the “Recording processing” tab, and “Top up” in the AI-tag wave window leads to the same place. Employees get no link — the line says the owner tops up. Read more: [Calls: recordings and speech analytics](/en/docs/calls), [Subscription](/en/docs/subscription). ### 7 October 2026 (date from code) — Providers checked at once, locations added from Documents - **Telephony and calls.** “Add provider” on the “Phone providers” tab now checks the connection to the provider right away — just like “Save and test” on a number and the connection wizard: the “Check” column shows “Testing…” and then the provider’s reply. While the PBX is getting ready for the first registration of a new trunk, the dot in its row follows this check and turns green if the provider answered, instead of showing “not registered” for the first few seconds. If the provider refused the PBX’s registration, the dot stays grey: the check confirms the provider’s address, not the login and password. A refusal right after the account is created at the provider can be temporary — after a 403 refusal the PBX retries the registration on its own in 5 minutes. Read more: [Connecting a provider number to the PBX](/en/docs/sip-trunks). - **Finance and documents.** In “Documents” you can now add a new location straight from the location list in the section header: the last item, “+ Add a location…”, opens the same form as in “Locations”, on top of the section, without leaving it. The new location is selected right away and ready to work with; it also appears in the sidebar location switcher at once. Previously you had to go to “Locations”, create it there and come back. The item is shown to those who can edit documents; the form itself tells you when your plan's location limit is reached. Read more: [Documents](/en/docs/documents). - **Telephony and calls.** In the “Equipment” device card, its tag tooltip, the “Phone equipment” list and the “Extension journals” window, times are now shown in the location’s time zone rather than by the clock of the device you are viewing from: “disconnected at 03:11” matches the clock on site. In the card this covers every tab — connections, calls, the uptime chart (its axis and the “from… to…” fields too), the line check and “Phone reports”. The time zone is named under the state line; if the location has no time zone set, times follow your device’s clock, and the card says so. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** The PBX call log card now names the time zone under the line with the date — “Times are in the location’s time zone (Europe/Moscow · GMT+3)” — and every time in the window uses it, including the “Route” tab: steps, “rang at …”, talk segments and the leg details on the diagram. Previously “Route” used the clock of your device, so from another city the step times disagreed with the time in the header. If the location has no time zone set, times follow your device’s clock, and the card says so; “Copy for support” writes the time together with the time zone. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Finance and documents.** In “Documents” a new folder now appears right away: after “OK” the “+ Folder” form closes and the folder shows up in the list marked “creating…”, turning into a regular folder a moment later — on the “Files”, “Templates” and “Documents” tabs. Previously “OK” did nothing for seconds while the server saved the folder and reloaded the list, and pressing it again created a second folder with the same name. If saving fails, the folder disappears from the list and an error message is shown. Read more: [Documents](/en/docs/documents). ### 3 October 2026 (date from code) — Sidebar sections without a redundant link or row - **“My website” widgets.** When a “My website” widget is added to the sidebar (the “Add to sidebar” button on its card), its page no longer shows the “← All website widgets” link: “My website” already sits next to it in the menu, and the link only repeated it. When the widget page is opened from elsewhere — say, from the dashboard or from Requests — the link is still there. Remove the widget from the sidebar and it comes back at once, without a reload. Read more: [My Website](/en/docs/site-widgets). - **“My website” widgets.** On a “My website” widget page, the “Add to sidebar” button now sits on the top frame of the settings block, on the right — just like on the Telephony tabs. It used to take a separate row above the form, and for a widget added to the sidebar that row often held nothing but this button; now the form starts right under the heading. The row above the block stays when it has something to show: the “← All website widgets” link, the location picker or the “Paid add-on” chip. Whether the widget is in the sidebar or not, the button stays in the same place, so clicking it doesn’t move it. Read more: [My Website](/en/docs/site-widgets). - **Telephony and calls.** On a Telephony tab added to the sidebar, the “In the sidebar” button moved from the page header to the top frame of the panel — the same place it has on the tab inside the section. The header is shorter, and the button no longer changes place when the tab is opened as its own page. Read more: [Telephony: your own PBX](/en/docs/telephony). ### 2 October 2026 (date from code) — Catalogue printing in your industry’s word, and the phone ping in the card - **Menu and catalogue.** The 🖨 button above the catalogue — and the same button on a location card — are now labelled with your industry’s word: “Printable services list” for a salon, “Printable products list” for a shop, “Printable articles list” for a blog. Both used to say “Printable menu”, which is what cafés and restaurants still see. The button on the location card was also Russian-only whatever language you worked in; it is translated now, and a screen reader reads it out. Read more: [Print Menu](/en/docs/print-menu). - **Telephony and calls.** In the phone device card (Telephony → Extensions → click the equipment tag next to an employee) the ping to the device now sits right in the state line: “online · address · network · last seen · 📶 Ping 23 ms”. Before, the delay was only visible on the “Uptime” tab — the moment you opened connections, calls, the check or the settings you lost sight of it. The figure is shown at any link quality, and hovering gives the average delay over the last hour and the last 24 hours plus how many checks went unanswered. A switched-off device has no ping in the line: the PBX does not check it. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** On the PBX console (Telephony → Console) a phone named in a call row now shows the link quality of that very device: a signal-bars icon and the delay next to its name — “☎️ Yealink T31G 📶 23 ms”. The same goes for the device of whoever is talking, for every ringing phone in “who is being called”, and for the devices in the call card. Before, the row carried only the phone’s name and the delay had to be looked up in the employee’s tile or in the “Devices” block — elsewhere on the screen — so “bad audio: the employee’s phone or the provider’s line?” took a while to answer. The icon’s colour shows the worse of two things: the delay to the device and how this side of the conversation sounds (packet loss and jitter — measured on a dedicated PBX); the full figures are in the hover tooltip. Until the PBX has measured the link (the console was just opened, the firmware is old, the PBX runs on your own computer) there is no icon — the phone’s name stays as it was. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** The call-centre board (Telephony → Live board → Board, and its full-screen TV view) has a new “Calls now” block: every call in progress at the location as a list — who is calling, who they are talking to or whose phone is ringing, which queue or automation holds the call, how long the caller has waited and how long the call has lasted. Before, the board showed only figures, queues and agents, while the conversations themselves — including calls ringing straight on an employee’s phone without a queue — were visible only in the Console view. For a small location with a few phones that is the main thing on the screen. The “Open call” button on a row opens that call on the console — with its card and the supervisor actions. A screen opened with a TV link (no login) has no such block — it still shows only figures and the masked numbers of waiting callers. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** On the call-centre board (Telephony → Live board → Board, and its full-screen TV view) a call that is not in a queue — one distributed by a ring plan grid or a plain ring-group hunt, or ringing straight on an employee’s phone — now counts as waiting for an answer: it is listed under “Waiting for an answer” with the number, whose phones are ringing and how long the caller has waited, and it is included in the “Waiting” and “Longest wait” figures. Before, only queued calls got there, so a location without queues showed “Waiting 0” while employees’ phones were ringing. The location-wide “Waiting more than” and “Wait longer than” thresholds (if you switched them on) and a screen opened with a TV link now count the same way — there a waiting caller still shows only a masked number. Read more: [Telephony: your own PBX](/en/docs/telephony). ### 1 October 2026 (date from code) — No more absences for tomorrow’s shifts; a routing rule with no condition no longer catches every call; “Check in” on a room booking really checks in - **Staff and HR.** “Today” in timesheet sign-off now follows the location’s time zone. A shift without a clock-out lands in the “to resolve” list and gets the “Mark as absent” button only once its planned time is over — the same way plan vs fact counts hours as of today. Before, in the afternoon Moscow time the button reappeared on tomorrow’s shifts. You can still mark an absence for today (someone didn’t show up this morning). Read more: [Staff & shifts](/en/docs/staff). - **Telephony and calls.** Deleting a telephony provider that routing rules point at now tells you in advance what will happen to EACH rule: it keeps working without this provider, it is turned off, or it is turned off and left with no condition. Rules are still not deleted. A rule whose only condition was the deleted provider is marked “no condition”, and its switch will not turn it on: before, a single click was enough to make such a rule catch every call. Give it a new condition — a number, a provider, hours or a caller prefix — and turn it on, or delete the rule. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Hotel.** For a reservation that sits on a hotel room, the “Check in” button now really checks the guest in: it opens the same check-in window as the rooms board, with the guest’s name and phone taken from the reservation — afterwards the guest has an open folio, the room is occupied and the stay is in the guest registration log (in Russia — the migration register). Before, the button only changed the reservation status. In the hall panel at the till such a reservation also shows “Check in” instead of “Seat”, leading to the same window. Read more: [Table Reservations](/en/docs/reservations), [Hotel](/en/docs/hotel), [Hall Panel](/en/docs/hall-panel). - **Hotel.** A hotel room is booked by nights only — now in the hall panel at the till as well: rooms and beds are no longer offered in the hourly reservation form or when moving a reservation. Read more: [Table Reservations](/en/docs/reservations), [Hall Panel](/en/docs/hall-panel), [Hotel](/en/docs/hotel). - **Hotel.** A room means a room or a bed in a venue of type “Hotel”. In other venues a “Room” on the plan is an ordinary place (a meeting room, a private room): it is booked by the hour, and the hall monitor shows its “Waiter” row again. A hotel room has no such row, and no waiter is assigned to it. Read more: [Floor Plan](/en/docs/tables), [Hall Panel](/en/docs/hall-panel). - **Telephony and calls.** Daily charges for the dedicated PBX are visible again — both in the server card and in Subscription. In Telephony → Server a running server has a collapsed “Daily charges” block: closed, it shows one line with the latest day; opened, the last 7 days for this location and a link to the full log. Subscription has a new “Dedicated PBX: daily charges” card: all locations over 31 days, the total and how much has already been deducted from the balance, and the status of each day. On 29–30 September the table was removed from the server card with the promise “the log is in Subscription”, which wasn’t there, so the charges were not visible anywhere. Read more: [Telephony: your own PBX](/en/docs/telephony), [Subscription](/en/docs/subscription). - **Telephony and calls.** The PBX board now shows EVERY phone a person has and the link quality to each one: a row per device with its own icon and delay (“📶 195 ms · ☎️ Yealink AX83H”). Previously there was a single summary icon — the worst device — so someone with a desk phone, a handset and an app could not tell which one was slow. A device that stopped answering the check shows a red ✕, one not checked yet shows a dash. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** On the PBX console (Telephony → Console) the “Your extension” field now lists the venue’s extensions: pick the phone the PBX will ring to connect you to a call. The list used to be empty — you could not switch phones, and anyone without an extension of their own was left with the “🎧 Listen”, “🗣 Whisper” and “👥 Join” buttons greyed out. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** The PBX console (Telephony → Console) now has a “Devices” block — every phone in the venue in one list, worst first: devices that stopped answering the link check, then the slow ones, then the good ones, and finally the ones not checked yet. Each chip shows the delay, the extension number and the device name (“📶 410 ms · 103 · ☎️ Fanvil X3S”), and the tooltip says whose device it is and gives the full figures. The same numbers are on the person’s tile, but there they answer “how is this person doing”, while the block answers “which device is bad right now” — previously you had to scan every tile to find out. Until the PBX has measured the link (console just opened, older firmware, your own PBX on your computer) the block is not shown. Read more: [Telephony: your own PBX](/en/docs/telephony). ## September 2026 ### 30 September 2026 (date from code) — The header and footer editor now has a close ✕ - **Finance and documents.** The box for editing a document’s header and footer (“Documents” → a text file in page view → click the header or footer band) now closes with a ✕ in its top-right corner — the same place as in every other window of the panel. On a large screen there was no ✕ at all before: you could only close it with Esc, by clicking outside the box, or with the “Done” button at the bottom right, while on a phone the same editor opens as a sheet and did have one. Every previous way of closing still works, and nothing about the header or footer changes: edits still apply immediately and go into the document’s autosave. Read more: [Documents](/en/docs/documents). ### 29 September 2026 (date from code) — Telephony: address ranges, whose network got blocked and ping for every phone - **Telephony and calls.** In the “Where from” tab of the extension settings, a collapsed “How to enter a range of addresses” help block now sits under the “Allowed addresses” field. Until now the hint just showed the example 203.0.113.0/24 and you had to already know what that notation meant and how to describe the whole office with it. The hint itself now says that 203.0.113.0/24 means every address from 203.0.113.0 to 203.0.113.255, and the help block walks through the mask: examples for 16, 256 and 65,536 addresses, the same notation for IPv6, and a warning that the mask counts from the network address — type 203.0.113.7/24 and it is saved as 203.0.113.0/24, allowing the whole subnet. It also says what is not possible: an arbitrary range such as “from 203.0.113.10 to 203.0.113.20” cannot be written in one line — enter those addresses one per line or take the whole subnet. If you do write a range with a dash, the answer now says exactly that — “a range ‘from address to address’ cannot be written like that” with a pointer to the help — instead of the former generic “not an address or subnet”. What is actually accepted has not changed: the address list works exactly as before. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** In the “Blocked addresses” block (“Telephony → Server”) every entry now says WHOSE network it is and which country it belongs to — “🇻🇳 Vietnam · VNPT-AS-VN” next to the reason; the range itself and the autonomous system number (“113.160.16.0/20 · AS45899”) are shown as a tooltip. Until now you only saw the bare address, and it was impossible to tell your own office from someone else’s scanner at a glance: “a home ISP next door” and “a foreign hosting provider” are different news, and the latter is usually left blocked. The PBX itself looks the address up in the same public network directory it already uses for the connection history — nothing leaves your browser. Note: this is the country the range is REGISTERED in, not where the person sits: with a VPN or hosting the two differ. If the lookup finds nothing, the line looks exactly as before. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** The signal-bars icon now shows next to EVERY phone the PBX measures ping to, not only the slow ones. Before, a phone with a good link had no icon — and looked exactly like a phone with no measurements at all. The delay figure next to the icon still appears only when the delay is noticeable; the full numbers are in the tooltip and the device card. Read more: [Telephony: your own PBX](/en/docs/telephony). ### 28 September 2026 (date from code) — A phone’s settings now live in its own card - **Telephony and calls.** The equipment card (Telephony → Extensions → the phone tag in the employee row) has a new “Settings” tab: server, port, transport, username and extension — exactly what you type into the phone itself, each value with a copy button. Until now those fields were shown ONCE, together with the password when credentials were issued, and afterwards “which server does this phone use” had to be pieced together from three different windows. The password is not there and cannot be: we store only its hash, and a lost one is reissued to the extension. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** The same tab shows what the PBX applies to this particular device: its own advanced SIP settings and the ones inherited from the station, each row labelled with where the value comes from (“this device” or “from the PBX”), with untouched ones summed up in a single line. It also names the transport the phone last connected with — UDP, TCP or TLS. The settings are still edited where they were edited before; this tab only shows them. Read more: [Telephony: your own PBX](/en/docs/telephony). - **POS and floor.** The floor plan editor won’t let you place a table or a bed across a wall — in any venue, not just a hotel: an element cut by a wall or hanging half-way out of a room turns red and snaps back. Standing flush against a wall is still fine, and a room’s walls hold a bed just like the hall walls do. Read more: [Floor Plan](/en/docs/tables), [Hotel](/en/docs/hotel). ### 26 September 2026 (date from code) — The call card shows how often that number has called; the menu board can show photos - **Telephony and calls.** In the record card, on the “Metrics” tab, a “records: N” counter now sits next to the other party’s number — how many records with that number are in the database over all time. You can see at once whether this person is calling for the first time or has been in touch before, without copying the number into the search box. Only records you are allowed to see are counted; for a number that has called very often it shows “records: ≥100” — all of them turn up if you type the number into the list search. The other side of the call has no counter: that is your own line, and the number of records with it tells you nothing. Internal extensions and withheld numbers are not counted — records cannot be searched by those at all. Read more: [Calls: recordings and speech analytics](/en/docs/calls). - **Marketing and newsletters.** The menu board on an advertising screen can now show photos when its rows are picked by a RULE (“Where the items come from” → “By a rule”: category, badge, on sale). Until now photos were switched on by a tick next to each row, and a rule-driven board has no rows in the editor — the rule supplies them — so there was nothing to switch: such a board played as text and price only. The same block now holds a “Photos in the rows” toggle, and every supplied row inherits it. A new board built by the “Menu and prices” wizard from a rule gets photos straight away, exactly like a board whose items were picked by hand. Boards already playing on your screens do not change by themselves: they carry no answer and keep their look until you turn the toggle on. The “Price tags” layout never shows photos — it is a large price in a frame, meant to be read from a distance; photos belong to “List” and “Tiles”. An item with no photo in the catalogue stays a line of text. Read more: [Advertising Monitor](/en/docs/signage). - **Platform.** Time fields — the schedule of a card on an advertising screen, the opening hours of a location, moving a booking — now carry a small clock on the right: press it and the time can be PICKED from a list, the hour and the minute separately, instead of being typed. Until now the field only accepted the keyboard: the browser’s native field had a button with a list of its own, but our field (it shows time in the location’s format — 24-hour or AM/PM, not the browser’s) had lost that door. Minutes in the list run in even steps — fives — and where the field has a step of its own (bookings five minutes, a schedule window a quarter of an hour) they follow it; a current minute that is off the grid, 09:07 say, is still in the list and highlighted, so picking never rounds anything silently. Typing still works exactly as before — the list replaces nothing: digits in the hour and the minute, ↑/↓ to step, pasting a whole “18:30”. In AM/PM format the list also spells out the half of the day (“9 PM”), while the value handed over stays 24-hour as it always was: the new way of choosing changes no data. Read more: [Advertising Monitor](/en/docs/signage), [Appointments](/en/docs/appointments). ### 25 September 2026 (date from code) — A request for workspace access reaches the owner in one click; Training now shows how to share the material - **Account and access.** In the “Choose a workspace” window, a workspace an employee cannot open yet offers “Ask the owner”, which shows a ready-made request — and now “Send to the owner” sits next to it: the request goes to the owner as a direct message in the team chat, and the link then opens that very conversation. Until now you had to copy the text, walk over to “Team chat”, find the owner there and paste it. Copying and the door to the chat are still there: if the chat does not answer, the panel says so — “Couldn’t send” — and the old path is untouched. Access itself is still granted by the owner in “Staff”: the message changes nothing except that the owner learns about the request. Read more: [Team chat and guests](/en/docs/team-chat), [Staff & shifts](/en/docs/staff). - **Help and training.** While the training material has not been built yet, the Training section now spells out the whole path to the employee — “add materials” → “address the course to staff” → “assign to particular people if you need to” — and offers two doors to the first step: “Add documents” and “Take a ready-made base” from the catalog. Until now the screen only said “upload and process at least one document first” and never said where to upload it: the library lives in the knowledge base, whose card is off by default, so the section is not in the menu. In the course list, the line under the “Addressed to staff” switch now says who sees the course right now: “Every employee with a login sees it” or “Only you see it”. Nothing changed about the rules themselves: sharing training still means switching that toggle on, and source documents are still not shown to employees. Read more: [Staff training](/en/docs/learning), [Knowledge Base](/en/docs/knowledge-base). ### 24 September 2026 (date from code) — Shift swaps warn about a busy day up front; the “external SIP” chip opens the extension settings - **Staff and HR.** The shift-swap card under “Staff” → “Requests” now warns you UP FRONT when the person taking the shift already has an overlapping shift of their own that day: “Approval will not go through: the new person already has a shift that day — 14:00–22:00.” Previously you only found out after pressing “Approve”: the swap was not applied and the request went back to its author as “needs changes”, leaving you to work out why something you approved ended up there. The same warning appears in the “Swaps” panel for requests waiting for your decision. It is a hint, not a ban: the decision buttons stay where they are, so you can move the clashing shift in the schedule first and approve the swap afterwards. An overlap means the planned hours cross on the same day; back-to-back shifts (“08:00–16:00” and “16:00–24:00”) raise no warning. Read more: [Staff & shifts](/en/docs/staff). - **Staff and HR.** In the employee cabinet (“Mine” → “Shift swaps”) a colleague’s offer and an open shift now say right away whether that day is already taken: “You already have a shift that day — 19:00–23:00.” If the hours cross your own shift, the line says plainly that you can’t take this one — until now you found that out only after pressing “Accept” or “Take the shift”, from the server’s refusal. The same line sits next to “Accept” in the “Swaps” panel. It is a hint, not a ban: if a second shift that day is deliberate, the buttons stay where they are. Back-to-back shifts (“08:00–16:00” and “16:00–24:00”) count as no overlap — but you still learn that the day is already taken. Read more: [Staff & shifts](/en/docs/staff). - **Staff and HR.** In “Mine” → “My details” an employee can now describe their identity document in the same detail as the manager does in the HR file: pick the document TYPE — passport, ID card, residence permit, work permit or other — and fill in the number, issuing authority, issue date and “valid until”. There used to be a single field, the number, and the type was always assumed to be a passport: someone carrying an ID card submitted it as a “passport”, and once approved it took the place of the real passport in the HR file, while the expiry date had nowhere to go — so no document-renewal reminder was ever raised. The default type is still passport, so the familiar “type the number and send it” works as before; if the dates are filled in but the number is not, the form asks for the number instead of dropping what you typed. Read more: [Staff & shifts](/en/docs/staff). - **Telephony and calls.** The “external SIP” chip in the row of an employee with a duplicated number opens the regular “Extension settings” window right on the “Provider” tab — just as clicking the number and name opens it on “Number and name”. The provider credentials and the registration status history are behind the “Open provider details” button on that tab. Read more: [Telephony: your own PBX](/en/docs/telephony). ### 23 September 2026 (date from code) — A shift clashing with someone's availability shows up at once, not at publish time - **Staff and HR.** When you add a shift under “Staff” → “Shifts”, the shift window now tells you right away if the day or the hours clash with what the person declared in the “My availability” block of their own cabinet: “the employee does not work that day” or “outside the declared availability” — along with their declared hours (09:00–14:00, say) and their note for that date, if they left one. Previously this only surfaced when you published the schedule, with the whole week already filled in, so the fixing happened after the fact. The warning forbids nothing: you can save the shift as it is, because you may well have agreed with the person separately. If nobody filled anything in, there are no warnings: empty availability still means “available at any time”. Read more: [Staff & shifts](/en/docs/staff). - **Staff and HR.** In the employee cabinet (“Mine” → “My details”), the contact phone and the emergency contact number are now entered as phone numbers: the country code on the left (pick it from a searchable list of every country or type it in), the number on the right, grouped into the digit blocks you are used to. The number is stored in international form, so it can be dialled from another country too. The familiar “8 990 …” form still means the same number — the field understands it, as well as a “+7 990 …” pasted from contacts. Numbers saved earlier as plain text are shown as numbers of your country, and if you do not touch them they are saved exactly as they were written. Read more: [Staff & shifts](/en/docs/staff). ### 22 September 2026 (date from code) — You can see whether an inherited number's channel is alive; a document clause tied to one answer; hold music can be heard before you pick it - **Telephony and calls.** In the extensions list, a row with an INHERITED number (the phone lives at the telecom operator, not with us) now shows a connection dot in the “Channels and SIP” column: green — the trunk used to reach that person is registered with the provider; grey — there is no registration, or the PBX has not reported one yet; a “stop” square — the trunk was turned off by the owner. Hover the dot to read which trunk it is, what is going on with it and when that was observed. Previously such a row showed its connection state nowhere — it has no “online/offline”, because the phone does not register with us — and a dead trunk looked exactly like a live one. Softphones and duplicated numbers did not get an extra dot: their connection is already shown by the dot at the left of the same row. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Finance and documents.** A clause in a document template can now be switched on by ONE PARTICULAR answer to a questionnaire question, and the editor finally spells out how that is written. Select a paragraph, press “⑂ Optional section” — a choice question lists every answer (“Cash”, “Bank transfer”), and each button shows the ready-made tag that goes into the body: {{#if payment=cash}} … {{/if}}. The “plus an ‘otherwise’ branch” checkbox adds the second half — the text for the other answers. Before, the button only knew “the question got any answer at all”, and nothing in the interface said how to write “if the answer is this one”. Read more: [Documents](/en/docs/documents). - **Telephony and calls.** Hold music can now be listened to without changing anything. Next to the tune list — in the “Default hold music” block above the numbers, in a number’s row, in the provider form, in the ring-group editor and in the employee hold-music window — there is a new “♪ Listen & choose” button. It opens a window with every tune at once: each has its own ▶, the first row is “Inherit” with whatever plays when you pick nothing, then your own tunes and the catalogue. Only the “Choose” button changes the setting; while you are just listening, callers keep hearing the previous tune. Before, only the tune ALREADY selected could be played: comparing two tracks meant assigning first one and then the other — and both reached the PBX on the way — and while “Inherit” was set there was nothing to listen to at all. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** You no longer have to reach the phone first to check it: the device card (click the equipment tag in the extension row) now has a “Call this phone” button on the “Check” tab. The PBX rings that phone itself, shows “Line check” on its screen and, once you pick up, tells you that you may speak and plays your own voice back. The measured numbers land in the same list as a hand-dialled *43. Why, if *43 already existed: it checks the road FROM the phone, while a call from the PBX checks the road TO the phone — that is, the most common complaint “the dot is green but incoming calls do not ring”. You still pick up the handset yourself; if the extension has several devices, one of them rings, and an inherited carrier number has no button. The button is only shown when your PBX can place such a call — otherwise the old *43 is there. Read more: [SIP Phone Setup](/en/docs/sip-phones). - **Telephony and calls.** Every setting in the “Advanced SIP settings” window now has a “More about this setting” disclosure (“Calls” → “Settings” → the PBX block, and the same button in an extension row). It holds three parts: “When you need it” — whether you should touch it at all; “What changes” — what happens if you turn it on or off and what it costs you (“call recording and live prompts disappear: the PBX no longer hears that audio”); “How to check” — what to press or dial to see the result with your own eyes (“dial *43 from the phone — the echo test must play your voice back”, “press Call this phone — it must ring”, “open PBX connection history”). Before, a setting had only a title and sometimes a single line of hint — and 18 settings out of 30 did not even have that — so working out whether you needed the setting, and what to check afterwards, meant reading SIP manuals. The explanations are collapsed, so the list of settings did not get any longer. Read more: [Telephony: your own PBX](/en/docs/telephony). - **CRM and counterparties.** A task's due date in a client record no longer has to be picked in the calendar. Write it inside the task text — “call back tomorrow”, “invoice by 25.12”, “on Friday”, “in 3 days”, “December 25” — and the Activity tab shows a “Set due date 25/12/2026” button next to the field. Press it and the date lands in the field and is saved with the task; ignore it and nothing changes. The hint only fills an EMPTY field: a date you picked yourself is never overwritten, and text without a date gets no button. Previously the due date could only be set in the calendar, even though the task itself almost always spells it out. Read more: [Clients (CRM)](/en/docs/counterparties). ### 21 September 2026 (date from code) — Change a free table's waiter with a single tap on the badge, a collapsible order total in checkout - **POS and floor.** On the floor plan in the POS Hall panel you can now change or clear the waiter of a free table: tap the waiter's circle on the table and the table card opens with the list of waiters already expanded, with a “Start order” button next to it. Before, the card opened only for an occupied or reserved table, and tapping a free table handed it straight to the till, so a waiter once assigned could not be changed. Tapping the table itself works as before: a free table goes to the till with a single tap. Read more: [Hall Panel](/en/docs/hall-panel). - **Website and storefront.** In the storefront checkout the lines that make up the total — subtotal, taxes, tip, delivery, discounts — are now folded under the “Total” row, so the bottom panel with the “Place order” button no longer takes a third of the screen while you fill in the form. Tap “Total” to expand or collapse the breakdown; once you scroll the form to the bottom it expands on its own. The total itself and the buttons stay in view at all times. ### 19 September 2026 (date from code) — The phone uptime chart — for any period you like - **Telephony and calls.** The phone uptime chart (device card → “Uptime”) is no longer limited to a day, a week or a month: move the window earlier and later, zoom out, jump back to now, type an exact “from… to…” — or simply drag across the bar to look at a piece of it up close. The period on screen is spelled out under the list, so yesterday's outage no longer looks like today's. Read more: [Telephony: your own PBX](/en/docs/telephony). ### 18 September 2026 (date from code) — Search for sections in the sidebar, table booking that works like the Hall panel, a compact checkout footer, a Hall panel that survives a reload - **Platform.** The sidebar now has a search bar you can show or hide: click the magnifier in its header and start typing a section name — sections in collapsed groups and in your own folders are found too, with a hint showing where they live. The arrow keys and Enter open a section from the keyboard, clicking the magnifier again hides the bar, and your choice is remembered on this device. - **Website and storefront.** When booking a table from the storefront, the guest now sets the booking the same way you do in the Hall panel: the fields come in the same order — date and time first, then duration and party size — and the sheet opens at the next full hour, which late in the evening means tomorrow. A time that has already passed is not accepted and the sheet says so under the field, so a request for last night can no longer reach you. Read more: [Table Reservations](/en/docs/reservations). - **Website and storefront.** The bottom panel with the “Place order” button on the storefront no longer covers half the screen: the promo code and gift card fields and the display currency picker have moved into the form itself, just below the order notes, leaving only the total and the buttons at the bottom. When the total has many lines, the panel scrolls instead of growing. - **POS and floor.** The Hall panel on the POS no longer closes when you reload the page: F5 keeps you in the panel instead of taking you back to the till. The browser's Back button closes the panel and returns you to the till, and from the till it opens the panel again — seat a guest, take the order and get back to the floor with one click. You can bookmark the till with the panel open: the panel opens if the staff member at the till can see the Hall button. Read more: [Hall Panel](/en/docs/hall-panel). - **Delivery and pickup.** The “Pick point on map” map in the storefront's delivery checkout now opens on your venue instead of a map of the whole world: a guest without geolocation and without a typed address immediately sees the streets around you and a marker for your venue to find their home from. If the venue point was not set in the delivery settings, the coordinates from the location card are used, and if those are missing too, its address. ### 17 September 2026 (date from code) — Reservations at a glance, delivery zones without leaving the page - **POS and floor.** Reservations in the Floor plan window are grouped by day: every day has its own header with a count of bookings and guests, times line up in their own column, and each row now has a single bright button — the next step for that booking (“confirm”, then “seat”, then “complete”). Read more: [Table Reservations](/en/docs/reservations), [Floor Plan](/en/docs/tables). - **Delivery and pickup.** Delivery zones on the map are now visible and editable right where you set the delivery fee and the radius — in the website settings and in the online-order hub. The block says how many zones are set and what they are called, and the button opens the very same map as the Courier screen, so there is no third section to go to for polygons. Read more: [Own delivery](/en/docs/delivery), [Orders](/en/docs/orders). - **POS and floor.** Guests who book a table now get emails that talk about a table booking instead of “You are booked”: right after booking — “Table booking request received” with a note that the booking is awaiting your confirmation, and once you confirm it — “Table booking confirmed”. The emails now show the party size and the table. Read more: [Table Reservations](/en/docs/reservations). - **POS and floor.** A reservation can now be edited right at the POS, in the Hall panel: the Edit button on a reservation moves the date and time, makes the reservation longer or shorter, and changes the party size, table, name, phone and comment. Each reservation row now shows the window the table is held for the guest — for example “11:00–13:00”. A table that is already taken at the new time cannot be saved. Read more: [Hall Panel](/en/docs/hall-panel), [Table Reservations](/en/docs/reservations). - **POS and floor.** A reservation can now release itself when the guest does not turn up: in the POS Hall panel, on the “Reservations” tab, the “⏱ Auto no-show” button switches the rule on and sets how long to wait after the reservation starts (15 minutes by default). While the clock runs it is shown right in the row; when the time is up the reservation goes to “no-show”, the table is free again and the POS says which table it was. The rule is off by default — running late is not the same as not coming — and a reservation with a paid deposit is never released automatically: a member of staff closes it, because the status decides what happens to the guest’s money. Read more: [Hall Panel](/en/docs/hall-panel), [Table Reservations](/en/docs/reservations). - **Delivery and pickup.** A courier's route now takes a single pick. On the Couriers screen, in the route panel above the map, there is a new “🛵 Courier route…” list: choose a courier and every order they have taken lines up into one trip, calculated from where that courier is right now. No more ticking orders one by one with “Include in route” — and you can still add another order to the built route with the same checkbox. Read more: [Own delivery](/en/docs/delivery). - **Website and storefront.** When booking a table from the storefront, the guest now picks how long the booking lasts — 1, 1.5, 2, 3 or 4 hours, 2 hours by default — instead of typing a second clock time: the same list you use to edit a reservation in the Hall panel. Below the list the sheet says until when the table is held, for example “Until 21:00”, and a booking that runs past midnight is worked out for you. Read more: [Table Reservations](/en/docs/reservations). - **Requests.** The “Requests” menu item now shows an orange badge with a number — how many requests arrived since your last visit to the section, across all your locations at once. No more checking “just in case”: open the section and the badge clears, and the section opens on the location where something is new. Read more: ["Requests: a single inbox"](/en/docs/leads). - **POS and floor.** The hall floor plan now shows who serves each table: the waiter is a clear circle in their colour with their initials at the table's corner, and hovering over it (a tap on a tablet) shows their name. This works on the “Now” and “Scheme” tabs of the Hall panel, in the POS table picker and on the hall monitor. Read more: [Hall Panel](/en/docs/hall-panel). ### 10 September 2026 — HR records, fixed assets and ring groups - **Staff and HR.** HR records for a small team: an employee has a manager, requests go for approval, people edit their own card, and HR events are dated — on termination access is revoked reliably. Read more: [Staff & shifts](/en/docs/staff). - **Staff and HR.** Leave is calculated by the rules of the country (Georgia, Russia, Turkey, Albania, Kazakhstan): the balance, a ledger of movements and the entitlement ladder by length of service — with no spreadsheet. Read more: [Staff & shifts](/en/docs/staff). - **Staff and HR.** An employee confirms their own timesheet, orders certificates themselves and signs documents with a code from an e-mail — no walking to the manager. Read more: [Staff & shifts](/en/docs/staff), [Documents](/en/docs/documents). - **Staff and HR.** No-shows, sick leave and unpaid leave are now first-class entities: they are deducted in payroll and included in the accounting export. Read more: [Staff & shifts](/en/docs/staff), [1C:Accounting](/en/docs/onec). - **Finance and documents.** A new “Assets” section: a register of fixed assets and equipment with accounting and tax depreciation, repairs and upgrades, a statement and QR labels. Read more: [Finance](/en/docs/finance), [Hardware: what connects](/en/docs/hardware). - **Telephony and calls.** Ring groups became extensions: a group has its own number, a second-by-second ring plan, personal hours for members, hold music and “music instead of ringback”. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** Line quality can be checked from the phone itself — the service number `*43`; the result lands in the call log, and the PBX log shows the routing trace of a call. Read more: [Telephony: your own PBX](/en/docs/telephony), [SIP Phone Setup](/en/docs/sip-phones). - **Chat and messengers.** @-mentions in the composer, announcements with read confirmation, a pinned-message bar and quiet hours driven by the shift schedule. Read more: [Chat with Guests](/en/docs/chat). ### 4 September 2026 — The partner cabinet, “Open now” widgets and ready-made call analyses - **Partner programme.** The partner programme now has a cabinet: a partner signs up on their own, manages their clients, invoices them and sees the settlement with the platform. Read more: [Partner program](/en/docs/partner-program). - **Partner programme.** A partner network: a partner can have sub-partners, the mark-up is calculated from the difference in rates, and sub-partners get invoiced. Read more: [Partner program](/en/docs/partner-program). - **“My website” widgets.** The “Open now” status on an external site follows the location's schedule; links and QR codes for an action — order, booking, call — arrived, along with an 18+ age gate. Read more: [My Website](/en/docs/site-widgets), [Multibutton](/en/docs/multibutton). - **“My website” widgets.** The site can show a popup with the nearest free booking slots and a progress bar saying how much is left until free delivery. Read more: [Appointments](/en/docs/appointments), [My Website](/en/docs/site-widgets). - **“My website” widgets.** A quiz on your site can score the answers, branch to different outcomes and act as a calculator — the visitor gets an answer, not just “thank you”. Read more: [My Website](/en/docs/site-widgets), [Attention](/en/docs/attention). - **Telephony and calls.** “Ready-made analyses” — a small set of industry conversation reviews that work without any setup; next to it there is now a control for analysis quality. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** The call recordings list scrolls infinitely, a column filter is entered right in that column's header menu, and the list holds video as well as audio. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Website and storefront.** Every legal document on the site now has a help note: whether it is mandatory in your country, what it contains and what you risk without it. Read more: [Website legal documents](/en/docs/legal-docs). ## August 2026 ### 31 August 2026 — A knowledge base built from websites, and an assistant that knows your till - **AI assistants.** The knowledge base ingests a whole website: folders mirror the URL structure, the queue comes from the sitemap, a crawl can be stopped halfway, and auto-refresh can be switched on. Read more: [Knowledge Base](/en/docs/knowledge-base). - **AI assistants.** The open knowledge-base document is now in the page URL — you can send a colleague a link to the exact article. Read more: [Knowledge Base](/en/docs/knowledge-base). - **AI assistants.** The assistant answers with action links: a click opens the right section, tab or the exact setting instead of leaving you to find it. Read more: [Help Center](/en/docs/help-center). - **AI assistants.** The assistant knows specific till models and sees the hardware at your workstation: “the till says SEND GRA SEVER” now gets an answer instead of advice to call a service centre. Read more: [Hardware: what connects](/en/docs/hardware), [Cenaly Hardware Bridge](/en/docs/hardware-bridge). - **Hardware.** “Receipt not printed” now comes with a reason and next steps instead of the raw text from the till driver. Read more: [Fiscalization](/en/docs/fiscal), [Cenaly Hardware Bridge](/en/docs/hardware-bridge). - **Hardware.** Discovered hardware can be disabled and deleted — and the deletion sticks: the device doesn't come back on the next scan. Read more: [Hardware: what connects](/en/docs/hardware). - **Marketing and newsletters.** Promo codes with validity dates: the table shows active, expired and upcoming codes separately, with no manual date checking. Read more: [Commerce](/en/docs/commerce), [Loyalty Program and Coupons](/en/docs/loyalty). - **Menu and catalogue.** AI autofill for a product card now works in the Russian environment too, on the models and search available from Russia. Read more: [Product Features](/en/docs/product-features), [AI Catalog Import](/en/docs/catalog-import). ### 28 August 2026 — Your own PBX for real, and guests inside the team chat - **Telephony and calls.** Your own PBX: call recording really records, inbound routing rules really execute, and an inbound line can be set up and tested right in its card. Read more: [Telephony: your own PBX](/en/docs/telephony), [Connecting a provider number to the PBX](/en/docs/sip-trunks). - **Telephony and calls.** Outbound calls: a line of their own for each employee, line-selection rules by number pattern, and dialling either through the carrier trunk or with the device's own SIP account. Read more: [Telephony: your own PBX](/en/docs/telephony), [SIP Phone Setup](/en/docs/sip-phones). - **Telephony and calls.** SIP over TLS on the dedicated machine and an external reachability probe: “the machine is configured” no longer means “calls actually reach it”. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** A daily minute cap, an alert on abnormal traffic and a real retention period for recordings — the phone bill finally has a brake. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Chat and messengers.** Guest chat moved into the team chat: guests, the AI secretary and digital workers now live in the same feed as the team, and messages can be reacted to with emoji. Read more: [Chat with Guests](/en/docs/chat). - **CRM and counterparties.** Global search on Ctrl/Cmd+K, a “My day” screen, bulk actions on cards, CSV export and duplicate detection. Read more: [Clients (CRM)](/en/docs/counterparties). - **POS and floor.** A floor monitor — a full-screen table plan for a TV or tablet, with panning and zoom to cursor. Read more: [Floor Plan](/en/docs/tables), [Hall Panel](/en/docs/hall-panel). - **Platform.** The open tab of a section now lives in the page URL across 23 sections: refresh, the browser Back button and a link to a colleague finally work as expected. Read more: [Account and location settings](/en/docs/settings). ### 24 August 2026 — Pay an invoice by link, gift cards and country-aware payroll - **CRM and counterparties.** An invoice can be paid by link: it gets its own page showing the outstanding amount, the e-mail carries a “Pay” button, and the incoming payment is allocated automatically. Read more: [Clients (CRM)](/en/docs/counterparties), [Payments](/en/docs/payments). - **CRM and counterparties.** Recurring invoices: a “Repeat…” control in the document card and a dedicated register tab — subscription invoices go out without manual work. Read more: [Clients (CRM)](/en/docs/counterparties), [Documents](/en/docs/documents). - **POS and floor.** The till learned gift cards and “on account” payment: a certificate can be sold and accepted as a tender, and the debt is settled within a per-location limit. Read more: [POS](/en/docs/pos), [Loyalty Program and Coupons](/en/docs/loyalty), [Corporate Accounts](/en/docs/corporate-accounts). - **Delivery and pickup.** Courier services on demand: the delivery price is shown to the guest at checkout, a courier can be called with a button, or automatically when the order is accepted. Read more: [Own delivery](/en/docs/delivery). - **Staff and HR.** Payroll is calculated by the rules of the country: packages for Russia, Turkey and Kazakhstan with their taxes and contributions, and one payslip format for every country. Read more: [Staff & shifts](/en/docs/staff). - **Marketing and newsletters.** An “Audience” section: guests with tags and segments, CSV export, and the same segment as the recipient filter for a newsletter. Read more: [Customers](/en/docs/customers), [Email campaigns](/en/docs/newsletter). - **Marketing and newsletters.** Double opt-in, a preference centre for the subscriber, and ready-made letter sequences you switch on with a toggle. Read more: [Email campaigns](/en/docs/newsletter), [On-Site Engagement Campaigns](/en/docs/campaigns). - **Finance and documents.** Files can be attached to a document, its PDF can be sent by e-mail or into a chat, and the covering letter is composed in the recipient's language. Read more: [Documents](/en/docs/documents). ### 18 August 2026 (date from code) — Missed-call rescue, loyalty points, guest Wi-Fi and till video control - **Telephony and calls.** A “Call back” tab — a missed-call rescue queue: the system spots the missed call, queues the number and sends an e-mail so the guest doesn't go to a competitor. Read more: [Telephony: your own PBX](/en/docs/telephony). - **Telephony and calls.** A “phone in money” summary on the dashboard and a “call → order or booking” trace: you see what the phone earned, not just how many calls there were. Read more: [Telephony: your own PBX](/en/docs/telephony), [Analytics and Reports](/en/docs/analytics). - **Marketing and newsletters.** A points loyalty programme: points accrue at guest checkout, there is a till panel for accrual and redemption, and the guest sees the balance in their account. Read more: [Loyalty Program and Coupons](/en/docs/loyalty). - **Marketing and newsletters.** Guest Wi-Fi: a splash page with sign-in, support for MikroTik and UniFi, and the guest's contact details land in the customer directory. Read more: [Customers](/en/docs/customers). - **Hardware.** Video control over the till area: a camera is attached to a location in “Hardware”, and every risky operation gets a video clip with a configurable retention period. Read more: [Loss Control and Cash Risks](/en/docs/loss-control), [Hardware: what connects](/en/docs/hardware). - **Marketing and newsletters.** Reputation: “Platforms” and “External reviews” tabs, monitoring of reviews on external sites, and AI-drafted replies you only need to check. Read more: [Guest Reviews and Reputation](/en/docs/reviews). - **POS and floor.** POS: per-guest items on the ticket, a “split by guest” bill and the guest number on the kitchen screen. Read more: [POS](/en/docs/pos), [Kitchen (KDS)](/en/docs/kds). - **Platform.** Migrating a venue from GloriaFood — bringing the storefront styling across, not just the menu. Read more: [Switch to us](/en/docs/migrate). ### 11 August 2026 (date from code) — A panel that fits your work, mailboxes and the text editor - **Account and access.** The sidebar can be tailored to you: hide the items you don't need, reorder the rest and switch on a ready-made panel profile for your kind of work. Read more: [Account and location settings](/en/docs/settings). - **Mail.** A mailbox on your own domain arrived — shared across all locations, with a signature, an auto-reply and message flags. - **Website and storefront.** The text editor: a slash menu instead of a button bar, tables of any size, callouts, markdown paste from the clipboard, a media library and draft auto-save. Read more: [Articles & Pages (CMS)](/en/docs/cms). - **AI assistants.** AI in the editor writes the alt text for an image, translates the selected fragment and changes the tone of a passage without rewriting the whole article. Read more: [Articles & Pages (CMS)](/en/docs/cms). - **Menu and catalogue.** Product collections: collection axes, collection shelves on site pages, and the open collection in the URL — the link can be sent to a customer. Read more: [Product Collections](/en/docs/collections). - **Website and storefront.** A gallery of store themes: try a theme on the live site first and apply it only after you like it. Read more: [Venue Website Builder](/en/docs/website-builder), [Online Store](/en/docs/shop). - **Stock and purchasing.** Stock-taking right inside “Menu”: a recount mode and filters by item kind, so you don't have to hunt for products across sections. Read more: [Inventory](/en/docs/inventory). ### 4 August 2026 (date from code) — Newsletters, “My website” and hardware without driver hunting - **“My website” widgets.** A new “My website” section: every widget for an external site lives in one place, and each has its own gear that opens exactly that widget's settings. Read more: [My Website](/en/docs/site-widgets). - **Marketing and newsletters.** E-mail newsletters: campaigns to your own subscriber list, open statistics and one-click unsubscribe straight from the letter. Read more: [Email campaigns](/en/docs/newsletter). - **“My website” widgets.** A form builder: assemble the fields, put the form on your site, and answers land in the panel under “Leads”. Read more: [My Website](/en/docs/site-widgets), [Commerce](/en/docs/commerce). - **Hardware.** The bridge installs the vendor drivers for ATOL and SHTRIH-M tills itself and recognises connected hardware over USB — no more hunting for drivers on vendor sites. Read more: [Cenaly Hardware Bridge](/en/docs/hardware-bridge), [Hardware: what connects](/en/docs/hardware). - **Online booking.** Online booking: staff schedules, location opening hours, buffers between services, guest-initiated rescheduling and an “Add to calendar” button. Read more: [Appointments](/en/docs/appointments). - **Website and storefront.** Website pages are assembled from sections that can be hidden or reordered, and the important pages can be pinned to the site's main menu. Read more: [Articles & Pages (CMS)](/en/docs/cms). - **Website and storefront.** Legal documents for the site are available in all 45 interface languages, with a live cookie declaration that updates from the scan results. Read more: [Website legal documents](/en/docs/legal-docs), [Cookies & Consent (CMP)](/en/docs/cookie-consent). - **Marketing and newsletters.** Your own Google Tag Manager container is connected with a single field in the tracking codes and honours the visitor's choice in the consent banner. Read more: [Analytics and Reports](/en/docs/analytics), [Cookies & Consent (CMP)](/en/docs/cookie-consent). ## July 2026 ### 28 July 2026 (date from code) — Guest chat, knowledge base and a faster catalogue - **Chat and messengers.** Guest chat got a real operator inbox: private notes, labels, snooze, priorities, ban, and AI suggestions right inside the conversation. Read more: [Chat with Guests](/en/docs/chat). - **Chat and messengers.** New chat channels: e-mail, Facebook, Instagram and a public API — every conversation in one inbox. Read more: [Chat with Guests](/en/docs/chat), [WhatsApp Integration](/en/docs/integration-whatsapp). - **Chat and messengers.** Chat can now work on its own: event-driven automation rules, reply macros, auto-tagging, and escalation when a guest has been waiting too long. Read more: [Chat with Guests](/en/docs/chat). - **AI assistants.** A new “Knowledge base” section: your own documents, search across them and questions; a whole website can be loaded — the crawler walks the pages for you. Read more: [Knowledge Base](/en/docs/knowledge-base). - **AI assistants.** The chat bot and the phone bot search products and dishes by meaning: a guest asks for “something not spicy” and the bot answers from your catalogue. Read more: [Chat with Guests](/en/docs/chat), [Knowledge Base](/en/docs/knowledge-base). - **Website and storefront.** The catalogue moved onto a database index: the storefront opens faster and products load as you scroll instead of waiting for the whole page. Read more: [Product Collections](/en/docs/collections), [Online Store](/en/docs/shop). - **Platform.** Migrating a store from another platform is now visible in the “Migration” section: what has moved, what is in progress and where it got stuck. Read more: [Switch to us](/en/docs/migrate), [AI Catalog Import](/en/docs/catalog-import). ### 21 July 2026 (date from code) — Store front and the on-site designer - **Website and storefront.** A new “Store studio” section — a single hub where the storefront, pages and styling are configured. Read more: [Online Store](/en/docs/shop), [Articles & Pages (CMS)](/en/docs/cms). - **Website and storefront.** The product page now works like in big stores: two columns, photo swatches for options, accordions for description and delivery, and a sticky buy button. Read more: [Product Features](/en/docs/product-features), [Online Store](/en/docs/shop). - **Website and storefront.** Product and collection URLs now look familiar to shoppers: `/products/` and `/collections/`. Read more: [Online Store](/en/docs/shop), [SEO & Storefront Promotion](/en/docs/seo). - **Website and storefront.** Product reviews now show customer photos, and long lists are paginated. Read more: [Guest Reviews and Reputation](/en/docs/reviews). - **Website and storefront.** The on-site designer: the panel docks to the screen edge and auto-hides, there is a phone/browser preview, and the “Properties” button takes you from a picked element straight to its settings. Read more: [Venue Website Builder](/en/docs/website-builder), [Articles & Pages (CMS)](/en/docs/cms). - **Menu and catalogue.** Menu printing: ready-made design presets, a price-list mode, three-column layout, a QR code and category selection. Read more: [Print Menu](/en/docs/print-menu). - **Stock and purchasing.** Purchasing: supplier price history, partial goods receipt, matching a photo of the delivery note against the order, and purchase cost per product. Read more: [Inventory](/en/docs/inventory), [Clients (CRM)](/en/docs/counterparties). - **Menu and catalogue.** A guest can filter the menu by allergens on the storefront and save a diet profile — the filter is reapplied on the next visit. Read more: [Allergens and Nutrients](/en/docs/allergens). --- ## Related articles - [How to get help](/en/docs/support) — the AI assistant, this help centre and live support - [FAQ](/en/docs/faq) — short answers about plans, countries, devices and data - [App store](/en/docs/app-store) — where to switch on the capabilities you do not have yet - [Subscription and plans](/en/docs/subscription) — what is included in your plan - [First day](/en/docs/first-day) — launch checklists by business type - [Troubleshooting](/en/docs/troubleshooting) — if something behaves oddly after an update - [Glossary](/en/docs/glossary) — what the words in the panel and in these notes mean --- # Orders — Dine-in, delivery, takeaway ## Overview The Cenaly ordering system supports all key restaurant business scenarios: | Order type | Description | Ideal for | |-----------|-------------|----------| | **Dine-in** | Table order via QR code | Restaurants, cafés, bars | | **Delivery** | Delivery to the customer's address | Restaurants with delivery | | **Takeaway** | Pickup (customer picks up themselves) | Cafés, fast food, bakeries | | **WhatsApp** | Order via messenger | Latin America, Middle East | | **Telegram** | Order via Telegram Mini App | CIS, Georgia | The admin panel has dedicated work screens for handling orders: - **[POS](/en/docs/pos)** — order entry by a waiter, table binding via QR; - **[Kitchen (KDS)](/en/docs/kds)** — kitchen display: queue, statuses, stations; - **[Courier](/en/docs/delivery)** — own-delivery screen with a map and routes; - **[Floor Plan](/en/docs/tables)** — table map, waiters and reservations. --- ## Dine-in — Table ordering ### How it works 1. The guest scans the QR code on the table 2. The menu opens linked to the table number 3. The guest selects items, add-ons, and adds notes 4. Taps **Order** 5. The order instantly appears for staff (on the kitchen screen / waiter's tablet) 6. The waiter confirms the order → the kitchen starts cooking 7. The guest receives a status notification ### Setup 1. Turn ordering on for the location: **Locations** → the location → the **WEB** tab. The same fields are gathered in one place under **My website** → the **Online ordering** card → **Configure** → the **Delivery & pickup** section. 2. Configure the floor plan in the **Floor Plan** section: tables, zones, bar counter (see [Floor Plan](/en/docs/tables)). 3. Bind QR codes to tables in the same **Floor Plan** section — after that a table order is recognised automatically. > There is no "Dine-in" tab in Settings, and no "Settings → Orders" page with ordering toggles either. The **Settings → Orders** tab is about something else: status automation, the guest blocklist and refund reasons (see "Order settings" below). ### Table management - Visual floor plan with drag & drop - Table statuses: free / occupied / reserved - Automatic release after payment ### Call a waiter The guest taps **"Call a waiter"** in the menu and picks a reason: bring water, the bill, help with the menu, or "other". The call travels the same path as an order itself — a signal to the server and from there to the staff in real time: - a **bell in the Orders section** — with the table number and reason, with sound (the sound can be muted with a button); - the **"Calls" tab in the [Hall panel](/en/docs/hall-panel)** — the same list, next to the scheme and the queue; - the **"Acknowledged"** button clears the call on both screens. Separately from calls there is an **addressed "order ready" push to the waiter**: if a waiter is assigned to the table (see [Floor plan](/en/docs/tables), "Waiters" mode), the readiness notification goes to them rather than to the whole shift. --- ### Pre-order slots If your kitchen can't absorb arbitrary "at 13:07" requests, turn on **pre-order slots** in the location settings. Then, for a scheduled order, the guest picks a **slot** rather than a free time: | Setting | What it defines | |---|---| | Slot length | 15 / 30 / 60 minutes — the grid step | | Slot capacity | how many orders to accept per slot (0 — unlimited) | | Lead time | the minimum notice for accepting an order | | Horizon | how many days ahead slots are opened (1–7) | The values can be set globally and **overridden separately for pickup and delivery** — their loads differ. The guest sees the nearest slots taking opening hours into account; **full slots are greyed out**. Slot occupancy is counted from orders already accepted and updates automatically. > The slot quota is **soft**: it is drawn for the guest and discourages overbooking, but there is no server-side "slot is full" rejection yet. If two guests pick the last slot at the same time, both orders go through. --- ### Pay-at-table — the guest pays from the table At a QR table the guest gets a floating **"Bill"** button: it opens the table's current bill (items, quantities, total) and lets them pay it online. The button only appears when both conditions hold: the QR code is bound to a table and online payment is enabled for the location. After payment a webhook marks the order paid — the till and the Orders section see it as usual. The guest can pay the bill **in full** or **their own share**: the bill sheet offers a choice between “split evenly” (they say how many people are sharing) and “by items” (they tick their own dishes, quantities can be split fractionally). A tip can be added on top of the share. Each share goes through as its own payment and the bill stays open until it is fully covered, with the amount due recalculated on the fly: if a neighbour has already paid their part, “pay in full” takes only the remainder rather than the whole bill again. Two guests paying at the same time will not overlap — a share is reserved on the server. > While an order is being taken at the till, an **upsell prompter** works: after an item is added, "suggest with this" chips appear — dishes most often bought together with it. The prompt adds nothing by itself; the waiter decides. --- ## Delivery — Delivery ### Setting up delivery zones 1. Open the **Couriers** section — polygon zones, the venue point and courier settings live there (the order settings hub links to it as "Delivery zones on the map, couriers and the courier network") 2. Draw zones on the map or set a radius from the venue 3. For each zone specify: - Delivery fee - Minimum order amount - Estimated delivery time General delivery terms (fee, free-from, minimum amounts, radius, notes) are set on the location: **Locations** → the location → **WEB**, or **My website** → **Online ordering** → **Delivery & pickup**. Details — [Delivery](/en/docs/delivery). ### Ordering flow 1. The customer opens the menu (via link, from social media, from packaging) 2. Selects **Delivery** → enters the address 3. The system determines the zone and shows the terms 4. The customer places the order → pays online or on delivery 5. The manager sees the order → assigns a courier 6. The customer tracks the status: accepted → preparing → on the way → delivered ### Courier management In-house delivery has its own **Courier** screen (see the [guide](/en/docs/delivery)): - The courier sees the queue: preparing → ready for pickup → out for delivery → delivered - "Take order" assigns the order to the courier, "Delivered" records the handover time - A map with the route to the customer and the courier's location - The payment method in the card: cash/card on delivery, online --- ## Takeaway — Pickup ### How it works 1. The customer opens the menu → selects **Takeaway** 2. Places the order → selects pickup time 3. Pays online or chooses pay on site 4. Receives confirmation with the order number 5. Picks up the order at the scheduled time ### Setup 1. **Locations** → the location → the **WEB** tab (or **My website** → **Online ordering** → **Configure** → **Delivery & pickup**) 2. Enable takeaway 3. Set the pickup terms: minimum amount and a note for the guest 4. Configure minimum prep time (e.g., 15 minutes) There is no separate "Settings → Takeaway" page: delivery and pickup are enabled by the same location fields. --- ## WhatsApp orders A popular ordering channel in Latin America, the Middle East, and Asia. ### Setup 1. **Locations** → the location → the **WEB** tab (or **My website** → **Online ordering** → **Configure** → **Delivery & pickup**) 2. Turn on **Accept orders via WhatsApp** 3. Enter the WhatsApp number in international format. Leave it empty to use the WhatsApp number from the location contacts There is no "Settings → WhatsApp" page — the toggle and the number live in the storefront ordering block. ### How it works 1. The guest builds a cart in the menu 2. Taps **Order via WhatsApp** 3. A WhatsApp chat opens with a pre-filled message (item list, quantity, total) 4. The manager confirms the order in chat --- ## Telegram orders ### Setup 1. Create a bot via [@BotFather](https://t.me/BotFather) in Telegram 2. In the admin panel → **Integrations** → **Telegram** 3. Connect the bot to your location 4. The menu will automatically become available as a Telegram Mini App More details: [Telegram Mini App — guide](telegram) --- ## Order management ### Orders panel All orders from all channels (dine-in, delivery, takeaway, WhatsApp, Telegram) are displayed in a single panel: - **New** — just received, awaiting confirmation - **In progress** — confirmed, kitchen is preparing - **Ready for pickup** — the kitchen finished; the order waits for the courier or the guest - **Out for delivery** — a courier took the order (for own delivery) - **Completed** — customer received the order - **Canceled** — order canceled ### Notifications Staff receive notifications about new orders: - 🔔 Sound notification on tablet/computer - 📱 Push notification on phone - 🖨 Automatic kitchen ticket printing (when a printer is connected) **The guest gets an e-mail confirmation.** The checkout form has an optional “E-mail” field (entered once — the address is remembered in the browser and pre-filled next time). When an address is given, a confirmation e-mail goes out with the order contents, the total and a link to its status, followed by a digital receipt once the order is paid. Letters come from the venue, in the guest's language. The order settings give the field three modes: **hidden**, **optional** (the default) and **required** — the last one makes sense where a receipt is always needed, for instance with online payment for takeaway. A consent checkbox for the venue's news can be shown next to the field: without it, the address is used only for this order and its receipt. ### Kitchen Display System (KDS) The **Kitchen (KDS)** screen in the admin panel shows the order queue (see the [KDS guide](/en/docs/kds)): - Dish order by time received, timers - Item statuses: queued → preparing → ready; bump and recall - Stations — filtering by menu categories - All-day summary and a sound alert for new orders ### Voice order management With the AI assistant, you can manage orders by voice: | Command | Example | |---------|---------| | Open the order list | "Show orders", "Open orders" | | Open a specific order | "Open order 42" | | Accept an order | "Accept order 15" | | Mark as ready | "Order 42 ready" | | Mark as paid | "Mark order 5 as paid" | | Cancel an order | "Cancel order 7" | All commands that change status require confirmation. More details — in the [voice assistant documentation](/en/docs/voice-input). --- ## Order settings Settings live in two places — worth knowing so you don't look in the wrong one. **Ordering terms** belong to the location: **Locations** → the location → the **WEB** tab. The same things are gathered on one screen under **My website** → the **Online ordering** card → **Configure**, as an accordion of four sections: | Section | What it configures | |----------|-------------| | Delivery & pickup | Fees and free-from, minimum amounts, radius, notes, accepting orders via WhatsApp | | Payments | Card payments online (your own provider account) and payment methods offered on delivery | | Checkout | Checkout fields and the guest e-mail, scheduled pre-orders, checkout upsell | | Fiscal receipts | Where receipts for online orders are issued | The same hub links out to related sections: delivery zones and couriers, promo codes, loyalty, order automation rules, service charge and tips, taxes on the receipt. **The "Settings → Orders" tab** is about handling orders that have already been placed: | Block | What it does | |----------|-------------| | Automation | Auto-cancel unpaid orders after N hours and auto-complete handed-over/delivered ones. Checked hourly; cancellation goes through the normal flow (stock, notifications) and is reversible from the order card | | Guest blocklist | Phone numbers, e-mails and IPs whose orders are not accepted | | Refund reasons | Your own list of reasons the staff picks from when issuing a refund | Payment methods visible on the order card: cash, card on delivery, online, corporate account, charge to room (hotel) and **On credit** — the order was closed at the till into the debt ledger (see [POS](/en/docs/pos)). --- ## 7. Floor plan and table management ### Floor plan editor 1. Open the **Floor Plan** section — it is its own sidebar item, not a Settings tab 2. Drag and drop elements: tables (round, square, rectangular), chairs, walls, doors 3. Specify the number and capacity of each table 4. Create multiple zones: main hall, terrace, VIP, bar counter Details — [Floor Plan](/en/docs/tables). ### Table statuses | Status | Color | Description | |--------|------|-------------| | 🟢 Free | Green | Table is ready for seating | | 🟡 Occupied | Yellow | Guests are at the table | | 🔵 Reserved | Blue | There is a reservation for this time | There are no separate "awaiting payment" or "service" table statuses. On the POS floor scheme two extra signals are highlighted on top of the status: **waiter call** and **order ready**. ### Linking QR codes to tables - Each table gets a unique QR code - When scanned, the system identifies the table number - The order is automatically linked to the table - The waiter sees which table the order came from --- ## 8. Reservation system ### Reservations for guests Guests can reserve a table: 1. Via the QR menu → **"Reserve a table"** button 2. Via the venue website 3. Via a Telegram bot 4. By phone (manager enters it manually) ### Reservation setup - **Time slots**: reservation duration - **Guest limit**: minimum and maximum per table - **Deposit**: require a prepayment for the table — a fixed amount or per guest; separately you choose what happens to the deposit if the guest doesn't show up (forfeited or refunded) - **Waitlist**: the guest joins a queue, and the invitation to a freed table is valid for a limited time - **Confirmation**: automatic or manual All parameters and their defaults — in [Reservations](/en/docs/reservations) and [Floor Plan](/en/docs/tables). ### Notifications - The guest receives confirmation (email / Telegram) - The manager sees all reservations in the calendar --- ## 9. Room Service (in-room dining) For hotels, hostels, and apartments: ### Setup 1. **Locations** → the location → the **Business type** field → **Hotel**. Business type sets the terminology and default presets of the location; it does not limit any features 2. In the **Floor Plan** section switch to **Rooms** mode and create rooms (101, 102… or names) instead of tables 3. Place a QR code in each room ### Ordering flow 1. The guest scans the QR in the room → sees the menu 2. Selects dishes → places an order 3. Enters the room number and delivery time 4. The kitchen receives the order → prepares → staff deliver to the room ### Additional options - Ordering additional services (towels, pillows, cleaning) - Breakfast schedule with dish selection - Mini-bar: consumption tracking - PMS (Property Management System) integration --- ## 10. Split Bill The bill is split **at the till**, by a waiter or cashier: - **by items** — each guest picks their dishes and pays only for them; - **equally** — the total is divided by the number of guests. Each part is closed with its own payment method (cash, card, corporate account), and the order counts as paid once all parts are closed. Details — [POS](/en/docs/pos). > **Guests can split the bill too** — with the "Bill" button at a QR table (pay-at-table, above): evenly or by items, with a tip on top of the share. Till-side and guest-side splitting compute the same shares and do not conflict: the till sees the parts guests have already paid and closes only the remainder. --- ## 11. Kitchen Display System (KDS) — detailed setup ### Hardware KDS works on any device with a browser: - **Tablet** (10–12 inches) — recommended for small kitchens - **Smart TV** (32–55 inches) — for large kitchens - **Monitor with a PC** — for large venues - **Multiple screens at once** — each shows its own station ### Multiple kitchen screens: station presets There is no screen builder in the admin panel — a screen is configured **on the kitchen screen itself**. The number of screens is unlimited, and each one is locked to its own station. #### How to connect 1. Open the **Kitchen (KDS)** section 2. In the **Stations** panel tick the menu categories this screen should see (the hint says exactly that: "Show only dishes from selected categories") 3. Press **Save current as preset** and name it (for example, "Grill") 4. Take **Copy link** or the **QR** of the saved preset and open it on the kitchen tablet, TV or monitor 5. The screen locks to that station — a "This screen is locked to a station" note appears Presets are stored on the account, so the same link can be opened on several devices. > If the link was saved and the preset was later deleted or renamed, the screen says so honestly: "Unknown station link — showing all orders". #### Example layout for a restaurant | Preset | Menu categories | Device | |-------|---------|--------| | Hot kitchen | Hot dishes, sides, soups | Smart TV 43" | | Cold kitchen | Salads, appetizers, desserts | Tablet 10" | | Bar | Drinks, cocktails, fresh juices | Tablet 10" | | Pizza | All pizzas | Smart TV 32" | | All orders | no filter (assembly / handoff) | Monitor 24" | #### How an item reaches the right screen Routing is done by the **screen's menu-category filter**, not by a field on the dish card: neither a menu category nor a menu item has a "KDS station" property. Whatever is ticked in the "Bar" preset is what the bar screen sees. The only "station → hardware" link is the **station printer**: the same Stations panel defines which bridge printer prints that station's ticket and which one is its backup (see [Kitchen printing](/en/docs/kitchen-printing)). ### Order queue board for guests The guest-facing screen is a separate thing, not a "KDS screen type". The public **Order queue board** shows order numbers that are being prepared and ready. It is enabled on the location: **Locations** → the location → the integrations section → **Order queue board**. The same card holds the "Show delivery orders" toggle (off = counter orders only), the public link, a QR code and an "Open board" button. All that is left is to open the link on a TV in the dining area or at the pickup counter. ### Station setup A station is a saved set of menu categories: | Station | What it shows | |---------|---------------| | Hot kitchen | Hot dishes, sides | | Cold kitchen | Salads, appetizers, desserts | | Bar | Drinks, cocktails | | All orders | No filter — for assembly and handoff | ### Time color indication - 🟢 **< 10 min** — within normal range - 🟡 **10–15 min** — needs attention - 🔴 **> 15 min** — critical, priority The thresholds (10 and 15 minutes by default) are set in the KDS appearance settings and are **shared by every kitchen screen of the account** — there is no per-station threshold. ### Managing orders on KDS - **Tap a dish** → "Preparing", tap again → "Ready" - **Start** — take the whole ticket into work - **Bump** — the ticket is assembled and goes to handoff; the waiter is notified - **Sound alert** for new orders and when time is exceeded - **All day** — how many identical items are in progress in total There are no swipe gestures and no bump-bar support on the kitchen screen — everything is done with taps and buttons. ### KDS offline mode If the internet goes down: - KDS keeps showing the last known state — the orders and appearance settings already loaded - The screen reconnects on its own; orders missed meanwhile are fetched from the server once the connection is back - Statuses sync automatically --- ## 12. Order cancellations and refunds ### Cancellation policy | Order status | Cancellation possible? | Refund | |--------------|------------------------|--------| | New | ✅ Yes (automatically) | Full refund | | Accepted by kitchen | ⚠️ With manager approval | Partial/full | | Preparing | ❌ Manager only | At manager's discretion | | Ready | ❌ No | No (if picked up) | | Out for delivery | ❌ No | Upon claim | ### Refund process A refund is **not** issued from the Orders section: the order card only displays the refund status. There is no "Refund" button there right now — it is in the works. 1. The guest contacts the manager 2. The manager opens **POS** → **Receipts**, finds the sale receipt and issues the refund against it 3. Selects items to refund (full or partial) and the refund method 4. Retail-vertical orders with a submitted refund request are visible in the **Returns** section Details — [Receipts and refunds](/en/docs/receipts) and [Returns](/en/docs/returns). --- ## What you need to get started - **At least one order channel**: the QR storefront, the POS, the Telegram shop, an order widget on your site, or a manual order created by a manager. - **An understanding of the "guest order needs confirmation" setting.** By default an order placed by a guest reaches the kitchen, the POS and the courier board only after an operator accepts it here; the location setting switches back to "straight to work" — for points where there is nobody to accept orders manually. - **Employee roles** — access to the section and to "My orders" is governed by permissions ([Staff](/en/docs/staff)). - **Configured order types** — dine-in, pickup, delivery: each has its own guest fields and its own rules. --- ## Limitations - **The order-acceptance setting is per location.** There is no bulk "switch on for all locations of the account". - **Updates come over a websocket.** Without a connection the list does not refresh itself — reload the page manually ([If the internet goes down](/en/docs/offline)). - **The time promised to the guest is static.** It comes from a location setting and is not computed from current kitchen load; there is also no automatic channel pause on overload. - **Aggregator orders are verified on mocks.** There are no live partner connections to Wolt, Glovo, Yandex Eda or Deliveroo. - **A WhatsApp order is a message to the owner**, not an order in the pipeline: the reply and the status are handled in the chat manually. - **The only writer of an order is the server.** Edits arrive as separate signals, so a change does not land instantly and "direct editing of the order file" does not exist. --- ## Troubleshooting **A guest's order did not reach the kitchen.** Most likely it is waiting for an operator to accept it: accept it here, or switch the location to "straight to work". **The status does not update on screen.** Updates come over a websocket — reload the page if the connection dropped. **A guest says the promised waiting time is wrong.** The promised time is static and set by a location setting — change it in the order settings. **An order from an aggregator is missing.** There are currently no live marketplace connections. **An order is "stuck" in a status.** Check that somebody further down the chain can move it: the kitchen display, the handoff screen or the courier board must be enabled and open. --- # Attention An ordinary dashboard shows numbers. This page shows **things to do**: "there are N things worth doing today", each with a single button. Open **Admin Panel → Attention** (`admin.cenaly.com/attention`). A location filter sits at the top. When there is nothing to do, the page says so: "All under control ✅". --- ## The eight sections | Section | What lands here | Where the button leads | |---|---|---| | **Callback requests** | requests left by guests on the storefront over the last 7 days | a phone call | | **Unconfirmed reservations** | reservations in "pending" status for today and tomorrow | the reservation card — floor plan or appointment book, depending on type | | **Overdue B2B invoices** | overdue amounts from the counterparty aging report | the counterparty card | | **Quotes awaiting an answer** | quotes with no response, with their expiry date | the quote document | | **CRM tasks due today** | open tasks due today or overdue | the tasks tab of the clients section | | **Fresh negative reviews** | rating 3 or below, unresolved, within 14 days | the reviews section | | **Cash risks** | fired loss-control rules | the risky-operations stream | | **Large guest debts** | balances from the debt ledger | the guest directory | Each section shows a handful of top rows rather than the whole list — the page stays a to-do list, not a report. --- ## Cash risks The **"Cash risks"** block stands apart — it is the only one that comes from rules rather than from people: void series, discount spree, cash discrepancy, consumption above norm, purchase price spike. How they work and how the thresholds are set — [Loss control](/en/docs/loss-control). --- ## Limits The page is assembled **from existing sources** and stores nothing of its own. Two consequences follow: - if a source is unavailable (for example CRM isn't connected yet), its block simply isn't shown and a soft warning appears at the top saying the list may be incomplete — the page doesn't break; - callback requests have no "handled" flag: the button places the call, but there is nowhere to close the request in this version. --- ## Related sections - [Loss control](/en/docs/loss-control) — the rules behind the "Cash risks" block - [Table reservations](/en/docs/reservations) — confirming and seating reservations - [Reviews and reputation](/en/docs/reviews) — handling negative feedback - [Returning guests](/en/docs/customers) — guest history and debts - [Clients (CRM)](/en/docs/counterparties) — invoices, quotes and tasks per counterparty --- ## FAQ ### How is this different from a dashboard? A dashboard answers "how are things going", this page answers "what should I do right now". There are no charts here, only rows with buttons. ### Why are some sections missing? A section is hidden when it has nothing to show, or when its source is unavailable (the relevant module isn't connected). In the second case a warning appears at the top. ### Is the data live? The page collects everything when you open it. Cash risks are recalculated on the server on a schedule; the other sources are read as of load time. ### Can I mark a callback request as handled? Not in this version. The request leaves the list by itself once it falls outside the 7-day window. --- # Payments — Online Payments and Integrations ## Overview Cenaly supports many payment methods tailored to the requirements of different countries and markets. ### Supported payment methods | Method | Regions | Fee | |--------|---------|-----| | **Stripe** | 40+ countries | 2.9% + $0.30 | | **Apple Pay** | All countries | Via Stripe | | **Google Pay** | All countries | Via Stripe | | **iyzico** | 🇹🇷 Türkiye | Provider's tariff; supports instalments (taksit), whose fee the guest pays on top of the order total | | **Pay on delivery** | All countries | 0% | | **Cash** | All countries | 0% | ### Local payment systems | System | Country | Description | |---------|--------|----------| | **Kaspi** | 🇰🇿 Kazakhstan | QR payments via Kaspi | | **LiqPay** | 🇺🇦 Ukraine | Card payments, Apple/Google Pay | | **MoMo** | 🇻🇳 Vietnam | Mobile payments | | **VietQR** | 🇻🇳 Vietnam | QR payments via banks | | **MercadoPago** | 🇦🇷🇲🇽 LATAM | Cards, QR, installments | | **GCash** | 🇵🇭 Philippines | Mobile wallet | | **GoPay** | 🇮🇩 Indonesia | Mobile payments | | **SumUp** | 🇪🇺 Europe | Card terminal | --- ## Connecting Stripe ### Step 1. Create a Stripe account 1. Go to [stripe.com](https://stripe.com) and sign up 2. Verify your business information 3. Get your API keys ### Step 2. Connect to Cenaly 1. In the admin panel → **Settings** → **Payments** 2. Select **Stripe** 3. Click **Connect Stripe** — you will be redirected to Stripe 4. Log in and confirm the connection 5. Done — guests can pay for orders online ### What's supported via Stripe - Bank cards (Visa, Mastercard, AmEx) - Apple Pay - Google Pay - iDEAL (Netherlands) - SEPA Direct Debit (Europe) - Bancontact (Belgium) - Przelewy24 (Poland) - and other local methods --- ## Pay on delivery If online payment is not connected or the guest prefers to pay on site: 1. In **Settings** → **Payments** → enable **Pay on delivery** 2. The guest selects this method at checkout 3. Payment is made in cash or by card upon receiving the order --- ## Online tips Guests can leave tips during online payment: 1. In **Settings** → **Tips** 2. Enable online tips 3. Configure options: 5%, 10%, 15%, 20%, custom amount 4. Tips are added to the payment total --- ## Security - All payment data is processed via **Stripe** (PCI DSS Level 1) - Cenaly **does not store** bank card data - The connection is protected with **SSL/TLS** encryption - Compliance with **GDPR** and local regulations --- ## Fiscalization For countries with mandatory fiscalization, Cenaly generates data to be sent to tax authorities: | Country | System | Status | |--------|---------|--------| | 🇹🇷 Turkey | E-Dönüşüm | Integration | | 🇷🇺 Russia | 54-FZ / OFD | Integration via iiko/1C | | 🇫🇷 France | NF 525 | Certification | | 🇩🇪 Germany | TSE (KassenSichV) | Integration | | 🇦🇹 Austria | Registrierkassenpflicht | Integration | | 🇮🇹 Italy | Scontrino elettronico | Integration | --- ## Payment reports In the **Analytics** section, you have access to: - Total revenue for the period - Breakdown by payment methods - Average check - Tip statistics - Export to Excel/CSV for accounting --- ## 8. Multi-currency ### Setup 1. **Location settings** → **Currency** → select the primary currency 2. Add additional currencies for display ### Supported currencies GEL (₾), USD ($), EUR (€), GBP (£), TRY (₺), RUB (₽), UAH (₴), KZT (₸), AED (د.إ), ILS (₪), PLN (zł), CZK (Kč), and others — 50+ currencies. ### How it works - Prices are stored in the venue's primary currency - Exchange rates update automatically (daily) - The guest sees prices in the currency of their choice - Payment is processed in the currency of the connected payment system - Different locations in a chain can use different currencies --- ## 9. Split Bill Guests at the same table can split the payment: - **Equally**: total amount ÷ number of guests - **By items**: each person marks their dishes - **Custom**: each person enters their amount Each guest pays their part via phone. The order is closed when all parts are paid. --- ## 10. Fiscal printers and receipts ### Supported hardware | Type | Models | |-----|--------| | Thermal printers | Epson TM-T20III, Star TSP143III, ATOL 30F | | Fiscal registrars | ATOL (Russia), Checkbox (Ukraine), EFTPOS (Turkey) | | Cloud cash registers | Kontur.Market, Poster POS, Checkbox | ### Connection 1. **Settings** → **Hardware** → **+ Add printer** 2. Select the connection type: USB, Wi-Fi, Bluetooth, cloud 3. Specify the IP address or MAC address 4. Print a test receipt ### Receipt templates - Customizable template: logo, QR code, thank-you text - Auto-print when an order is created / closed - Separate kitchen receipt (without prices) ### Fiscalization by country | Country | Requirement | Solution in Cenaly | |--------|-----------|---------------| | 🇹🇷 Turkey | ÖKC / Yeni Nesil | Integration with EFTPOS | | 🇷🇺 Russia | 54-FZ online cash register | ATOL, Evotor, Kontur | | 🇺🇦 Ukraine | RRO / PRRO | Checkbox | | 🇫🇷 France | NF 525 | Certified software | | 🇩🇪 Germany | TSE (KassenSichV) | TSE module | | 🇮🇹 Italy | Registratore Telematico | RT integration | | 🇬🇪 Georgia | RS.ge | Integration with RS.ge | --- ## 11. Refunds and disputes ### Full refund Manager → **Orders** → select an order → **Refund** → confirm. Funds are returned to the card (1–5 business days). ### Partial refund Select specific items to refund — only the cost of the selected dishes is returned. ### Reporting All refunds are recorded in analytics → **Refunds** section — reasons, amounts, frequency. --- # Connecting Stripe Accept online payments via Stripe: cards, Apple Pay, Google Pay. --- ## 1. Overview **Stripe** is a global payment platform. In the Cenaly registry Stripe is offered for connection in **46 countries**. The Cenaly + Stripe integration allows you to: - 💳 **Accept payments** by card (Visa, Mastercard, AmEx) - 📱 **Apple Pay / Google Pay** — one-tap payments - 💰 **Receive payouts** to your bank account - 🔄 **Process refunds** from the admin panel - 💵 **Tips** — the guest adds a tip during checkout - 📊 **Reports** — full financial analytics --- ## 2. Requirements - ✅ Cenaly account (plan **Basic** and above) - ✅ Stripe account (free signup at stripe.com) - ✅ Bank account for payouts (in your country's currency) - ✅ Verification documents (passport / ID, company documents) ### Supported countries Stripe is offered for connection in 46 countries: | Region | Countries | |--------|----------| | Europe (EEA) | Austria, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Liechtenstein, Lithuania, Luxembourg, Malta, Netherlands, Norway, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden | | Europe (non-EEA) | United Kingdom, Switzerland, Gibraltar | | Americas | USA, Canada, Mexico, Brazil | | Asia | Japan, Singapore, Hong Kong, Malaysia, Thailand, India, Indonesia | | Middle East | UAE | | Oceania | Australia, New Zealand | > **Georgia and Türkiye are not on this list** — Stripe does not open merchant accounts there, so for a location with such a country the Stripe card will not appear in the panel. For Georgia connect **Bank of Georgia (iPay)** or **TBC Bank**, for Türkiye — **iyzico**, for the Middle East — **PayTabs**; the global alternative that works almost everywhere is **PayPal**. If Stripe is already connected to your legal entity in another country, it stays in the list and keeps working. --- ## 3. Creating a Stripe account ### Step 1. Sign up 1. Go to [stripe.com](https://stripe.com) → **Start now** 2. Enter your email and create a password 3. Confirm your email ### Step 2. Business verification Stripe will request: | Document | Description | |----------|-------------| | Business type | Sole proprietor, LLC, individual | | Name | Legal name and trading name | | Address | Company legal address | | TIN / Tax ID | Tax identifier | | Director's document | Passport or ID card | | Bank details | IBAN or account number | | Business description | "Restaurant / cafe / food delivery" | Verification usually takes **1–3 business days**. ### Step 3. Get API keys 1. In the Stripe dashboard: **Developers** → **API keys** 2. Copy: - **Publishable key** (pk_live_...) - **Secret key** (sk_live_...) > ⚠️ **Important**: for testing, use keys from **Test mode** (pk_test_..., sk_test_...). --- ## 4. Connecting to Cenaly You connect **your own** Stripe account: the guest's money goes straight to your Stripe balance, Cenaly never holds it. Open **App Store → “Finance” category → Stripe card → “Configure”** — the connection block opens as a modal right in the store. The familiar path also works: **Locations → location card → “Payments” tab** (the “Guest payment” section), then **“Connect”** on the Stripe card. ### Connection wizard (recommended) A step-by-step wizard (≈10 minutes) walks you through the whole process, showing where to click in the Stripe dashboard: 1. **Choose the mode** — test or live. The mode in Stripe and the “Test / Live” toggle in Cenaly must match. 2. **Copy your API keys** — **Developers → API keys**: the Secret key (`sk_test_…` / `sk_live_…`) is required, the Publishable key (`pk_…`) is optional. 3. **Add a webhook endpoint** — **Developers → Webhooks → Add endpoint**, and paste the Cenaly webhook URL that the wizard offers with a “Copy” button into the Endpoint URL field. Without a webhook Stripe won't tell Cenaly that the order was paid, and the order may stay “pending”. 4. **Select the events to send** — under “Select events” add `checkout.session.completed` (required — this is what confirms a paid order), and for delayed payment methods also `checkout.session.async_payment_succeeded` and `checkout.session.async_payment_failed`. Then click “Add endpoint”. Without these events the webhook exists but reports nothing. 5. **Copy the Webhook signing secret** (`whsec_…`) — an optional field, but it enables signature verification of the notifications. 6. **Connect** — the entered values go to the secure backend. ### Short form If you already know your way around Stripe, open the inline connection form and fill in the same fields: Secret key, Webhook signing secret (optional), Publishable key (optional), plus the mode toggle. > **Stripe Connect is not used.** Cenaly is not an intermediary platform: you enter the keys of your own account instead of granting Cenaly access to it over OAuth. --- ## 5. Setting up payment methods ### Bank cards Enabled automatically when Stripe is connected: - **Visa** / **Mastercard** — all countries - **American Express** — most countries - **Diners Club** / **Discover** — selectively ### Apple Pay 1. **Settings** → **Payments** → **Apple Pay** → **Enable** 2. Add and verify your domain in the Stripe Dashboard: - **Settings** → **Apple Pay** → **Add new domain** - Upload the verification file 3. Apple Pay will appear as an option on iOS/Safari ### Google Pay Enabled automatically when Stripe is connected. Works on Android and in Chrome. ### Other methods Via Stripe you can enable: | Method | Countries | Description | |-------|--------|----------| | **iDEAL** | Netherlands | Bank transfer | | **Bancontact** | Belgium | Bank transfer | | **SEPA Direct Debit** | EU | Bank account debit | | **Przelewy24** | Poland | Online payments | | **giropay** | Germany | Bank transfer | | **EPS** | Austria | Bank transfer | | **Boleto** | Brazil | Payment voucher | Enable the required methods in Stripe Dashboard → **Settings** → **Payment methods**. --- ## 6. Tips ### Setup 1. **Settings** → **Payments** → **Tips** 2. Options: | Parameter | Description | |----------|-------------| | Suggested amounts | Presets are filled in by the venue's country: 18/20/25 % for the USA, 15/18/20 % for Canada, 10/15/20 % for Georgia; in Japan, China and Korea the tip block is hidden | | Custom amount | Guest enters their own amount | | Default tip | None (guest chooses) | | Distribution | To waiter / shared pool / proportional | ### What the guest sees At checkout after selecting items: ``` Your order: 45₾ Add a tip? [ 10% (4.50₾) ] [ 15% (6.75₾) ] [ 20% (9.00₾) ] [ Other amount ] [ No tip ] TOTAL: 49.50₾ [Pay →] ``` ### Tip reports **Analytics** → **Tips**: - Total tips for the period - Average tip % - Tips by employee - Trend (up/down) --- ## 7. Payouts to your account ### How Stripe pays out funds ``` Guest pays → Stripe holds → After T+2 days → Funds in your account ``` | Parameter | Value | |----------|----------| | Standard payout | T+2 (in 2 business days) | | Accelerated payout | T+1 (available in some countries) | | Instant payout | Instant Payouts (within an hour, for an additional fee) | | Minimum payout | 1€ / 1$ / 1₾ | ### Schedule setup In Stripe Dashboard → **Settings** → **Payouts**: - **Daily** (recommended) - **Weekly** (specific day of the week) - **Monthly** --- ## 8. Stripe fees | Region | Fee | Example | |--------|----------|--------| | Europe (EEA) | 1.5% + 0.25€ | Order 50€ → fee 1.00€ | | United Kingdom | 1.5% + 0.20£ | Order £50 → fee £0.95 | | USA/Canada | 2.9% + $0.30 | Order $50 → fee $1.75 | | International cards | +1.5% | Extra for cards issued in another country | | Currency conversion | +1% | If card currency ≠ account currency | > 💡 Cenaly does not charge any additional fee on top of Stripe. --- ## 9. Refunds ### Full refund 1. **Orders** → select an order → **Refund** → **Full** 2. Funds are returned to the guest's card within 5–10 business days 3. Stripe returns the fee (in most cases) ### Partial refund 1. **Orders** → order → **Refund** → **Partial** 2. Enter the amount or select items 3. The guest receives a partial refund ### Automatic refunds Configure rules in **Settings** → **Payments** → **Refunds**: - Cancel before cooking starts → automatic full refund - Cancel after cooking starts → requires manager approval --- ## 10. Security ### PCI DSS - Cenaly **does not store** card data — everything is processed by Stripe - Stripe is certified as **PCI Level 1** (highest level) - Card data is encrypted and tokenized ### 3D Secure - Automatic 3D Secure checks for EU cards (SCA/PSD2) - Reduces fraud and chargebacks - For the guest: confirmation in the bank app ### Radar (fraud protection) Stripe Radar automatically blocks suspicious transactions: - Unusual purchase patterns - Cards from blacklists - Geolocation anomalies --- ## 11. Testing Before enabling in production, test: ### Stripe test cards | Card number | Result | |-------------|-----------| | 4242 4242 4242 4242 | Successful payment | | 4000 0000 0000 3220 | 3D Secure | | 4000 0000 0000 9995 | Declined (insufficient funds) | | 4000 0000 0000 0069 | Card expired | CVV: any 3 digits. Date: any future date. ZIP: any. ### How to test 1. **Settings** → **Payments** → **Mode: Test** 2. Use test keys (pk_test_..., sk_test_...) 3. Create a test order → pay with a test card 4. Check: receipt, order status, analytics 5. Switch to **Mode: Live** when everything works --- ## 12. Alternative providers For countries without Stripe or as an add-on: | Provider | Countries | Description | |-----------|--------|----------| | **BOG iPay** | 🇬🇪 Georgia | Bank of Georgia, popular in Georgia | | **TBC Pay** | 🇬🇪 Georgia | TBC Bank | | **İyzico** | 🇹🇷 Turkey | Local payment provider | | **PayTR** | 🇹🇷 Turkey | Alternative to İyzico | | **Adyen** | EU, global | Enterprise solution | | **Square** | US, UK, EU | POS + online | Connecting any provider: **App Store** → **“Finance”** category → the provider's card → **“Configure”**, or via the familiar path **Locations** → location card → **“Payments”** tab. --- ## 13. FAQ ### When will I receive the money? In 2 business days after payment (T+2). The first payout may take 7–14 days (while Stripe verifies the account). ### A guest wants to pay cash — what should I do? Cenaly supports mixed payments. Mark the order as "Cash payment" — a fiscal receipt will be generated, but Stripe won't be involved. ### Can I connect both Stripe and BOG iPay? Yes. In payment settings you can enable multiple providers. The guest chooses the convenient one at checkout. ### Stripe blocked the account — what should I do? 1. Check your email — Stripe sends the reason 2. Usually additional verification is required 3. Contact Stripe Support: support.stripe.com 4. While blocked, you can use an alternative provider ### How can I minimize fees? - Encourage payments with EU cards (1.5% instead of 2.9%) - Use SEPA for large amounts (fixed 0.35€) - With high volume (>100K€/month) — request a custom rate from Stripe --- ## 14. Support - **Stripe:** support.stripe.com - **Cenaly:** support@cenaly.com → subject "Stripe / Payments" - **Stripe Status:** status.stripe.com (service status check) --- # Fiscalization Connecting fiscal printers and online cash registers to comply with tax legislation. --- ## 1. Overview **Fiscalization** is a legal requirement in many countries: every financial transaction must be registered in the tax system and confirmed with a fiscal receipt. Cenaly supports fiscalization for: | Country | System | Status | |--------|---------|--------| | 🇬🇪 Georgia | Revenue Service (RS.ge) | ✅ Supported | | 🇹🇷 Turkey | e-Dönüşüm / ÖKC | ✅ Supported | | 🇩🇪 Germany | TSE (Technische Sicherheitseinrichtung) | ✅ Supported | | 🇦🇹 Austria | Registrierkassenpflicht (RKSV) | ✅ Supported | | 🇮🇹 Italy | Registratore Telematico (RT) | ✅ Supported | | 🇪🇸 Spain | VeriFactu / TicketBAI | ✅ Supported | | 🇵🇱 Poland | Kasa fiskalna online — own fiscal printer (POSNET Thermal) via the bridge | ✅ Supported | | 🇵🇱 Poland | Kasa fiskalna online — API of a third-party certified cash register (CRK) | 🛠 In development: cannot be connected yet | | 🇰🇿 Kazakhstan | Cloud OFD gateway (Webkassa) | 🛠 In development: cannot be connected yet | | 🇬🇷 Greece | myDATA (ΑΑΔΕ) | 🔜 In development | | 🇭🇷 Croatia | Fiskalizacija | 🔜 In development | | 🇷🇴 Romania | SAF-T / E-factura | 🔜 In development | --- ## 2. How it works ``` Guest pays for the order ↓ Cenaly generates a fiscal document ↓ The document is sent to the fiscal device / cloud cash register ↓ The device registers the transaction with the tax authority ↓ Guest receives a fiscal receipt (printed or electronic) ``` ### Two fiscalization options | Option | Description | For whom | |---------|----------|----------| | **Physical printer** | Fiscal printer on premises (Epson, Star, Atol, Datecs) | Dine-in, takeaway | | **Cloud cash register** | Cloud fiscalization service (no physical printer needed) | Delivery, online orders | --- ## 3. Connecting a fiscal printer ### Supported printers | Manufacturer | Models | Countries | |--------------|--------|--------| | **Epson** | TM-T88VI, TM-T88VII, TM-m30II | All | | **Star Micronics** | TSP100IV, mC-Print3 | All | | **Datecs** | FP-700X, FP-2000 | Georgia, Bulgaria | | **Atol** | 30F, 55F, 77F | Russia, Kazakhstan | | **Custom** | K3 FIT, KUBE II F | Italy | | **Bixolon** | SRP-350plusIII | All (receipt) | If the venue has no receipt printer at all, the **guest bill (pre-check) is printed by the fiscal register itself** — the line width is asked from the device so that the amounts column is not cut off. Daisy, ATOL and Shtrikh-M can do this; Polish Thermal registers do not print free text and refuse honestly. Only the test print and the pre-check go to a fiscal register — kitchen tickets and receipt copies do not. ### Step-by-step connection #### Step 1. Connect the printer to the network - **Ethernet**: cable from the router to the printer - **Wi-Fi**: configure via the printer utility - **USB**: via Cenaly Print Agent (PC application) The printer and the device running Cenaly must be on the **same local network**. #### Step 2. Configure in Cenaly 1. **Settings** → **Fiscalization** → **+ Add printer** 2. Select connection type: - **Network** → enter the printer IP address - **USB** → install [Cenaly Print Agent](https://cenaly.com/downloads/print-agent) → the printer will be detected automatically 3. Select country and tax regime 4. Enter company details (Tax ID, legal entity name, address) 5. **Test receipt** → verify printing 6. **Save** #### Step 3. Configure tax rates | Parameter | Example (Georgia) | Example (Germany) | |----------|-------------------|-------------------| | Standard VAT | 18% | 19% | | Reduced VAT | — | 7% (takeaway food) | | No VAT | Exempt | — | 1. **Settings** → **Fiscalization** → **Taxes** 2. Set rates for your country 3. Assign the rate to categories (food, drinks, alcohol) --- ## 4. Country-specific setup ### 🇬🇪 Georgia — Revenue Service **Requirements:** - Register the cash register on rs.ge - Fiscal module in the printer (Datecs FP-700X recommended) - Tax ID (საიდენტიფიკაციო ნომერი) **Setup:** 1. Register the cash register at [rs.ge](https://www.rs.ge) 2. Obtain the cash register identifier 3. In Cenaly: **Fiscalization** → **Country: Georgia** → enter the cash register ID 4. Each receipt is automatically registered in RS ### 🇹🇷 Turkey — e-Dönüşüm / ÖKC **Requirements:** - Online ÖKC (Yeni Nesil Ödeme Kaydedici Cihaz) - Registration with GİB (Gelir İdaresi Başkanlığı) - VKN (Vergi Kimlik Numarası) **Setup:** 1. Connect an ÖKC printer (Ingenico, Profilo, Beko) 2. In Cenaly: **Fiscalization** → **Country: Turkey** 3. Enter VKN and the ÖKC serial number 4. e-Fatura / e-Arşiv Fatura are generated automatically ### 🇩🇪 Germany — TSE **Requirements (KassenSichV):** - TSE module (Technische Sicherheitseinrichtung) - Certified TSE provider: fiskaly, Swissbit, Epson - Register the cash register with the Finanzamt **Setup:** 1. Purchase a TSE module (recommended: fiskaly Cloud-TSE) 2. In Cenaly: **Fiscalization** → **Country: Germany** → **TSE provider** 3. Enter the TSE ID and API key 4. Each transaction is signed by the TSE 5. The receipt contains a QR code for verification **DSFinV-K export**: Cenaly generates DSFinV-K files for tax audits: **Settings** → **Fiscalization** → **Export DSFinV-K** (for a period). ### 🇦🇹 Austria — Registrierkassenpflicht **Requirements (RKSV):** - Signature certificate (AES or HSM) - Registration on FinanzOnline - QR code on every receipt (for BMF verification) **Setup:** 1. Obtain a signature certificate (A-Trust, PrimeSign) 2. Register the cash register on [FinanzOnline](https://finanzonline.bmf.gv.at) 3. In Cenaly: **Fiscalization** → **Austria** → upload the certificate 4. Each receipt is signed and includes a QR code ### 🇮🇹 Italy — Registratore Telematico **Requirements:** - RT (Registratore Telematico) — certified device - Registration with Agenzia delle Entrate **Setup:** 1. Connect an RT printer (Custom, Epson) 2. In Cenaly: **Fiscalization** → **Italy** → RT serial number 3. Receipts are automatically transmitted to Agenzia delle Entrate ### 🇪🇸 Spain — VeriFactu / TicketBAI **Requirements:** - VeriFactu (nationwide, from 2025) or TicketBAI (Basque Country) - Electronic signature certificate (FNMT) **Setup:** 1. Obtain a certificate at [FNMT](https://www.sede.fnmt.gob.es) 2. In Cenaly: **Fiscalization** → **Spain** → upload the certificate 3. Specify the region (TicketBAI for the Basque Country, Navarre, Álava) 4. Documents are signed and sent to AEAT/Hacienda Foral ### 🇵🇱 Poland — Kasa fiskalna online **Requirements:** - Online fiscal cash register - Registration in Centralnym Repozytorium Kas (CRK) **Setup:** 1. Connect your own fiscal printer that speaks the POSNET Thermal protocol (Posnet, Emar, Innova, Torell, Elzab Mera) to the point-of-sale computer 2. Add it in **Hardware** as a fiscal register — the bridge on that computer drives it 3. Data is transmitted to CRK by the cash register itself The second path — fiscalizing through the **API of somebody else's certified cash register** — is 🛠 in development: the gateway is written, but its backend is not deployed and there is no adapter for a specific certified model yet, so no connection card is shown in the location integrations. --- ## 5. Cloud fiscalization For online orders (delivery, pre-orders) without a physical printer: ### Supported cloud services | Service | Countries | Description | |--------|--------|----------| | **fiskaly** | Germany, Austria | Cloud-TSE, API-based | | **ATOL Online** | Russia, Kazakhstan | Cloud cash register | | **Checkbox** | Ukraine | Cloud RRO | | **Facturify** | Spain | Cloud VeriFactu | ### Cloud cash register setup 1. **Settings** → **Fiscalization** → **Cloud cash register** 2. Select a provider 3. Enter the API key 4. Choose which channels to fiscalize: - ✅ Dine-in (if there is no physical printer) - ✅ Delivery (online orders) - ✅ Takeaway (pickup) --- ## 6. What is printed on the receipt A standard fiscal receipt contains: ``` ╔══════════════════════════════╗ ║ RESTAURANT NAME ║ ║ Address: 1 Example St. ║ ║ Tax ID: 123456789 ║ ╠══════════════════════════════╣ ║ Khinkali (5 pcs) x5 25₾ ║ ║ Adjarian khachapuri x1 18₾ ║ ║ Lemonade x2 8₾ ║ ╠══════════════════════════════╣ ║ TOTAL: 51₾ ║ ║ VAT (18%): 7.76₾ ║ ║ Payment: card ║ ╠══════════════════════════════╣ ║ Receipt #: 00001234 ║ ║ Date: 10.03.2026 14:32 ║ ║ Cashier: Giorgi ║ ║ [QR code for verification] ║ ╚══════════════════════════════╝ ``` ### Configuring receipt content **Settings** → **Fiscalization** → **Receipt template**: - Logo (optional) - Additional header/footer text - Venue Wi-Fi password - QR code to the menu or loyalty program - "Thank you for your visit!" message --- ## 7. Electronic receipts In addition to paper receipts, Cenaly sends electronic ones: - **Email receipt**: to the guest's email (if provided) - **SMS receipt**: a link to the receipt - **QR receipt**: the guest scans a QR code on the screen Benefits: - Saves paper - The guest can always find the receipt - Meets requirements (e-receipt) --- ## 8. Accounting reports ### Z report (end of day) Automatic or on demand: **Fiscalization** → **Z report** Includes: - Number of receipts for the day - Amount by payment type (cash, card, online) - VAT by rate - Refunds - Total revenue ### X report (current) Interim report without closing the shift. ### Data export - **CSV/Excel**: for the accountant - **XML**: for 1C, SAP - **DSFinV-K**: for the German tax authority - **SAF-T**: for international audit - **API**: for automated export to an accounting system --- ## 9. FAQ ### Is fiscalization mandatory? In most EU countries — **yes**. Penalties for operating without fiscalization range from €500 (Georgia) to €25,000 (Germany). ### Can we operate without a physical printer? Not today: the cloud fiscalization gateways for Kazakhstan (Webkassa) and Poland (kasa online over API) are not open for connection yet, so every supported country needs your own device. In Russia a physical cash register is required by law anyway, but it can be driven from the cloud through the **Cash register API** section — the computer with the register stays in one place while receipts are sent to it by your website or 1C. ### What to do if the printer breaks? 1. Cenaly switches to **fallback mode** — receipts are saved 2. After replacing the printer, accumulated receipts are sent automatically 3. Some countries require notifying the tax authority about downtime ### How to connect multiple printers? One printer for the dining area + one for the bar + one for takeaway — each is configured in **Fiscalization** → **+ Add printer** with the zone specified. --- ## 10. Support - **Cenaly:** support@cenaly.com → subject "Fiscalization" - For cash register registration questions, contact your country's tax authority - List of certified printers: cenaly.com/fiscal-printers --- # Analytics and Reports ## Overview The analytics section provides a complete picture of your venue's performance — from dish popularity to staff efficiency. All data is available in real time and can be exported to Excel/CSV. --- ## Dashboard The main analytics page displays key metrics: - **Revenue** — total amount for the period (day/week/month) - **Number of orders** — total count and trend - **Average check** — average order amount - **Popular items** — TOP 10 most ordered - **Menu views** — how many times guests opened the QR menu --- ## Sales Reports ### General report - Revenue by days, weeks, months - Trend charts - Comparison with previous periods - Filtering by categories, items, order channels ### Menu ABC analysis Classification of items by profitability and popularity: | Group | Description | Action | |--------|----------|----------| | **A — Stars** | High profit + high popularity | Promote, keep in a prominent place | | **B — Workhorses** | Average profit, stable demand | Optimize margin | | **C — Outsiders** | Low profit and/or low demand | Update or remove from the menu | ### Profitability report (COGS) - Cost of goods for each item - Margin in % and absolute numbers - Food cost by categories - Optimization recommendations --- ## Staff KPIs ### Waiter metrics - Number of tables served - Average check per waiter - Average service time - Total tips received - Number of upsells (additional sales) ### Kitchen metrics - Average order preparation time - Number of orders processed - Returns and complaints - Hourly workload --- ## Channel Report Comparison of order channel effectiveness: | Channel | Metrics | |-------|---------| | Dine-in | Orders, average check, service time | | Delivery | Orders, average delivery time, zones | | Takeaway | Orders, average check | | WhatsApp | Orders, conversion | | Telegram | Orders, new users | --- ## Menu Analytics ### Item popularity - TOP most viewed items - TOP most ordered - Items that are viewed but not ordered (possibly the price is too high) ### Heatmap - What categories are popular at what time of day - Peak order hours - Seasonal trends ### Menu engineering A dedicated tab in menu statistics lays dishes out on the **Kasavana & Smith matrix** (stars, plowhorses, puzzles, dogs) and gives a recommendation for each: keep it featured, raise the price, move it up the menu, or take it off. The same tab shows margin by channel with aggregator commissions taken into account. Details — [Menu engineering](/en/docs/menu-engineering). --- ## Financial Reports ### P&L (Profit and Loss) - Revenue - Cost of goods sold (COGS) - Gross profit - Operating expenses - Net profit ### Cash Flow - Cash inflows by day - Breakdown by payment methods - Ending balances for the period --- ## Data Export All reports are available for download: - **Excel (.xlsx)** — for analysis in Excel / Google Sheets - **CSV** — for import into accounting systems - **PDF** — for printing and reporting --- ## Accounting Integration Analytics data can be automatically transferred to: - **1C** (Russia) - **iiko** (CIS) - **MoySklad** (Russia) - Other systems via **API** / **Webhooks** --- ## Tips for Working with Analytics 1. **Check the dashboard daily** — spot trends and anomalies 2. **Use ABC analysis** once a month — update the menu based on data 3. **Compare periods** — to see growth or decline 4. **Export to Excel** — for detailed analysis and reporting 5. **Track staff KPIs** — for motivation and training --- ## 8. Inventory Management and Cost of Goods ### Ingredient tracking 1. **Inventory** → **Ingredients** → add all products with purchase price 2. Link ingredients to menu items (recipe cards) 3. The system will automatically calculate the **cost** of each dish ### Recipe card (recipe) For each dish, specify: - List of ingredients with exact weight (grams / ml) - Processing loss percentage (shrinkage, boil-down) - Finished dish yield ### Food cost calculation | Metric | Formula | Benchmark | |-----------|---------|-------| | Food cost % | Cost ÷ Selling price × 100% | 25–35% | | Markup | Selling price ÷ Cost | 2.5–4x | | Margin | (Price - Cost) ÷ Price × 100% | 65–75% | ### Stock control - **Auto write-off**: when an order is closed, ingredients are written off automatically - **Low stock**: push notification when the minimum is reached - **Stocktaking**: reconcile actual stock with system stock - **Discrepancy report**: actual/system deviations to control theft ### Purchasing - The system suggests a purchase list based on the sales forecast - Auto-order from suppliers when minimum stock is reached - Purchase history with prices to track inflation --- ## 9. Demand forecast The forecast lives in Inventory, on the **"Forecast"** tab, and is computed from sales history with no AI at all — from two explainable statistics: the median sales of a dish on this weekday over 8 weeks, and how that demand is spread across dayparts. What comes out of it: - a **prep plan** for the shift — with recipes exploded (including nested semi-finished items) and a "be ready by" hour; - a **supplier order draft** for a chosen coverage horizon; - a **"runs out around 19:00" risk** corrected for today's pace. Details, including the limits, — [Demand forecast](/en/docs/demand-forecast). --- ## 10. Automated Reports ### Mailing setup 1. **Analytics** → **Report schedule** 2. Choose: daily, weekly, monthly 3. Specify recipients (email) 4. Select report sections ### Auto-report contents - Revenue and average check - TOP 10 items - Comparison with the previous period - Stop list for the period - Staff KPIs --- # Menu engineering **Menu engineering** answers a question revenue reports never show: *what to do with a specific dish*. One dish is ordered often but barely feeds the business. Another has an excellent margin but nobody notices it on the menu. A third does neither and simply takes up a line. Open **Admin Panel → Menu → Statistics** (`admin.cenaly.com/menu/statistics`) and switch to the **"Menu engineering"** tab. The method is the classic **Kasavana & Smith matrix** (1982): two dimensions, four quadrants, one recommendation per quadrant. --- ## How the quadrants are calculated Every dish is compared **inside its own menu category**, not against the whole menu: comparing a dessert with a main course is meaningless — they have different prices and different order frequencies. A "Whole menu" toggle lets you look at the cross-category view as well. **Popularity threshold.** If demand were even, each of the N dishes sold in a category would take a `1/N` share. A dish counts as popular if it reaches at least **70 % of that bar** — i.e. its share in units is ≥ `0.7 × (1/N)`. That is the method's canonical factor. **Margin threshold.** A dish's margin here is its **unit contribution margin**: average selling price over the period minus portion cost. The bar is the category's **quantity-weighted** average margin, not a plain arithmetic mean: otherwise one expensive dish sold twice would raise the bar for the whole category. **Portion cost** comes from the dish recipe (components × purchase prices — see [Inventory](/en/docs/inventory)). > **Dishes without a complete portion cost do not get a quadrant.** If there's no recipe, or some ingredients have no purchase price, the dish is flagged "no cost data" and stays out of the matrix. This is deliberate: a "remove from the menu" decision based on an invented margin is far too expensive. Besides the table, the tab draws a **scatter plot**: popularity on one axis, unit margin on the other, both thresholds shown as dashed lines. You see not only which quadrant a dish is in, but how far it is from the border. --- ## The four quadrants | Quadrant | Popularity | Margin | Recommendation | |---|---|---|---| | ⭐ **Stars** | high | high | **Keep it featured** — don't touch quality or portion size, put it at the top of its section and into recommendations | | 🐴 **Plowhorses** | high | low | **Raise the price or cut the cost** — guests love it, so it will absorb a modest price increase; the alternative is reworking the recipe | | ❓ **Puzzles** | low | high | **Move it up the menu** — rename it, add a photo, suggest it in the room and at the till; demand is limited by visibility, not by the dish | | 🗑 **Dogs** | low | low | **Take it off the menu** — nobody orders it and it doesn't feed you, while its ingredients still occupy stock | The "What to do" column is filled in automatically from the quadrant — it is a fixed rule of the method, not an AI suggestion. Rows inside a category are sorted by total margin over the period (what actually feeds you comes first), and categories by revenue. --- ## Margin by channel A dish with an average in-house margin can go negative in an aggregator that takes 30 %. That's why there is a **"Margin by channel"** block under the matrix: | Column | What it is | |---|---| | Channel | own channel, Wolt, Glovo, Yandex Eda and so on | | Gross | channel revenue before the platform's cut | | Commission | the cut: a percentage of revenue plus the allocated share of the per-order fixed fee | | Net | what actually reaches your till | | Margin | net minus the cost of goods sold | Commission rates are set **per location + channel pair** in the location's integrations (see [Finance](/en/docs/finance)). Until they are filled in, commission counts as zero and net equals gross — an optimistic picture. Channel cost is computed **only from dishes with a complete recipe**, while revenue counts all of them; how many of the channel's dishes are left without cost is shown as a separate number. --- ## What the matrix needs to appear 1. **Sales for the period.** The period uses the same selector as the statistics tab: 7 / 30 / 90 days, 12 months, "All time". 2. **Dish recipes** with purchase prices filled in for the ingredients — without them a dish has no cost and therefore no quadrant. 3. **Channel commissions** — only for the "Margin by channel" block; the matrix itself works without them. If not a single dish has a complete cost, the tab says so plainly instead of showing an empty table. The **⇩ CSV** button exports the whole matrix — handy for discussing the menu with your chef in a spreadsheet or attaching it to a price-review record. --- ## Limitations - **Without cost of goods the matrix cannot be built.** You need recipe cards with purchase prices; if not a single item has a full cost, the view says so honestly instead of showing an empty table. - **On a short period the quadrants are unstable.** A couple of sales move a dish from "puzzles" to "stars" and back — look at 30 or 90 days. - **Channel commissions are estimated rates** from your settings, not the marketplaces' actual deductions; the "Margin by channel" block is only as accurate as those rates. - **There is no single metric glossary yet** — revenue in Finance, in Statistics and at the POS may be computed differently, so compare identical periods and identical slices. - **The section is computed on the analytics database of the AWS contour** — on the Russian brand sales statistics falls back to computing from orders. --- ## Troubleshooting **The view is empty.** There are no sales for the period, or not a single item has a full cost of goods. **A dish is missing from the matrix.** It has no recipe card with ingredient prices, so it has no margin — there is nothing to measure. **A quadrant looks implausible.** Check the period: 7 days is too small a sample. And check ingredient prices — a stale purchase price distorts margin more than anything else. **The numbers do not match the Finance section.** Compare the period and the slice: there is no single "truth about the number" between sections yet. --- ## Related sections - [Menu statistics](/en/docs/analytics) — sales per dish, ABC, trend and "frequently bought together" - [Inventory](/en/docs/inventory) — recipes and purchase prices behind the portion cost - [Finance](/en/docs/finance) — channel commissions and net margin for the whole venue - [Demand forecast](/en/docs/demand-forecast) — how many of this dish will sell tomorrow --- ## FAQ ### Why is a dish in no quadrant at all? Either it had no sales in the selected period, or it has no complete portion cost: the recipe is missing, or some ingredients have no purchase price. In both cases the dish stays in the table with a flag but without a quadrant. ### Can I change the 70 % popularity threshold? Not in the interface — the canonical factor of the method is used. What you can change is the grouping: compare dishes inside a category (default) or across the whole menu. ### The matrix says to remove a dish, but we need it on the menu "for the range". What now? The recommendation is a consequence of two numbers, not a verdict. A dish that doesn't feed you but keeps guests coming (a kids' item, a vegetarian alternative, "that one dish" for regulars) can stay on the menu deliberately. The matrix is useful here precisely because it shows the price of that decision. ### Why does the channel margin differ from the matrix margin? The matrix computes margin from the gross selling price; the channel block computes it from revenue **after** the platform's cut. The difference between the two is the price of the channel. --- # Loyalty program and coupons The loyalty engine runs **three programs on one guest ledger**: stamps, points and a regular-guest discount. The ledger is kept per guest and per location, and only the server writes earnings and redemptions into it — a balance cannot be forged from the browser. Switch it on in **Location settings → Loyalty**. While the engine is off, none of the three programs run and no files are created. The guest is identified by **phone number**; for a signed-in guest the ledger may be kept under their account. --- ## Stamps (stamp card) The classic "every sixth coffee is free" card. | Setting | What it defines | |---|---| | Stamps per order | how many stamps one qualifying order gives (usually 1) | | Reward threshold | how many stamps are needed | | Reward type | a **free item** (you pick the dish) or a **percentage discount** | | Minimum order amount | below it no stamp is given (0 — always give one) | | Program name | shown to the guest; translated into your menu languages | Stamps are credited when an order reaches a realised status, and **exactly once per order**: reprocessing does not double the balance. The reward is applied by the cashier as an ordinary discount marked "loyalty"; redemption is idempotent too, and the balance never goes negative. --- ## Points The second program on the same ledger. | Setting | What it defines | |---|---| | Earn percentage | what percent of the paid check comes back as points | | Redemption cap | what share of a check (%) can be covered by points. Not set — **50 %** | | Excluded categories | categories that earn no points (alcohol being the classic) | | Minimum check amount | below it no points are earned | Exclusions are set **by category**: there is no pinpoint list of items in the interface yet (the engine understands such a field, but it cannot be filled in from the settings). **1 point = 1 currency unit**, points are whole numbers. The cap is not accidental: uncapped redemption is a straight hole in revenue. The till shows the cashier exactly the number of points the server will later deduct: the calculation at the till and on the server is one and the same formula. --- ## Regular-guest discount The third and simplest program: if a guest has made at least the configured number of completed orders, the till **suggests** a discount of the configured percentage. It is a suggestion — applying it or not is the cashier's call. The order count comes from the guest directory ([Returning guests](/en/docs/customers)). > The guest directory only lives on AWS brands (`cenaly.com`, `cenaly.com` and others). In the Russian contour (`cenaly.ru`) there is nothing to count a guest's orders with, so the regular-guest suggestion does not appear at the till yet. Stamps and points do not depend on it and work everywhere. --- ## The loyalty panel at the till The till has a "Loyalty" panel (it appears only when the engine is on). Given the guest's phone number it: - shows the **stamp and point balances**; - lets you **apply a stamp reward**; - lets you **redeem points** within the cap; - **suggests the discount** for a regular guest. A redemption turns into an ordinary discount on the ticket — the till's money math is not forked. > **Redeeming points on a cash or pay-the-courier order happens at the till.** At online checkout the guest redeems points themselves, but only when paying online: cash and "pay the courier" go through the till, and so do the points. --- ## What the guest sees - a **checkout teaser** — a loyalty block with the balance and the option to redeem points when paying online; - **progress on the order screen** — how many stamps are collected and how many are left; the screen is public, so no private API is needed. --- ## Coupons and promo codes Coupons are a separate tool, unrelated to the loyalty ledger. | Type | What it does | |---|---| | **Percent** | a percentage discount, with an optional maximum amount | | **Amount** | a fixed discount in currency | | **Free shipping** | zeroes out delivery | | **BOGO** | "buy one, get one" under a configurable rule | Every coupon can carry: a scope (whole cart / specific products / a collection), a minimum order amount, a total usage limit and a per-guest limit, a validity window, whether it stacks with other coupons, and customer conditions (for example, new guests only). Every application is written to a redemption ledger, so the limits are enforced honestly. **Location promo codes** (the "Promo codes" block in the location settings) also have a **validity window** — a "Valid" column with "from" and "to" dates. As soon as the table holds scheduled or expired codes, a filter appears above it — **"Active / Scheduled / Expired / All"** with counters; active ones are shown by default. If every promo code of a location has expired, the storefront does not open the code field to the guest at all. More on commercial tools — [Commerce](/en/docs/commerce). --- ## Limits: what the program does not do An honest list, so you don't plan around things that don't exist: - **points do not expire** — there is no validity period; - **there are no tiers** (bronze/silver/gold) — earning is the same for every member; - **there is no referral program.** There is a separate tool — an **affiliate program** for site owners and bloggers (a commission on referred orders) — but it is not "invite a friend" for guests; - **there is no QR stamping at the table** — a stamp is only given for a paid order. --- ## Related sections - [Returning guests](/en/docs/customers) — the guest directory, history, segments and debts - [POS](/en/docs/pos) — the loyalty panel and applying a reward - [Commerce](/en/docs/commerce) — coupons, gift cards, memberships, affiliate program - [Engagement campaigns](/en/docs/campaigns) — pop-ups, wheel of fortune and coupon reveals on the storefront - [Reviews and reputation](/en/docs/reviews) — collecting reviews and handling negatives - [Email newsletters](/en/docs/newsletter) — letters to guests --- ## FAQ ### Can I enable only stamps or only points? Yes. The programs are enabled independently inside the shared engine: you can run stamps only, points only, or both. ### Why doesn't the guest see their points? Check three things: the loyalty engine is on for this location, the points program is on, and the guest left a phone number with the order. Without a phone number (or a sign-in) there is nothing to attach the balance to. ### Do points accrue on alcohol? Not if you added the alcohol category to the exclusions. By default there are no exclusions. ### Can a guest redeem points when paying cash? Yes, but the cashier does it at the till. At online checkout redemption is available only for online payment. ### Do points expire after 90 days? No. There is no expiry for points right now — they sit on the guest's account until spent. --- # Allergens and nutrients ## Why this is needed In the European Union, the United Kingdom, Saudi Arabia, and many other countries, it is **legally required** to provide guests with information about allergens in dishes. Fines for non-compliance can reach **tens of thousands of euros**. Cenaly makes it easy to label allergens and nutritional values — the information is displayed directly in the digital menu. --- ## 14 main allergens (EU) According to **Regulation (EU) No 1169/2011**, the following allergens must be labeled: | # | Allergen | Icon | Examples | |---|----------|--------|---------| | 1 | **Gluten** | 🌾 | Wheat, rye, barley, oats | | 2 | **Crustaceans** | 🦐 | Shrimp, crabs, lobsters | | 3 | **Eggs** | 🥚 | Chicken eggs and products made from them | | 4 | **Fish** | 🐟 | All types of fish | | 5 | **Peanuts** | 🥜 | Peanuts, peanut butter | | 6 | **Soy** | 🫘 | Soy sauce, tofu, soy milk | | 7 | **Milk** | 🥛 | Milk, cheese, butter, yogurt | | 8 | **Nuts** | 🌰 | Almonds, hazelnuts, cashews, walnuts | | 9 | **Celery** | 🥬 | Stalks, root, seeds | | 10 | **Mustard** | 🟡 | Mustard, mustard oil | | 11 | **Sesame** | ⚪ | Sesame seeds, tahini | | 12 | **Sulfur dioxide** | 🧪 | Sulfites (>10 mg/kg), wine | | 13 | **Lupin** | 🌿 | Lupin flour, seeds | | 14 | **Molluscs** | 🦪 | Mussels, oysters, squid | This is the list of **regulatory requirements**, not the list of what can be flagged on an item today — see the next section. --- ## How to label allergens in Cenaly ### Step 0. Turn the card fields on The dish-flags block and the nutrients block are **off by default** — without this step you won't find them on the item card. There are two equivalent ways to enable them: - in the header of the item card — the **"Visible Fields"** gear, toggles **"Dish Flags"** (allergens, diets, special tags) and **"Nutrients"** (calories, protein, fat, carbs); - in the **App Store** — the cards **"I mark allergens and dietary info on dishes"** and **"I indicate nutritional values for dishes"**. The onboarding wizard pre-selects dish flags for the cafe, restaurant, bakery and canteen concepts, and nutrients for cafe, fast food and canteen. In every other case turn the fields on manually. ### Step 1. Flag the item 1. Open the menu item for editing — the **"Info"** tab. 2. In the **dish flags** block select everything present in the dish. 3. The card saves itself — the icons appear next to the item in the menu. ### What can be flagged on an item The card's flag dictionary is **fixed**, and since September 2026 its "allergens" group holds **all 14 EU allergens** — plus the "Gluten Free" dietary claim: | Flag | Icon | What it covers | |------|------|----------------| | Contains Gluten | ⚠️ | Wheat, rye, barley, oats | | Crustaceans | 🦐 | Shrimp, crab, lobster | | Contains Eggs | 🥚 | Eggs and products made from them | | Fish | 🐟 | All kinds of fish | | Peanuts | 🥜 | Peanuts, peanut butter | | Contains Soy | 🌱 | Soy and soy products | | Contains Dairy | 🥛 | Milk and dairy products | | Contains Nuts | 🌰 | Almonds, hazelnuts, cashews, walnuts | | Celery | 🥬 | Stalks, root, seeds | | Mustard | 🌭 | Mustard, mustard oil | | Sesame | 🌰 | Sesame seeds, tahini | | Sulphur Dioxide | 🧪 | Sulphites (>10 mg/kg), wine | | Lupin | 🌿 | Lupin flour, seeds | | Molluscs | 🐚 | Mussels, oysters, squid | | Gluten Free | 🌾 | A dietary claim, not an allergen | There used to be seven flags: peanuts were not separated from nuts, molluscs from crustaceans, and fish, celery, mustard, sesame, sulphur dioxide and lupin had no flag at all. Items marked with the old set keep working exactly as before: "Contains Nuts" still means nuts, "Crustaceans" still means crustaceans. If a dish contains a non-standard allergen (coriander, say), state it **in the dish description** — the description is visible to the guest on the card and is translated into every menu language. The icon library in the **Labels** section (`/labels`) holds **29** standard labels — all 14 EU allergens plus 15 dietary and special ones — and you can add your own there. But the library defines **icons and translations**, not the choice list on an item: only the flags from the table above can be selected on a dish card. See [Dish labels](/en/docs/labels). > There is no separate bulk screen, but you can flag many dishes at once **by voice** in the "Voice assistant" section: "mark all soups as containing gluten", "set nuts on everything with chicken", "remove the gluten allergen from all drinks". The assistant asks for confirmation and applies the flags to every matching item. The **AI card check** speeds labelling up too: among other things it suggests dish flags (diets and allergens) from the same dictionary, and you accept them in one click. --- ## Display for guests ### In the digital menu - Allergen icons are displayed next to each item - On the dish card the **allergen name in the guest's language** is printed next to the icon — no need to guess from the picture - A **dish-label filter** is available — the guest picks dietary labels (vegetarian, vegan, halal, gluten free…) and sees only matching items; the choice is remembered and survives a page reload - An **"exclude allergen" filter** is available too — the guest ticks what they must avoid and those items disappear from the menu. Its list is built from the allergens actually present in your menu: the codes are derived from the flags set on the dish cards, so nothing has to be filled in separately. "Gluten Free" never enters that list — it is a dietary claim and lives in the dietary-label filter ### Display example ``` 🍝 Pasta Carbonara ₽650 Spaghetti, bacon, parmesan, egg, cream 🌾 🥚 🥛 [Calories: 520 kcal | Protein: 22g | Fat: 28g | Carbs: 45g] ``` --- ## Nutritional value (nutrients) For each item, you can specify: | Parameter | Unit | |----------|---------| | Calories | kcal | | Protein | g | | Fat | g | | Carbohydrates | g | Nutrients are set not only for the dish as a whole, but also **per variant** (portion size, dough type) and **per add-on** — the guest sees the figures for the option they picked. There are no "fiber", "sugar" or "salt" fields on the card. ### Country requirements | Country | Requirement | |--------|-----------| | 🇪🇺 EU | 14 allergens required (Reg. 1169/2011) | | 🇬🇧 UK | 14 allergens + "Natasha's Law" for pre-packed | | 🇸🇦 Saudi Arabia | Allergens + calories required (SFDA) | | 🇺🇸 USA | Top 9 allergens (FALCPA + FASTER Act) | | 🇦🇺 Australia | 11 allergens (FSANZ) | --- ## Additional labels In addition to allergens, you can label items as: | Label | Icon | Description | |-----------|--------|----------| | Contains Gluten | ⚠️ | The only way to flag gluten on a dish | | Vegetarian | 🥬 | No meat | | Vegan | 🌱 | No animal products | | Gluten-free | 🚫🌾 | No gluten | | Halal | ☪️ | Meets halal requirements | | Kosher | ✡️ | Meets kashrut requirements | | Spicy | 🌶 | Spiciness level (1–3) | | Chef's recommendation | ⭐ | Bestseller / recommendation | --- ## Tips 1. **Don't skip allergens** — it's not only caring for guests, but also a legal requirement 2. **Update when the recipe changes** — if the ingredients changed, update the labeling 3. **Train staff** — employees should know the ingredients and be able to inform guests 4. **Use the filter** — show guests that your establishment cares about safety --- # Dish Labels **Labels** are visual badges shown next to a dish in the digital menu: "spicy", "vegan", "new", "chef's recommendation", and so on. Open **Admin Panel → Labels** (`admin.cenaly.com/labels`). > Labels are about the **visual signal** for the guest. If you need legally significant allergen and nutrient labeling (EU Regulation 1169/2011 and similar requirements), see the separate [Allergens & Nutrients](/en/docs/allergens) section. --- ## Standard label library A ready-made set of labels in three categories ships out of the box: | Category | Examples | |---|---| | **Allergen** | peanuts, celery, crustaceans, tree nuts, gluten, milk, lupin, molluscs, mustard, egg, fish, sesame, soybeans, sulphur dioxide | | **Dietary** | organic, vegetarian, vegan, halal, gluten-free, sulfite-free | | **Special** | sold out, chef's suggestion, home cooked, new, chef's specialty, "I love", local product, spicy, fresh frozen | Standard labels are **always shared across all locations** and protected from editing or deletion — this guarantees important badges (like allergens) can never be accidentally lost. --- ## Custom labels Beyond the standard set, you can create your own label: 1. Click "Add label". 2. Set a name (with translations into the languages you need, via a translatable field). 3. Give it an icon — three ways to choose from: - **upload** your own file; - **pick from the account's media library**; - **generate with AI** — the model draws a pictogram in the menu's single "flat" style: **✨** for the first generation, **🔄** to redraw it if you don't like the result. 4. Choose a category — allergen, dietary, or special. Custom labels are fully yours — they can be edited and deleted at any time, unlike standard ones. > A custom label is assigned to a dish just like the built-in ones: open the **"Dish labels"** block on the item card — your own labels are grouped there under **"My labels"**. The guest sees the label in their own language and with your icon. --- ## Scoping a label to locations If you have multiple locations, a custom label can be made **local** instead of shared: pick the locations in the scope selector. A label with no explicit scoping (or an empty location list) stays shared across the whole chain — this is the default, backward-compatible behavior for existing labels. Location scoping is useful, for example, if a "chef's signature dish" label only makes sense for one venue in the chain, not all of them. That label's icon syncs only to the guest-facing site of the scoped locations. --- ## Related sections - [Allergens & Nutrients](/en/docs/allergens) — legally significant allergen and nutrient labeling - [QR Menu](/en/docs/qr-menu) — categories, dishes, photos, where labels are shown to guests - [Multi-location](/en/docs/multi-location) — managing a chain of venues --- ## FAQ ### How do labels differ from allergens and nutrients? Labels are visual badges on the menu for the guest (including for allergens) — their names, translations and icons. There is no separate "Allergens & Nutrients" screen in the panel: allergens and nutrients are fields on the same dish card, and the regulatory side is covered in the [Allergens and nutrients](/en/docs/allergens) article. ### Can I delete a standard label, like "spicy"? No: the name, the category and the label itself are fixed — you can only create your own labels in addition to them. The one thing you can change on a standard label is its **icon**: upload your own (📷) or generate one with AI (✨) and the guest sees exactly that on the menu. Changed your mind — upload another one (there is no button that brings the factory icon back). ### How do I assign a label to a specific dish? The dish editor in the [Menu](/en/docs/qr-menu) section has a **"Dish labels"** block — first turn it on with the **"Visible Fields"** gear in the card header, then tick the labels you need. The picker has three built-in sections (allergens, diets, special tags — 20 values) plus a **"My labels"** section with your own labels from this page. The 29 standard labels stay read-only — they cannot be renamed or deleted, but you can give them your own icon. ### Is a label's name only shown in one language? No, a label's name can be translated into every language you use in your menu — the guest sees the label in their own language. --- # Chain Management — Multi-Location and Franchises ## Overview If you have multiple venues—a restaurant/café chain or a franchise—Cenaly lets you manage them from a single admin panel. --- ## Capabilities ### Centralized management - **Unified menu** for the entire chain with the option for local changes - **Different prices** by regions/locations - **Unified customer database** with a shared loyalty program - **Centralized analytics** — reports for the whole chain and for each venue ### Flexibility - Each location can have **unique items** (local specialties) - **Different currencies** for venues in different countries - **Different languages** — each location selects its own languages - **Different opening hours** — configured per location --- ## Chain structure ``` Company (your brand) ├── Location 1: Restaurant "Name" — Tbilisi │ ├── Menu (inherits the base + its own items) │ ├── Prices (GEL) │ └── Staff ├── Location 2: Restaurant "Name" — Batumi │ ├── Menu (inherits the base + its own items) │ ├── Prices (GEL, seasonal) │ └── Staff └── Location 3: Restaurant "Name" — Istanbul ├── Menu (inherits the base + its own items) ├── Prices (TRY) └── Staff ``` --- ## Managing the chain menu ### Base menu 1. Create a **base menu** at the company level 2. All locations inherit it automatically 3. Changes to the base menu propagate to all locations ### Local changes Each location can: - **Hide** items (temporarily or permanently) - **Change the price** (for its region) - **Add** unique items (local specialties) - **Edit the description** (e.g., different ingredients) ### Synchronization - Changes in the base menu → automatically updated in all locations - Local changes → are not affected when the base menu is updated - Conflicts → local changes take priority --- ## Access management ### Roles | Role | Access | |------|--------| | **Owner** | Full access to all locations and settings | | **Chain administrator** | Menu management, analytics, staff across the entire chain | | **Location manager** | Full access to their location | | **Staff member** | Order taking, working with the menu (no settings) | ### Assigning staff 1. **Settings** → **Team** → **+ Add staff member** 2. Enter email, role, and location 3. The staff member will receive an invitation and access to their part of the system --- ## Chain analytics ### Chain dashboard - Total chain revenue - Revenue by location - Location ranking by metrics - Location-to-location comparison ### Reports - **Revenue by location** — period comparison - **Average check** — per location - **Popular items** — what sells best in each location - **Staff KPIs** — across the whole chain --- ## Franchise ### Franchise-specific features - The franchisor creates the **base menu and standards** - The franchisee gets **access to their location** with limited permissions - The franchisor sees **analytics for the entire chain** and controls quality - Access levels are configured individually ### Whitelabel For large chains, the **whitelabel** feature is available: - Your branding instead of Cenaly - Custom domain (menu.yourband.com) - Custom colors and logo --- ## 7. Staff management ### Creating staff accounts 1. **Settings** → **Staff** → **+ Add staff member** 2. Specify: name, email, role, locations 3. The staff member will receive an email invitation ### Role and permission breakdown | Permission | Owner | Administrator | Manager | Staff member | |-------|----------|---------------|----------|-----------| | Account management | ✅ | ❌ | ❌ | ❌ | | Create locations | ✅ | ✅ | ❌ | ❌ | | Edit menu | ✅ | ✅ | ✅ | ❌ | | Order management | ✅ | ✅ | ✅ | ✅ | | View analytics | ✅ | ✅ | ✅ | ❌ | | Financial reports | ✅ | ✅ | ❌ | ❌ | | Staff management | ✅ | ✅ | ❌ | ❌ | | Configure integrations | ✅ | ✅ | ❌ | ❌ | | Stop list | ✅ | ✅ | ✅ | ✅ | | Refunds | ✅ | ✅ | ✅ | ❌ | ### Staff KPIs Track for each staff member: - Number of orders served - Average check - Service speed (from order to close) - Tips (amount and % of revenue) - Guest rating --- ## 8. Custom domain and branding ### Connecting a domain 1. **Settings** → **Domain** → enter your domain (menu.yourrestaurant.com) 2. Add a CNAME record in DNS: `menu.yourrestaurant.com → cname.cenaly.com` 3. The SSL certificate is issued automatically (Let's Encrypt) 4. The domain will be active in 5–15 minutes ### Branding - **Logo**: displayed in the menu header - **Colors**: primary color, accent color, background - **Favicon**: browser tab icon - **Welcome text**: on the menu home page - **QR code style**: colors, shape, logo --- ## 9. Offline mode and PWA The digital menu works as a **Progressive Web App (PWA)**: - A guest can **add the menu to the phone's home screen** - The menu is **cached** — works even with poor internet - With no connection at all, the last loaded version is shown - Auto-update when the connection is restored ### For staff - The admin panel caches critical data - Orders are saved locally and synced when the connection is restored - KDS continues to show active orders offline --- # Print Menu — the PDF builder ## What is it? **Print Menu** is a builder in the admin panel that turns your digital menu into a print-ready document: with the style, languages, background and layout you choose. The result is visible right away in a paginated preview, and the output is **a printout or a PDF file** (plus a PNG of a single page if you need an image for social media). The paper menu is always built from **current** data: change a price or remove an item and the next printout already reflects it — nothing has to be laid out again. ### Features - 🎨 **10 ready-made styles** — background, fonts and layout in one click - 📋 **Menu or price list** — two layout modes - 🌍 **33 languages** — in any order, on separate lines or with a separator - 🖼 **Backgrounds** — presets, your own file or AI generation - 📐 **8 paper formats** and both orientations - 🔳 **QR block** — a link to the digital menu right on the sheet - 📄 **PDF export**, printing, "Share" and a PNG of a page --- ## How to open it Three equivalent entry points — the builder is the same: 1. **Marketing → 🖼️ Print** (`/print`) — the print hub: printing the menu for the location you need and materials for individual dishes. 2. **Menu** — the print button above the item list. If a custom menu filter is on (a bar list, for example) or a **collection** is selected, that exact menu is printed. 3. **Locations** — the 🖨 button next to a location or inside its settings. The builder opens **full screen** (the address looks like `/print-menu?location=&menu=`, and `…&collection=` for a collection — you can bookmark the link or send it to a colleague). Settings open in a **side panel on the right** (on a phone — as a bottom sheet), while the preview stays visible and keeps updating live. > All settings are saved automatically **separately for every location and every custom menu > or collection** — next time the builder opens exactly as you left it. --- ## 1. Styles — a quick start The **"Styles"** button opens 10 ready-made designs with mini previews: **Classic, Bistro, Café, Elegant, Minimal, Provence, Steakhouse, Marine, Oriental, Kids**. One click sets the background, fonts, colors, number of columns and dotted leaders. A style **does not touch** the selected languages, the paper format, your own blocks or the category selection — so you can try styles at any moment without losing anything. The **"Reset design"** button returns the styling to its defaults (languages, paper size and category selection are kept). --- ## 2. Layout: mode, density, columns In the **"Layout"** panel: | Setting | Values | What it is for | |---------|--------|----------------| | **Mode** | Menu · Price list | "Price list" is a compact layout without descriptions and photos — items and prices only | | **Density** | Compact · Normal · Spacious | How much air there is between items — this changes the page count | | **Columns** | 1 · 2 · 3 | Multi-column layout for large menus | | **Dotted price leaders** | on/off | A dotted line from the name to the price — the classic restaurant look | | **Each category on a new page** | on/off | Every section starts on a clean sheet | | **Page numbers** | on/off | Numbering at the bottom of the page | --- ## 3. What to print The **"What to print"** panel has a checkbox per category (with "All" / "None" buttons). That is how you build, say, a bar list or a dessert card out of the full menu. If nothing is selected, the preview shows a placeholder and export is disabled. The same panel has the price options: - **Hide prices** — a menu without prices (for a window display, a presentation or an insert); - **Show currency** — print the currency symbol next to the number. Dish images are configured separately: show/hide, size, position (left/right). Archived and paused items are never printed — and neither are the internal catalog item types (preps, ingredients, materials, packaging): only what is sold to the guest goes on the sheet. --- ## 4. Languages Pick one or several languages — their **order** defines the order of translations in the printed menu (rearranged with the arrows). The list holds all **45 languages** of the account: the main ones are shown first, and the "Show all languages" button opens the full list with search. > **Eight languages cannot be printed yet:** Arabic, Persian, Urdu, Chinese, Japanese, Korean, > Hindi and Bengali. They are shown in the list but cannot be selected — the button is disabled > with a hint. The reason is technical: the Arabic script needs contextual shaping, while CJK and > Devanagari need 4–16 MB fonts that do not fit into a PDF. Latin, Cyrillic, Greek, Georgian, > Armenian, Hebrew and Thai do print — **37 languages out of 45**. The **"new line"** option (separately for headers and for dishes) prints every translation on its own line instead of `Khachapuri / Хачапури / ხაჭაპური`. --- ## 5. Background ### Ready-made backgrounds White, Cream, Light Gray, Warm Beige, Parchment, Dark, Dark Green, Navy. ### Your own background **"Upload background"** — any image (JPEG, PNG, WebP). The file is stored on the server and loaded next time. For good print quality use an image of at least 1024×1792 px. ### 🤖 AI background generation Describe the background you want and press **"Generate"** — AI draws a background image for the sheet. The prompt is refined automatically so that the background stays a background: no text, no plates or dishes, and enough room for readable text. **Prompt examples:** - `An elegant minimalist background with a delicate floral pattern in pastel tones` - `A dark background with golden art-deco ornaments` - `A vintage kraft paper texture with a light grain effect` - `A marble texture in white and gray tones` The **"Brightness"** and **"Opacity"** sliders mute the background so the text stays readable. > **Exception — the Russian contour.** On brands running in the Russian cloud (`cenaly.ru`) AI > background generation is not deployed yet, so the "AI background" button is simply not shown > there. Preset backgrounds, your own file and the account background gallery all work. The AI > design suggestion and AI description shortening work as usual on these brands. --- ## 6. Text styles Styling is configured separately for four groups: **category headers**, **dish names**, **descriptions** and **prices**. | Parameter | Description | |-----------|-------------| | **Text color** | Color picker | | **Text background** | Highlights the line with a color (removed with the × button) | | **Font** | 13 typefaces in four groups: basic (Noto Sans, Noto Serif, Noto Sans Mono), serif (Playfair Display, Cormorant Garamond, Lora, Merriweather), sans (Montserrat, Open Sans, Oswald), display (Comfortaa, Caveat, Bebas Neue) | | **Size** | −/+ buttons | | **B / I / U** | Bold, italic, underline | | **New line** | Every translation on its own line | | **Hide** | Descriptions can be left out entirely | This is how the visual hierarchy is built: large headers, medium names, small descriptions and prominent prices. --- ## 7. Page settings - **Paper format:** A4 (210×297), A5 (148×210), A3 (297×420), Letter (216×279), Half Letter (140×216), DL slim (99×210), Square 148×148, Square 210×210. - **Orientation:** portrait / landscape (the toggle next to the format). - **Margins:** top, right, bottom, left — in millimeters (20/15/20/15 by default, 5 mm steps, an exact value can be typed in). The preview shows the sheet in real proportions and paginates the menu itself; the ← / → controls move between pages and show the current page number. --- ## 8. Header and footer The **"Header & Footer"** panel adds the service lines that paper menus usually need: - a **header** (under the venue name) and a **footer** (at the bottom of every page); - fields: **address**, **phone**, **Wi-Fi** (network/password), **social networks**. --- ## 9. Custom elements and the QR code - **Text block** — any caption you like (a slogan, "chef's choice", the terms of a promotion). It is dragged with the mouse and edited right on the sheet. - **Image** — a logo, an ornament, a frame: upload a file, paste from the clipboard or generate with AI. Position and size are set by dragging. - **QR code** — a block with a link and a caption (for example, "Scan for the full menu"). By default it points to your location's digital menu; size and position are set by dragging. In the PDF the QR code comes out in print quality. --- ## 10. Printing and export | Button | What it does | |--------|--------------| | **Print** | Builds the document and opens it in a new tab with the print dialog — send it to a printer or choose "Save as PDF" | | **Save PDF** | Downloads the ready file `{Location}-{Custom menu}-{YYYY-MM-DD}.pdf` — the date shows which print is the fresh one | | **Share** | On a phone — the system share sheet with the PDF (messenger, mail, cloud); if the system does not support it, the file is simply downloaded | | **PNG** | Saves the **current preview page** as an image — for stories, posts and messengers | Document details: - the page is printed in the chosen format and orientation, 1:1 with the preview; - the background fills the whole sheet and starts anew on every page; - fonts, colors, dish images, the QR code and your own blocks are kept exactly as in the preview. > 💡 If a print shop asks for a "vector" file, send the PDF from the "Save PDF" button: > it is a ready-to-print document in the required format. --- ## Related sections - [Dish Flyer Designer](/en/docs/dish-flyer) — a promo leaflet, table tent or sticker for **a single item** (also with printing, PDF and PNG) - [QR codes and devices](/en/docs/device-codes) — printing sheets and posters with table QR codes - [Getting started](/en/docs/getting-started) — how to start working with the menu --- ## FAQ ### Can I print only a part of the menu instead of all of it? Yes — the "What to print" panel lets you pick the categories you need. And if you have custom menus (a bar list, a business lunch), open printing from the "Menu" section with the filter on — exactly that menu is printed, and its settings are stored separately. ### Can I use different backgrounds for different pages? No, one background applies to all pages of the document. ### Do dish and category photos get printed? Yes, if dish images and the "Category photos" option are enabled. In "Price list" mode images and descriptions are hidden so that more items fit on a page. ### Are hidden/archived dishes printed? No, only active categories and items are printed. ### How do I print a menu without prices? Turn on the "Hide prices" option — the layout and everything else stays as it is. ### Can an AI background be edited after it is generated? The generated background is stored on the server; generate a new one and it replaces the previous one. Brightness and opacity can be adjusted with the sliders at any time. ### Are print settings shared across all locations? No. The design is remembered separately for every location and every custom menu. --- # Table QR Codes and Device Codes The **Codes** section (`admin.cenaly.com`) brings together everything about QR codes and device pairing. It's split into tabs by the purpose of the codes. --- ## Guest codes (tables) A guest code is a QR the guest scans at the table; it leads to a short address like `c.cenaly.com/CODE` and opens the menu. For each code you set: - a **name** (e.g. "Table 5") and a **location**; - a **service fee** — fixed or percentage; - the **menu languages** available through this code; - a **menu override** — this code can show a special set of dishes (a dedicated "per-table menu"); - a **delivery/pickup override** — its own delivery terms (base fee, free from a threshold, minimum order, radius, ETA). Each code shows its status (active/disabled), how many times it was used and when it was last used. A code can be added manually or by **scanning an existing one**. --- ## Printing: sheets and posters QR codes can be printed conveniently: - as **sheets** — several codes per page; - as **posters and table tents** — the generator supports various paper sizes (A4, A3 and up to A0, plus Letter), portrait and landscape orientation, footer captions and styling. That way you can quickly prepare QR codes for all tables or a large sign with a single code. --- ## Device codes On the **"Devices"** tab you create one-time **pairing codes** — to "attach" a tablet or monitor to your venue: a menu tablet, an **order monitor**, a **kitchen display (KDS)** and so on. The flow is simple: create a code, open the login link with that code on the device — and the device connects to the right location without entering a username and password. --- ## Related sections - [QR Menu](/en/docs/qr-menu) — what the guest sees after scanning a code - [Website builder](/en/docs/website-builder) — styling the menu page - [Floor plan](/en/docs/tables) — binding tables - [Kitchen (KDS)](/en/docs/kds) — the kitchen display paired with a code - [Digital signage](/en/docs/signage) — a TV screen with promos --- ## FAQ ### Why is a guest code better than one shared link? A code can set a service fee, its own delivery terms and even a special set of dishes for a particular table or area — more flexible than a single link for the whole venue. ### Can I print all the codes at once? Yes, sheet mode places several codes per page; for a single code there are posters and table tents in various sizes. ### How do I connect a tablet or monitor? Create a code on the "Devices" tab and open the login link with that code on the device — pairing happens automatically. --- # Website Traffic and Sales Summary The **Statistics** section is a quick look at who visits your web menu and how, plus a compact summary of sales and kitchen. Traffic data comes from Google Analytics and is refreshed by a background job on the server (no "live" API calls), so the section opens instantly. Open: **Admin Panel → Statistics** (`admin.cenaly.com`). Data is shown for the selected location or all at once. > For deep sales reports, ABC analysis and margins, use [Analytics](/en/docs/analytics), and for the financial picture, [Finance](/en/docs/finance). Here you get a compact overview and, most importantly, **website traffic**, which those sections don't have. > **Available on AWS brands** (`cenaly.com`, `cenaly.com` and others), **not on `cenaly.ru`.** The platform's analytical database these figures come from is not deployed in the Russian contour, so the **"Kitchen"** and **"Risky operations"** tabs are always empty there — they have no fallback calculation. The other tabs ("Traffic", "Orders", "Pour", "Store search") work on every brand. The section can be tailored to you: the **⚙️ gear in the header** hides tabs and "Traffic" blocks you don't need, sets the default tab and period (7 / 30 / 90 days or 12 months) and the kitchen lateness threshold (5 to 120 minutes). There are ready-made presets too — "simple", for instance, leaves only the "Orders" tab. A hidden tab disappears from the section header; you cannot switch all of them off at once. --- ## "Traffic" tab Google Analytics data on visits to the web menu: - **KPIs**: sessions, active users, page views, average session duration — compared with the previous period over 7 and over 28 days (these two windows are fixed; the period switcher at the top applies to the other tabs); - **daily trend** (sessions); - **channels** and **devices**; - **traffic sources**, **countries**, **cities**, **languages**; - a **sessions heatmap** by hour and weekday — handy for planning promos and content; - **top pages**; - a **conversion funnel**: menu opened → dish viewed → added to cart → checkout started → order placed; - **top dishes by views** (from view and add-to-cart events). --- ## "Orders" tab A compact sales summary from the same data as the Finance section: - **revenue**, **order count**, **average check**; - a **revenue trend**; - **top dishes by revenue** and **by quantity**. This is a "quick slice" — for detailed reports go to [Analytics](/en/docs/analytics) and [Finance](/en/docs/finance). --- ## "Kitchen" tab Kitchen speed metrics: - average **accept**, **cook** and **full-ticket** time, **% late** (with a configurable threshold); - a trend and heatmap of times by hour/weekday; - the **slowest dishes** and **wasted prep** (items cancelled after cooking had already started). Kitchen data appears automatically as soon as staff start accepting, cooking and serving tickets on the [KDS](/en/docs/kds) or in orders — no setup required. It is collected by the platform's analytical database, though, and that is only deployed on AWS brands: in the Russian contour (`cenaly.ru`) the tab stays empty no matter how many tickets pass through. --- ## "Risky operations" tab A feed of risky actions at the POS, attributed to a cashier: voiding an item already sent to the kitchen, cancelling an order, editing a bill after the pre-check was printed, refunds, manual discounts and price overrides, opening the cash drawer without a sale, **reprinting a receipt already handed to the guest** (the classic way to swap a guest's receipt) and a **cash discrepancy at shift close**. The full table with explanations is in [Loss control](/en/docs/loss-control). What you see: - the **number of events** and the **amount at risk** for the period — discounts, refunds, voided items and totals of cancelled orders; - breakdowns **by cashier** and **by operation type**; - the feed itself with time, amount, details and who approved the operation. This is a conversation tool rather than a punishment tool: an outlier among cashiers is visible immediately. Events arrive from the POS within a couple of minutes — see also [PIN roles and approvals](/en/docs/pos). On top of this feed run the **loss-control rules**: void series, discount spree, cash discrepancy, consumption above norm, purchase price spike and a log mismatch. They turn the feed into a short "what to look at" list, feed the "Cash risks" block in **Work chat → Needs a decision → the [“Under control”](/en/docs/attention) tab**, and optionally e-mail the owner. Rule thresholds open from the **⚙️ gear in the section header**, the "Alert thresholds" item: it switches to the "Risky operations" tab and expands the collapsed thresholds block for you (the item is visible to the owner and the manager). Details — [Loss control](/en/docs/loss-control). --- ## "Store search" tab What shoppers look for on your storefront, in their own words: - top queries for the period; - **zero-result queries** (a dedicated filter) — a direct list of what your catalog is missing or what is named differently from the way people search; - how many product cards were opened and added to the cart after a query — counted within a search session (5 minutes after the query); - **CSV** export. The report is aggregated: no visitor identifiers are stored. If too many distinct queries pile up over a month, the rarest ones are left out — and the report says so. --- ## "Pouring" tab A preview of draft-beverage control for bars: a “tap → product → serving size” mapping and a comparison of poured versus sold. The framework is in place, but the **“poured” figures are demo data for now** — real volume will arrive once tap flow meters are connected through [Cenaly Hardware Bridge](/en/docs/hardware-bridge). “Sold” is real data from orders. A "poured ≠ sold" gap is the same loss topic as the "Risky operations" tab: see [Loss control](/en/docs/loss-control). --- ## Related sections - [Analytics](/en/docs/analytics) — detailed reports, ABC analysis, margins - [Loss control](/en/docs/loss-control) — rules, thresholds and the digest for risky operations - [Finance](/en/docs/finance) — revenue, channels, food cost, staff - [Kitchen (KDS)](/en/docs/kds) — the source of kitchen timings - [Advertising & Marketing](/en/docs/integration-advertising) — connecting analytics --- ## FAQ ### Why isn't the data "real-time"? Traffic is collected by a background job from Google Analytics, so the section opens fast and doesn't depend on API limits. Refresh takes up to a day after GA is connected. ### The section is empty — what should I do? Data appears once the GA collection job runs (usually within 24 hours of connecting) or once the location has processed its first orders and tickets. ### How is this different from "Analytics"? "Statistics" gives website traffic and a compact overview; "Analytics" gives detailed sales reports, ABC analysis and margins. --- # Subscription The **Subscription** section is about money and your plan: which plan you're on, what it includes, how to top up your balance, generate an invoice and add extra packages. Open: **Admin Panel → Subscription** (`admin.cenaly.com`). --- ## Plans A plan has exactly five numeric limits: - number of **locations**; - number of **menu items**; - number of **devices** (tablets, registers and screens paired by code); - number of **orders per month**; - number of **auto-translation languages**. Everything else that differs between plans is capabilities rather than limits: access to AI features (dish photo generation), for instance, opens up on plans above free. The starter plan is **free** — enough to get a QR menu up. Paid plans lift the limits and unlock advanced capabilities. Billing can be **monthly** or **yearly** — yearly billing comes with a **20% discount**. A full comparison of plans and prices is on the [pricing](/en/pricing) page. > Plan limits are **soft**: they stop you from adding beyond the plan (a fourth location on a three-location plan, say), but they never switch off what already exists. And guest orders are never blocked — the order limit only shows a warning. A new plan takes effect as soon as it is paid — in every section, including tabs that are already open, with no need to reload the page. --- ## Balance and payment - **Balance** is shown by currency; the **"Top Up"** button increases it. - **"Generate Invoice"** — issue an invoice for payment (handy for companies and bank transfers). - Choosing a plan and period (monthly/yearly) is done right on the page; several payment providers are supported. --- ## Dedicated PBX charges If you have a [dedicated PBX](/en/docs/telephony), the page shows a **"Dedicated PBX: daily charges"** card — a log of the last month for all locations: - the **total over 31 days** and how much of it has already been **deducted from the balance**; - a row per day: the date (for a partial day — how many hours the server worked), the **location** (if you have several servers), the amount and the status — "charged", "to be charged", "free" (free access), "calculated, not charged" and so on; - the first 7 rows are shown at once, the rest via **"Show all"**; the **"Server settings"** link leads to the server card. The server is charged **per day**: a full day of work costs the package price, a partial day (creation, shutdown, size change) — in proportion to the time worked; days follow UTC and appear in the log once they are over. If the log says "charges are currently only calculated", the amounts are computed but nothing is deducted from the balance yet. The same days for one location are also shown in the server card (Telephony → Server, the collapsed "Daily charges" block). Only the account owner sees this card. ## Storage for call recordings If recordings of conversations are kept in the [Calls](/en/docs/calls) section, the page shows a **"Storage used"** card: how much space the recordings take, how many files there are and how many of them sit in cold storage. Space is billed, and what frees it is the **retention periods** — you can change them right here: - the **"Change recording retention"** button opens a window over the page with "Auto-delete audio" and "Auto-delete transcripts" (a tick and a period in days). These are the same settings as in "Calls" → "Settings" → "Privacy and retention": a period changed in one place shows in the other; - a period is saved when you leave the field — "Saved" appears under the fields (or "Could not save" with a "Retry" button); - the periods apply on their own, and "Storage used" goes down once expired audio is deleted. Deleting at once ("Apply policy now"), digit masking and the ban on external AI models are in the Calls section: the **"All privacy and retention settings"** link in the window leads there; - the **"Recount"** button checks the card's figure against what is actually in storage. Only the account owner sees the card and the window; while there are no recordings, the card is not shown. ## Add-ons Beyond the plan, separate packages are available. For example, the **"Own site"** add-on — a subscription that lets you serve a location's menu on **your own domain** (monthly or yearly billing, separate payment methods). After activation you connect your domain in the location settings — see [Custom Domain](/en/docs/custom-domain) for a step-by-step guide. --- ## Related sections - [Multi-location](/en/docs/multi-location) — how many locations your plan allows - [Website builder](/en/docs/website-builder) — where a custom domain is connected - [Custom Domain](/en/docs/custom-domain) — step-by-step domain connection guide - [App Store](/en/docs/app-store) — paid extensions on top of your plan - [Calls](/en/docs/calls) — call recordings: what takes up space and where else retention is set --- ## FAQ ### What's included in the free plan? A basic set to launch a QR menu, with limits on the number of locations, menu items, devices, orders per month and auto-translation languages. Exact limits are shown on the pricing page. ### What's the benefit of yearly billing? Yearly billing gives a 20% discount compared with twelve monthly payments. ### How do I connect my own domain? Via the "Own site" add-on: activate it in the Subscription section, then set the domain in the location settings. For the full instructions, including examples for popular DNS providers, see [Custom Domain](/en/docs/custom-domain). ### Can I pay by invoice? Yes, the "Generate Invoice" button issues an invoice for payment. --- # Data export Your venue's data belongs to you, and you can take it yourself — no support ticket required. An export is useful for accounting and analysis, as a backup before large changes, as an answer to a GDPR request, or simply to keep a copy. Where: **Settings → the “Data export” tab** (`admin.cenaly.com`). --- ## How to export 1. Tick the sections you want included. 2. Set the order period. 3. Press **“Prepare export”**. 4. Wait for it to finish — the status goes “Queued” → “Collecting data” → “Ready” — and download the ZIP. You can close the page: the archive is assembled on the server and appears in the list of past exports. --- ## What goes into the archive | Section | What is inside | |---|---| | **Settings, locations and site pages** | Venue profiles, storefront settings, pages and articles | | **Catalog** | Products and dishes as CSV plus the source records | | **Orders and customers** | Orders for the chosen period and the related contacts | | **Raw order files** | Complete source data for every order (heavy — include it only if you really need it) | | **Reviews** | Guest ratings and texts | There is also a **“Download catalog CSV”** button — a quick product export straight in the browser, without preparing the full archive. --- ## Limits and retention - By default the export covers the last **24 months** and no more than **20,000 orders**. - **Photos are not packed into the archive** — the files keep links to the images. - A finished archive is kept for **7 days** and then deleted automatically; after that the history link no longer works, so simply build the export again. --- ## What is never included Staff PIN codes, integration keys and tokens, passwords. That is deliberate: archives are often forwarded to an accountant or a contractor, and secrets inside them are an unnecessary risk. --- ## Related topics - [Switch to us](/en/docs/migrate) — the opposite task: importing data from another system - [Finance](/en/docs/finance) — reports without exporting - [Online store](/en/docs/shop) — catalog import and export - [Subscription](/en/docs/subscription) — invoices and payments --- ## FAQ **Can I export a single location?** The archive is built per account; inside, the data is organised by location. **Is this a good way to back up before an import?** Yes, that is a sound scenario: export the catalog and settings before a bulk import. **Will the format open in Excel?** The catalog and orders are exported as CSV among other formats, which opens in Excel and Google Sheets. --- # Guest Reviews and Reputation The **Reviews** section helps collect feedback from guests and manage your restaurant's reputation. Ratings come directly from the QR menu — without phone calls or paper questionnaires. The core principle: **low ratings stay private** for internal review, while satisfied guests are invited to leave a public review on Google or another platform. Open: **Admin Panel → Reviews** (`admin.cenaly.com`). Inside, there are four tabs: **"Internal Reviews"** (private guest feedback), **"Google"** (reviews from Google Business), **"Platforms"** (which review sites you have and what to do with them), and **"External Reviews"** (a unified monitoring feed across all platforms). --- ## How a guest leaves a rating A guest can leave a rating at several touchpoints: - **At checkout** — immediately after placing an order in the QR menu, a prompt to rate the visit appears. - **In a completed order** — when the order status changes to "Completed" or "Delivered", the guest sees a "Rate" button in their order. - **Via a direct link** — you can place a link like `?review=1` on a table, at the POS, or in a messenger; the guest will open the rating form directly. The rating form is a panel with stars (1–5★) and a text field. Entering text is optional. --- ## One rule for all three forms: private text, public platforms at any rating We ask for a rating in three places — the storefront form after an order, a popup campaign with a "Rating" field, and the feedback page linked from the autopilot's review-request email. **Buttons for public platforms are shown at ANY rating in all three** — for a five and for a one alike (owner's decision, 12 Sep 2026). | Rating | What the guest sees | What happens on your side | |--------|---------------------|---------------------------| | 1–3★ (low) | A "What can we improve?" field and a different thank-you line — "thanks, we'll look into it". The same platform buttons are below it. | A private review in the "Reviews" section and a row in the "Needs attention" queue. | | 4–5★ (high) | A thank-you line and the platform buttons — **"Leave a review on Google"**, Yandex and the others you enabled in the "Platforms" tab. | A review in the "Reviews" section, marked with a "prompted to a platform" badge. | **Why the buttons are shown for low ratings too.** Showing the public path only to happy guests is review gating: the review platforms' own policies forbid it (Google, Yandex, TripAdvisor), and in the US the FTC rule on review suppression covers it explicitly. The honest rule costs you nothing: **the text the guest typed into the form stays private** — it goes to you only, never becomes a public review and is published nowhere. The public review is written on the platform, by the guest's own choice, while a low rating still raises a "Needs attention" card so someone can talk to the guest. There is no public review board on your QR menu page — all ratings are stored only with you. --- ## Where exactly the guest rates - **the storefront form** — after an order on your QR-menu page (the "Rate your visit" button on the "order placed" screen and on the order tracking page; switched off in the reputation settings); - **a popup campaign** with a "Rating" field on your own website or on the storefront (the "Show review platforms" toggle in the campaign editor); - **the feedback page** from the autopilot's review-request email: the guest rates, optionally writes to you privately — and sees the same platform buttons right there. One link from the email — one answer: opening it a second time shows "we already have your answer", and no second card appears on your side. The link lives for 30 days, after which the page says so honestly. --- ## Managing Reviews in the Admin Panel On the **"Direct Reviews"** tab, you can see everything guests have submitted through the QR menu. ### KPI Cards At the top of the page are summary metrics for the selected location: - **Average rating** — the arithmetic mean of all reviews. - **Total reviews** — the overall count. - **Unresolved low** — reviews with 1–3 stars that are not yet marked as "Resolved"; highlighted in red if any remain open. - **Distribution** — a mini-histogram for each star rating (5★ → 1★). ### Reviews List Each review in the list displays: - rating (stars) and status (see below); - source — checkout, order, or QR link; - text left by the guest (if any); - guest's name and phone number (if available from the order); - a link to the linked order — can be opened directly from the card. ### Statuses and Workflow Each review goes through three statuses: 1. **New** — just received, not yet reviewed. 2. **Viewed** — you have seen it, but the issue has not been resolved yet. 3. **Resolved** — the issue is closed (or the review requires no action). Switch statuses using buttons directly on the card; a closed review can be reopened if the issue reoccurs. The filter at the top of the list has four options — **All**, **New**, **Viewed**, **Resolved**. A dedicated KPI card at the top of the section shows how many low-rating reviews remain unresolved. ### Internal Note Under each review, there is a field for an **owner note** — for yourself or colleagues (the guest cannot see it). It is convenient for logging what was done: "spoke with the chef", "offered a discount on next visit". --- ## "Google" Tab The **"Google"** tab displays reviews from your Google Business Profile — both those left directly on Google by guests and those submitted via the QR menu button. Tab features: - View all Google reviews with ratings and dates. - **Reply to reviews** directly from the admin panel — without switching to Google Business Profile. Sent replies are displayed right under the review. - Average Google rating — displayed above the list. To use this tab, you need to connect your Google Business account — this is done in **App Store → By Locations → Google Business**. If the account is not connected or a Google location is not selected, the tab will notify you and guide you on what to do next. --- ## "Platforms" Tab Google is not the only place where people write about you. The **"Platforms"** tab contains a directory of review sites tailored specifically for you: the list is automatically filtered by location country and business type (a hotel will be offered Booking, a restaurant — Restoclub and similar). For each platform: - **Profile link** — paste your page URL; the system will warn you if the link does not look right. - **Capabilities badge** — shows what we support for this platform: full integration via API, automatic review collection, or link only. - **Two independent toggles:** - "Show to guests" — whether the platform is included in the funnel and the order of the buttons; - "Track reviews" — enables monitoring: new reviews from the platform will appear in the "External reviews" feed. ### Find reviews online The platform directory is "where people CAN write about you." The **"Find reviews online"** button answers a different question — where people are already writing about you: the system searches for mentions of your venue by name and address and returns a list of found pages. Each candidate can be assigned to the profile of a matching platform, added to "Custom sources", or hidden so it is no longer suggested. ### Custom sources If reviews are on a website that is not in the directory, add its URL to **"Custom sources"** — it will be monitored just like platforms from the directory. The system first tries to read the page itself; when a website only serves a "shell" rendered in the browser, the page is captured by the **browser extension** on your computer (the same one that gathers pages into the knowledge base). The feed will then transparently display "queued for your PC" — and if the extension has not connected for a long time, you will see it rather than guess why there are no reviews. The same method is used to retrieve reviews from Yandex Maps, 2GIS, Flamp, Zoon, and Tripadvisor. --- ## "External Reviews" Tab A unified feed of everything written about you on external platforms—no need to manually check five different websites every morning. Reviews are collected automatically on a schedule; the **"Refresh Now"** button runs an immediate check. - **Filters**—by platform, "Negative only", "Unanswered". The latter two serve as your daily to-do list. - **Owner response.** Where technically supported by the platform, responses are sent directly from the admin panel. Where not supported (Yandex, 2GIS, Facebook)—we state it clearly and provide a "Copy text and open platform" button. - **AI draft response.** The generate button inserts a ready-made text into the input field—and stops there. Sending externally happens only upon your click: strictly no autoposting, whether for 5★ or any other reviews. --- ## Reputation Settings Settings are accessed via the **gear icon ⚙ in the section header** — it switches to the "Direct Reviews" tab and expands the **"Reputation Settings"** block: - **Ask guests for a rating** — toggle. If disabled, the rating form does not appear at checkout and on completed orders. Useful during maintenance or if you want to temporarily suspend review collection. - **Link to Google profile** — insert a direct link like `https://search.google.com/local/writereview?placeid=…`. This exact link opens for guests who tap the Google button, at any rating. If the link is left blank, the Google button is not displayed. - **Link to Yandex** — the same for Yandex Maps/Business. If a custom link is not specified, it will be automatically populated from the Yandex Business address of your location. After making changes, click **"Save"**. Settings apply to the selected location. ### Automated Review Request Most direct reviews do not arrive on their own — they are brought in by the **"Review Request"** autopilot campaign: the system automatically asks the guest to rate their visit a set number of hours after a completed order (the delay is configurable, 1–168 hours). It is located in the **"Sales & Promo" → "Coupons" tab → "Marketing Autopilot" block**; the second target of the gear icon in the "Reviews" section leads directly there. For more details, see [Campaigns & Autopilot](/en/docs/campaigns). --- ## Related Sections - [Orders](/en/docs/orders) — order statuses to which reviews are linked - [Regular Guests](/en/docs/loyalty) — history of guests and their activity - [QR Menu](/en/docs/qr-menu) — checkout from which the rating form is launched - [Integrations](/en/docs/integrations) — connecting Google Business Profile - [Advertising and Marketing](/en/docs/integration-advertising) — managing external channels --- ## Frequently Asked Questions ### Can guests see each other's reviews? No. There is no public review board — all ratings are private and accessible only to the owner and managers. Any guest is offered a public review on Google or another enabled platform — but writing one is their personal choice. ### What happens if a guest leaves only stars and no text? The rating is still saved and factored into the KPIs. Text is optional — sometimes clicking the stars is enough for the guest. ### How do I get a Google profile link for the settings? Log in to [Google Business Profile](https://business.google.com), open your location, and click **"Get review link"** (or "Share review form"). Copy the short link and paste it into the "Google Profile Link" field in the "Reviews" section settings. ### Can I manage reviews across multiple locations? Yes. If you have multiple locations, select the desired one from the drop-down list at the top of the page — KPIs, the review list, and settings will load for the selected location. ### Where does a review go if a guest rates via the ?review=1 link instead of an order? The review is saved in the exact same way as via checkout: with the source "QR link", without a linked order. The smart filter works identically for all sources. --- # Customers — Guest Directory, Segments, and Debts The **Customers** section is the venue's guest CRM: who visits you, how often, how much they spend, what they like, and who owes what to whom. The database compiles automatically from orders — guests do not need to fill out anything or register. To open: **Admin Panel → Customers** (`admin.cenaly.com`). Inside, there are five tabs: **Directory**, **Callbacks**, **Debts**, **Segments**, **Groups and Access**. > **Where this works.** The guest directory, guest profile with LTV and history, segments, and the regular guest badge are powered by a separate guest identity database, available only on AWS brands (`cenaly.com`, `cenaly.com`, and others). In the Russian environment (`cenaly.ru`), these tabs are currently empty, and manually adding a contact is not available. The **"Callbacks"**, **"Debts"**, and **"Groups and Access"** tabs do not depend on this database and work across all brands. --- ## Phone Directory The main tab is a list of all venue guests. For each guest, you can see: - phone number and name; - number of orders; - **lifetime value (LTV)** — total revenue generated by the guest; - date of the last order. **Search works instantly**, without waiting for the server: the guest database is loaded into the browser once and filtered locally from then on. You can search by name and by any digits of the phone number — including the last digits ("...45-67"), starting from three digits. If you navigated here from a call card in the "Calls" section, the number is already pre-filled in the search. You can **add a contact manually** — phone number in international format and name. Such entries are marked with a "manually added" badge so they stand out among guests generated from orders. --- ## Guest Profile and Activity Feed Clicking a row opens the guest profile — a slide-out panel on the right. It contains: - **header with aggregated metrics** and one-tap contact buttons: 📞 "Call", **WhatsApp**, **Telegram**, and ✉️ "Send email" (the latter appears only if the guest's email is known); - **recent orders** and statistics: completed, cancelled, LTV, date of the last order; - **debt ledger balance** with a link to the "Debts" tab; - **loyalty progress** — how many stamps have been collected for the selected location; - **CRM fields:** tags, allergies, preferences, date of birth, notes, visit and no-show counters. Filled in manually and stored per location — if there are multiple locations, a switcher is available at the top of the profile; - **activity feed** — the complete history of interactions with the guest in a single timeline: orders, reservations (including cancellations and no-shows), reviews, chat correspondence (with navigation to the **"Work Chat" → "Guests" section**), debt entries and repayments, loyalty stamp accruals and redemptions. If any source is temporarily unavailable, the feed clearly marks it and displays the rest. --- ## Callbacks A dedicated tab for requests from the “Call me back” widget on your website or storefront. For each request, you can see the phone number, name, location, preference (“now / at a convenient time”), and notification status indicating whether an alert was sent to staff. The “Call” button dials the number immediately. The widget itself is enabled and configured via the **gear icon ⚙️ in the section header** — the “Callback widget” option. Right there, as the second option, you will find “Loyalty program”: settings for stamps and points, with progress visible in the guest profile. --- ## Debts ("Debt Ledger") A digital replacement for a neighborhood store's paper ledger. Keep a record log by customer phone number: **lent** — **repaid**. The balance is calculated on the fly, debtors move to the top of the list, and the overall total debt across all customers is displayed at the top. You can expand a row to view the transaction history for that customer; any entry can be deleted (with confirmation). **Debt directly from the POS.** In the payment window on the [POS](/en/docs/pos), there is a "🤝 On Credit" payment method: the cashier finds the guest by phone number or name (or adds a new one on the spot), and the entire remaining bill balance goes into this same ledger — nothing needs to be transferred manually. Right here, on the "Debts" tab, you can set the **POS debt limit** for the location: if exceeded, the tender is blocked, and it can only be overridden by an authorized employee or a manager using a PIN. Debt repayments can also be accepted at the POS — in cash or by card, including partial payments. --- ## Segments and Newsletters A segment is a saved filter for the guest database that is recalculated every time you open the page: each segment displays a live member count. > Do not confuse these with segments in the **"Audience"** tab of the Store Studio (see [Newsletters](/en/docs/newsletter)): that tab filters the subscriber base and tagged guests, whereas here it filters the order history of guests at this location. Both can be used as an email audience. **One-click presets:** VIP, regulars, newcomers, "dormant". The **builder** creates a custom segment using thresholds and attributes: - minimum number of completed orders; - minimum and maximum LTV amount; - last order within / older than N days; - first order within N days; - cancellation rate of total orders; - "has phone", "has email", "has allergies"; - filter by CRM tag — select from tags you have already assigned to guests. The segment breakdown opens in a table (name, phone, email, orders, total spent, last order; sorted by LTV) and **can be exported to CSV**. An **email campaign** can be launched directly from a segment: the system creates a snapshot of member addresses, you select a location (each has its own subscriber base) — and you are taken to the standard newsletter composer with the audience pre-populated. Marketing consent is cross-referenced automatically: the email will only be sent to those who are subscribed. --- ## Customer Groups & Access A tab for stores and B2B showcases where a casual visitor should not see prices or place an order before approval. - **Registration moderation** — "approval required" toggle and selection of what exactly is restricted until approved: checkout only, prices, or the entire catalog. The message for pending users is also configured here. - **Application field builder** — what information to request upon registration: single-line text, multi-line text, phone, email; each field can be made required. - **Customer groups directory** — group name, "default group" flag, "requires approval" flag. - **Application inbox** — filter by status (pending / approved / rejected), application card, "approve" and "reject" buttons (with a reason for rejection), and assigning a group to the member. The moderation block features a **sparkle ✨** — the AI assistant will explain the current configuration and suggest what to adjust. Only the settings themselves and application counters are sent to the prompt, without any customer names or phone numbers. --- ## Regular Guest Badge in the Order Monitor Guest recognition works not only in the "Customers" section. In the header of the order card in the monitor, a **👤** icon with a number is displayed — the number of **past completed orders** made by this guest across the entire establishment (all locations). - If there are no past orders, the badge is not displayed at all. - If the guest has visited before, you see the actual number of their visits, for example **👤 7**. - The current open order is **not included** in the counter — only past ones. - If the guest is identified only by device (without a phone number and without logging into an account), the badge is gray and labeled "identified by device" — this is a less reliable match. The badge tooltip displays the guest's name and their lifetime total. No action is required from the staff. --- ## Guest Order History Click on the **👤** badge — a window with this guest's order history will open. At the top is a summary: name, number of completed orders, lifetime spend. Below is a list of orders, most recent first, with each showing: - order number; - date and time; - location, if the venue operates across multiple locations; - order type and status; - amount. Any order from the history **opens with a click** — right on the same screen. If there are many orders, the most recent ones are shown — this is clearly noted below the list. This allows you to quickly understand guest preferences, suggest favorite dishes, or clarify details of a previous visit without manual searching. --- ## How the System Recognizes a Guest Cenaly automatically links multiple guest visits into a single profile, even if the guest hasn't registered. Several identifier types are used for this: | Identifier | Description | |--------------|----------| | **Device** | When opening the QR menu, the guest's browser receives an anonymous identifier. A return visit from the same device is recognized automatically. | | **Account** | If the guest logged in (Google, email), their orders are linked regardless of the device. | | **Phone** | If the guest provided a phone number when placing an order, it becomes an additional linking point. | | **Email** | The address from the order also works as a linking point between visits. | All sources are merged into a single guest profile on the server. If the same person ordered from a smartphone, then registered, and later called — the system will show a unified counter of their visits. No setup is required for this — recognition works automatically. --- ## How to Use in the Dining Area The regular guest badge and guest profile help dining area staff in several scenarios: - **Priority service** — a regular guest with a high visit count deserves special attention: greeting them by name, offering their favorite dish. - **Personalized offers** — the waiter sees the history and can unobtrusively suggest items the guest has previously ordered and enjoys. - **Allergies and preferences at hand** — details recorded in the profile are not lost when waiter shifts change. - **Experience tracking** — if a regular guest leaves a low rating or cancels an order, the manager will notice it faster. - **Loyalty evaluation** — LTV and visit counters across all locations provide an overall picture of how active the guest is across your chain. --- ## Related Sections - [Orders](/en/docs/orders) — order monitor where the badge is displayed - [Loyalty Program](/en/docs/loyalty) — bonus programs and promo codes for regular guests - [Reviews](/en/docs/reviews) — feedback from guests after an order - [POS](/en/docs/pos) — order taking by dining area staff - [Analytics](/en/docs/analytics) — guest retention statistics --- ## Frequently Asked Questions ### Does a guest need to register for the system to recognize them? No. Repeat visits from the same device are recognized automatically — without registration or data entry. If the guest registers later or provides a phone number, all their previous orders will be merged into a single profile. ### Does the counter track orders for a single location or across all of them? Across all locations of the venue. If your guest has visited two different spots in your chain, the counter sums both. ### Can I view a guest's history without opening their current order? Yes — via the "Customers" section: find the guest in the directory by name or phone number and open their profile card. From the order monitor, the history opens by clicking the badge inside the order card. ### What if a guest uses multiple different devices and has not logged into an account? If the devices have no common connection points (account, phone number, or email), they will be counted as separate guests. The most reliable way to link visits is when the guest signs in via Google or provides their phone number at least once. ### Does the badge affect order monitor performance? No. Guest data is loaded in the background and does not slow down the monitor. ### Can anyone see the guest's mailing subscriptions in their profile card? Not yet — there is currently no dedicated consent block in the guest card. When sending mailings to a segment, consents are checked automatically on the server side: messages will only be sent to subscribed guests. --- # Chat with Guests — a Unified Inbox for Every Channel **Guest chat** is where an operator handles guest conversations: the chat widget on your storefront plus any connected external channels (messengers, email) all land in one inbox. There is no separate "Chat" item in the sidebar any more: since late August 2026 the guest inbox lives **inside the Work chat** — as its **"Guests"** section. Open **Admin Panel → Work chat → Guests** (`admin.cenaly.com/team-chat`). The old `/chat` address still works and simply redirects there, so bookmarks and links in old emails keep working. The "Needs attention" feed moved the same way — it is now the **"Needs a decision"** section of the same Work chat. The section has five tabs: **Inbox**, **Leads**, **Contacts**, **Analytics** and **Settings** (the last one is the gear at the end of the row). --- ## Chat widget on the storefront On the guest-facing menu (and on connected BYOD/custom domains via an embeddable script) guests see a floating round chat button. Clicking it opens a conversation: - a greeting message (can be set per guest language); - an optional pre-chat form — name, phone, email; - working hours: outside them, guests see an automatic "we're offline" reply; - quick-action buttons and attachments (photo/file); - an unread-message badge on the button itself. The button and window appearance (color, left/right position, icon) is configured on the **Settings** tab. Changes are **saved automatically** — there is no separate "Save" button. The chat can also be placed on **your own website**, even if you have no storefront with us: one line of code from the [My Website](/en/docs/site-widgets) section. The same place enables the [Help](/en/docs/help-center) tab next to the chat, so guests can find an answer without waiting for an agent. --- ## Unified inbox The **"Inbox"** tab is a thread list with filters and a conversation panel: - **Statuses**: Open, Bot-led, Resolved; - filters by channel, label, priority, "unread only", "mine", mentions, text search; - the conversation panel has an operator reply box, internal notes (not visible to the guest), canned responses (`/shortcut`), quick actions, AI assistance (draft a reply, translate, suggest labels), and guest satisfaction (CSAT) ratings; - a contact card on the side shows name, phone, email, and this person's history across all channels. --- ## Leads tab Everything a visitor left, in one stream: campaign pop-ups and forms, website forms and messages, callback requests, table bookings and service appointments. For an operator these are all the same event — "someone left their contact details" — so they are not scattered across separate screens. It is the very same panel as the **"Leads"** item in the sidebar, just within reach of the chat operator; the location comes from the selector in the tab row. The panel is read-only: leads can be filtered by period, "unprocessed only" and a search over name, phone, email and text, and the list can be exported to CSV. --- ## Connected channels Every channel reads and writes into the same inbox — the guest never notices they're being helped by the same operator through a different channel: | Channel | What's needed to connect it | |---|---| | **Website widget** | nothing — works by default for the location | | **WhatsApp** | the venue's number via the WhatsApp Cloud API | | **Telegram** | the venue's own bot (created via @BotFather) | | **Email** | a location email address with inbound mail configured | | **Facebook Messenger** | the venue's Facebook page | | **Instagram Direct** | an Instagram account linked to that same Facebook page | | **API** | a channel token for external integrations (n8n, Zapier, your own scripts) | Connect each channel under **Settings → Channels**. The same guest writing from, say, WhatsApp and from the website is merged into one contact card. > The email channel is currently available only on the platform's AWS infrastructure (not on Yandex Cloud). --- ## AI bot and knowledge base access The bot has three modes (**Settings → AI assistant**): | Mode | Behavior | |---|---| | **Off** | the bot doesn't participate; every message is handled by an operator | | **Draft** | the bot prepares a suggested reply; an operator reviews and sends it (or edits it) | | **Auto-reply** | the bot replies to the guest on its own, until the conversation is handed to a human | You can set the bot's name, tone and free-form instructions ("persona"), a schedule (always, or only outside working hours) and a daily reply cap. An operator can take over a conversation from the bot, or hand it to the bot, at any time. If your account has a [Knowledge Base](/en/docs/knowledge-base) section, the bot can be allowed to search it for answers — across all documents or only the ones flagged as available to the bot. Without knowledge-base access, the bot only answers using general instructions and menu/reservation data. --- ## Routing, automation, SLA Teams with several operators get additional settings: - **Routing** — rules for distributing new conversations by channel/language/first-message text, round-robin or least-busy auto-assignment, and a cap on simultaneous conversations per operator; - **Automation** — "on this event, do this action" rules (change priority, assign an operator, add a label); - **SLA** — first-response and resolution time thresholds, with escalation (raise priority, assign, add labels) on a breach; - **Live translation** — guest and operator messages are translated on the fly when they write in different languages. --- ## History and notifications The full conversation history for each thread is stored and available from the conversation panel and from the contact card — you can see what was discussed with this guest before, including in other channels. The inbox shows unread-message counts per conversation and per filter tab, and a "typing…" indicator appears while the guest is composing a message. Updates arrive in real time, without reloading the page. --- ## Related sections - [Knowledge Base](/en/docs/knowledge-base) — documents the AI bot can draw answers from - [Returning Guests](/en/docs/customers) — a guest's order history alongside chat - [App Store](/en/docs/app-store) — account modules and extensions --- ## FAQ ### Does a guest need to sign up to use the chat? No, the widget works anonymously. The pre-chat form (name/phone/email) is optional and can be turned on or off in settings. ### Can the AI handle a conversation entirely on its own? Yes, "Auto-reply" mode has the bot answer the guest without an operator, until a human takes over the thread. A middle ground is "Draft" mode, where the AI only prepares a reply and an operator sends it. ### Do all channels feed into one conversation with the guest? Yes, if it's the same person — the system merges conversations from different channels (website, WhatsApp, Telegram, email, social) into a single contact card. ### Can an external system connect to the chat directly? Yes, there's a dedicated API channel with a token — suited for integrations via n8n, Zapier, or the venue's own scripts. --- # On-Site Engagement Campaigns **Engagement campaigns** are popups, offers, and coupon reveals on your storefront that appear to a guest based on a rule you set — on exit intent, after N seconds on a page, when an item is added to the cart, and so on. The section lives in **Admin Panel → Website → "Configure site" → "Proactive messages"** (`admin.cenaly.com`) and works on any vertical — restaurant menu, shop, hotel, salon — except kiosk mode. A campaign only appears on the storefront once you've created and enabled it — the section ships with nothing turned on by default. --- ## Campaign types and display formats Each campaign is one of six actions: | Type | What it does | |---|---| | **Announcement** | Plain text with a title — an announcement, reminder, or informational message | | **Offer** | Text + a button linking to a promo page, category, or specific item | | **Email capture** | An email field + a consent checkbox → a subscriber added to the newsletter list | | **Coupon reveal** | A real coupon code from the location + a "Copy" button; a countdown timer if the coupon has an expiry | | **Open AI chat** | Opens the location's AI assistant chat with a preset first message | | **Open staff chat** | Opens the guest chat with a staff member with a preset first message | Display is one of three formats: a **modal window** (screen center), a **slide-in panel** (side/bottom), or a **thin bar** at the bottom of the screen that doesn't cover the content. --- ## AI campaign draft by text or voice The campaign editor has a panel where you can **describe in words** — typed or spoken via the browser microphone — what the campaign should do: "offer a discount to people leaving a product page above $50" or "remind everyone who came from ads about free shipping over $100." The model produces a draft — copy in the location's languages, a button, a trigger type, and audience conditions — using the **location's real data**: existing coupons, catalog categories, enabled languages and currency, not invented values. The draft opens in the editor for review — it is **not saved automatically**; you review it, adjust if needed, and save it, exactly as with a campaign built by hand. --- ## Triggers, audience, schedule, show limits **When to show it** — one of these triggers: - **time on page** — after a set number of seconds since the page loaded; - **exit intent** — the cursor leaves the window on desktop; idle time on mobile; - **scroll depth** — after scrolling a set percentage of the page; - **idle time** — the guest hasn't moved the cursor or scrolled for a set time; - **cart change** — with a condition on cart total or item count; - **pages per session** — starting from the Nth page viewed in a visit. **Who to show it to** — you can restrict by: new vs. returning guests, device type (mobile/desktop), interface language, traffic source (utm), specific site pages (by path mask), and the content of the open page — a catalog section, item tags, or the price of the open product. **When it's active** — an optional schedule: a date range, days of week, business hours. **How many times to show it** — a show limit and period (e.g., no more than once every 7 days), stopping after the guest takes the target action, plus an overall cap on popups per visit and per day — so different campaigns don't bury one guest under a stack of windows. Campaigns stay out of checkout's way: modal and slide-in formats don't show over an open checkout by default. --- ## Ready-made shop campaigns Separate from the campaign builder, retail storefronts get ready-made widgets in the site appearance settings — they work as soon as you turn them on, with no trigger configuration needed: - **Lucky wheel** — the guest enters an email, spins the wheel, and gets a code for one of the location's coupons; enabled in the storefront appearance settings; - **Free-shipping progress bar** — shown in the cart, tells the guest how much more they need to spend to reach the free-shipping threshold; it appears on its own once a threshold is set in delivery settings; - **Back-in-stock subscription** — a form on an out-of-stock product page: the guest leaves a contact, and an email is sent automatically once the item is back on the storefront; - **Callback request form** — a "Request a call" widget on the site: the request lands in the owner's inbox by email, and the request list is on the **Customers** page, **"Callback requests"** tab. These widgets and the campaign builder run side by side on the same page without conflicting — only one popup shows at a time. --- ## What you can see about results Every campaign view, click, dismiss, and conversion is sent as an event to the location's Google Analytics (if a GA4 property is connected — see [Analytics](/en/docs/analytics)). There isn't yet a built-in campaign report inside the admin panel itself — how many times a campaign was shown, how many clicks, how many signups or offer click-throughs — those numbers currently live only in GA4. --- ## Related sections - [Website builder](/en/docs/website-builder) — where the "Configure site" section lives - [Customers](/en/docs/customers) — callback requests and newsletter subscribers - [Analytics](/en/docs/analytics) — where campaign events are sent --- ## FAQ ### The campaign shows in the editor but isn't visible on the site — why? Check that the campaign is **enabled**, not just saved as a draft, and that a few seconds have passed since the page loaded — popups are intentionally silent for the first moments of a visit so they don't interrupt the guest. ### Can I limit a campaign to one product category? Yes — audience conditions let you target specific catalog sections, item tags, or a price range of the open product; the campaign only fires on a matching page. ### Can the AI invent a coupon that doesn't exist? No, the model only inserts coupons, languages, and categories that actually exist at the location — a draft referencing a nonexistent coupon code is rejected before it reaches you. ### Do campaigns get in the way of checkout? No, by default modal windows and slide-in panels don't show over an open checkout; the bottom bar doesn't block the interface and can stay visible. --- # Meal Subscription Plans A **meal plan** isn't a one-off order — it's a subscription: the guest pays for a period (a week or a month) and gets ready-made lunches delivered on a schedule, without re-ordering every single day. It fits canteens, dark kitchens, corporate office lunch delivery, and fitness meal programs — anywhere a guest eats on a recurring schedule rather than occasionally. The section is **food-service only**: it is available to locations whose business type is restaurant, cafe, bar, fast food or canteen (decision of 11 September 2026). A salon, shop, hotel or pickup point never sees the "Meal subscriptions" card in the App Store — daily-lunch subscriptions do not apply to those businesses. Open: **Admin Panel → Meal subscriptions** (`admin.cenaly.com/meal-plans`) — that is how both the sidebar entry and the page heading are labeled. > The section works on the international contour. On the Russian one (`cenaly.ru`) meal subscriptions are not supported yet: neither the menu entry nor the App Store card is shown there. --- ## What a meal plan is A plan is a template the venue configures: - **name, description and variant** — a free-text tag like "standard," "veg," "light" for different flavor lines on the same schedule; - **dishes or combos** for the day and their quantities; - **delivery weekdays** (e.g. weekdays only); - **subscription length** — one week or several (a month ≈ 4 weeks); - **price for the whole period** — usually cheaper than the sum of one-off orders for the same days; - **delivery window** (e.g. "12:00–13:00"); - **active/inactive** — inactive plans aren't shown to guests. --- ## Admin section The **"Meal subscriptions"** page has a location picker and two sections: **Plans** — a list with create/edit: the form collects name, description, variant, currency and period price, duration in weeks, delivery weekdays (day toggles), dishes with quantities, and the delivery window. The **"⚙️ Generate orders now"** button manually triggers today's order generation and shows a **"Generated: N"** summary — handy for testing without waiting for the automatic cron. **Subscriptions** — a table of the location's active subscriptions: customer, plan, period (start/end dates), status (active/paused/cancelled/completed), payment (unpaid/paid), and the number of orders delivered so far; from the table you can mark a period as paid ("Mark paid"), undo that ("Mark unpaid"), or cancel a subscription. The section shows up in the admin menu only when meal plans are enabled as a location capability. The toggle itself is only offered to food-service accounts (see above). --- ## Storefront and subscribing If the location has active plans, the menu page (in food/canteen mode) shows a **"Meal subscription"** block above the dish list: plan cards with the period price and delivery days, and a **"Subscribe"** button. The guest picks a plan, enters name, phone and a delivery address, and confirms — the subscription is created right away. Online billing for the period isn't automated yet: after subscribing, the guest sees an **"Awaiting payment"** status — the period is paid on the spot or as arranged with the venue, and staff mark it paid in the admin panel. --- ## The subscriber's calendar If a guest has already subscribed on this device (the browser remembers it), on their next visit to the menu page they see their subscription and a calendar of upcoming deliveries. For any given day there's a **"Skip"** button — that day's delivery isn't generated, without cancelling the whole subscription. --- ## Daily order generation Every day, at a set time, an automatic process runs through all of a location's active subscriptions and, for each one that has a delivery scheduled today (and the day isn't skipped or the subscription isn't paused), creates a regular delivery order tagged with the "meal plan" source. From there the order flows through the same pipeline as any other: [the kitchen (KDS)](/en/docs/kds), the order monitor, the [own-delivery](/en/docs/delivery) screen — there's no separate queue for subscription orders. Re-running generation for a day that's already been processed doesn't create a second delivery — generation is idempotent. The dishes and price locked into a subscription at signup don't change even if the plan template is edited later in the admin panel — every active subscription carries its own snapshot of the terms. --- ## Paying for a period Right now, subscription payment is manual: the venue collects money for the period on the spot (cash/card) or however's convenient, and marks the subscription as paid in the subscriptions table. Automatic billing for the next renewal period isn't wired up. --- ## What you need to get started - **A food-service business type** (restaurant, cafe, bar, fast food, canteen): other verticals have no card in the App Store. - **The "Meal plans" toggle switched on** in the [App Store](/en/docs/app-store) — the section is niche and off by default. - **Menu items the lunches are assembled from** — the plan is built from your catalog. - **A pickup or delivery schedule** — the days and times orders are generated for. - **A way to pay for a period** — payment is marked manually by an administrator. --- ## Limitations - **Food service only.** Salons, shops, online stores, hotels and pickup points are not offered the section at all: their App Store card is hidden (decision of 11 Sept 2026). - **On the Russian brand (`cenaly.ru`) meal-plan subscriptions are not supported** — neither the section nor the App Store card is available there. - **There is no automatic charge per period.** Recurring billing was deliberately not built: an administrator marks the period as paid. - **The section is off by default** and is enabled with a toggle. - **This is a subscription, not a one-off pre-order** — for one-off timed orders there are pre-order slots in the regular checkout. --- ## Troubleshooting **There is no "Meal plans" item in the menu.** The section is not switched on — enable it in the App Store. **There is no "Meal subscriptions" card in the App Store.** Check the location business type: the card is shown to food-service businesses only (restaurant, cafe, bar, fast food, canteen) and only on the international brand. **Orders for the day were not generated.** Check the subscription schedule and skipped days in the subscriber's calendar: a skipped day creates no order. **A guest paid but the period is marked unpaid.** Payment is marked manually by an administrator — there is no automatic charge per period. **The section is missing on the Russian brand.** That is correct — the contour is not supported yet. --- ## Related sections - [Orders](/en/docs/orders) — where scheduled orders land - [Kitchen (KDS)](/en/docs/kds) — handling subscription orders alongside regular ones - [Own Delivery](/en/docs/delivery) — the courier screen that delivers subscription meals --- ## FAQ ### What if a guest forgets to skip a day and isn't home? The order for that day is generated on schedule regardless — skip a delivery ahead of time in the subscriber calendar, or contact the venue directly. ### Does editing the plan template affect subscriptions already signed up? No — each subscription keeps its own set of dishes, price and days, fixed at signup; template edits in "Plans" only apply to new subscriptions. ### Is the subscription billed automatically each period? Not yet — payment is manual: the venue collects money for the period and marks the subscription paid in the admin panel. --- # Menu schedule, happy hour, and stop list '86' Three tools that manage **dish availability over time**: 1. **Schedule** — a dish or custom menu is available only on specified days and hours (for example, breakfasts until 12:00 on weekdays, bar menu after 22:00). 2. **Happy hour** — during a specified time window, a dish has a different (usually reduced) price. 3. **Stop list '86'** — instantly remove a menu item from sale when the product runs out, and bring it back just as quickly. All three rules are calculated in real time in the **location's time zone** — the guest and cashier always see the up-to-date picture. --- ## Availability Schedule ### How to Set a Schedule for a Dish 1. Open **Menu** in the admin panel. 2. Find the desired dish in the list — next to the active toggle, there is a **clock** icon. - Gray clock — no schedule set (always available). - Green — currently within schedule. - Red — currently outside schedule (dish is hidden/unavailable). - Amber — no schedule, but a happy hour rule is set for the dish. 3. Click the clock — the "**Schedule and Pricing**" editor will open. 4. Enable the **"Limit availability by schedule"** checkbox. 5. Set the days of the week and time windows (format `HH:MM–HH:MM`). You can add multiple windows for a single day (for example, lunch 12:00–15:00 and dinner 18:00–23:00). 6. For periods crossing midnight (bar menu 22:00–03:00), mark the window as "overnight" — the system will correctly handle the midnight crossover. 7. Click **"Save"** — changes are published to the customer menu. > A dish schedule takes priority over category and custom menu schedules. If a dish does not have its own schedule, it inherits the union of schedules from its category and all custom menus it belongs to. --- ## Category, custom menu, and collection schedule You can set a schedule not just for a single dish, but for an **entire group of menu items**: - **a category** — for example, "Breakfast" or "Bar"; - **a custom menu** — "Business Lunch", "Sunday Brunch"; - **a product collection** in a store (retail) — for example, "Night Deals". In this case, all items in this group automatically become unavailable outside the specified hours. The clock icon next to the name of a category, custom menu, or collection works the same as the dish clock icon: one click opens the same schedule and happy hour rules editor. --- ## Happy hour (time pricing) Happy hour is a rule that **automatically changes the price** of a dish during a specific time window. Multiple rules can be combined; if several rules are active at the same time, the lowest price wins (the best offer for the guest). ### Setup 1. Open the "Schedule and Prices" editor for the dish or custom menu (clock button). 2. In the **"Happy hour (time pricing)"** section, click **"+ Add rule"**. 3. Set: - **Name** (e.g., "Happy hour") — displayed as a label for the discount. - **When active** — time window by days of the week (the same schedule editor). - **Discount type**: "Percentage discount" or "Fixed price". 4. Save. You can add multiple rules (different hours, different discounts). On the customer menu during the happy hour period, the regular price is shown crossed out, with the discounted price next to it. In the POS, the price on the tile updates automatically. --- ## "86" Stop List The **"86"** button is a quick way to remove a menu item from sale without deleting or archiving the dish. It is used when an ingredient is suddenly out of stock. ### How to put a dish on the stop list Next to each dish in the **Menu** section, there is an **"86"** button: - If the dish is **not on the stop list** — the button is faint and outlined. - If the dish is **on the stop list** — the button is red and solid. Click "86" — a menu will appear: | Option | What it does | |---|---| | **Stop now** | The dish is unavailable indefinitely until manually removed from the stop list | | **Until end of day** | Auto-restores at 23:59 | | **Until tomorrow** | Auto-restores at 06:00 the next day | ### How to remove from the stop list Click the red "86" button — the stop status is removed immediately without confirmation. > Auto-restore works on the client in real time: as soon as the specified time arrives, the dish becomes available again without republishing. ### "86" directly from the POS You do not have to return to the "Menu" section: on the POS, you can **press and hold a dish tile** (or right-click it) — the same window will open with three stop options, or "Remove from stop list" for an already 86'd dish. This permission is available to employees with dining area administrator privileges: a regular waiter cannot put a tile on the stop list. --- ## How guests see unavailable items On the customer menu, a dish unavailable right now (out of schedule or on the stop list): - Appears **dimmed** (reduced opacity). - The "add to cart" button is disabled. - A time hint appears below the price: 🕒 **09:00–12:00** — when the dish will be available for purchase again. - A dish removed via "86" is marked with a red **STOP** badge (in the store — with a "Sold Out" label), and tapping it opens an explanation with a 🚫 icon. Guests see the full assortment — understanding what the venue offers, but cannot order an item outside its time window. --- ## How the POS reacts to schedules and happy hour - Tiles for dishes that are unavailable by schedule or marked as "86" are **dimmed**: a regular waiter cannot add them to a bill. For an employee with dining area manager permissions, the tile remains clickable — otherwise they would not be able to remove the stop status with a long press. - If a happy hour is active for a dish, the tile displays the reduced price (the regular price is crossed out). - Long pressing a tile places a dish on the stop list or removes it — for employees with dining area manager permissions. - The POS calculates time in the location's time zone just like the customer menu — there are no discrepancies. --- ## What you need to get started - **The location's time zone.** All three rules are evaluated in the venue's zone — if the zone is not set, the windows will not behave the way you expect. - **Items, categories or custom menus** the rule applies to. - **A second price** — for happy hour. - **Cashier access to the 86 list** — an item is taken off right at the shift workspace with the "86 list" button. ## Limitations - **The 86 list applies to the whole item.** You cannot take a dish off "at one location only" from the shift window — that scenario lives on a separate path and is not surfaced here. - **Automatic return from the 86 list does not reach aggregators.** The deadline passes, the item comes back for you, and nobody wakes the marketplace. - **There are no live aggregators yet.** Sending 86 to Wolt, Glovo, Yandex Eda and Deliveroo is written and verified on mocks; production connections have not been made. - **A happy-hour price always beats the base price** inside its window — "discount for dine-in only" is not a separate axis. - **The storefront is served through a CDN.** A schedule change does not reach the guest instantly. ## Troubleshooting **The dish has not disappeared from the storefront.** Wait for the distribution to refresh and reload the page with the cache cleared; if that does not help, check that the rule is on that item and that location. **The schedule fires at the wrong time.** The location's time zone is missing or wrong — the rules are evaluated in the venue's zone. **Happy hour did not apply at the POS.** Check the time window and that the item is part of the rule: the POS reads the same availability as the storefront. **An item came back on sale by itself.** That is the 86 list auto-restore working — if you do not want it back, set 86 without a deadline. **The dish is still on sale at the aggregator.** There are no live marketplace connections — take the item down in the marketplace's own back office. ## Related Sections - [QR Menu](/en/docs/qr-menu) — customer menu setup, custom menus and sections - [POS](/en/docs/pos) — order taking by staff, response to schedules and happy-hour - [Kitchen (KDS)](/en/docs/kds) — kitchen display, receives only available orders - [Orders](/en/docs/orders) — monitoring and order management - [Multi-location](/en/docs/multi-location) — time zones are set separately for each location --- ## Frequently Asked Questions ### Can I set different schedules for the same dish across different locations? The schedule is set at the dish level (globally). If you have multiple locations in different time zones, the time is calculated in the time zone of each specific location — a single "breakfast until 12:00" rule will work according to local time at every branch. ### What happens if a guest tries to order a dish outside of its schedule? The add to cart button is disabled. The dish remains visible but unavailable for ordering — the guest understands that the item is on the menu and sees when it becomes available. ### Does happy hour apply to options and add-ons? Yes. The discount applies to the base price of the dish, and selected options and add-ons are calculated on top of the discounted price. ### Do I need to republish the menu after changing a schedule? Dish schedule changes are published automatically upon saving. Custom menu schedules are also applied upon saving. ### Can I put a dish on the stop list directly from the POS? Yes. In the **Menu** section, there is an "86" button next to each dish for this purpose, and on the POS, a long press (or right-click) on the dish tile opens the same "stop now / until end of day / until tomorrow" modal. On the POS, this action is only available to employees with dining area manager permissions. --- # Advertising Monitor The **Advertising Monitor** is digital signage for your venue: a program of cards with your items, promotions and menu plays on the TV in the hall. You put the program together in the admin panel, press "Publish" — and the TV picks it up by itself, nothing needs restarting. Open: **Admin panel → Advertising → Advertising Monitor**. --- ## Card types Each screen is a program of cards. Three types are available: | Type | What it shows | |------|---------------| | **Item** | A large photo, name, price, description and badges (new, bestseller, etc.); several layouts — full screen, text on the side, card in the centre | | **Promotion or announcement** | Your headline and text over an image, video or colour fill; ready-made compositions (large headline, QR on the right, event with a date and others), and a QR code with a caption if you want one | | **Menu board** | A list of items with prices in café-menu style — as a list, tiles or price tags, columns are arranged automatically | Item cards take the photo, name and **price straight from the catalog** — nothing has to be entered twice, and the screen stays correct after a price change. You can crop the photo, turn on a slow "living" motion or **cut the item out of its background** — AI does the cutout in one click. A promotion can be linked to a catalog item: when the item runs out, the promotion is not shown. --- ## Creating a screen and its program 1. In the **Advertising Monitor** section press **"Add screen"** — the wizard "What should this screen do?" opens. 2. Choose the job: sell items, show the menu and prices, announce a promotion, entertain the queue, shop window or checkout display. 3. Pick what to show (catalog items or the promotion text), look at the preview and choose when to show it — all the time or in the "Morning", "Day", "Evening" slots. 4. Press **"Publish and connect"**. The TV connection window opens after publishing is confirmed. If confirmation is missing, the wizard asks you to retry. You can then edit the program: cards on the left, a **live preview** in the centre and card settings on the right. **"On screen now"** calculates what the program should show at the selected time and explains skipped cards. It is not a screenshot of the TV. --- ## Draft, publishing and history Edits in the editor are saved as a **draft** — the top of the editor says "Draft · not published". While you work, the TV keeps showing the previous program and never flashes a half-finished one. When you are ready, press **"Publish"**. The top of the editor shows how publishing goes: - **"Waiting for confirmation…"** and **"Accepted · publishing to screens…"** — the program is on its way; - **"✓ Published"** — the program is published; the TV usually receives it in 1–6 minutes. Network problems or a different update interval can make this longer. Look for "Version N applied" in the screen list; - **"Queued: no connection — it will be sent automatically"** — your internet dropped; publishing will go through when the connection is back; - **"⚠ Publishing not confirmed"** — no reply has arrived yet; publishing may still finish later. Press "Retry"; the changes will not be applied twice; - **"⚠ Not published: the program was changed"** — while you were editing, the program was published from another device; nothing was replaced, take the fresh version or publish over it. Every publication goes into **history** (the last 20). To restore yesterday’s program, choose **"History" → "Restore"**, then "Publish". Deleting the last screen sends a publication immediately; the TV changes after its next update. To remove the program, choose **"⋯" → "Remove the program from the screen"** in the hub. The TV stays paired. **"Unlink device"** in the device list stops its reports, but the program already open on it keeps playing. If the editor reports a missing image or video, open the indicated card or placeholder, upload the file again and publish. Dismissing the warning does not restore the file. --- ## Connecting the TV ### Connect the TV with a code 1. Open the browser on the TV or set-top box and enter the short address **`tv.`** — for example, `tv.cenaly.com`. 2. The screen shows a six-character code (for example, `8P2-9JV`) and a QR code. 3. In the admin panel open **"Advertising" → "Advertising Monitor" → "Connect the TV"** and enter the code — or point your phone camera at the QR code and the code fills in by itself. Choose the location and the screen. 4. The TV asks "Connect this TV?" with the location and screen names — press **OK** on the remote. The program starts playing at the same address, and after a restart the TV shows it without a code. The code alone does nothing: only "OK" on the TV completes the connection. A code lives 10 minutes; if it has expired, press OK and a new one appears. The screen's row in the admin panel shows that the TV is online and which program version it has applied. **"Connection" menu on the remote.** Hold **OK** for two seconds or press it three times. The menu offers **"Change assignment"**, **"Diagnostics"** and **"Screen margins"**. If edges are cut off, first try the TV’s "Just Scan" or "Screen Fit" mode. In margin calibration, left/right change the side margins and up/down change the top and bottom margins. OK saves; Back cancels. Margins shrink the display area rather than move the picture. ### Which TV works The screen works most reliably on an **Android TV or Google TV** box with Chrome 105 or newer. The TV's built-in browser may also work, but old browsers cannot cope — in that case the screen itself will suggest connecting a box. ### Other ways In the "Connect the TV" window, the **"Other ways to connect"** section has a direct link to the screen and its QR code — for a tablet, a computer or a TV where the short address did not open. Open the link in a browser and switch to full screen (`F11` in most browsers). --- ## Without internet and when something goes wrong - Saved programs and files can play **for up to 7 days from the last confirmed connection**. Restarting offline also requires the app itself to have been saved beforehand. An incomplete download or cleared browser storage can prevent this. Prices have a separate freshness limit; after a week the screen switches to a neutral placeholder. - If loading fails and no saved program is available, the TV shows "Connecting…" and retries automatically. The initial loading screen can be dark before this message appears. - If the screen was deleted or its program removed, the TV shows "Monitor is not set up yet" — connect it to the right screen again. - During opening hours, the system aims to report a lost connection in the work chat **within 15 minutes** and opens a case in "Needs decision". Delivery failures can cause delays; the hub shows a late alert or missing delivery confirmation. The case closes when the connection recovers. - If the TV is connected but shows only an unplanned screensaver, the hub explains why: for example, items are missing from the published menu or blocked by the stop list, country rules or dates. After **15 consecutive minutes** during opening hours, the system sends a work-chat message. After **5 minutes** of normal playback, it sends a recovery message. Scheduled breaks, pauses and disabled playback do not trigger this alert. --- ## Country advertising rules The screen checks every card against the advertising rules of your location's country (the country comes from the location settings). This is not legal advice: the service shows which rule applied, and the decision stays with you. - **Restricted categories** — alcohol, tobacco and vapes, medicines, dietary supplements, gambling, energy drinks. For an item, the category comes from a badge in the catalog; for a promotion, the ticker and your own placeholder you answer "What does it advertise?". Until there is an answer, such a card or ticker does not go on screen, and your own placeholder is replaced with a neutral one — the venue name and opening hours. - **"Where the screen faces"** — "Into the hall" or "Into the window, seen from the street". The rules are stricter for a window; until you choose, the window rules apply. - **Warning plate** — if a rule requires one, the screen adds it by itself, and it cannot be removed. - **State language** — where the law requires text in the state language, the screen checks its share and size in the frame; the editor suggests which translation to add. Cards that do not pass the rules are marked ⛔ — with the name of the rule and a hint on what to do. --- ## Screen settings The **⚙** button in the editor opens the screen settings: - **Time slots** — "Morning", "Day", "Evening" or your own with days of the week and hours; a card marks which slots it belongs to. Time follows the venue's clock. - **Aspect ratio** — 16:9 for a landscape TV, 9:16 for a portrait screen or stand, plus 4:3, 3:4, 1:1 and 21:9. - **Card duration** — how many seconds each card is shown; a single card can have its own time. - **Style** — ready-made looks (Classic, Luxe, Neon, Fresh, Bold and others); the accent colour and headline font are set separately. - **Screen language** — names and captions are shown in it; promotion texts can be translated by hand in the "Translations" block. - **Show prices** — one price switch for the whole screen (handy for a window display without price tags). - **Ticker** — a line at the bottom of the screen: Wi-Fi password, a promotion, an announcement. - **Where the screen faces** — "Into the hall" or "Into the window, seen from the street". - **How often to check for updates** — once every 60 seconds by default (from 15 seconds to an hour). A screen can be **turned off** for a while ("Turn the show off" in the screen's "⋯" menu): the advertising stops, the TV itself is not switched off, and the settings are kept. --- ## Several screens per location One location can have several screens with different programs — for example, for the hall, the bar counter and the shop window. Each screen connects to its own TV; a program can be copied to another screen from the "⋯" menu. **A chain of several locations.** "⋯" → "Copy to another location…" moves a screen's program to one or more other locations — cards, schedule, ticker, languages and pictures. The copy lands as a draft: it reaches the TVs only after "Publish" in that location's editor. Prices always come from the catalog, and cards for items the location does not sell are not copied — before copying, the window shows for each location how many cards will be copied and what will not, and why. If the location already has screens, you can add the program as a new screen or replace the program of one of them. After copying, press "Open and check": the program check uses that location's country, languages and advertising rules. --- ## The screen shows the truth of the menu The player works out availability and price **by the same rules as the till, storefront, kiosk and aggregators**: - **stop-list «86»** — an item taken off by the cook leaves the card; in a menu-board row the price is replaced with a **"Sold out"** plate in the screen's language; - **item and menu schedule** — breakfast is not shown in the evening; - **happy-hour price** — the screen shows the same price the till will charge. All of this is recalculated **by the location's clock** about once a minute, so happy hour starts and ends on screen by itself, without restarting the TV. Prices are not typed into cards by hand: the screen always shows the catalog price. New prices and the stop list reach the TV without a restart: the screen re-reads the menu every 5 minutes, so this usually takes 5–10 minutes, and up to 15 minutes on some brands. More about the rules — [Schedules and Happy Hour](/en/docs/scheduled-menus). --- ## Related sections - [Schedules and Happy Hour](/en/docs/scheduled-menus) — stop-list «86», item schedules and happy-hour prices - [Menu printing](/en/docs/print-menu) — print a menu or a poster with items - [QR menu](/en/docs/qr-menu) — QR codes for guests on the tables - [Analytics](/en/docs/analytics) — views and guest activity - [Multiple locations](/en/docs/multi-location) — managing several locations --- ## Frequently asked questions ### Do I need special equipment or a set-top box? Best of all — an Android TV or Google TV box (Chrome 105 or newer): the screen runs reliably on it. A Smart TV's built-in browser, a tablet or a computer will also do if the browser is not too old — otherwise the screen itself will suggest a box. ### What happens if the internet goes down in the hall? Playback can continue for up to 7 days from the last confirmed connection if the program, files and app were saved beforehand. This also allows an offline restart. Incomplete or cleared storage cannot guarantee it; prices have a separate freshness limit. After a week, a neutral placeholder appears. ### Can I show video on cards? Yes. On a promotion card you can upload a video instead of an image (MP4 and other popular formats). The video plays muted in a loop. ### How fast do changes appear on screen? Usually 1–6 minutes after "✓ Published". Your update interval or network problems may make it longer. "Version N applied" in the hub confirms that the player page received the program. If edits are missing, check that you pressed "Publish". ### Does the number of screens affect my plan? No. The ad monitor is included in every plan, including Free, and your plan does not limit the number of screens. Screens are not charged separately. Bring your TV and box; AI suggestions use AI credits. You can register up to **24 devices per location**. Remove old records with "Forget" in the device list. Programs and devices are different: several TVs can show the same program. See the [app store](/en/docs/app-store) and [Subscription](/en/docs/getting-started) for terms. --- # Voice Input — Voice Control ## Overview Voice input allows staff to control the Cenaly system using voice commands — add items, change prices, manage orders, and perform other operations without using the keyboard. ### When voice input is especially useful | Situation | Problem | Solution with voice input | |----------|----------|---------------------------| | Small screen | On a tablet/phone it's inconvenient to enter data | Dictate the command by voice | | Many items | Manually entering 50+ items takes hours | By voice — many times faster | | Hands are busy | Chef / barista is working in parallel | Voice command without touching the screen | | High load | During rush hour there's no time to type | One phrase — and the action is done | | Price updates | Need to quickly update prices before opening | Dictate new prices sequentially | --- ## Capabilities ### What you can do by voice - **Order management** — "Confirm order 15", "Cancel order 23", "Order ready, table 7" - **Menu editing** — "Price of Margherita — 18 lari", "Remove Caesar from the stop list" - **Create and delete** — "Add dish Cappuccino for 5 to Drinks", "Delete lemonade", "Create category Desserts" - **Stop list management** — "Add tiramisu to the stop list", "Mojito is out" - **Translation checks** — "Check translations", "Add missing translations" - **Marketing trackers** — "Set Google Analytics UA-12345", "Facebook Pixel 111222333" - **Navigation** — "Open orders", "Show today's analytics" - **Search** — "Find all items with cheese", "Show orders for table 12" ### Supported recognition languages You can speak in any language: the model recognises speech and understands the meaning regardless of the language, and it answers and phrases confirmations in the admin interface language (the interface is available in 45 languages). **Exception — the Russian cloud.** On brands that run in the Russian cloud (`cenaly.ru`), speech is recognised by Yandex SpeechKit, which has a closed list of languages: Russian, English, German, Spanish, Finnish, French, Hebrew, Italian, Kazakh, Dutch, Polish, Portuguese (European and Brazilian are separate models), Swedish, Turkish and Uzbek. Georgian, Armenian, Azerbaijani, Albanian and Arabic are not on it: if the panel is open in one of these languages, the assistant honestly says it cannot recognise that language by voice and asks you to type the command. Text commands and answers work in all 45 interface languages. --- ## Available voice commands The voice assistant supports 24 command types, grouped by category. Commands can be spoken in any language — the system recognizes the intent and performs the action. ### Menu management | Command | Description | Examples | |---------|-------------|----------| | **Change price** | Update an item's price | "Price of Khachapuri — 18 lari", "Set price of Caesar to 25" | | **Change description** | Add or update a dish description | "Add a description to Khachapuri: sulguni cheese, egg" | | **Open item card** | Open the item editor | "Open Khachapuri", "Show Caesar" | | **Open options** | Go to the options/add-ons tab | "Add options to Khachapuri", "Options for pizza" | | **Open tags** | Go to editing tags and allergens | "Specify allergens for Khachapuri" | | **Check translations** | Check for translations and automatically fill in missing ones | "Check translations", "Add missing translations" | ### Creating and deleting menu items | Command | Description | Examples | |---------|-------------|---------| | **Create dish** | Add a new menu item with a price | "Add cappuccino for 5 to Drinks", "Create dish Tiramisu for 8" | | **Delete dish** | Delete an item from the menu (irreversible) | "Delete lemonade from the menu", "Remove the old cocktail" | | **Create category** | Create a new section in the menu | "Create category Desserts", "Add section Drinks" | | **Rename category** | Change a category name | "Rename Hot to Main courses" | ### Stop list and visibility management | Command | Description | Examples | |---------|-------------|----------| | **Stop list** | Put a dish on the stop list (pause it) | "Put Khachapuri on the stop list", "Tiramisu is out" | | **Remove from stop list** | Return a dish from the stop list | "Remove Khachapuri from the stop list", "Khachapuri is available again" | | **Hide from menu** | Completely exclude an item from the menu | "Exclude Khachapuri from the menu", "Hide pasta" | | **Return to menu** | Show a previously hidden item | "Return Khachapuri to the menu" | ### Orders | Command | Description | Examples | |---------|-------------|----------| | **Open orders** | Go to the orders page | "Open orders", "Show orders" | | **Open order** | Open a specific order by number | "Open order 15", "Show order number 42" | | **Change order status** | Accept, prepare, serve, pay, or cancel an order | "Accept order 15", "Order 42 is ready", "Order 5 is paid", "Cancel order 7" | ### Location settings | Command | Description | Examples | |---------|-------------|----------| | **Open settings** | Open location settings on the required tab | "Open settings", "Show opening hours" | | **Opening hours** | Set the working schedule by day | "From 9 to 23 every day", "Monday is a day off" | | **Contact information** | Update phone, email, or address | "Phone +995555123456", "Email: info@restaurant.ge" | | **Social media** | Add or update a social link | "Instagram @myrestaurant", "WhatsApp +995555000000" | | **Service charge** | Configure the service fee amount | "Service 15 percent", "Disable service charge" | | **General settings** | Change name, currency, timezone, tips, waiter call | "Change the name to Cafe Aroma", "Enable tips" | | **Marketing trackers** | Set IDs for analytics systems | "Google Analytics UA-12345", "Facebook Pixel 111222" | ### How confirmation works Commands are divided into two types: - **Auto-execution** — navigation and opening cards (no confirmation) - **With confirmation** — all actions that change data For commands that require confirmation, the voice assistant will show exactly what will be changed and will prompt you to confirm or cancel the action. --- ## Waiter voice assistant ### How it works 1. The waiter enables **Voice Assistant** mode in the app 2. Approaches the table and **speaks the order**: "Table 5 — two khachapuri, one khinkali, lemonade" 3. The system recognizes speech and **reads out a confirmation**: "Order accepted: two Adjarian khachapuri, one khinkali, homemade lemonade. Table 5. Total — 48 lari. Send?" 4. The waiter confirms: "Yes, send" 5. When the dish is ready, the waiter receives a **voice notification**: "Order 42, table 5 — khinkali are ready" ### Voice notifications from the kitchen - 🔊 **In an earpiece** — a voice message with the table number and dish name - 📳 **Vibration** — if the notification arrives while talking to a guest - 📱 **On screen** — duplicated visually --- ## Hands-free mode — name activation The system listens but does not respond until it hears the wake word. ### How it works 1. You set the **assistant name** (for example, "Cenaly", "Assistant", "Nika", "Chef") 2. After saying the name, the system listens to the command and executes it 3. After execution, it returns to standby mode ### Mode features - **Doesn't drain the battery** — name recognition happens locally - **Doesn't record conversations** — until name activation, audio is not processed - **Works in noise** — detects the wake word at noise levels up to 75 dB --- ## Abuse protection ### Role-based access control | Role | Available voice commands | |------|--------------------------| | **Owner** | All commands without restrictions | | **Administrator** | Order management, menu, stop list, analytics | | **Shift manager** | Order management, stop list | | **Waiter** | Order confirmation, call manager | | **Chef** | Update dish statuses (ready / in progress) | ### Auditing and logging All voice commands are logged: - **Who** — employee name - **What** — which command was executed - **When** — exact time - **Result** — executed / rejected / error --- ## Privacy - Voice samples are stored encrypted - Data is processed locally on the device - GDPR compliance: voice data is processed only with the employee's consent --- # Voice Copilot — Command Reference ## What it is The Voice Copilot is an AI assistant built into the Cenaly control panel. It understands commands in any language, recognizes dish names even with typos, and performs actions for you — from updating prices to optimizing your menu structure. > **Copilot documentation sections** > - **Basic reference** (you are here) — targeted commands for menu, orders, settings, translations, devices > - [Bulk and advanced operations](/en/docs/voice-copilot-bulk) — bulk price and stop-list updates, tags and allergens, device codes, shifts and staff (who is working today, late arrivals, time off, scheduling shifts), order adjustments > - [Promotions, schedules, and photos](/en/docs/voice-copilot-automation) — promotions and happy hours, menu schedules, combos, menu photo and invoice recognition > - [Analytics and smart insights](/en/docs/voice-copilot-insights) — voice-driven statistics, conversation context, history and rollbacks, proactive AI suggestions ### How it works 1. Open the assistant: on mobile — tap the "AI" button in the bottom navigation bar; on desktop — click the "AI Assistant" badge in the bottom-right corner (if unused for a while, the label collapses into a circle with a sparkle icon — hover over it). Then press and hold the recording button 2. Speak your command in any language — or type it out if the microphone is unavailable 3. The copilot recognizes the intent, finds the required dish/category, and executes the action 4. For mutating actions — it asks for confirmation before applying changes ### Key features - **Any language** — speak in Russian, English, Georgian, Turkish, or any other language; the copilot responds in your panel's interface language - **Overlay on top of the current screen** — the assistant opens as an overlay and knows which section you are in; no need to leave the page - **Fuzzy search** — finds dishes even if you pronounce the name approximately - **Multi-location** — if you manage multiple venues, the copilot will ask which one to apply the command to - **Conversation context** — remembers previous commands within the current session > **About "any language" in the Russian deployment.** For brands running in the Russian cloud (`cenaly.ru`), speech recognition is powered by Yandex SpeechKit, which supports a restricted list of languages: Russian, English, German, Spanish, Finnish, French, Hebrew, Italian, Kazakh, Dutch, Polish, Portuguese (European and Brazilian are separate models), Swedish, Turkish, and Uzbek. Georgian, Armenian, Azerbaijani, Albanian, and Arabic are not supported: if the panel is opened in one of these languages, the copilot will honestly inform you that it cannot recognize speech in that language and ask you to type the command. Text input and assistant responses work across all interface languages. --- ## Commands: Menu Management | Command | What it does | Examples | |---------|-----------|---------| | **Change price** | Updates the price of the menu item | "Khachapuri price — 18 lari", "Set price of Caesar to 25" | | **Change description** | Adds or changes the dish description | "Description of Khachapuri: sulguni cheese, egg, butter" | | **Open card** | Opens the menu item editor | "Open Khachapuri", "Show Caesar salad" | | **Open options** | Goes to the variants and add-ons tab | "Options for Khachapuri", "Options for pizza" | | **Open tags** | Goes to editing allergens and tags | "Allergens in Khachapuri", "Tags for soup" | | **Move dish** | Moves the menu item to another category | "Move Tea to Drinks", "Move pasta to Mains" | | **Suggest options** | AI generates options (size, doneness) and add-ons (sauces, toppings) | "Suggest options for pizza", "Suggest addons for burger" | --- ## Commands: Creation and Deletion | Command | What it does | Examples | |---------|-----------|---------| | **Create dish** | Adds a new menu item with a price and category | "Add Cappuccino for 5 lari to Drinks", "New dish: Tiramisu, 8 lari" | | **Delete dish** | Deletes a menu item from the menu (irreversible, with confirmation) | "Delete lemonade", "Delete old cocktail" | | **Create category** | Creates a new menu section | "Create category Desserts", "New category: Hot Drinks" | | **Rename category** | Changes the name of an existing category | "Rename Hot to Main Dishes" | --- ## Commands: Stop list and visibility | Command | What it does | Examples | |---------|-----------|---------| | **To stop list** | Temporarily suspends the sale of the dish | "Khachapuri to stop list", "Tiramisu is out of stock" | | **From stop list** | Returns the dish to sale | "Remove Khachapuri from stop list", "Khachapuri is available again" | | **Hide** | Completely removes the menu item from the visible menu | "Hide pasta from the menu", "Hide old soup" | | **Show** | Returns the hidden menu item back to the menu | "Return Khachapuri to the menu", "Show Caesar" | --- ## Commands: Menu Analysis and Optimization | Command | What it does | Examples | |---------|-----------|---------| | **Find duplicates** | AI finds duplicate dishes and suggests merging them | “Find dupes”, “Find duplicates” | | **Fix categorization** | Checks if dishes are correctly distributed across categories | “Fix grouping”, “Fix categorization” | | **Suggest structure** | AI analyzes the menu and suggests an optimal category structure | “Optimize categories”, “Suggest better structure” | > After executing these commands, an interactive window will open with suggestions that can be accepted or rejected individually. --- ## Commands: Translations and Languages | Command | What it does | Examples | |---------|-----------|---------| | **Check translations** | Finds and automatically fills in missing translations | "Check translations", "Check translations" | | **Add language** | Adds a new language to the menu | "Add Turkish", "Add English" | | **Remove language** | Disables a language in the menu | "Remove German", "Remove Turkish" | | **Change order** | Rearranges menu languages | "Georgian first", "Order: ka, en, ru" | --- ## Commands: Orders | Command | What it does | Examples | |---------|--------------|----------| | **Open orders** | Navigates to the orders page | "Show orders", "Open orders" | | **Open order** | Opens a specific order by number | "Open order 15", "Order 42" | | **Change status** | Changes the status of the entire order or an individual dish within it | "Accept order 15", "Order 42 is ready", "Khinkali in order 42 are ready", "Cancel order 7" | | **Add item** | Adds a dish to an existing order — without confirmation (safe action) | "Add latte", "Add two khachapuri to order 15" | | **Remove item** | Removes a dish from the order — with confirmation | "Remove salad from order 15" | | **Mark as paid** | Marks the order as paid — with confirmation | "Order 15 is paid", "Guest paid for order 15" | > A new order cannot be created by voice — the copilot works with existing orders. If no order number is mentioned, it will apply the command to the order currently open on the screen. ### Available Order Statuses | Status | Meaning | Command examples | |--------|---------|------------------| | `accepted` | Accepted for work | "Accept order 15", "Accept order 15" | | `preparing` | In preparation | "Order 15 is preparing" | | `ready` | Ready to serve | "Order 15 is ready", "Order 15 ready" | | `served` | Served to guest | "Order 15 is served" | | `paid` | Paid | "Order 15 is paid" | | `cancelled` | Cancelled | "Cancel order 15", "Cancel order 15" | --- ## Commands: Location Settings | Command | What it does | Examples | |---------|-----------|---------| | **Open settings** | Opens the settings modal window on the required tab | “Show settings”, “Working hours” | | **Working hours** | Sets the schedule by days of the week | “Mon-Fri from 9 to 23”, “Monday closed” | | **Schedule exceptions** | Holidays, special modes, one-time schedule changes | “January 1 closed”, “December 31 until 4 AM” | | **Contacts** | Updates phone, email, address | “Phone +995555123456”, “Email: hi@cafe.ge” | | **Social media** | Adds or updates links | “Instagram @mycafe”, “WhatsApp +995555000” | | **Service charge** | Configures the service percentage or amount | “Service 15%”, “Disable service charge” | | **General settings** | Name, currency, timezone, tips, waiter call | “Name — Cafe Aroma”, “Currency EUR”, “Enable tips” | | **Trackers** | Sets analytics ID | “Google Analytics UA-123”, “Yandex Metrica 987654” | ### Settings Tabs With the “Open settings” command, you can specify the required tab: | Tab | Keywords | |---------|----------------| | General | “settings”, “name”, “currency” | | Contacts | “contacts”, “phone”, “email” | | Working hours | “working hours”, “schedule”, “hours” | | Marketing | “marketing”, “trackers”, “analytics” | | Image | “location photo”, “cover” | ### Supported Social Media Instagram, Facebook, Telegram, WhatsApp, YouTube, TikTok, Twitter/X, TripAdvisor, Google Maps ### Supported Trackers Google Analytics, Yandex Metrica, Facebook Pixel, VK Pixel, Matomo, LinkedIn Insight Tag, Snap Pixel, Pinterest Tag, Microsoft Clarity --- ## Commands: Devices | Command | What it does | Examples | |---------|-----------|---------| | **Device code** | Generates a 6-digit code to connect a display or tablet | "Create order monitor code", "Kitchen display code" | ### Device types | Type | Purpose | |-----|-----------| | `orders-monitor` | Screen with active orders (default) | | `kitchen-display` | Kitchen display for chefs | | `menu-management` | Menu management tablet | --- ## Commands: Telephony (own PBX) | Command | What it does | Examples | |---------|-----------|---------| | **Check connection** | Traces the incoming call chain and identifies the first broken link | "What's wrong with the phones?", "Why aren't calls coming through?" | | **Extension list** | Shows who is on which extension | "What is Nino's extension?", "Show extensions" | | **Create extension** | Sets up an internal extension for an employee | "Create an extension for Nino", "Extension 105 for Givi" | | **Call recording** | Enables and disables call recording | "Turn on call recording", "Turn off recording" | The first two commands are read-only and execute immediately; creating an extension and toggling recording require confirmation. > **Passwords are never spoken aloud.** The copilot displays the credentials of a new extension on screen, while only speaking the extension number and name aloud: reciting the password would expose it to anyone near the microphone. Outbound voice calls cannot be placed by voice commands, and revoking extensions, deleting trunks, and configuring routes must be done manually. If multiple employees match the name, the copilot will ask for clarification rather than guessing. --- ## Commands: Shift and POS | Command | What it does | Examples | |---------|-----------|---------| | **Open shift** | Opens a POS shift with a starting cash amount | "Open shift", "Open shift, starting cash 200" | | **Close shift** | Closes the shift with counted cash | "Close shift", "Close shift, 4300 in the drawer" | | **Shift summary** | Quick summary of the current shift | "Shift summary", "How is the shift going?" | | **Cash movements** | Pay in, pay out, cash collection | "Add 500 to POS", "Withdraw 1000" | | **POS status** | Current amount in the cash drawer | "How much is in the POS?" | | **X and Z reports** | Fiscal POS reports | "Run X-report", "Z-report" | | **Open drawer** | Opens the cash drawer | "Open drawer" | --- ## Commands: Shift Tasks | Command | What it does | Examples | |---------|-----------|---------| | **Create task** | Creates a task on the [shift task board](/en/docs/tasks) | "Create task: wipe the display case" | | **Take task** | Assigns the task to yourself to work on | "I'll take the display case task" | | **Complete task** | Marks as completed | "Display case task is done" | | **Task list** | What is open right now | "What tasks are open?" | | **What to do now** | Names one next task personally for you, rather than the entire list | "What should I do now?", "Where should I start?" | | **Quick task** | Picks a task that fits within the specified time (defaults to 15 minutes if unspecified) | "Give me something for 15 minutes", "Is there anything quick?" | | **Shift summary** | Checklist progress, overdue items, urgent tasks without an assignee, who is busiest | "How are things going on the shift?", "Summary" | > The copilot reads the shift summary only to the owner and manager — employees see their own plan, not the overall picture. --- ## Commands: Integrations and Dashboard View | Command | What it does | Examples | |---------|-----------|---------| | **Connect integration** | Opens the same connection modal as the button in the dashboard (the copilot does not touch tokens) | "Connect Wolt", "Connect Google Ads" | | **Disconnect integration** | Unlinks the service — with confirmation | "Disconnect Glovo" | | **Integration settings** | Opens settings for a specific service | "Open Wolt settings" | | **Telegram shop** | Connect, rename, disconnect, check status | "Connect Telegram shop", "Telegram shop status" | | **Hide/restore section** | Hides or restores a sidebar menu item, resets its layout | "Remove the Courier section from the menu", "Restore inventory", "Reset menu" | | **Dish photo history** | Shows previous image versions and restores the selected one | "Show photo history for khachapuri", "Restore previous photo" | --- ## Commands: Support | Command | What it does | Examples | |---------|-----------|---------| | **Report an issue** | Sends a bug report to the developers | "The price didn't update", "The button isn't working" | > Use this command when something is clearly not working as it should. Copilot will gather context and send a report to the development team. --- ## Questions about the POS and equipment The assistant doesn't just execute commands, it also answers questions — including those about **your specific equipment**. When opened from the "POS" section, it sees what is connected to this workstation: the model and serial number of the fiscal printer, whether the shift is open, if there is paper, when the last Z-report was run, as well as the receipt printer, scanner, scale, and payment terminal. If a SIP phone is linked to the workstation, the assistant knows its make and model (the phone identifies itself to our PBX upon registration) and provides answers regarding its menu, web interface, and default factory passwords. Therefore, to questions like "the POS is showing an unfamiliar error", "how to run a Z-report", or "the printer is printing gibberish", the answer will be tailored to your specific model — referencing its exact buttons, modes, and codes, rather than generic advice like "go to settings". You can ask without specifying the model: the assistant already knows it. You can also ask about equipment you don't have yet — for example, when deciding what to buy: the assistant answers based on the model directory and the common hardware used for issuing receipts in your country. --- ## Action Confirmation Commands are divided into two types: ### Without confirmation (instant) Navigation and opening (orders, menu item card, settings), as well as safe additions: adding a menu item to an order, marking a dish as ready. ### With confirmation All actions that modify data. Copilot shows exactly what will be changed and waits for confirmation. | Confirmation Level | When | |--------------------|------| | Voice "Yes" | Standard changes (price, stop-list, description) | | On-screen | Critical actions (deletion, bulk changes) | --- ## Navigating Admin Panel Sections The copilot opens working sections via voice commands ("open inventory", "show finance", "open dining area layout"): - [Inventory](/en/docs/inventory) — stock balances, incoming stock, suppliers, recipes, semi-finished products - [Dining Area Layout](/en/docs/tables) — tables, reservations, waiters - [Staff](/en/docs/staff) — roles, access, shifts - [Finance](/en/docs/finance) — revenue, reports, sales statistics - [POS](/en/docs/pos) and [Kitchen (KDS)](/en/docs/kds) - [Courier](/en/docs/delivery) — in-house delivery - Marketplace, Websites, Devices, Labels, Flyers, Integrations (Wolt/Glovo) The copilot can also voice some figures without navigating away: shift summaries, POS register status, a quick sales report for a period, or a list of open tasks. And with a command like "plot a daily revenue chart for the month", it will build a chart on the [dashboard](/en/docs/analytics). For everything else, it opens the section where the numbers are already on the screen. **Action links in responses.** When a response involves a specific location in the panel, the copilot includes a navigation button in the text: it opens the required section, the relevant tab, or directly the settings window being discussed. The copilot can also guide you to settings hidden in modal windows from any page — not just the one you are currently on. **Questions about a specific block.** Next to the headers of complex settings, there is a small ✨ button: it opens the copilot directly with the context of that specific block — explaining what the setting does, its implications, and its name. The button is available across more than a hundred panel blocks: calls, extension store, commerce, documents, telephony, counterparties, couriers and delivery network, pickup points, corporate accounts, customer segments, and others. ## Features not yet covered by the copilot The copilot will politely let you know that this topic is not yet supported via voice if you ask about: - loyalty programs and bonus points; - accounting, taxes, and data exchange with 1С; - the guest database and CRM — the ["Customers"](/en/docs/customers) section itself is available and functional in the dashboard, but it is managed manually rather than by voice. --- # Bulk and Advanced Operations While the basic [command reference](/en/docs/voice-copilot) covers pinpoint actions (one price, one dish), this section is about speed and scale. One phrase instead of fifty clicks. > **Why businesses need this.** The morning briefing takes 2 minutes instead of 20. Responding to shortages takes 5 seconds instead of opening every single item card. Checking "who is on shift today" — without navigating across three different sections. --- ## How the Copilot Selects Items Any bulk command consists of two parts: **what to target** and **what to do with it**. Selection is based on one of the rules: | Selection | Example phrasing | |-----------|------------------| | Entire menu | “raise all prices by 10%” | | Category | “desserts +15%”, “everything in the Bar section” | | Label (tag) | “everything tagged vegan” | | Word in name | “all pizzas”, “everything containing the word khachapuri” | | Price range | “everything under 10 GEL” | | Single item | “increase the price of khachapuri by 10%” — the same mechanics for N=1 | --- ## Bulk Price Changes | Command | What it does | Examples | |---------|-----------|---------| | **Increase prices by %** | Applies a percentage to all dishes or a category | "Increase all prices by 10%", "Desserts +15%", "Increase all prices by 5%" | | **Change prices by amount** | Adds or subtracts a fixed amount | "All soups +2 GEL", "Cocktails −3" | | **Set a single price** | Sets the same price for the entire selection | "All coffees at 6 GEL" | | **Just calculate** | Query without changes — copilot will only show the selection | "How many desserts without description?", "What is cheaper than 5 GEL?" | **Example scenario.** A supplier raised meat prices by 12%. You say: "Increase prices in the Meat category by 8%". Copilot gathers all items in the category, shows a "was → now" table — you confirm with a single click. 47 prices are updated in a few seconds. > Before applying, copilot **always** shows a list of affected items and their new values. If more than 50 items match the criteria, a warning and an "I checked the list" checkbox will appear; if more than a thousand, the plan will not execute at all, and the criteria must be narrowed down. --- ## Bulk Stop-List and Visibility | Command | What it does | Examples | |---------|-----------|---------| | **Category stop-list** | Adds all dishes in a category to the stop-list | "Put all soups on stop-list", "86 all fish" | | **Remove from stop-list** | Makes the selected items available for sale again | "Return all soups to sale" | | **Stop by tag or keyword** | Stops dishes with a specific tag or word in their name | "Put everything with seafood on stop", "86 all pizzas" | | **Hide from menu** | Completely removes the selection from the visible menu | "Hide the entire winter menu" | | **Restore to menu** | Makes hidden items visible again | "Bring back the summer menu" | **Example scenario.** The kitchen runs out of fish. You say "86 all fish" (classic kitchen slang) — the copilot gathers all fish dishes, displays the list, and moves them to the stop-list in a single command upon confirmation. Guests in the QR menu immediately see them as unavailable, and new orders are blocked. --- ## What happens instead of "undo" Copilot has no dedicated "undo last" command — and by design, it doesn't need one: it doesn't change anything until you confirm. The rollback point is always before the edit, not after: - before applying, you see a "before → after" table — cancellation is right there; - made a mistake in the criteria — ask again with a new phrase ("not desserts, but drinks"), and the old plan simply won't be executed; - changes already applied can be edited the regular way — with another command or manually in the card. --- ## Device codes | Command | What it does | Examples | |---------|-----------|---------| | **Create device code** | Connection code for an order display, kitchen display, or menu management tablet | “Create an order display code”, “Kitchen display code” | | **Open code list** | Opens the section for table QR codes and device codes | “Open QR codes”, “Show device codes” | **Example scenario.** A new tablet arrived in the kitchen. “Create a kitchen display code” — copilot provides the code and instructions on where to enter it. Table QR codes themselves are printed in the [QR codes](/en/docs/device-codes) section — copilot opens it, but does not create them. --- ## Tags, Labels, and Dish Properties | Command | What it does | Examples | |---------|-----------|---------| | **Add tag** | Applies a label to the entire selection | "Mark all soups with the vegan tag", "Khachapuri — spicy" | | **Remove tag** | Removes a label from the selection | "Remove spicy from khachapuri", "Remove the new tag from all desserts" | | **Set allergens** | Bulk adds or removes allergens and dietary flags | "Set gluten for all pastries", "Remove lactose from all cocktails" | | **Add property** | Creates an item property and attaches an empty field to the selection — just fill it in | "Add Manufacturer property to all TVs" | | **Fill in property** | Sets a specific value across the entire selection at once | "Set manufacturer to Samsung for all TVs" | | **Rewrite description** | Sets a single description for the entire selection | "Set description for all Bar items: served with ice" | **Why it matters.** Guests with dietary restrictions and allergies are a growing audience. Fully completed tags = more trust + automatic filtering in the QR menu. --- ## Shifts and Staff Copilot can answer HR-related questions and make adjustments to the schedule — commands are available to the owner and manager, while the section is restricted for other employees. | Command | What it does | Examples | |---------|-----------|---------| | **Who is working** | Who is on shift on a specific date or right now | "Who is working today?", "Who is on Saturday evening?" | | **Late arrivals** | Who was late or did not show up | "Who was late yesterday?", "Were there any no-shows this week?" | | **Vacations and time off** | Who will be absent and when | "Who is on vacation in July?", "Who has time off tomorrow?" | | **Schedule a shift** | Assigns a shift to an employee — with confirmation | "Schedule Nino for tomorrow evening", "Beka on Saturday from 10 to 18" | | **Record an absence** | Vacation, sick leave, time off — with confirmation | "Nino is on vacation from August 1 to 10", "Beka is on sick leave tomorrow" | Names can be phrased in any way — Copilot will match the name with the employee and ask for clarification if there are multiple similar matches. --- ## Order Adjustments | Command | What it does | Examples | |---------|-----------|---------| | **Add item to order** | Adds a dish to an existing order — instantly, without extra prompts | "Add cappuccino to order 15", "Add fries to order 8" | | **Remove item from order** | Removes a line item — with confirmation | "Remove steak from order 211" | | **Mark as paid** | Marks the order as paid — with confirmation | "Order 15 is paid" | | **Single item status** | Changes the status of an individual item in the order rather than the whole order | "Khinkali in order 42 are ready" | **Why.** The waiter doesn't need to search for the order in the list and open its card: if the order is already on the screen, they don't even need to say the number. --- ## See also - [Basic command reference](/en/docs/voice-copilot) — targeted operations with a single dish or order - Section on promotions, schedules, and photos: [Promotions, schedules, and working with photos](/en/docs/voice-copilot-automation) - Section on analytics and proactive prompts: [Analytics and smart suggestions](/en/docs/voice-copilot-insights) --- # Promotions, Schedules, and Working with Photos Continuation of the copilot guide: what it does on its own, and what it launches for you across adjacent sections of the dashboard. This section also covers scenarios where the input is a smartphone camera rather than voice. > **Why this matters for business.** Promotions and seasonal menus are configured with rules once and then activate automatically. Meanwhile, new dishes, inventory receipts, and updated menus are added from a photo instead of manual typing. --- ## Promotions and Special Prices The copilot makes quick price adjustments by voice: | Command | What it does | Examples | |---------|-----------|---------| | **Discount by selection** | Changes prices for an entire selection — by percentage or fixed amount | "Cocktails −20%", "All soups −2 GEL" | | **Revert prices** | Reverse adjustment using the same method | "Cocktails +25%" | | **Stop list and visibility** | Hides or restores items during promotions | "Hide the entire winter menu" | Meanwhile, **recurring** promotions — like "beer −30% on weekdays from 17:00 to 19:00" — live in rules rather than voice commands: a dish, category, custom menu, or selection has a **happy hour** window with a percentage or fixed price by days of the week. Set it up once — from then on, the price updates automatically and consistently across the digital menu, POS, and promo displays. Details — [Schedule and Happy Hour](/en/docs/scheduled-menus). Discount codes, automatic discounts, gift cards, and free delivery thresholds are handled by a separate engine: [Commerce](/en/docs/commerce). --- ## Schedules: seasonal menu, lunch, holidays | What you need | Where to configure it | |-----------|------------------| | "Breakfast until 12:00 only", "bar after 22:00" | Schedule on a dish, category, or custom menu — [Schedules and Happy Hour](/en/docs/scheduled-menus) | | "Summer menu until September 30" | Same schedule on a custom menu, plus "archive" status after the season | | "January 1 is a day off", "December 31 open until 4 AM" | Copilot sets up a **schedule exception** by voice: "January 1 day off" | | "Mon–Fri from 9 to 23" | Location opening hours — also by voice | **Example scenario.** Before holidays, the manager dictates: "December 31 we're open until 4 AM, January 1 is a day off." Copilot shows exactly what will change in the schedule, and after confirmation, saves the exceptions — guests see the correct opening hours in the menu for those dates. --- ## Combos and Sets Combo sets (“soup + main + drink at a fixed price”) are configured in the item card on the **“Composition”** tab (🧂): a bundle of several dishes with a shared total price, including showcase “build-your-own” combos with slots and surcharges. Copilot opens the required card by name — then the bundle contents are assembled with the mouse. Item types such as “service”, “raw material”, “material”, and “packaging” do not have a composition, and the tab is not displayed for them. --- ## Photo → Data Three scenarios where the input is a photo and the output is ready-to-use data. All three live in their respective dashboard sections, and the copilot helps you navigate to them. | Scenario | What happens | Where | |----------|----------------|-----| | **Paper menu photo → menu items** | AI reads photos of the menu: categories, dishes, descriptions, prices; marks already existing items so the import updates them instead of duplicating | AI scanner button in the [Menu](/en/docs/qr-menu) section | | **Invoice photo → stock-in** | AI recognition of invoice line items, matching with the item catalog, and a ready-to-use inventory receiving document | [Inventory](/en/docs/inventory) | | **Floor plan photo → layout** | A snapshot of a hand-drawn plan turns into a layout of tables, walls, bar, and doors | [Floor Plan](/en/docs/tables) | --- ## Dish Photo: Generate and Roll Back The dish card has its own photo factory: ready-made AI shots from a shared pool ("Ready AI images" — pictures already generated for similar prompts, available for free without generating anew), AI generation of a new shot, AI enhancement of an existing one, and short video generation. Background removal is done in the flyer editor or promotional display editor and saved back to the dish card — from there, both editors can reuse it. Every version is saved — you can revert to a previous one in one click, including by voice: > AI generation of a new shot is currently not working for all brands: some accounts receive a "Failed to create job" error instead of an image. The cause is on our side, and a fix is in progress; other photo factory tools (ready-made shots, enhancement, version history) are unaffected. | Command | What it does | Examples | |---------|-----------|---------| | **Photo history** | Shows previous versions of the dish image | "Show photo history for khachapuri" | | **Restore version** | Rolls back the photo to the selected version | "Restore the previous photo of khachapuri" | --- ## Industry-specific voice templates Copilot understands industry slang — no need to speak "technical" language: | Slang | What it means | |-------|---------------| | **"[dish] is out"**, "no [dish]" | Add to stop list | | **"[dish] is back"**, "[dish] arrived", "serving [dish] again" | Remove from stop list | | **"guests shouldn't order this, but don't remove it from the menu"** | Stop list, not hiding the item | Kitchen "86" is also available in the product, but not as a voice phrase, rather as an **"86"** button next to the item on the POS and in the menu: clicking it opens the choice "stop now / until the end of the day / until tomorrow", clicking again removes the stop. --- ## See also - [Basic command reference](/en/docs/voice-copilot) — starting commands for daily work - [Bulk and advanced operations](/en/docs/voice-copilot-bulk) — bulk edits, tags, and staff shifts - [Analytics and smart tips](/en/docs/voice-copilot-insights) — voice metrics and copilot suggestions --- # Analytics and Smart Suggestions Copilot is not just a command executor, but also an analyst. This section covers how to retrieve information by voice, maintain conversation context, and what suggestions Copilot provides on its own. > **Why businesses need this.** Business questions are resolved in seconds without opening reports: ask "revenue by channel for the month" — and the table arrives right in the chat. And Copilot runs data quality checks ("what is missing in the menu", "translation report") with a single phrase, immediately offering to fill the identified gaps. --- ## Quick Voice Navigation | Command | What it does | Examples | |---------|-----------|---------| | **Open QR codes** | Table and device codes section | "Open QR codes", "Show codes" | | **Open dish tags** | Dish card on the tags and allergens tab | "Open Caesar tags", "Tags for Caesar" | | **Open labels** | Label and price tag printing section | "Open labels", "Open labels" | | **Build chart** | Takes you to the dashboard builder with the prompt already filled in | "Build a daily revenue chart for the month" | | **Access and roles** | Staff access settings | "Access settings", "Permissions" | | **Open analytics** | Reports and statistics section | "Show finances", "Open statistics" | | **Open locations** | Account venues list | "Open locations", "Show my venues" | **Why it matters.** The more features there are, the harder it is to find the right section. Voice is the shortest path: 1 second versus 3–4 clicks through the menu. --- ## Menu Information | Command | What it does | Examples | |---------|-----------|---------| | **What's missing in the menu** | Scans item cards and shows a summary of gaps: descriptions, photos, allergens, translations, prices | "What's missing in my menu?", "Check item card quality" | | **Translation report** | In-depth check: where and in what languages translations are missing | "Translation report", "Where is the Turkish translation missing?" | | **Complete translations** | Finds gaps and fills them with auto-translation | "Check translations", "Fill in missing translations" | | **Filter by criteria** | Shows a list of menu items based on a condition — without changes | "What is under 5 GEL?", "Show all items in the Bar category" | | **Duplicates and structure** | Finds similar menu items and oddly organized categories | "Find duplicates", "Fix grouping" | **Example.** "Translation report" — the copilot scans the entire menu and sends a breakdown: how many menu items and in what languages lack translation. Then, with a single phrase "fill in missing translations", the gaps are filled with auto-translation. --- ## Order Information Copilot compiles the report directly in the chat: you specify the **metric**, **breakdown**, and **period**, and it returns a ready-to-use table. | What to ask | Examples | |-------------|----------| | **Revenue** | “Weekly revenue”, “How much did we make last month?” | | **Order count** | “How many orders today?”, “Orders over 30 days” | | **Average check** | “Monthly average check”, “Average check by day of the week” | | **Top menu items** | “Best sellers this week”, “Top dishes of the month” | | **Shift summary and cash** | “Shift summary”, “How much is in the POS right now?”, “How much did we sell this shift?” | | **POS terminal check** | “Is the POS working?”, “What's with the POS?” | **Breakdowns**: by day, by hour, by day of the week, by sales source and channel, by payment method, by order type, by ad campaign. **Periods**: today, yesterday, week, month, last month, last 30 days, or explicit dates (defaults to the last 30 days if no period is specified). Copilot does not make up breakdowns that the report does not support: if asked for “revenue by category”, “by waiter”, or “by table”, it will honestly reply that this breakdown is not calculated yet and suggest the closest alternative — for example, top dishes or revenue by sales channel. **Example scenario.** After closing, the owner asks: “Revenue by day for the week” — Copilot sends a daily table right into the chat. Need a chart instead of a table? “Build a chart of daily revenue for the month”, and it will open the dashboard builder with the chart already generated. --- ## Dialogue context — conversational intelligence Copilot remembers the last five messages in the dialogue — its own and yours combined, which is about two to three exchanges — and understands clarifications, corrections, and follow-ups. | Feature | Examples | |-------------|---------| | **On-the-fly correction** | You said "Margarita 22" → did not confirm → "No, not 22, make it 24" — Copilot updates the number while preserving the dish context | | **Clarification** | You said "Khachapuri" (and you have 3 varieties) → Copilot displays a list of matches: "Imeretian, Megrelian, or Adjarian?" | | **Chaining** | "Hide Cheesecake", "now Tiramisu", "and Brownie" — each subsequent command operates within the context of "hiding" | | **Grouping in a single phrase** | "Hide all chicken dishes", "What is cheaper than 5 GEL?" — Copilot gathers the selection based on the criterion and shows a preview | | **Confirmation or cancellation** | Any change is first shown as a command card — executed only after your "yes"; read requests (reports, search) are executed immediately | **Why it matters.** A conversational interface should feel like talking to an assistant, not dictating a rigid command. Copilot carries on a conversation rather than executing steps according to a protocol. --- ## Dish Photo History and Restoring a Previous Version Every replacement or deletion of a dish photo is saved — old images are not lost. Using your voice, you can both view this history and restore any of the previous versions. | Command | What it does | Examples | |---------|-----------|---------| | **Show photo history** | Feed of previous dish photos directly in the chat (executed immediately, changes nothing) | “Show photo history of Khachapuri”, “Show photo history of Caesar” | | **Restore previous photo** | Restores the previous version, the version before it, or the very first image | “Restore previous photo of Khachapuri”, “Restore original photo”, “Roll back photo to the previous one” | If multiple dishes match the description, the copilot will first ask to clarify which one you mean, and restoring a photo — like any change — will be executed only after confirmation. **What is not available yet.** There is no general log of "what I changed today" or bulk rollback of edits via voice: only the specific dish photo is rolled back. For changes across different sections, check those sections directly — for example, articles and website pages have version history, and counterparty cards have their own event feed. --- ## Copilot Suggestions The copilot offers suggestions in two scenarios. **1. You asked — it checked.** A single phrase triggers an analysis that concludes with a ready-to-use action plan: | Request | What you get in response | |---------|--------------------------| | "What's missing in the menu?" | A prioritized summary of gaps: descriptions, photos, allergens, translations, prices, calorie counts | | "Translation report" | Where and in which languages translations are missing — across dishes, categories, add-ons, and variants | | "Find duplicates" | A list of similar items with a merge plan that you approve before applying | | "Fix categorization" | Dishes that are "in the wrong category" and a proposed new menu structure — also reviewed before execution | **2. You asked about a feature you don't have.** If you ask about a capability, but the corresponding section or extension is disabled, the copilot provides a direct answer and **suggests enabling it** — via a card with a brief "why you need this" rationale. A suggestion appears only in response to your question: the copilot never offers anything proactively without a prompt. If you decline, it remembers this — and the next time you ask about the same feature, it will transparently remind you: "You previously declined this suggestion; if it's relevant now, enable it here." Once you enable something, it stops suggesting it altogether. A maximum of one suggestion is provided per response. The suggestion card appears only for **text-typed** commands: during voice input, the transcribed phrase does not reach this mechanism. It works exclusively in the admin panel copilot — the kitchen display, courier app, and waiter app do not have these cards. The copilot **does not initiate conversations on its own** — it will not message you first about dropping sales or rising meat prices. A screen that collects such alerts automatically already exists in the product: **[Needs Attention](/en/docs/attention)** — which, since late August 2026, is no longer a separate sidebar item, but **Work Chat → "Action Required" section → "Monitored" tab** (the old link `/attention` automatically redirects there; the general Work Chat layout is described in [Guest Chat](/en/docs/chat)). This tab displays overdue B2B invoices, pending proposals, CRM tasks for today, recent negative reviews, POS risks, telephony issues, documents (expiring and unread), and significant guest debts. Urgent matters — returning an inquiry call, confirming a reservation, accepting an order — live in the adjacent **"Urgent"** tab within the same section and can be resolved directly there, with a single button per item. This screen cannot be opened by voice — access it through the Work Chat. --- ## Privacy and Your Data - Voice is transmitted for recognition over a secure channel and is **not stored**: only the command text remains after recognition. - The request text, model response, and selected action are recorded in your account's AI request log — this is needed for analyzing edge cases and improving response quality. - In the Russian perimeter, speech is recognized and processed by Yandex services (SpeechKit and YandexGPT) — neither audio nor text leaves this ecosystem. - Suggestions are built on your venue's data — data is never shared between different restaurants. - Chat history is stored locally in your browser and can be cleared with a button in the assistant settings. - Recognition and responses are billed using account AI credits; if the microphone is unavailable, the copilot accepts the same commands as text. --- ## See also - [Basic Command Reference](/en/docs/voice-copilot) — basic commands for daily operations - [Bulk and Advanced Operations](/en/docs/voice-copilot-bulk) — bulk operations, QR, tags, permissions - [Promotions, Schedules, and Photo Management](/en/docs/voice-copilot-automation) — promotions, menu schedules, photo recognition - [Voice Assistant — Technical Description](/en/docs/voice-input) --- # Dashboard and location readiness The first screen an owner lands on after signing up and finishing the setup wizard is the **Dashboard**. At the top it answers "what should I do next to start working", and below it shows the numbers the way your venue wants to see them: the set of charts is yours to assemble. Open: **Admin panel → Dashboard** (`admin.cenaly.com/dashboard`). This is not a "calls dashboard" or an "orders dashboard": every line of a chart names its own data source, and one chart can compare different sections. --- ## What this help section covers The Dashboard opens the **Communications, AI & Records** section. Next to it are the articles about messaging, incoming requests, AI tools and asset records: | Article | What it is about | |---|---| | 💬 [Team chat and guests](/en/docs/team-chat) | staff messaging, the "Needs a decision" queue and the whole guest chat in one window | | 📥 [Requests: a single inbox](/en/docs/leads) | every incoming request of the location in one stream: forms, callback, widgets | | 📧 [Mail and the AI auto-responder](/en/docs/mail) | your own mailboxes, a mail client in the panel, an AI agent that runs the mailbox | | 🎧 [Calls: recordings and speech analytics](/en/docs/calls) | call recordings, transcription, tags and AI analysis metrics | | 🤖 [AI receptionist](/en/docs/secretary) | a robot on incoming calls: persona, questionnaires, routing | | 💡 [Agent assist](/en/docs/call-assist) | hints for the employee during a call over the live transcript | | 🎓 [Staff training](/en/docs/learning) | courses and tasks built from the knowledge base, repetition, exam clearance | | 🤖 [Digital worker](/en/docs/digital-worker) | a browser AI performer for routine in third-party systems without an API | | 🧠 [AI models and your own key](/en/docs/ai-models) | which provider and model power the AI features | | 🗣️ [AI translator for the guest](/en/docs/ai-translator) | a face-to-face conversation with a foreign guest on two phones | | 🧰 [Assets and equipment](/en/docs/assets) | a register of fixed assets, depreciation, statements, QR labels | | 🖼️ [Gallery: the account media library](/en/docs/gallery) | images are uploaded once and picked in any editor | | 🧩 [Custom editors](/en/docs/custom-editors) | your own mini-editors inside the panel in a sandbox | --- ## What you need to start | What | Why | |---|---| | **The account owner role** | the section is built for the owner: they see data across all locations | | **The "Dashboard" card switched on** | the section is hidden by default — enable it in the [app store](/en/docs/app-store). The setup wizard and the copilot switch it on themselves when you finish onboarding | | **At least one location** | readiness is computed from the account profile and the location profile | | **The sections the numbers come from** | a chart is drawn over the data of [Orders](/en/docs/orders), [Appointments](/en/docs/appointments), [Calls](/en/docs/calls), stock and [site widgets](/en/docs/site-widgets). A section that is off produces no data | No extra settings, devices or subscriptions are required: the section reads what you already have. > If you signed up long ago and there is no "Dashboard" in the sidebar, nothing is broken. It is one of the opt-in sections: the "Dashboard" card in the app store is free, and it is removed the same way as any other. --- ## Getting your venue ready: five steps The first block of the page, above the charts, is the **"Getting your venue ready"** checklist with a "{done} of 5 done" counter. The five steps are the minimum after which the venue can actually serve a guest: | Step | What to do | How it closes | |---|---|---| | **Name your venue** | type the name right in the panel | an input inside the checklist: an auto-created location is called "My Restaurant", and guests see that name on the storefront and on the receipt | | **Fill in the catalogue** | import, a demo menu or your own items | the "Open catalogue" button; see [catalogue import](/en/docs/catalog-import) | | **Set up payments** | an online payment provider — or the "We only take cash" button | see [payments](/en/docs/payments) | | **Place a test order** | the "Test order" button opens your storefront in a new tab | order as a guest: the order lands in "Orders" and closes the step | | **Print the QR code** (and open a shift) | the "QR codes" and "Open a shift" buttons | a shift is what lets the register take money | Three large buttons sit under the list: **"QR codes for tables"**, **"Open a shift"** and **"Test order"**. "Open a shift" appears only for formats with a register, and the "QR for tables" wording only where tables exist: in a shop or a salon the checklist talks about products, services and a link, not about dishes and tables. The panel shows itself while the location is not ready. Once everything is done — or if you collapsed it yourself — only a green "5 of 5 done" line remains: the block does not disappear, so you can always come back to it. To expand it on purpose (and to send a colleague a link), use `admin.cenaly.com/dashboard?panel=readiness`. Readiness is computed **locally, from your own profile**, not by asking the server; the expensive checks (payments, orders, shift) are made once and remembered in the browser — opening the page does not re-query them. --- ## Dashboards and tiles A **dashboard** is a named set of charts. You can have several — "Morning", "Delivery", "Phone" — and switch between them in the section header. - **"New dashboard"** creates one, "Rename" changes the name, "Delete" removes it together with all its charts (it asks for confirmation). - Tiles live in a 12-column grid, each in one of four sizes: **Small**, **Medium**, **Large**, **Full width**. - A chart has "Duplicate" (handy when you need the same chart with a different filter) and "Delete". - Data is computed when the page opens and on the **"Refresh"** button. There is deliberately no background polling: a dozen cards hammering the server on a timer buys nothing but load. - The open dashboard lives in the address (`?tab=`): F5, "back" and a link to a colleague all return to the same set. The card states its condition honestly: "The source returned only part of the rows — the numbers are understated", "No data yet" (not an error — there were no records), "The service is being deployed". An error in one series dims that line, not the whole chart. --- ## Building a chart The **"Add chart"** button opens the editor. It is built around one idea: **a series is a source plus a filter plus an aggregation**. **Chart appearance:** | Field | Options | |---|---| | **Type** | Line · Area · Bars · Stacked bars · Horizontal bars · Pie · Doughnut | | **Size** | Small · Medium · Large · Full width | | **Name** | your own; without it the tile is labelled "Untitled chart" | | **Show legend** | a checkbox | **Time window:** | Field | What it does | |---|---| | **Window** | "Relative" (last N days / weeks / months) or "Fixed dates" (from… to…) | | **Step** | Hour · Day · Week · Month | | **Time by** | the moment the record was created or the moment of the event itself — it decides which bucket the row lands in | | **Draw zeros in empty buckets** | a checkbox; averages are never zero-filled — there a gap stays a gap | | **Compare with previous period** | a dashed line in the same colour | ⚠️ **The step and the window are linked: a chart cannot have more than 400 columns.** An hourly step over a 30-day window is 720 columns, so such a chart will not build (and 720 points on one tile would be unreadable anyway). The editor counts the columns for you and, when there are too many, shows a warning with the numbers and a **"Use the 'Day' step"** button — that is, the finest step that still fits your window. Hourly is comfortable for windows of roughly up to two weeks. **Series.** The "Add series" button, up to **8 series** per chart (the ninth colour is already indistinguishable, colour blindness included). Each series has a label, a source, a colour, an aggregation and a filter. - **Aggregation:** Count of records · Sum · Average · Median · Minimum · Maximum. The last five require a metric — the editor will say so. - **Filter:** statuses, tags (all of them), "Title contains", metric conditions (equals, greater than, contains, has a value, is empty…). --- ## Data sources The list of sources comes from the server rather than being hard-wired into the panel — so a new source shows up on its own, without updating the app. There are seven today: | Source | What it counts | |---|---| | **Orders** | orders of the location: total, item count, fulfilment type, sales channel | | **Bookings and appointments** | tables and online booking: party size, duration, deposit, master/resource, service | | **Menu views** | storefront traffic: sessions, visitors, page views | | **Stock costs** | stock documents: amount, cost, quantity, lines per document | | **Calls** | recordings, their duration and **your own** AI analysis metrics | | **Site widgets** | the [widget](/en/docs/site-widgets) funnel: widget shown → opened → submitted; surface, device, referral class | | **Website campaigns** | proactive messages: impressions, clicks, dismissals, conversions by campaign and A/B variant | Two subtleties, without which the numbers read wrong: - **Call metrics are yours.** Which metrics the AI extracts from a conversation is up to you — configured in Calls → settings → AI. The gear icon in the dashboard header leads exactly there: those definitions have no other author in the panel. - **For "Site widgets" a row is a daily group, not a single event.** That is why the default aggregation is not "Count of records" but "Sum" over the "Events" metric — and the field label says so in words. **A source can be unavailable, and that is normal.** Such an item is inactive and carries the reason: "Orders" needs the catalogue and orders index, and "Menu views" does not work on `cenaly.ru` (there is no Google Analytics sync in the Russian contour at all). If the service lacked permission for a source's data, you will see it as a caption on the chart tile itself: the source list does not check permissions, otherwise every opening of the section would cost a trial read per source. --- ## "Describe the chart in words" Above the dashboard (and inside the editor) there is a single field — **"Describe the chart in words"**: - in the dashboard header a phrase builds a **new** chart and opens it in the editor right away — the assistant will not save anything silently; - in the editor the same phrase **edits the open** chart: "make it bars", "add a second series for delivery". Input is typed or dictated (the **"Dictate"** button; the browser does the recognition, no audio is sent anywhere, and the button only appears where the browser supports it). The answer is shown in full, including warnings about what the assistant **dropped** from your phrase: "Unknown metric replaced with a record count", "Unknown status in the filter discarded", "Only the first 8 series were kept". A silently swallowed invention of the model is a chart that counts the wrong thing. --- ## Section tiles Besides your own charts, two ready-made tiles live on the dashboard: - **"Phone"** — telephony money and calls. It appears only when the [Calls](/en/docs/calls) section is on: an owner without telephony does not need someone else's feature on their main screen. - **"Documents"** — the three numbers worth opening the section for: expiring, overdue, awaiting acknowledgement. Each number is a link with its **own** filter into [Documents](/en/docs/documents), not a generic entrance. The tile does not disappear when everything is fine (a vanishing tile in a fixed grid reads as a breakage), but on a brand without that section it is not shown at all. --- ## Limitations - **The section is opt-in.** It is off by default; "older" accounts will not see the readiness panel until "Dashboard" is switched on in the app store. - **There is no drag and drop.** The order of dashboards and tiles is set at creation time — you cannot rearrange them with the mouse yet. - **There is no background refresh.** Numbers update when the page opens and on "Refresh"; there are no automatic retries after an error either. - **Up to 8 series per chart** — not a matter of taste but the limit of distinguishable colours. - **On `cenaly.ru` the "Menu views" source is unavailable** (no Google Analytics sync in the Russian contour). The other six sources are computed in both clouds. - **The "Orders" source** requires the catalogue and orders index: without it the item is inactive and explains why. - **The AI assistant is optional.** If your contour has no connected model, the "Describe the chart in words" field simply is not there — the section works without it. - **Dictation is browser-side.** In a browser without speech recognition there is no "Dictate" button. - **This is a builder, not accounting.** Ready-made hard-wired reports live in [Statistics](/en/docs/statistics) and [Finance](/en/docs/finance); the dashboard does not replace them and does not produce tax forms. --- ## Troubleshooting | Symptom | Check | |---|---| | **No "Dashboard" in the sidebar** | whether the "Dashboard" card is on in the [app store](/en/docs/app-store); the section is hidden by default | | **The readiness checklist is not visible** | it is collapsed into a "5 of 5 done" line, or you collapsed it — open `?panel=readiness` | | **The "test order" step does not close** | the order must contain items: an opened and abandoned storefront is not an order | | **A source is greyed out** | the caption next to it names the reason: no orders index, no analytics sync on `cenaly.ru` | | **The tile says "No data yet"** | that is not an error: there were no records in the chosen period. Widen the window or check that the source section is on | | **"The service is being deployed"** | the dashboards backend is not up in this contour yet; try later — the panel itself does not retry | | **Numbers are lower than in the section** | the card carries a warning that the source returned only part of the rows — wait for a full read and press "Refresh" | | **Call metrics are missing from the list** | they are yours to define: set up AI analysis in Calls first (the gear in the dashboard header leads there) | A symptom-by-symptom walkthrough lives in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — see [how to get help](/en/docs/support). --- ## FAQ ### How is the Dashboard different from Statistics? In [Statistics](/en/docs/statistics) the reports are hard-wired: you pick a period and look at what we computed. In the Dashboard you assemble the chart yourself — source, filter, aggregation — and collect into one set what you look at every morning. ### Can I compare two locations on one chart? Yes: the sources have a "Location" dimension, and a chart holds up to eight series. Make two series of the same source with different filters and they will sit side by side. ### Who else sees my dashboards? The section is built for the account owner: the chart sets are theirs. Staff work in their own sections, not here. ### Does the data refresh by itself? No. Numbers are computed when you open the page and on "Refresh". That is deliberate: a chart is not a kitchen display, and polling a dozen cards in the background gives nothing but load. ### The assistant built the wrong chart — did it break anything? No. The assistant never saves silently: it opens the assembled chart in the editor, and you either fix it or close it. Everything it dropped from your phrase is listed as warnings above the result. ### The readiness panel is in the way — can I remove it for good? You can collapse it with "Collapse": a single line remains. Removing it entirely is deliberately impossible: while the location is not ready this is the shortest path to the first order, and a finished panel takes no space anyway. --- ## Related articles - [App store](/en/docs/app-store) — where the Dashboard itself and the source sections are switched on - [Statistics](/en/docs/statistics) and [Finance](/en/docs/finance) — ready-made reports if you do not need a builder - [Calls](/en/docs/calls) — the source of your custom chart metrics - [My site: widgets](/en/docs/site-widgets) — the "Site widgets" and "Website campaigns" sources - [Needs attention](/en/docs/attention) — the things waiting for a decision right now - [First day: where to start](/en/docs/first-day) — launch checklists by business type - [Orders](/en/docs/orders), [Appointments](/en/docs/appointments), [Documents](/en/docs/documents) — the sections the dashboard reads --- # Team chat and guests A shift usually talks in a messenger, guests write into a different window, and "what is urgent" is known only to whoever is in the room today. The **Work chat** section brings that together: internal staff messaging, a single queue of things to decide, the task board and **the whole guest chat** — from messengers, from the storefront and from your own website. Open: **Admin panel → Work chat** (`admin.cenaly.com/team-chat`). The section is open to every role — it has no toggle of its own, and the only gate is section access in the role settings. The same chat opens as a **drawer over the register**, so a cashier or a host can answer a guest without leaving the POS. > There is no separate "Chat" page any more: the guest chat lives as the **Guests** section in this very window. Old `/chat` links lead here. --- ## What you need to start | What | Why | |---|---| | **Staff with their own logins** | only people with a login exist in the chat; create them in [Employees](/en/docs/staff) | | **Section access in the role** | without it a person does not see the chat; access levels are set there too | | **The "Guests" right** — for the guest chat | the section is visible to the owner, admin, host, receptionist and support; others simply do not have it | | **Connected guest channels** | WhatsApp, Telegram, Facebook, Instagram, e-mail, storefront chat and the widget — see [guest chat](/en/docs/chat) and [site widgets](/en/docs/site-widgets) | | **A shift schedule** — optional | needed for "do not disturb outside my shift" and the green "on shift" dot | No devices and no separate subscription are required: the chat works in the panel, in the app and in the POS drawer. --- ## Step 1. Channels, groups and direct messages On the left (on a narrow screen — on top) is the channel rail: | Channel | What it is | |---|---| | **Notifications** | your personal system channel: the schedule was published, the payslip is ready, something needs a decision. Only the system writes here — you cannot reply | | **Everyone** | the account-wide channel | | **Locations** | one channel per location; there is a search if you have many | | **Groups** | your own channels per topic: "Senior shift", "Kitchen" | | **Assistant** | a private conversation with the company AI assistant (see below) | | **Direct messages** | 1:1 with colleagues | | **Digital workers** | a channel for each AI persona you created | **Groups** are created and edited by the owner and managers: up to 50 groups per account, a title up to 80 characters, from 2 to 200 members; the author is always in the group. The server only sends you the groups you belong to and delivers messages strictly by membership. Creation, membership edits and disbanding reach members instantly — a channel appears and disappears without a reload. Disbanding removes the channel from the lists but does not destroy the history — it simply stops being visible. Unread counts are tracked per channel; the system channel counts like any other. --- ## Step 2. Messaging: mentions, announcements, pins The feed works like a familiar messenger: sending is instant, history loads as you scroll up (the feed does not jump), messages from one author within 5 minutes are merged, the start of the unread part is marked with a **"New messages"** divider, and a "↓" button at the bottom takes you to the latest. **@-mentions.** Typing `@` opens the list of channel members; up to 20 mentions per message. A manager also gets two group tokens — **"Everyone"** and **"Managers"**; they expand into people **at delivery time**, so "everyone" means everyone who is in the channel now, not a snapshot of when the message was sent. A mentioned person is always notified: a mention breaks through both "Mentions only" and quiet hours. A message that mentions you is highlighted with a border. **Announcements.** A manager can send a message as an **"Announcement"** (📣 in the composer) into the company, location or group channel: it is drawn as an amber block with "Read by 6 of 9" and a **"Got it"** button underneath. Hovering shows by name who has not confirmed yet. The audience is a snapshot taken at send time, so the counter does not drift with hiring and leaving. Text up to 1000 characters, audience up to 500 people; direct messages and the system channel have no announcements. **Pins.** Up to three pinned messages per channel (📌 in the message menu, set and removed by a manager). The header with pins is drawn as soon as the channel opens and survives old messages moving into the archive; clicking a row jumps to the message. **Reactions.** The ☺ button next to a message opens a palette of twelve common emoji; reactions hang as chips under the message, and hovering shows who left them. A reaction is not a message: it does not move the channel in the rail, does not grow the unread counter and does not ping anyone. Caps: 20 distinct emoji per message and 5 from one person. **Attachments.** An image is shown as a thumbnail inside the message (a click opens the original), a document as a tile with an icon, a name and a size; the chosen file is visible before sending. The limit is 6 MB per file. Only the owner and managers can delete other people's messages. **Also in the message menu:** "To task" creates a task from the message; "Assign to a digital worker" hands the text to an AI persona; an invitation to view the register's screen opens right from the chat (closing the viewer reliably stops the session on that machine). --- ## Step 3. Notifications, quiet hours and "who is on shift" Every channel has its own setting in the conversation header: **"All messages"**, **"Mentions only"** or **"Off"** (a muted channel is marked in the rail). Next to it — **"Do not disturb outside my shift"**: a notification arrives only if you are not on shift right now according to the schedule. Silence is switched on **only on positive knowledge about the shift**: the account has a schedule, you are in it, and there is no current window with a 30-minute margin. No schedule — no silence: a chat that stays quiet is worse than an extra notification. Quiet hours do not apply to direct messages and the system channel, and mentions and announcements always break through. ⚠️ What is muted are the **notifications**. The conversation itself flows as usual, so an open tab never drifts apart from the server. In the member list a person on shift has a green dot and the caption **"on shift until 18:00"**. This is not presence: in a venue it matters who is in the room, not who keeps a tab open. --- ## Step 4. "Needs decision" — the shift queue The first item in the rail (🚨) with a **red** number is the single operational inbox. On the right is one flat queue of things with a horizon of less than a day, sorted by urgency: age plus the weight of the type, with an overdue deadline lifting the row to the top. What it collects (fourteen sources): new orders, waiter calls, hotel room requests, unconfirmed bookings and appointments, today's arrivals, the callback queue for missed calls, returns, parcels with an expiring pickup deadline, storefront access requests, "call me back" leads from the site, marketplace requests, untouched low reviews (3★ and below) and **HR requests addressed to you personally**. **A case is closed in place** where that is possible: "Accept" / "Reject" an order, "Dismiss call", "Take" and "Done" for a room request, "Confirm" / "Cancel" a booking, "Called back" / "No answer", "Approve" / "Decline". Anything irreversible asks for confirmation. Returns, arrivals and parcels lead to their own section by a link: the decision needs full context. The anti-noise rule: every row has either a closing button or a server deadline — there are no eternal cards in the queue. **"👤 Assign to me".** The button in the row tells colleagues that someone has taken the case: they see a chip "👤 Maria · 5 min · note" without a reload. You can release your own claim and attach a short note (up to 200 characters). This is **a hint, not a lock**: the closing buttons stay available to everyone, and taking over someone else's claim simply asks for confirmation. Closing a case releases the claim on its own; after 24 hours a claim expires. **Two tabs.** **"Urgent"** is this queue, and it is what forms the red number. **"On watch"** is the periphery with a horizon longer than a day: B2B invoices, quotes, CRM tasks, reviews, cash risks, telephony, documents, debts; it is not part of the number. The address is `/team-chat/?inbox=1` and `…&view=control`. The same queue exists as its own sidebar section — [Needs attention](/en/docs/attention). It is **the very same inbox**: one data source, one list, one counter; by construction the two entrances cannot disagree. The queue refreshes when the page opens, when the tab regains focus, every 2 minutes while the tab is visible, and on live events for orders, waiter calls, room requests and bookings. If the first decision has been waiting too long, a reminder card arrives in the system channel. --- ## Step 5. The "Guests" section — the whole guest chat The **Guests** item in the rail opens the **full guest conversation centre** on the right — four tabs: | Tab | What is there | |---|---| | **Inbox** | the queue of threads and the thread with the guest card | | **Contacts** | contacts merged from conversations across all channels; segments, CSV export and import | | **Analytics** | conversations per period, average first reply, ratings, monthly reports | | **Settings** | channels, the AI assistant, routing, SLA, macros, chat widget settings | Inside a thread: a **Reply** to the guest and a private **Note** for the team (the guest does not see it), attachments, canned replies, ⚡ macros, ✨ AI assist ("Suggest a reply", "Improve the text", "Translate for the guest", "Summarise the conversation"), @-mentions of colleagues, "Take over from bot" / "Hand to bot", "Assign to me", "Resolve". The guest card shows the name, contacts, language, page, order history and a returning-guest badge. All of the state lives in the address: tab, thread, filter, location, month. A link can be forwarded to a colleague and they will land in exactly that conversation. Channels, the AI bot and widget setup are covered in [Guest chat](/en/docs/chat). This article only covers how the team works the queue. --- ## The guest queue: views, "waiting for the guest", following Instead of tabs and "mine only / unread" chips there are **ten fixed views with counters**: **Mine** (open, assigned to me) · **Unassigned** (open, no owner) · **All open** · **Bot-led** · **Waiting for the guest** · **Snoozed** · **Following** · **SLA breached** · **Mentions** · **Resolved**. A counter is the number of threads in the view; empty views are not hidden (a row that vanishes reads as a breakage). "Unread" remains a secondary filter next to channel, label, priority and search. **"⏳ Waiting for the guest"** is a separate status next to "Resolve". The operator has replied and is waiting: the thread leaves "open" and "Mine", and the row gets a "⏳ waiting N h" badge. A reply from the guest returns the thread to work **with the same owner** and marks it unread; to bring it back by hand use "↩ Back to work". The waiting time is **subtracted from the resolution SLA**: the venue is not at fault when the guest is silent. The guest does not see the status — for them the conversation is simply open. **Lifecycle timers** (settings → "Conversation lifecycle"): remind the guest after N hours of waiting (48 by default), close after N days of waiting (5 by default), close silence in an open conversation after N days (7 by default). Zero switches a timer off. The reminder text can be your own; a guest replying after an auto-close **reopens the same conversation** — no separate follow-up ticket appears. **"👁 Follow this conversation"** is a toggle in the thread header. Followers (up to 20 per thread) see an eye icon in the row and get the "Following" view, and a card arrives in their personal system channel when the thread has unread messages again or the status changes. The author of the event does not get the card — otherwise following would become an echo of your own actions. **"💬 Discuss with the team"** is an action in the thread header: pick a work chat channel and write a text. A **guest conversation card** goes into the channel (name, channel, preview of the last message, status, an "Open conversation" button), and a private note "Discussion in the work chat" with a link to that channel lands in the guest thread. The conversation itself is not copied into the work chat — only the preview. If the thread is linked to a booking or an appointment, a **booking card** sits between the header and the feed: when, the service, the master or the table, party size, status, deposit, a no-show flag — and one-tap actions ("confirm", "arrived", "no-show", "reschedule", "cancel", "request payment"). The status changes through the same call as the floor board, so the board in the neighbouring tab shows the same thing in the same frame. --- ## Collisions: who is viewing and who is typing An open thread tells colleagues you are there, and tells you about them. The thread header shows a chip **"👀 Maria is viewing"** or **"✍️ Maria is typing…"**, the list row shows a colleague's initial, and if you send a reply while someone else is typing, a non-blocking line "Maria is writing a reply too" appears under the composer. There are deliberately no locks: in a small team two operators help each other more often than they get in the way — what matters is only seeing each other before you send. --- ## The company assistant and the AI secretary reading room **"Assistant"** at the top of the rail is a private conversation that every participant has and only they can see. The assistant answers **from the venue's knowledge base documents**: on an empty channel it shows example questions ("How do I open a shift on the register?", "What do I do if a guest asks for a refund?"), while working it shows "The assistant is thinking…", and under the answer it draws source chips — which documents it built the answer from. It answers in the language of the question and only from the base; if there is no answer there, it says so honestly and suggests asking a manager. Up to 8 recent messages are used as context. When the account's AI balance is spent, the assistant says exactly that. **"AI secretary"** in the rail is a **reading room, not a console**: a text transcript of what the robot says to calling guests. You see the last 20 calls of the chosen location, and a call happening right now arrives as live lines. You cannot answer by voice from here: decisions about handing a call to a human stay in the [AI receptionist](/en/docs/secretary) section and on the employee's phone. The item is visible only to those who have the right to that section. --- ## Tasks, digital workers and kudos **"Tasks"** (📋, an amber number) is the same board as the [Shift tasks](/en/docs/tasks) section: list, kanban and "My day", a task editor, checklist templates. The amber number does not mean "unread" but "my tasks that need action now". The links work both ways: "To task" from a message, the "from chat" chip in the task card returning to the original channel, and the "Discuss in chat" button in the editor opening the location channel with a pre-filled message (you confirm sending). **"Digital workers"** is a section built from the account's registry of AI personas: a persona appears as soon as it is created and disappears when it is revoked. The channel is two-way: a job is given as an ordinary message, and the worker answers there — "accepted", a run report, a question before anything irreversible. The row shows the persona's status: "online", "paused" or "offline" — it decides whether work starts now or waits in the queue. Details are in [Digital worker](/en/docs/digital-worker). **Kudos and the mood pulse.** A separate panel behind a button in the rail: a short thank-you to a colleague (up to 280 characters) as a card in the channel feed, and a mood survey. The survey aggregate is visible to the owner and managers, and only after a threshold of responses; **individual answers are never visible to anyone**. --- ## Limitations - **Only staff with logins.** A person without panel access does not appear in the chat; guests write into the separate "Guests" section, not into team channels. - **External mail is a separate section.** Letters live in [Mail](/en/docs/mail) and are not merged into the work chat. - **On `cenaly.ru` there are no mobile push notifications.** The chat there lives on the live connection: a reply and a colleague's message arrive in an open tab or when you enter the channel, but no push reaches the phone. The "typing…" indicator in groups and the "who is viewing" chips will start working on `.ru` after the updated connection service is rolled out. - **On `cenaly.ru` the "Guests" section has no e-mail channel and no inbound WhatsApp through the official API** — the other channels work. - **AI help on the task board does not work on `cenaly.ru`** (free-text parsing, decomposition, semantic search and reliance on the knowledge base). The deterministic core — "My day", the briefing, priorities, capacity, the assignee suggestion — works in both clouds. - **The low-rating card reaches the chat only in the AWS contour**; the "Needs decision" queue itself works on `.ru`. - **Quiet hours need a shift schedule.** Without a schedule silence is not enabled and there is no green "on shift" dot. - **An "Assign to me" claim is not a lock.** It warns, but does not stop a colleague from closing the case; taking it over asks for confirmation and that is all. - **Disbanding a group does not delete the history** — it stops being visible but is not destroyed. - **Mobile pushes from the task coordinator are still bilingual** in one line. --- ## Troubleshooting | Symptom | Check | |---|---| | **The section is not in the sidebar** | section access in the role settings — the chat has no toggle of its own; the employee needs a login | | **There is no "Guests" section** | it is a separate right: owner, admin, host, receptionist and support. Following a direct link, a role without the right simply stays in the ordinary chat | | **Colleagues do not see my message** | a group channel is delivered strictly by membership — check that the person is in the group; in a direct message only two people see it | | **No notifications** | the channel mode ("Mentions only" / "Off"), "Do not disturb outside my shift" and the fact that you are off shift right now. On `cenaly.ru` there are no mobile pushes at all | | **The red number does not match my feeling** | "Urgent" and "On watch" are different horizons: only "Urgent" is counted. The server computes the number with the same permission checks, so other people's cases never leak into it | | **A case hangs in the queue and will not go away** | every row has either a closing button or a deadline; returns, arrivals and parcels are closed in their own section — the row leaves after that | | **A subordinate's leave request is not in my queue** | an HR request goes to the person it is addressed to. The full list of what you may decide is in the "Requests" tab of the Employees section | | **A guest conversation disappeared from "All open"** | it may have moved to "Waiting for the guest" or "Snoozed" — they have their own views | | **A file will not attach** | the limit is 6 MB per file; some file types the chat does not carry | A symptom-by-symptom walkthrough lives in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — see [how to get help](/en/docs/support). --- ## FAQ ### How is the work chat different from the guest chat? It is one window and two different contours. Team channels are staff messaging. The "Guests" section is the conversation with a guest from messengers, the storefront and the widget: its own statuses, SLA, owners and bot. Their data is separate: discussing a conversation in a team channel does not copy the guest's messages into it. ### Can the kitchen use the chat if the cook has no computer? Yes. The chat opens as a drawer over the register and in the mobile app: a cook only needs a staff login. On `cenaly.ru` there will be no phone push — the message appears when the app is opened. ### Does the guest see that I set "Waiting for the guest"? No. For the guest such a conversation is simply open: they see neither "resolved" nor a request to rate it. The status is for your queue, not for them. ### Two of us answered the same guest — how do we avoid that? Before sending, the thread header shows "👀 viewing" and "✍️ typing…", and if you press "Send" while a colleague is typing you get a warning. We deliberately do not lock threads: in a team of two to five people a lock gets in the way more than it helps. ### Who sees the mood survey answers? The aggregate goes to the owner and managers, and only after enough people have answered. Individual answers are shown to nobody, the owner included. ### Can I answer a guest by voice from the AI secretary reading room? No. It is a transcript of the robot's conversations, not a console: handing a call to a human is done in the [AI receptionist](/en/docs/secretary) section and on the employee's phone. --- ## Related articles - [Guest chat](/en/docs/chat) — channels, the AI bot and chat widget setup - [Needs attention](/en/docs/attention) — the same queue of cases as a separate section - [Shift tasks](/en/docs/tasks) — the same board as in the "Tasks" section - [Employees and shifts](/en/docs/staff) — logins, roles and the schedule quiet hours depend on - [Requests: a single inbox](/en/docs/leads) — the same visitor requests as a separate stream - [Mail and the AI auto-responder](/en/docs/mail) — external correspondence - [AI receptionist](/en/docs/secretary) and [Calls](/en/docs/calls) — the telephone side of talking to a guest - [Digital worker](/en/docs/digital-worker) — the AI personas that work inside a chat channel - [Knowledge base](/en/docs/knowledge-base) — what the company assistant answers from --- # Requests: a single inbox A visitor rarely leaves a request where you expect it: one fills in a popup, another taps "call me back", a third books a service, and a fourth simply writes into a form on the site. Each of those channels used to live in its own corner of the panel, and the stream as a whole was visible nowhere. The **Requests** section puts them into one list. Open: **Admin panel → Requests** (`admin.cenaly.com/leads`, the "Work" group in the sidebar). The section deliberately has no toggle: it exists precisely for the people who would otherwise never find it. > **Requests are not Orders.** A guest's order with items and payment lives in its own section with an operational flow. Here you get enquiries: a popup subscription, a form answer, a callback request, a service booking, a table reservation. --- ## What lands in Requests | Channel | Where it comes from | Where it is handled | |---|---|---| | **Popups & forms** | popup leads and their form answers | "Popups and forms" in [site widgets](/en/docs/site-widgets) | | **Site forms** | storefront form submissions | the location's website settings | | **Site messages** | the contact form | the same place | | **Callbacks** | the [Callback](/en/docs/callback) widget | [Customers](/en/docs/customers) | | **Appointments** | online service booking | [Appointments](/en/docs/appointments) | | **Table bookings** | a table reservation | [Tables](/en/docs/tables) | Rows are assembled **at read time**, from the very data the profile sections own. Nothing is copied or duplicated: Requests is a window over six channels, not a seventh storage. --- ## What you need to start | What | Why | |---|---| | **At least one location** | the top-level split of the list is the location; one location = one of the owner's companies | | **Channels switched on** | a request has to come from somewhere: [site widgets](/en/docs/site-widgets), storefront forms, [callback](/en/docs/callback), [online booking](/en/docs/appointments), [table bookings](/en/docs/tables) | | **A role with section access** | the section is meant for the owner and the marketer; access is configured in [Employees](/en/docs/staff) | Paid features live **on the channels**, not on the section: the "Popups and forms" widget is an extension in the [app store](/en/docs/app-store), while the inbox itself costs nothing. --- ## Step 1. Switch on the channels that collect requests An empty section is not a breakage but an honest "there have been no requests yet". To make the stream appear, switch on at least one of these: 1. **Widgets on your own website** — one tag and ready-made products on top of it: a popup with a form, a callback, booking, reservations, online ordering. See [My site: widgets](/en/docs/site-widgets). 2. **Forms on our storefront** — the contact form and the forms on the location's site pages. 3. **Callback** — the "call me back" button on the storefront or on your own site: [callback](/en/docs/callback). 4. **Online booking and reservations** — [appointments](/en/docs/appointments) and [tables](/en/docs/tables); their requests land here too. A request appears in the list as soon as the visitor presses "Send". --- ## Step 2. Groups, period and filters At the top is the **location selector**. Inside a location the list is split into **automatic groups "source plus its specifics"**: a popup campaign, a particular page form, or the whole channel for the rest. There is nothing to configure — the groups appear on their own, and each has two counters: total rows and unhandled ones. To their left sits **"All requests"**. | Control | What it does | |---|---| | **Period** | 7 / 30 / 90 / 365 days | | **Search** | by name, phone, e-mail and the text of the answers | | **"Unhandled only"** | leaves what has not been dealt with: for bookings and appointments, only those awaiting confirmation | | **"New since your last visit: N"** | the visit marker is **local**, one per location: requests have no server-side "read", so the counter is not shared across the team | | **"Total: N"** | how many rows are shown with the current filters | | **Surface chips** | "Your Cenaly storefront" / "Your own site"; they appear only if the stream has more than one surface | A list row shows the channel, **the time the request appeared** (not the time of the visit: otherwise a booking made for next month would fall to the bottom), the contacts and the gist of the enquiry. The status comes from the source: **New**, **Handled**, **Cancelled**. What that means per channel: | Channel | New (unhandled) | Handled | Cancelled | |---|---|---|---| | **Table bookings and online appointments** | awaiting the venue's confirmation | confirmed, guests arrived, visit completed | cancelled; if the guest did not come, the label is **"No-show"** | | **Callbacks** | not marked yet | marked "Called back" | marked "No answer" | | **Popups, forms and site messages** | always: these requests have no status of their own | — | — | A booking created by staff in "Tables" or "Appointments" is confirmed straight away, so it never lands among the unhandled ones. The group's unhandled counter follows the same rule. ### The badge on the "Requests" menu item So that you do not have to open the section "just in case", the **"Requests"** item in the side menu shows an orange badge with a number — how many requests arrived **since your last visit** to the section. It is the same "New since your last visit" number, added up across all your locations; every channel and every status counts, as with the counter inside the section. - **It clears itself** when you open the section: the location's number drops to zero at once, in other open tabs too. The **"Refresh"** button counts as a visit as well — the new rows are already in front of you. - **Several locations.** The section opens on the location where something is new; other locations with new requests are marked "New since your last visit: N" in the location selector. - **It refreshes** every few minutes while the tab is open, and right away when you come back to it. - **Only the account owner sees it** — just like the popup, form and site-message channels themselves. - **The first visit in a new browser** starts counting "from this minute": the badge does not greet you with every request of the quarter that you already handled in another browser. Orange means "unread". What needs a decision right now (a booking awaiting confirmation, a guest asking for a callback) also turns red on the **"Needs decision"** item. --- ## Step 3. The request card and the source passport Clicking a row expands the details: **the answers to all the form fields** and the **Source** block — a passport of where the person came from: | Passport line | What it shows | |---|---| | **Surface** | "Your Cenaly storefront" or "Your own site" (with your domain) | | **Widget / Popup campaign** | which product exactly collected the request | | **Page** | the normalised path; the link opens that page | | **Campaign tags** | UTM tags of the visit | | **QR / action link** | if this is one of our QR links, you get "placed on / action" instead of raw tags | | **Came from** | Maps · Search · Social · Direct · Another site | | **Device** | Phone or Computer | Three things worth understanding about this block: - **It is computed at read time** from the fields the channels already store. The passport is not written into the request itself — otherwise it would gain a second truth about its own origin. - **The surface is decided by the page address, not by the channel.** A widget placed on your own domain that serves our storefront is honestly read as the storefront. - **For older requests the block is shorter, not empty.** Records from previous months do not have the newer fields and will not gain them retroactively: missing knowledge is shown by a missing line, not by a dash and not by the word "unknown". There is no personal data in the passport beyond what the visitor left: what goes out is a referral class (one of five values) and a single bit about the device. We store neither the raw referrer nor the browser string anywhere. If the request came from **your own form**, captured by our tag, the card says so honestly: we saw the visitor submit it, not what your backend did with the data. --- ## Step 4. Working with a request The row has three quick actions: - **"Call"** opens the number on the device; - **"Write"** opens the mail client; - **"Open section"** leads to where the request really lives: Appointments, Tables, Customers, "Popups and forms" or the site settings. **The section only reads, and that is deliberate.** Confirming a booking, marking a callback as done, deleting a lead — all of it happens in the profile section. If Requests changed statuses on its own, the same request would end up with two truths about what has already been done to it. That is also why the section has no "request owner": the owner is assigned where the request is handled — in the booking, in the appointment or in the customer card. And **converting into a customer** is exactly what "Open section" does for a callback: the guest card with their whole history lives in [Customers](/en/docs/customers). --- ## Step 5. CSV export The **"Export CSV"** button builds the file **from the visible rows** — respecting the chosen location, group, period, search and filters. In practice that means: first filter the list the way you need it, and only then export. The file includes the source passport columns: surface, widget, UTM tags, referral class, device. It is prepared for Excel (non-Latin characters survive) and protected against formula injection into cells. --- ## Where else the same stream lives The same panel is mounted as the **Requests** tab of the contact centre — the "Guests" section of the [work chat](/en/docs/team-chat) (`/team-chat/?guests=1&tab=leads`). It is one and the same list: the component is shared, and there is no second truth about what the stream contains. The only difference is that there the location selector already sits in the tab row, so the panel does not draw its own. That suits an operator who spends the day in guest conversations: requests and threads end up in one window. --- ## Limitations - **Statuses are not changed here.** The section reads; "handled" is set in the profile section and read back from there. - **There is no section-level "read" mark.** The "new since your last visit" counter and the badge on "Requests" in the menu are local to your browser and your location: a colleague has their own. - **Chat conversations are not included** — guest threads live in the neighbouring tab of the contact centre, and they are not requests. - **Orders are not included** — they have their own section with an operational flow. - **A channel that did not answer is visible.** Such a case lands in a yellow banner "these channels did not answer and may be missing rows": "empty" and "broken" are never silently merged. The exception is callbacks and appointments: for them a missing file reads as "there were no requests", so they do not appear in the banner. - **The section dictionary covers 11 languages** (English, Russian, Georgian, Turkish, Ukrainian, Polish, German, French, Spanish, Italian, Albanian); other languages see the English wording. - **The source passport will not appear retroactively.** For requests collected before it existed some lines are simply absent. --- ## Troubleshooting | Symptom | Check | |---|---| | **The list is empty** | the selected period (it is not unlimited by default), the location in the selector and the "unhandled only" filter | | **The yellow "may be missing rows" banner** | it lists the channels that did not answer a read: a channel may be disconnected or temporarily unavailable — nothing is lost, refresh the page | | **A request from the site did not arrive** | whether our tag is on the page and the widget is on — see [My site: widgets](/en/docs/site-widgets); an installation check lives in that section | | **It arrived but with no contacts** | the visitor did not leave them: the row says "No contact details left". Make the field required in the form settings | | **The "new" counter does not reset for a colleague** | that is expected: the visit marker is local, one per person | | **The badge on "Requests" stays after a visit** | something new arrived at another location: the location selector marks it "New since your last visit: N" — switch to it | | **There is no badge on "Requests" at all** | only the account owner sees it; in a private browser window the visit marker is not saved, so there is nothing to count from | | **The passport has no "Page" or "Came from" line** | the request is old, or the channel does not provide those fields — missing knowledge is shown by a missing line | | **The status does not change** | it is not meant to change here: press "Open section" and change it where the request lives | | **The CSV does not contain all rows** | the file is built from what is visible: drop the filters and widen the period before exporting | A symptom-by-symptom walkthrough lives in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — see [how to get help](/en/docs/support). --- ## FAQ ### How is Requests different from Customers? Requests is a stream of enquiries over a period: who contacted you and when. [Customers](/en/docs/customers) is a directory of people: the guest card, history, debts, segments. A callback in Requests leads exactly into the customer card. ### Why is a service booking in both Requests and Appointments? Because it is the same booking seen from two sides. In Requests you see it as an enquiry in the common stream; in [Appointments](/en/docs/appointments) as an event in the calendar with confirmation, rescheduling and reminders. There is no copy of the data. ### Can I assign an owner to a request? Not in this section. The owner is assigned where the request is handled: in the booking, the appointment, the customer card or the guest chat thread. ### What do "Your Cenaly storefront" and "Your own site" mean? The surface is decided by the address of the page where the request was left. If the widget sits on your own site (WordPress, Tilda, hand-written) it is "Your own site". If the form was opened on the storefront we built for you, it is the storefront — even when it runs on your domain. ### Do requests feed advertising statistics? The source passport carries UTM tags and the referral class, and both are exported to CSV — enough to match enquiries to an ad campaign. The campaigns and their budgets themselves live in the advertising sections. ### Who sees the personal data in requests? Whoever the role gives section access to. The rows are personal data left by a visitor, so access is worth opening only to the people who actually process enquiries; see [data and security](/en/docs/security-privacy). --- ## Related articles - [My site: widgets](/en/docs/site-widgets) — the popups, forms and buttons that collect requests - [Callback](/en/docs/callback) and [the order widget](/en/docs/order-widget) — enquiry channels that do not require a call to you - [Customers](/en/docs/customers) — the guest card a callback request leads to - [Appointments](/en/docs/appointments) and [Tables](/en/docs/tables) — where bookings are confirmed - [Team chat and guests](/en/docs/team-chat) — the same panel as a tab of the contact centre - [Guest chat](/en/docs/chat) — conversations, which are not requests - [App store](/en/docs/app-store) — where the paid source channels are switched on - [Data and security](/en/docs/security-privacy) — who sees visitors' contact details --- # Support tickets: a number, a status and a reply for the guest Chat works well when an operator is there and the question takes a minute. But a complaint about an order, a return, a question about a booking or an appointment outlives a single conversation: the guest leaves the page, comes back two days later from another phone and wants to know what happened to their question. **Tickets** give the guest a number, a status and an email about the reply — and give you order: nothing gets lost in the chat feed. > **This section is rolling out in stages.** If there is no "Support requests" card in "My Site" yet, it will appear with the next update. On the business's own website the tab appears after the chat widget is updated. --- ## What a ticket is and how it differs from chat A ticket is the same conversation with a guest, but with a **number**, a **subject** and a **category**. There is no separate "Tickets" section: tickets land in the same place as chat — **Admin panel → Team chat → Guests**. Replies, assignment, notes and templates are all shared. | | Chat | Ticket | |---|---|---| | When it fits | a quick "here and now" question | a question that is not solved at once | | What the guest gets | a reply in the chat window | a number, a status, emails about every step | | Coming back from another device | not possible | possible — after a code from the email | | Form | one field | category, description, category questions, files | > **Tickets are not "Leads".** [Leads](/en/docs/leads) collect sales requests: pop-ups, forms, callback requests. Tickets are support: the guest is already your customer and something went wrong. --- ## What you need to get started - **Guest chat turned on.** Tickets are a tab of the chat window; without the chat the tab has nowhere to appear. How to turn the chat on — see [Guest chat](/en/docs/chat). - **On your own website** — also the chat widget from [My Site](/en/docs/site-widgets). On a storefront we built for you nothing else needs to be installed. - **A role** with access to guest chat (to reply) and to "My Site" (to turn tickets on). - **Plan** — any: tickets are free, just like the chat. - **A data processing policy** — better published: the guest ticks a consent box in the form, and a link to your document from [Legal documents](/en/docs/legal-docs) is shown under it. --- ## Step 1. Turn tickets on **Admin panel → My Site** (`admin.cenaly.com/embed`) → the **"🎫 Support requests"** card right after "Chat" → **Turn on**. The **Configure** button opens a window with the essentials: - a **"what the guest sees now"** line. If live chat is off, the window says plainly that the tab has nowhere to appear and offers "Set up chat". If the chat is not connected on your website — "Turn on on the website"; - **categories** at a glance — what the guest will be able to choose; - **"Guest email is required"** — on by default: without an email, a guest who leaves the page never learns about your reply. Changes are saved automatically. The link at the bottom of the window leads to the full settings section. --- ## Step 2. Set up categories **Team chat → Guests → Settings → "Tickets"** (the "General" group). On the first turn-on we add **typical categories for your business type**: a café gets "Dish quality", "Delivery", "Reservation", "Payment"; a shop — "Order not received", "Return or exchange", "Warranty", "Product quality"; a salon — "Booking", "Service quality", "Gift certificate"; a hotel — "Room", "Reservation", "Bill". Every set has "Other". From there the list is yours: | What you set | Why | |---|---| | Name and icon | this is how the guest sees the category in the form | | What the ticket is about | the form asks for an order, booking, appointment, hotel room or product | | Extra questions (up to 10) | for example, the reason for a return — free text or a choice list | | Assignee | who gets such tickets right away | | Priority | a ticket of this category gets the right priority in the inbox at once | The order in the list is the order of tiles in the guest form. Up to 20 categories. **"Restore typical ones"** replaces the list with the original set. If you delete a category, tickets already submitted with it are not lost — they show "Other" instead. --- ## Step 3. Guest form, number and emails In the same section: - **Ticket number.** A prefix (up to 6 characters: Latin letters, digits, `#` and a hyphen) and the first number — `#1001` by default. Numbers run consecutively per location; numbers already issued never change. - **Guest form.** "Guest email is required", "Confirm the email before submitting" (less spam, but some guests will not get to the send button), "Offer Help articles first" — some questions get answered without a ticket, see [Help center](/en/docs/help-center). - **Files.** Photos and PDF: up to 5 files of 8 MB each by default, 10 files of 10 MB at most. - **After it is resolved.** How many days the guest can reopen a resolved ticket (14 by default, from 0 to 90; 0 — not allowed) and whether the guest can close the ticket themselves. - **AI assistant on tickets.** "Prepares a draft reply" by default: the assistant writes, a staff member sends. A reply to a ticket is the business's word, so auto-reply stays off until you choose "Same as in the chat" yourself. - **Emails to the guest.** "Ticket received", "You have a reply", "We are waiting for your answer", "Ticket resolved" — each can be turned off. --- ## Step 4. What the guest sees A **"Requests"** tab appears in the chat window next to "Chat" and "Help". 1. **New request.** The guest picks a topic tile, writes a short subject and a description, answers the category questions, optionally points to an order, a booking or an appointment, attaches files, leaves a name and an email and agrees to data processing. 2. **Number.** After sending — "Request #1042 received". The same number arrives by email. 3. **Status.** "Received" → "In progress" → "Waiting for your reply" → "Resolved". Once the reopening window is over — "Closed". 4. **Reply.** The guest reads your reply in the tab or via the link in the email — it opens the request page where they can reply, attach a file, close or reopen the request and rate the resolution. 5. **My requests.** From the same browser the list is visible right away. To see all their requests from another device, the guest presses "Show all by email", receives a **6-digit code** by email (valid for 15 minutes) and enters it. "Forget this device" ends that sign-in. The guest form is translated into 44 languages. --- ## Step 5. Working with tickets in the inbox **Team chat → Guests → Inbox → the "Tickets" view** — all tickets in any status, with their own counter. - **In the list row** — a "#1042 · subject" chip with the category icon; its colour shows the status. - **Search** finds a ticket by number (`#1042` or just `1042`) and by subject. "Filters" have the category. - **Above the conversation** — the ticket block: what the guest sees right now, until what date they can reopen, a link to the order, appointment or booking. The category changes in one click; the pencil opens editing of the subject and fields. - **The guest's status changes from ordinary actions:** you replied or assigned someone — "In progress"; you set "waiting for the guest" — "Waiting for your reply"; you finished the conversation — "Resolved". - **Create a ticket for a guest.** The guest called or came in person — the **"+"** button above the list: name, email or phone, what happened, category. The "guest agrees to receive emails" mark is needed for notifications to reach them. - **Turn a conversation into a ticket.** A chat grew into an investigation — "Turn into a ticket" in the conversation menu: the messages stay, a number appears. --- ## Extra entry points for the guest - **In the "Help" tab** under the articles — a "Didn't find an answer? Contact support" line. - **A link or a button on your website**: a page address ending in `#cenaly=support` opens the window right on requests, and `#cenaly=support:` opens the form of that category. Ready-made links and QR codes are in the "Links and QR codes for actions" block of "My Site". - **[Multibutton](/en/docs/multibutton)** — the "Contact support" channel. If tickets are off, the link and the multibutton channel open the regular chat, and the line in "Help" is not shown. --- ## Limitations - **No "requests only" mode yet** — a window without live chat. Tickets work as a tab next to the chat. - **A category's own response time does not apply yet.** The "First response" and "Resolution" fields of a category are saved, but the general time from the "SLA" section of chat settings is what is tracked. - **Replying to the email is not possible.** The guest replies in the "Requests" tab or on the page opened from the email link. - **The link to an order is not verified.** The guest picks an order from their history on this site or types a number — check it against [Orders](/en/docs/orders). - **Emails are sent only with an email address and consent.** A request without an email lives only in the guest's browser. - **One "You have a reply" email per 10 minutes.** A burst of short replies does not turn into a burst of emails. AI replies and internal notes never trigger an email. - **Panel settings are available in English, Russian, Georgian and Turkish**; in other languages this section is shown in English. - **Anti-spam limits:** 5 requests a day from one browser, 20 per email address; a confirmation code — no more than once in 30 seconds and 3 emails a day. --- ## Troubleshooting | Symptom | Check | |---|---| | **The guest has no "Requests" tab** | whether "Accept tickets" is on and guest chat is on; on your own site — whether the chat widget is installed ([My Site](/en/docs/site-widgets)) | | **No "Support requests" card in "My Site"** | the section is rolling out in stages — it will appear with the next panel update | | **The guest did not get an email** | whether they left an email and ticked consent; whether that email is enabled under "Emails to the guest"; whether the guest closed the request themselves (then no "resolved" email is sent) | | **The guest cannot see their old requests** | from another device a code sign-in is needed: "Show all by email". Requests submitted with that email are shown | | **The code does not arrive** | the spam folder; it can be re-sent after 30 seconds, no more than 3 emails a day per address | | **"This request is closed. Please create a new one"** | the reopening window is over (14 days by default) — change it under "After it is resolved" | | **A file did not attach** | photos (JPEG, PNG, WebP, GIF) and PDF up to the set size are accepted | | **After "Create ticket" the number did not show up at once** | the number is issued within a few seconds — the ticket appears in the list by itself; do not send again, there will be no duplicate | | **The ticket's category shows "Other"** | the category was deleted from settings after the ticket was submitted | General symptom guide — [Troubleshooting](/en/docs/troubleshooting); if nothing helped — [how to get help](/en/docs/support). --- ## Frequently asked questions ### How much does it cost? Nothing: tickets are part of guest chat and need no separate extension. ### Can I run tickets without live chat? Not yet: the tab lives in the chat window. A "requests only" mode is in the works. ### A guest wrote in chat, but the question turned out to be complex. What do I do? Choose "Turn into a ticket" in the conversation menu. The messages stay in place, and the guest gets a number and emails about further steps — if the conversation has their email and consent. ### Will the guest see internal notes? No. Staff notes, AI drafts and service lines about assignment are not shown to the guest — they only see replies and status changes. ### What happens to numbers if I change the prefix? New tickets get the new prefix, old ones stay as they were. Search finds a ticket by bare digits too. ### Where are the guest's contacts stored? The guest's email and phone are stored separately from the conversation and are visible only to staff with access to guest chat. More — [Data and security](/en/docs/security-privacy). ### Does it work on cenaly.ru? Yes, the same way: submitting, statuses, emails, the confirmation code and attachments. --- ## Related sections - [Guest chat](/en/docs/chat) — the chat window that hosts the "Requests" tab, and inbox settings - [Team chat and guests](/en/docs/team-chat) — where staff see conversations and tickets - [My Site: widgets](/en/docs/site-widgets) — the "Support requests" card, the chat widget on your own site, links and QR - [Help center](/en/docs/help-center) — articles the guest sees before the request form - [Multibutton](/en/docs/multibutton) — the "Contact support" channel - [Leads](/en/docs/leads) — sales requests: forms, pop-ups, callbacks - [Legal documents](/en/docs/legal-docs) — the policy the guest agrees to - [Data and security](/en/docs/security-privacy) — who sees guests' contacts --- # Mail and the AI auto-responder A small business usually gets mail in two inconvenient shapes: the owner's personal mailbox, which suppliers and guests write to — or mail hosting that has to be bought and configured separately. The **Mail** section offers a third: **the venue's own mailboxes right inside the panel** — and a proper client to work in them. Open: **Admin panel → Mail** (`admin.cenaly.com/mail`, the "Work" group). No extension needs to be switched on: the section is open to every role, and the only gate is section access in the role settings. The owner sees and administers every mailbox of the account, an employee sees their own (the server filters that, not the interface). --- ## What you need to start | What | Why | |---|---| | **The account owner role** | only the owner creates, deletes and shares mailboxes | | **At least one location** | the mailbox address is built from its subdomain; an "all locations" mailbox lives on the company subdomain | | **Staff with logins** | to create a personal mailbox for an employee and to open a shared one to them; see [Employees](/en/docs/staff) | | **Your own domain** — optional | if the address has to look like `info@yourcompany.com`; you need access to the domain's DNS | | **A connected AI model** — optional | for reply assistants, AI filing rules and the AI agent; see [AI models](/en/docs/ai-models) | --- ## Step 1. Your first mailbox The **"New mailbox"** button. The form has four fields: **"Name before @"** (lowercase Latin letters, digits, dot, hyphen, underscore — `anna`, `info`, `orders`), **"Location"** — a specific location (the address sits on its subdomain) or "All locations" (then the address lives on the company subdomain, which is set once), **"Type"**, and **"Display name"** — what recipients will see. **Four types of mailbox:** | Type | What it is for | |---|---| | **Employee** | a person's personal mailbox | | **Shared** | a mailbox for a location or a department, for the owner and managers | | **AI agent** | a mailbox whose incoming mail is handled by the AI agent (see below) | | **Calls** | a service receiver for voicemail and call transcripts | A mailbox can be **disabled** (the address stops accepting mail) and **deleted**. Deletion is the owner's only: it frees the address for a new mailbox and **erases the mail**, so the confirmation shows the address in its text and cannot be undone. For the service "Calls" mailbox the panel also removes the source card in the [Calls](/en/docs/calls) section. **Mailbox statistics** (the "Statistics" tab in mail settings — an employee sees it for their own mailbox too): received, sent, how many incoming messages had attachments and how much volume — over 24 hours, 7 days, 30 days and all time. The numbers are computed on read from the message list, so they always agree with what you see in the folder. --- ## Step 2. Your own domain The **"Your own domain"** button — a three-step wizard: 1. **Enter the domain.** The safest choice is a subdomain like `mail.yourcompany.com`: the mail that already works on the main domain keeps working. 2. **Add the DNS records** at your registrar. Every record has a "Copy" button, and next to them are the two warnings this step exists for: - an MX record on the **apex** (the domain itself, not a subdomain) switches off the mail service you use on it today (Google Workspace, Microsoft 365 and so on); - **a second SPF record breaks the check entirely** — if SPF already exists, our fragment must be added inside the existing record, not as a new one. 3. **"Check".** The server verifies the records and reports on each: "record found" or "record not there yet". Records usually propagate within minutes. A verified domain appears as its own group in the mailbox creation form — from there mailboxes on it are created as usual. --- ## Step 3. Connecting your Gmail or Yandex If you already have a mailbox and do not want to change the address, you can **connect** it: mail will arrive and be sent straight from the panel. The **"Connect your own mailbox"** button — again three steps: 1. **The e-mail address**, in full, for example `info@your-restaurant.com`. 2. The server **detects the mail system** from the domain's DNS records and shows that system's own instructions in your language: where to go and how to obtain an **app password** (such systems will not accept the ordinary account password). If the system could not be detected, the IMAP and SMTP server addresses can be typed in by hand. 3. **The result** — how many messages were fetched right away. The password goes to the server once and is never returned back. Here you also choose who can use the mailbox: the owner and managers, or one employee. ⚠️ A connected third-party mailbox is **only disconnected**, never deleted: the mail stays with your provider, we do not touch it. --- ## Step 4. Reading and writing On the left is the mailbox bar, next to it the folder rail: **"Inbox" → your folders → "All mail" → "Sent"**. **List and reading.** Messages load as you scroll; a message has tags, a read state and "Mark all as read". A message's foreign markup is shown in an isolated frame and cannot affect the panel. Above the list there is a search box and three filters: **"Unread"**, **"With attachments"** and by **tags** (any of the selected ones). ⚠️ The search goes over **list rows** — addresses, the subject and the beginning of the message — and not over message bodies: a word from the middle of a long letter will not be found. **Compose.** The **"Compose"** button opens a window with the usual set: "To", "Cc", "Subject", formatted text, attachments. The signature is inserted into a new message automatically (switched on in settings), and reply templates are shared across the account. **A reply quotes the original**: the body opens empty, the signature sits below it, and under that comes "On {date}, {sender} wrote:" and the text of the original message. The **text** is quoted, not the markup; a quote alone does not count as a message — "Send" waits until your own text appears. **Drafts are not lost.** What you type is kept in the browser: a misclick outside the window, F5 or a drained tablet do not erase the message — on return you get a "Draft restored" banner with a "Discard" button. The draft is separate per mailbox and per reply, so a draft from a shared mailbox never surfaces in a personal one. **The fate of a sent message.** In "Sent" the row carries a delivery chip: **"Delivered"**, **"Not delivered"** or **"Marked as spam"**. No field means no chip at all: "unknown" is a normal state (the event has not arrived yet), and a grey question mark would alarm people where everything is fine. "Not delivered" usually means a non-existent address on the other side, not a fault of the service. --- ## Step 5. Folders and filing rules The **"Folders"** tab in mail settings. **Folders.** Up to 30 of your own folders per mailbox: a name and a colour. A message is moved by hand with the selector in the message card, and the row shows a folder chip. As soon as the first folder appears, "Inbox" starts to mean "not filed yet" — which is why **"All mail"** shows up next to it: otherwise a filed message would look lost. Deleting a folder **does not delete** the mail — it returns to the "Inbox", and the rules that pointed at it are cleared. **Rules.** Up to 20 per mailbox, and the order decides: the first matching rule wins, so important ones are moved up. A rule comes in one of two modes: | Mode | How it works | |---|---| | **By conditions** | sender (a full address or a domain — `bank.com` also catches `mail.bank.com`), "To"/"Cc", subject, message text, "with attachments only". Conditions combine with AND, values inside one condition with OR. Fires **instantly**, at delivery | | **AI decides** | a description in words: "a job application with a CV attached", "supplier invoices". Such a message is filed **within a few minutes** — a background pass handles it, not the delivery. Conditions remain a pre-filter | The difference is spelled out in the interface itself; the model call is paid and goes through the usual AI accounting, and on `cenaly.ru` a local model is used. A rule can also **mark the message as read right away**, and the **"Apply to mail already here"** button runs the rules over the top unfiled messages. **A manual move beats the rules**: a re-delivery and the background pass will not override your filing. ⚠️ A rule with no conditions and no AI description would take every message — the panel warns about that and will not save it. --- ## Step 6. Staff access to a mailbox The **"Access"** tab (owner only). For every employee with a login, one of three levels: | Level | What is allowed | |---|---| | **No access** | the mailbox is not visible | | **Read** | see messages, mark them read, add tags and file them into folders | | **Read and send** | the same plus sending mail **from the mailbox address** | Up to 50 people per mailbox. "Read" physically cannot send a message: the ban lives on the server, not only in the interface. The mailbox settings themselves stay with the owner in both cases. The mailbox owner and the account owner are not shown in the list — their access is full anyway. --- ## Auto-reply The **"Auto-reply"** block in mail settings — available for every type of mailbox **except the AI agent** (there the agent itself is responsible for answers). The **"Answer incoming mail automatically"** toggle (an enabled auto-reply is marked with a "↩" chip in the mailbox bar), **"Subject of the answer"** (empty — the incoming subject with "Re:" is used), **"Text of the answer"**, the **"Active from" / "Active until"** window (empty dates mean no limit, both dates inclusive) and **"Pause between answers to one address, hours"** — the loop guard, where zero means the server default. The answer is sent by **the server at the moment the message is delivered**, not by an open panel — there is no need to keep a tab open. Three independent guards stand between you and a loop of two auto-responders: recognition of auto-reply and bulk-mail markers (our own answer also goes out marked as automatic), the per-sender pause, and an "already answered" marker — a re-delivery will not produce a second answer. ⚠️ **On `cenaly.ru` the auto-reply can be configured but does not answer** — the service that executes it runs only in the AWS contour. This is the one place where a setting is saved but no action follows; see "Limitations". --- ## AI reply assistants These are **prompters**, not automation: they write a draft, and you send the message. Assistants are created by the owner in mail settings → **"Assistants"** (up to 20 per account). Each one has: - a **Name** — "Sales", "Support", "Bookings"; - **Instructions** (up to 4000 characters) — who it is and how it answers: what to offer, what to avoid, how to react to complaints; - a **tone** and a **reply language** ("As in the message" or a specific one); - the **location** it replies on behalf of; - **Data access** — toggles: "Catalogue and prices", "Sender's orders" (by their address), "Business card" (name, address, phone, opening hours) and the **knowledge base** (do not use / the entire base / up to three selected collections). In the reply window an employee picks an assistant from the list, optionally adds a one-off hint ("decline politely") and presses **"Suggest a reply"**. The assistant reads the **incoming message** — the one you are replying to — and returns a draft; in a new message without an original the panel says so. Nothing is sent or rewritten silently: you insert the text into the message yourself, above the signature and the quote. Phrases like "I am an AI" in a draft are highlighted with a warning. Under the list the owner sees an "Access: …" line — which toggles the chosen assistant has on; instructions and toggles are not shown to employees. From the knowledge base the assistant takes **only the documents open to clients**: the answer goes outside. --- ## The mailbox AI agent If a mailbox was created with the **"AI agent"** type, it sorts the incoming mail itself. Its settings have five tabs: | Tab | What is there | |---|---| | **Profile** | the general description of its work and detailed instructions; the "Process incoming mail automatically" and "Self-learning" toggles; the **reply mode** — "Send it to the sender" or "Only save a draft for me"; **behaviour outside the rules** — "Let the agent decide on its own" (with a confidence threshold: below it a draft is left) or "Leave the message alone"; the addresses notified about escalations | | **Contacts** | the only list of recipients the rules and the free mode draw "forward to whom" and "message in the work chat to whom" from. The agent writes to nobody else | | **Rules** | condition → action: message type, keywords, senders, languages, presence of attachments → "Reply", "Forward", "Add tags", "Post in the work chat", "Escalate to a human", "Do nothing". They are executed by an ordinary engine, not by the model | | **Learning** | the short instructions the agent worked out; you can edit, delete and clear them | | **Log** | what the agent did with each message: the category, the rule that fired, the chain of actions, the draft reply. Read-only | There are two buttons for checking: **"Test run"** — the rules are run without a single message leaving, and the result lands in the log; **"Run the agent"** — hand a particular message to the agent once more under the current settings. The agent's access to private [knowledge base](/en/docs/knowledge-base) documents is switched on **per document** — with the "available from mail" toggle. --- ## Links to tasks and CRM - **A message from a task.** The "✉️ Write" button in a task card opens the compose window **over the task** — the person is not thrown out of the task and out of the conversation — and the sent message is remembered in it: you can see that the supplier has already been written to and whether they answered. See [Shift tasks](/en/docs/tasks). - **A message in a counterparty card.** A delivered incoming message lands as an activity in the counterparty card in [Companies and invoices](/en/docs/counterparties) — matched by address, switched on with a toggle in the CRM "Automation" section. From the card a link leads straight back to the message, into the right folder. - **The AI assistant spark** is present on three of the more complex mail surfaces — "Folders", the AI agent settings and "Your own domains": it explains that particular block. --- ## Limitations - **The search does not look inside message bodies.** It covers addresses, the subject and the beginning of a message; a folder list is capped and held entirely in the tab's memory. - **There are no server-side drafts.** A draft lives in the browser: you will not see it on another device, and one older than a week is not offered. - **On `cenaly.ru` there are no AI agent mailboxes, no auto-reply and no delivery chip.** An "AI agent" mailbox cannot be created there; auto-reply settings are saved, but there is nobody to answer the mail; delivery and spam-complaint events arrive only in the AWS contour. Everything else — mailboxes, folders, rules, assistants — works in both clouds. - **"AI decides" rules do not fire instantly** — they run within a few minutes of delivery, and every pass is billed as an ordinary AI call. Rules by conditions work immediately and for free. - **A connected third-party mailbox is disconnected, not deleted** — its mail stays with the provider. Deleting **your own** mailbox, on the contrary, is irreversible: the address is freed and the mail is erased. - **Caps**: 30 folders and 20 filing rules per mailbox, 50 people per mailbox in "Access", 20 assistants per account, assistant instructions up to 4000 characters. A mailbox also has a daily sending limit and a cap on recipients — the panel will tell you if you hit them. - **A domain is not verified instantly.** In the first minutes after the domain's first mailbox is created, sending may be rejected with a "the domain is still being verified by the mail provider" note — that is normal. --- ## Troubleshooting | Symptom | Check | |---|---| | **"The mail service is unavailable"** | the service in this contour is temporarily not answering — the page does not crash and nothing is lost; retry in a minute | | **"No access to the mailbox"** | an employee opens only their own mailbox and the ones the owner granted in the "Access" tab | | **A message will not send** | the mailbox's daily limit, the number of recipients, the access level ("Read" cannot send), an address on the non-delivery blocklist | | **Mail to your own domain does not arrive** | whether all required DNS records were added and what the "Check" button says; a second SPF record breaks the check entirely | | **A connected Gmail will not connect** | you need an **app password**, not the account password: the link to create one is right in the wizard | | **A rule did not fire** | the order of the rules (the first match wins), the rule mode ("AI decides" takes a few minutes) and a manual move — it beats the rules | | **A message "disappeared" from the Inbox** | a rule filed it: look at "All mail" and the folder chip in the row | | **The auto-reply does not answer** | whether it is on, whether today falls inside the "from… until…" window, whether the pause for that sender applied; on `cenaly.ru` the auto-reply does not work | | **The assistant answers off the point** | check its instructions and data access toggles: it only takes facts from the sources you enabled | A symptom-by-symptom walkthrough lives in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — see [how to get help](/en/docs/support). --- ## FAQ ### Do I need to buy mail hosting? No. Mailboxes like `anna@location.cenaly.com` work straight away, without a domain and without a third-party provider. Your own domain is only needed if the address has to look like yours. ### Can I keep my Gmail and still work in the panel? Yes — the "Connect your own mailbox" wizard fetches mail over IMAP in three steps and sends through your SMTP. The address and the messages stay with your provider. ### How is a reply assistant different from the AI agent? An assistant is a **prompter**: it writes a draft, and you send the message. The agent is a **separate type of mailbox**: it sorts incoming mail by your rules and, if you allow it, answers on its own. The agent exists only in the AWS contour. ### Does the auto-reply work on cenaly.ru? It can be configured, but **no automatic answers go out there**: the service that replies to mail runs only in the AWS contour. So far this is the one place in the section where a setting is saved but no action follows. ### Who can read a shared mailbox? The people the owner granted access to in the "Access" tab, and the owner themselves. The "Read" level really only reads: the ban on sending lives on the server. ### What happens to the mail if I delete a mailbox? It is erased, and the address is freed for a new mailbox. That is irreversible, which is why the confirmation shows the address in its text. If you only want to stop receiving mail — disable the mailbox instead of deleting it. --- ## Related articles - [Employees and shifts](/en/docs/staff) — the logins mailboxes are created for and access is granted to - [Team chat and guests](/en/docs/team-chat) — internal messaging and guest conversations, not to be confused with mail - [Shift tasks](/en/docs/tasks) — a message sent straight from a task card - [Companies and invoices](/en/docs/counterparties) — an incoming message as an activity in a counterparty card - [Knowledge base](/en/docs/knowledge-base) — where the assistants and the agent take facts from - [AI models and your own key](/en/docs/ai-models) — which provider powers the AI features of mail - [Calls](/en/docs/calls) — the service "Calls" mailbox and call transcripts - [Data and security](/en/docs/security-privacy) — where mail lives and who has access to it --- # Staff training Training in a small business usually looks like this: the new hire is handed a folder of playbooks, shown the job once during a shift, and everyone hopes it stuck. A month later it turns out it did not, and asking felt awkward. The **Training** section turns your own documents into a working trainer: the system breaks playbooks and instructions down into processes, concepts and questions, hands them to the team in short sessions, brings back what was forgotten and shows you who can be put on a shift today. Open: **Admin panel → Training** (`admin.cenaly.com/learning`). The section is visible by default — no extension to switch on. The **document library, however, lives in the [knowledge base](/en/docs/knowledge-base)**, and that one is hidden by default: switch on the "Knowledge base" card in the [app store](/en/docs/app-store) if you have not yet. --- ## What this is | Who | What they see | |---|---| | **Owner, manager** | the material build, the process map, a "practice yourself" mode and the team's progress. Tabs live in the address (`?set=overview` and so on): **Overview**, **Practice**, **Staff**, **Processes** | | **An employee with their own login** | only their own training — the "My training" screen with the **Session** and **My progress** tabs. Source documents are out of reach: they see questions and explanations, not your library | The split is automatic, there is nothing to configure: whoever signs in sees their own side. Employee logins are issued in the [Employees](/en/docs/staff) section. --- ## What you need to start | What | Why | |---|---| | **At least one processed document** in the knowledge base | there is nothing to teach from while the library is empty. The build button says so plainly: "Upload and process at least one document first" | | **A knowledge base collection** (one shared one is fine) | material is built from the chosen collection — you can train on a narrow set of documents instead of the whole library | | **A collection with the "Training" purpose** | required for the process map and scenario questions: edit the collection in the knowledge base and set that purpose | | **Logins for the team** | without their own login a person gets neither sessions nor progress | | **Devices** | nothing special: a session runs in the browser, a phone included | Roles: the owner and the manager build material and watch progress; everyone with a login can train. --- ## Step 1. Build the training material On the **Overview** tab press **Build training materials**. The build runs in the background and says what it is busy with: "Reading the knowledge base…" → "Extracting core concepts…" → "Grouping into topics…" → "Composing quizzes…" → "Finalising…". You can leave the page — pressing again during a build honestly answers "materials are already being built". What comes out: - **Topics** — one per knowledge area of your base, each with a summary; - **Concepts** — terms and rules with a definition, examples and a link to the source document; if a concept is backed by a fragment that contains a diagram or a photo, the card gets that picture from the document; - **Quizzes** — questions whose correct answer is a statement of the article, while the wrong options are drawn from its own "what not to say" and from neighbouring topics. That is why the questions test your playbook and not general ideas about politeness. When documents change, a note appears above the material — "Your documents changed — rebuild to refresh the materials" — with a **Rebuild** button. The rebuild is careful with people: rephrasing a question resets nothing, changing the correct answer resets only the evidence for that question, and a **changed rule of the playbook** lands in the mandatory part of the employee's next session marked "changed". ### How to share the material with your staff Built material becomes a **course** — one per knowledge base collection, so your own base and one installed from the catalog live side by side instead of overwriting each other. In the course list on the Overview each course has an **Addressed to staff** switch — that is what "sharing" means here: switch it on and every employee with a login gets the course. The line under the switch says who sees it right now: "Every employee with a login sees it" or "Only you see it". If every course is switched off, the screen says so too — from the outside that looks like training has disappeared. You do **not** have to assign anything person by person: an assignment with a deadline (the Staff tab) is about "this person, by Friday", not about access to the material. While there is no material yet, the screen spells out the whole path — "add materials → address the course to staff → assign to particular people if you need to" — and offers two doors to the first step: **Add documents** and **Take a ready-made base** (ready-made bases for front-line staff live in the catalog inside the knowledge base). --- ## Step 2. Processes: what exactly to teach The **Processes** tab is what makes this more than a pile of tests. **Business processes** are extracted from your documents: steps, branches, conditions, endings — each with a quote from the document. | What is on the process card | Why | |---|---| | Status **ready / draft / blocked** | "blocked" means "cannot be taught, there are findings in the way" | | The **Description completeness**, **Backed by documents**, **Steps reachable** and **Can be checked** gauges | you see what exactly your playbook is missing | | **Applies to** | you confirm which workplaces need this process. Until you do, it is not assigned to anyone | | **Mentioned, but no procedure** | the documents talk about it but never say what to do step by step: a list of holes worth filling | | Findings: **"blocking" / "needs fixing" / "worth a look"** | split by severity, so you fix what breaks training first | Next to it sits the document's training access: a document can be barred from producing questions and verbatim quotes, and then it stays a source of meaning without ending up in the trainer word for word. --- ## Step 3. How an employee learns The employee opens **Training** and sees "My training". - **Session.** A badge "Time to review: N" and a **Start session** button. A session is a server-side object: F5 or a closed tab bring them back to the same step, not to the beginning. - **My processes.** A list of what the person is mastering, with statuses: "review needed", "a rule changed — needs a repeat", "theory verified", "theory needs refreshing". - **Time budget.** Chips for 3, 5 and 10 minutes: the session adapts to how much time there is right now. - **Inside a session.** A mini-map of the process areas, terms highlighted with a popover holding the definition and the quote (the next answer is then marked "with the reference open"), and after each answer an explanation: the correct option, the reasoning and the "why". The formats go beyond "pick an option": a decision in context, the next step, spot the violation, put steps in order by dragging, matching. - **A mistake is not drilled immediately.** The question that was missed comes back later in the session or in the next one — memory works better that way than with an instant repeat. - **"Is this question ambiguous?"** — if the employee thinks the verdict is wrong, they say so with one button. It is a note to the owner about the material and does not affect their result. - **My progress.** Mastery per process, the streak, upcoming reviews and the **Training history**: past sessions with the date, the kind (practice / review / check), "N of M correct" and each mistake spelled out — which area, what the question actually said, "incorrect" or "partly correct", plus the marks "with the reference open" and "answered it later unaided". The correct answer is deliberately absent from the history: that question will come back as a review, and a list with keys would turn the repeat into recognising a string. - **"I know it — test me".** An experienced employee does not have to walk a process from the start: the button hands out one of the hardest questions per area. Answered correctly on the first try and unaided — the area is confirmed and moves to a long interval; missed — the area goes into the normal route. There is no instant retry in this mode, and the screen says so up front: this is a check, not a lesson. --- ## Step 4. Exam, practice and clearance Once enough theory has accumulated, **Check theory** appears on the process. | What | How it works | |---|---| | **The ticket** | assembled from the process, with mandatory coverage of critical goals. There are no term popovers and no instant verdicts in an exam — the breakdown arrives after you finish | | **Threshold and attempts** | the screen names the pass threshold in per cent and the attempt number; the weekly attempt limit and the cooldown are shown as the date of the next possible attempt | | **Safety rule** | if a question tests a rule you must not get wrong, per cent do not help: the attempt is not passed, and the screen explains why | | **Validity** | a pass is valid until a specific date ("Theory verified until …"); a changed rule of the playbook annuls the pass for that process | | **Practice** | a separate kind of task on the [shift task board](/en/docs/tasks): it is closed by an **observer**, not by the learner, and that closure becomes the proof of practice | | **Clearance** | theory **and** practice together; for a critical process — plus the confirmation of the process owner. The clearance runs out with the shorter of the two halves | Clearance is not decoration: a task on the board can carry a gate "requires a qualification in process X", and without valid clearance such a task will not close. --- ## Step 5. Control: who is ready for the shift The **Staff** tab answers one question: who can be put on a process today. - **The "processes × team" matrix.** The cell where an employee meets a process is a traffic light: ready to be checked / theory verified / waiting for the process owner / expired / nothing to learn from / not started. Two scales switch next to it: **Retention** — the forecast of whether the person would recall it right now (it fades by itself over time) — and **Demonstrated**: the fact, areas walked unaided and without hints (it does not fade). - **Needs a decision.** Only what requires action: "N employees cannot be put on the critical process X", "N have clearance expiring within 14 days", "N have it expired". Next to it — **Assign training**: a track, a due date, who to — and the people get a message in the work chat. - **Questions in doubt.** Three sources in one list: staff complaints, statistics (first-attempt error rate and "discrimination" — whether the people who miss it are exactly those who master the neighbouring areas) and the build's own objections. Findings are split: **"The build refused to serve these"** — employees never see them at all, fixed by editing the document; **"Worth a look"** — the question works, the build merely has a doubt. - **Schedule calibration** — a check on the planner: "we promised recall with a probability of 0.85 — it happened in 0.71 of cases". It sits at the bottom of the tab because it is not today's work. - **Clearance and readiness** on the Overview — the same facts on the first screen. If there is nothing to decide, the block is not there at all: an "all good" banner trains people to skip that spot. - **Emails.** Once a week the owner gets a digest: what is expiring, what expired, what waits for their confirmation and which critical processes have nobody ready. Nothing to write about — no email. Before a shift the employee gets a reminder like "a shift in 3 hours — 4 questions, 5 minutes, 1 of them mandatory". --- ## Limitations - **Training grows out of the knowledge base.** No documents, no material; a weak playbook yields weak questions. Scenario formats and the exam work where a process could be extracted from the documents; where there are no processes, sessions run on topics. - **The practice half of clearance depends on a platform setting.** Until the signing of observer receipts is enabled in your cloud, a closed practice task is not counted: theory still counts, clearance stays incomplete (training itself works as usual). If practice is being closed and clearance is still not issued — write to support, it is a setting on our side. - **Nothing runs "on a timer".** Recalculating validity, processing practice receipts and reminders happen when a person opens training (and some of it when the owner opens the statistics). An employee who never opens the section will not get an email about their expired clearance — but you will see it in the matrix. - **The pre-shift reminder needs a shift schedule.** No schedule, no reminder: we do not write by the calendar. A moved shift moves the reminder with it. - **The matrix shows the first 120 employees** and says so honestly; the "questions in doubt" statistics is likewise computed over the first 120 progress files. - **Calibration fills up gradually** and only from fresh answers; a bucket with fewer than 30 answers shows "not enough data" instead of a zero. - **The clearance gate works only on the shift task board.** Actions at the till and in the schedule do not check clearance. - **There are no per-person deadlines per process yet** — assignments live as topic tracks, so "process X by Friday" cannot be set. - **There is no dedicated till onboarding.** Teaching work at the till is possible only through your own documents about it. - **Improvements to the questions themselves arrive with a rebuild.** Until you press "Rebuild", training runs on the previous build of the material. - **Heuristic checks err both ways.** "Two options say the same thing" and "this option came from another process" are hints to the owner, not a verdict: they do not block the question. --- ## Troubleshooting | Symptom | What to check | |---|---| | **The build button says "Upload and process at least one document first"** | there is no processed document in the [knowledge base](/en/docs/knowledge-base) library — upload a playbook and wait for processing | | **"No collection is marked as a training one yet"** | open the knowledge base, edit a collection and give it the "Training" purpose | | **"No processes were found in these documents"** | the documents describe facts and rules, not an order of actions. Add a playbook or a step-by-step instruction and build again | | **The employee sees "Training materials have not been built yet"** | the owner builds the material — press "Build training materials" on the Overview | | **The employee's Training section is empty although the material is built** | the course is not addressed to anyone: switch "Addressed to staff" on in the course list on the Overview. The line under the switch shows who is getting the course | | **"No processes are assigned to you yet"** | the process card does not confirm which workplaces it applies to | | **Answers were not counted, "the material was rebuilt"** | the build changed while the session was running — start a new one, the questions will come from the fresh build | | **"There is nothing to build the check from"** | some goals of the process have no questions yet; the owner sees this in "Questions in doubt" and fixes it in the document | | **A board task will not close: "a qualification is required"** | the assignee has no valid clearance for the process — assign training or remove the gate from the task | | **A question looks wrong** | the employee presses "Is this question ambiguous?", and the owner sees it in "Questions in doubt" together with the numbers about the question itself | A symptom-by-symptom guide is in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — [how to get help](/en/docs/support). --- ## FAQ ### Do I have to switch on the knowledge base to train the team? The Training section is visible right away, but the material comes from documents, and the document library lives in the knowledge base — so its app store card does have to be switched on. ### How do I share the training material with my staff? There is no separate "share" button — what you share is a **course**. Build the material and switch "Addressed to staff" on for the course on the Overview tab: that is enough, sessions will reach everyone who has a login. You do not need to hand out links or files manually — and you cannot: source documents are deliberately not shown to employees. ### Will an employee see my documents? No. An employee only has their own training: questions, explanations and progress. The library, the collections and the process map stay with the owner and the manager. ### Where do the questions come from — does the AI invent them? No. Every question is assembled from an article of your collection: the correct answer is a statement of the article, the wrong options come from its own "what not to say" and from neighbouring topics, and the question carries a link to the source document. ### How long does a session take? As long as the employee chooses: chips for 3, 5 or 10 minutes. Questions are selected to fit that budget. ### How is "theory" different from "clearance"? Theory is a passed exam on the process. Clearance is theory **plus** practice closed by an observer on the shift, and for a critical process plus the confirmation of the process owner. Put people on a critical process by clearance, not by a test score. ### What happens if an employee simply never opens training? Nothing breaks, but nothing moves either: their clearance will not renew itself. In the "processes × team" matrix they show up as "expired" or "not started", and "Needs a decision" will list them under the critical process. ### Can we train in several languages? Yes: material is built in the language of your documents, and the training interface is translated. Scenario formats are available for Russian, English, Georgian and Turkish. ### We are a chain — can we train differently in different locations? A process is assigned to workplaces rather than to locations, and training is shared across the account. You can separate location tracks by keeping [different knowledge base collections](/en/docs/knowledge-base) for them; how a chain is wired in general is in [managing a chain](/en/docs/multi-location). --- ## Related articles - [Knowledge base](/en/docs/knowledge-base) — the document library, collections and their purposes: the source of all training material - [Employees and shifts](/en/docs/staff) — logins, roles and workplaces: who training is assigned to - [Shift task board](/en/docs/tasks) — the practice task under an observer and the clearance gate on a task - [Team chat and guests](/en/docs/team-chat) — where training assignments, pre-shift reminders and changed-rule notices arrive - [App store](/en/docs/app-store) — where the knowledge base is switched on - [AI models and your own key](/en/docs/ai-models) — which model builds the material and the questions - [Subscription](/en/docs/subscription) — balance and AI usage spent on building material - [How to get help](/en/docs/support) — if clearance is not issued or a build keeps failing --- # Digital worker A small business is full of web routine in systems that have no API and never will: confirming bookings in a marketplace back office, copying the same data into supplier forms, ticking the same boxes in a partner panel. You cannot build an integration there — but you can put a worker there. The **digital worker** is an AI performer that does such routine **in your own browser, under your own account**. The model is simple: the browser extension is the hands, the cloud is the head. The worker does one step at a time, and what to do next is decided by the server. Open: **Admin panel → Digital worker** (`admin.cenaly.com/digital-worker`). The section is off by default — switch on the "Digital worker" card in the [app store](/en/docs/app-store). --- ## What this is | Term | What it means | |---|---| | **Worker (persona)** | a named performer account: its own browsers, its own skills, its own channel in the work chat. You can have several — per computer, say, or per area of work | | **Skill** | the scenario of one routine: steps, fields, rules. It is data, not code: the skill arrives from the server, so new abilities do not require reinstalling the extension | | **Risk class** | the legal regime of the site. **Green** — automation is allowed, or the action happens on our own surfaces; **amber** — not explicitly forbidden; **red** — the site's terms forbid it (Booking.com, Airbnb) | | **Run** | one execution of a job: steps, collected values, stops and the reason | The section is run by the owner and the manager. The safety switches — the account stop and the blocked domain list — belong to the owner only; the manager sees an explanation in their place and a **Ask the owner** button. --- ## What you need to start | What | Why | |---|---| | **A computer with Chrome** or another Chromium-based browser (Edge, Yandex Browser, Opera, Brave, Vivaldi) or Firefox, switched on while the work runs | the worker's hands are the extension in that browser; a computer that is off means the worker is offline | | **Your own account** in the target system | the worker lives on top of the session you have already opened. It never learns the logins and passwords, and we do not store them | | **The work chat** | jobs are assigned as text in the worker's channel, and reports and questions come back there | | **The right to automate this** | you are responsible for the target site's terms allowing it: the consent and the acceptance state that plainly | | **The account's AI balance** | deciding a step and parsing a job is done by a model — those are paid AI calls of the owner | --- ## Step 1. Consent: what will actually happen The first screen of the section is not a list of workers but a consent: "Before you start: what exactly happens". Until it is accepted, the list of personas is not shown at all and a browser cannot be paired either. What it says: - our extension will act in your browser under your account — everything it opens and does is performed **on your behalf**; - the worker lives on top of an already open session: it never learns the logins and passwords of target systems, and we neither store nor pass them on; - the work is visible and stoppable at any moment — both from this section and from the machine itself; - the worker **never** bypasses captchas, two-factor authentication or bot protection; skills that would need that we do not ship. If the consent text is updated, you will be asked to confirm it again — that is not a fault. --- ## Step 2. The worker and its browser 1. **Create a worker** — the name is free-form ("Masha's laptop", "Bookings assistant"); it can be edited in place with ✎ and affects nothing but the label. 2. **Connect a device** → "Computer" — the dialog starts with step 0: pick the browser you are installing the extension in (the one the admin is open in is picked already) and follow its steps — download the archive, open the extensions page, switch on "Developer mode" and press "Load unpacked". Each browser has its own steps and address — see the table below. The extension's privacy policy is right there. 3. The dialog shows a **pairing code** and a **connection string** (it carries both the code and the address of your cloud), plus the same QR — photograph it with a phone to carry it to another computer. Paste the string into the extension. 4. The dialog notices the connection itself and replaces the code with a green "Connected: …". The code is single-use and short-lived — by then it has been spent. How browsers differ in step 0. A browser's internal page cannot be opened from a link, so the dialog shows the address with a "Copy" button — paste it into the address bar. Unzip the archive into a folder you will keep: the browser loads the extension straight from it. | Browser | Page address | Where "Developer mode" is | Keep in mind | |---|---|---|---| | Chrome | `chrome://extensions` | top right | — | | Edge | `edge://extensions` | bottom of the left panel (in a narrow window — behind the ☰ button) | the "Load unpacked" button is above the extension list | | Yandex Browser | `browser://extensions` | top right | on Windows it switches off extensions that did not come from the Chrome Web Store or Opera Add-ons — right after installing and on every start: switch it back on with "Enable" in the browser's message or on the `browser://tune` page — while it is off, the worker is offline | | Opera · Brave · Vivaldi | `opera://extensions` · `brave://extensions` · `vivaldi://extensions` | top right | — | | Firefox | `about:debugging` → "This Firefox" → "Load Temporary Add-on…" | — | its own `.xpi` package; until Mozilla signs it, the add-on works until Firefox restarts | | Safari | — | — | not supported yet: install the extension in another browser on that computer | The worker card shows: **paired browsers** (each can be revoked), the "Online / Offline" status, the **live status** — idle, working, **needs you**, paused — and the counter "jobs in progress: N". Exactly one state is red: "needs you". The same number turns red on the section's menu entry. Each browser shows its **extension version**. If it is out of date, it says "update" — with links to the new version and to the instructions right next to it ([how to update the extension](#update)). The worker panel can be kept as a **pinned tab** or as Chrome's **side panel** — the buttons are in the extension pop-up; the choice is remembered, and the panel opens the same way after a notification and when the browser starts. If the panel was closed, the status says "**Panel closed — open the extension**" — that is not the owner's pause, just open the panel again. A worker can be **paused** or **revoked** — revoking is irreversible and instantly cuts off all its browsers. Revoked ones do not pile up in the list: they sit in a collapsed "Revoked (N)" block, and each can be tucked away with **Hide** (the runs and the conversation stay). ### How to update the extension If a browser says "update" (on the "Devices" tab and in the device card), two links sit right next to it: **"Download version …"** — the package of the new version for that device's browser — and **"How to update"** — this section. An old extension does not break things silently: a skill that needs a newer version is simply not handed to it, the panel shows "Update the extension", and the job stops with "the browser extension is too old for this skill". **Chrome, Edge, Yandex Browser, Opera, Brave, Vivaldi** — an extension loaded from the archive does not update itself: 1. Download the archive with the "Download version …" link (the same archive is in the "Connect a device" dialog). 2. Unzip it **into the same folder** the browser loads the extension from, replacing the files. 3. Open the extensions page (`chrome://extensions`, `edge://extensions`, `browser://extensions` and so on — the addresses are in the table above) and press ↻ on the "Digital Worker" extension card (or "Update" at the top of the page in developer mode). The extension restarts with the new version; the pairing and the saved account passwords stay. > ⚠️ Do not load the new version from a different folder as one more extension: the browser treats it as a new one — you would have to pair it again and save the account passwords again. If that already happened, remove the old one on the extensions page. **Firefox** — download the new `.xpi` package and load it the same way as the first time: `about:debugging` → "This Firefox" → "Load Temporary Add-on…". If the extension asks for a code, pair it again. If the device card says the extension was installed by your organisation or is kept by the bridge, whoever installed it updates it: such a device gets no archive link. --- ## Step 3. Where the skills come from **A ready-made skill from the store.** The "Digital worker" category card in the app store opens an installation wizard: which worker gets the skill, with which parameters (they will travel into the other system's form) and an explicit agreement with the risk class. There are few ready platform skills so far — this is a young section, and today the main path is the second one. **Learning by demonstration.** You show the routine once by hand, and the system assembles a scenario from it: 1. Give the **separate consent to recording** ("Allow training"): recording only runs while REC is lit; passwords and hidden fields are never written by construction; the voice of your comments goes to the server solely to be transcribed. 2. Press record in the worker panel in the browser and perform the operation, commenting aloud if you like. 3. The section shows a training session with the stages "upload → transcription → analysis", and out of it comes a **skill draft**. 4. Open the draft: parameters (some marked "from voice"), rules, steps in plain words, linter warnings and the **analysis questions** — what remained unclear. An answer rebuilds the draft; the worker can ask the same questions in the chat. 5. **Testing up the ladder of trust** — a rung cannot be skipped: **Shadow run** (changes nothing, reports "I would click here") → **Co-drive** (the worker highlights the target, you click, it verifies) → **Attended** (it acts itself but asks before every action). 6. **Promote to work** — an acceptance dialog opens: with separate checkboxes you confirm that you are entitled to act in those back offices, that you will honour the sites' terms, that you will not bypass protections, that you are responsible for the data entered, that the route is yours, and that the platform may stop the skill on a substantiated complaint. After that the draft becomes a **personal skill of your account** — nobody else sees it. If the route breaks on a live site, the worker will ask to be shown the routine again; the draft wizard has **Needs another recording** for that. **When the site changes.** If a button or field is not where it used to be, the worker does not give up at once: it looks at similar elements on the page and picks a replacement — first by the element's name recorded during training, then with the help of the model (which picks from what was found rather than inventing). A replacement for a **check** ("wait for the element") it applies itself and verifies immediately. A replacement for an **action** — typing or a click — it agrees with you first: a "yes / no" question arrives in the worker's channel, the run card gets "Accept the replacement" and "Not that element" buttons, and the to-do queue shows "an element moved — approve the replacement". An accepted replacement is remembered, and later runs follow it with no questions and no model call. The worker also remembers its decisions on steps: the same situation gets the same answer without calling the model again. The owner's **"Learning from exceptions"** switch among the safety switches turns all of this off (what has been learned is kept; to erase it, use "Forget what was learned" in the skill card). Installed abilities live in the worker card as the **Skills** block: name, version, risk class, a map-health chip (it appears when there were misses on page elements over the last week). The row's buttons are "Run now", "Dry run", "Change parameters", the "enabled" toggle, "Delete" and "Schedule". --- ## Step 4. Assign a job and watch the work Jobs are assigned **as text in the [work chat](/en/docs/team-chat)**: in the worker's channel ("assign to the worker") you write what needs doing — and get an "accepted: …" reply that becomes the root of a thread with the job's status. Step reports are folded under it into an accordion, so a schedule that runs every 15 minutes does not turn the channel into a hundred messages. What is going on is visible on the **Jobs** tab (`?tab=runs`): - **The status in plain words**: queued · working · waiting for your answer · waiting for you · done · failed · cancelled · outcome unknown. - Who assigned it, where it came from (chat, schedule, admin panel, test run) and an estimate "usually ~N min" — the median of completed runs of the same skill (with one or two runs no estimate is promised). - The **Needs attention** filter comes first and shows exactly the jobs where the worker is standing still, waiting for a human. - Row actions: "Open run", "Open in chat" and "Cancel" (on an unfinished one, with a confirmation — the step in flight will be abandoned). **The run card** answers "what is it doing now and why did it stop": the position "step 3 of 7", the trail of what happened, the current step, **What the worker collected** (fields that look like passwords and codes are stripped by the server before sending) and the reason for stopping in plain words — "the site map is out of date, show me the route again", "a captcha is in the way", "the session dropped", "clicked, but saw no confirmation — please check by hand". The same card holds **Done, carry on** (after you solved the captcha or signed in) and **Repeat the job** — a new job with the same parameters. When the worker runs into a human, it does not stay silent: the browser shows an **operating-system notification** with an "Open panel" button and repeats the reminder every five minutes, while a "the worker is waiting for you" row appears in the shared to-do queue — next to orders and bookings. --- ## Step 5. Confirming the irreversible Where an action cannot be undone, the worker stops and asks. The question arrives as a **card in the chat**: a summary of the facts, a deadline and "Yes" / "No" buttons. If it is about a list of rows, the rows come with checkboxes and a "Confirm the selected" button. The answer goes into the channel as an ordinary message from you — a decision before an irreversible action must stay in the conversation, with an author and a timestamp. The "yes" itself is not a word but a bundle of four checks: | Barrier | What it closes | |---|---| | **A one-time token** | a second "yes" to the same question no longer works | | **A fingerprint of the facts** | you confirm exactly the data you were shown | | **A deadline** | the question does not live forever: hours for the green class, minutes for the red one | | **Re-reading** | right before writing, the worker re-reads the facts from the page and compares them with what you agreed to; if they differ, it asks again | Who may do what depends on the risk class rather than on a button: | Action | Green | Amber | Red | |---|---|---|---| | **Ask** the worker | any participant | any participant | any participant | | **Assign a job** | any participant | manager and above | owner only | | **Confirm the irreversible** | any participant | manager and above | the owner, and not the job's author | That last cell is the four-eyes rule: whoever already decided "this must be done" skims their own read-back. --- ## Step 6. Schedules and safety switches A **schedule** is set with three forms instead of a cron expression: "every N minutes", "every day at HH:MM", "on selected days at HH:MM". The clock comes from the chosen location. The time you enter is a **median, not an alarm**: start jitter is mandatory and cannot be switched off, only narrowed — a worker that starts at exactly 09:00:00 is spotted by any analytics on the other side at a glance. There are also quiet hours: a trigger that falls into the window is moved to its end. The risk class decides what is possible: the **red** class has no schedule form at all (only a run while you are there), and the **amber** one warns that background work here happens without you and the risk is yours. Too short a period is refused — each class has its own minimum. A schedule that fails three times in a row switches itself off and says so; a disabled or removed skill puts its schedules to sleep without deleting them — bring the skill back and switch them on again. **Safety switches** (owner): - **Stop all workers** — an emergency switch for the whole account: every worker stops at once, jobs are not lost but wait in the queue until the stop is lifted. - **Blocked domains** — a list of hosts the worker will not visit whatever a skill declares. It is stronger than the skill itself and reinstalling the skill does not help. --- ## Limitations - **Chrome and Chromium-based browsers, Firefox — and only on a computer that is on.** The extension is still installed by hand in developer mode — there has been no Chrome Web Store release yet. In Firefox the package is not signed by Mozilla yet and lives until the browser restarts; Yandex Browser on Windows switches such an extension off on every start (switch it back on at `browser://tune`); Safari is not supported yet. The extension has no QR scanner of its own: the QR is there to carry the connection string to another machine. - **The section is young.** There are few ready platform skills in the catalogue, and we have honestly not measured "how many hours it saves". The real path today is learning by demonstration on your particular system. - **Bypassing protections is not supported in any form.** A captcha, a second factor or bot protection is a polite stop and a request to a human, not a task for the worker. - **Red sites — only while you are there.** For Booking.com, Airbnb and the like there is no background schedule at all, and the branch of the interface that would install such a skill with a schedule simply does not exist. Where an honest API integration exists, we offer that instead of a worker. - **There are no screenshots of steps.** The run card tells you in words what happened but keeps no pictures of the page. - **A forgotten question does not pile up forever**: a run that has waited for a human for more than six hours takes the worker off shift and says so. The "the worker is waiting for you" row in the to-do queue clears itself after a day. - **A worker belongs to the account, not to a location** — which is why its row shows up in the to-do queue of any location. - **We hold no passwords of yours to target systems.** If the session in the target system drops, only a human can sign back in. - **AI calls are paid.** Deciding a step, parsing a chat job and analysing a training recording spend the owner's AI balance; with an exhausted balance the worker cannot decide a step. - **Training voice is transcribed in the cloud** of the brand you work in and is kept exactly until the transcription is done; training without a microphone is valid too — there will simply be more questions for you. --- ## Troubleshooting | Symptom | What to check | |---|---| | **The extension says "code not found"** | paste the whole **connection string**, not just the digits of the code: it carries the address of your cloud. The code is single-use and lives for minutes — take a "New code" | | **The worker is "offline"** | the browser is closed or the computer is off; check that the worker panel is open and on shift (the panel can come up together with the browser). After a browser restart: in Yandex Browser (Windows) switch the extension back on at `browser://tune`, in Firefox load the temporary add-on again at `about:debugging` | | **A red "needs you" chip** | a captcha, a dropped session, a second factor or a missing site permission. Do it by hand **in the same browser** and press "Done, carry on" | | **"An element moved — approve the replacement"** | the worker found where a button or field moved on the site and waits for your "yes": answer in the chat or press "Accept the replacement" / "Not that element" in the run card | | **"The site map is out of date"** | the target site changed so much that no replacement was found: show the routine again ("Needs another recording" in the draft wizard) and the route will be rebuilt | | **"Update the extension"** (in the panel, the browser row or the run card) | the skill needs a newer extension version: download it with the "Download version …" link next to "update" on the "Devices" tab (or the archive in the "Connect a device" dialog), update the extension — [step by step](#update) — and run the job again | | **"Panel closed — open the extension"** | the panel window is closed — open it from the extension icon; the worker gets back on shift by itself | | **Not sure what is wrong with the connection** | press **"Check connection"** in the worker panel: it shows access to the server, the cloud's answer and the last request for jobs point by point | | **The skill is on but no job is taken** | the skill's toggle is off, the skill was removed, or the extension has no host permission — the panel says "Skill 'X' needs access to …" with an "Allow" button | | **A schedule switched itself off** | the reason is written in the row: three failures in a row, the skill is disabled or removed, the worker was revoked | | **A job from the chat is rejected** | the risk class does not let this role assign it: amber needs a manager or above, red needs the owner | | **The status is "outcome unknown"** | the worker clicked but saw no confirmation. Check by hand whether it went through: it will not retry on its own | | **All workers are standing still** | the account stop is on — lift it in the card at the bottom of the section (owner only) | If the cause is unclear, press **"Report a problem"** in the worker panel: the last log lines (without field values), the extension version and the run number arrive in the worker's channel in the team chat — you can forward them to support. There is also **"Copy log"**, and the filter above the log keeps only errors, steps or training. A symptom-by-symptom guide is in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — [how to get help](/en/docs/support). --- ## FAQ ### Do I have to hand the worker a login and password to another system? No, and that is the main difference from "robots" that are handed credentials. The worker acts on top of a session you opened yourself, in your browser. It never sees the passwords, and we neither store nor pass them on. ### Is this legal? You are responsible for the target site's rules allowing such actions, and we make that question visible: every skill has a risk class, every irreversible action has your confirmation, and before running your own trained skill you sign an acceptance of responsibility. Bypassing captchas and bot protection is not supported in any form. ### How is this different from an integration? An integration talks to the other system through an API — fast, reliable and without a browser. A worker is for places where there is no API at all. If a site has a decent API, we build an integration rather than a worker. ### Can I just tell it anything in words? The worker does what it has been taught: a job from the chat is parsed into a run of an installed skill with parameters. "Do something useful" it will not perform, and it will honestly say it has no such skill. ### Does the computer have to be switched on? Yes. The worker's hands are the extension in the browser on your machine; a computer that is off means "offline", and jobs simply wait in the queue. ### How many workers can I create? As many as you need — one per computer, for example. Choose the persona's name so that the to-do queue tells you which machine to walk to. ### What if the worker makes a mistake? It does not perform an irreversible action without your "yes", and at an unclear point it stops and calls a human. Everything it did is in the run card: the steps, the collected values and the reason for stopping. ### What if the site changes its design? Usually nothing: the worker finds where the element moved by itself. If the replacement concerns typing or a click, it asks "yes / no" in the chat, and after your "yes" it follows the new place on its own. If the page changed too much, it asks you to show the routine again. ### Who can press "stop"? The owner and the manager can pause a worker; the account stop and the blocked domain list belong to the owner only. A paired browser can also be revoked from the machine itself. --- ## Related articles - [App store](/en/docs/app-store) — where the section is switched on and where ready skills come from - [Team chat and guests](/en/docs/team-chat) — the worker's channel: where jobs are assigned and its questions are answered - [Shift task board](/en/docs/tasks) — the to-do queue where the "worker is waiting for you" row appears - [AI models and your own key](/en/docs/ai-models) — which model makes the step decisions - [Subscription](/en/docs/subscription) — balance and AI usage - [Knowledge base](/en/docs/knowledge-base) — the same performer-extension trick for collecting pages behind a login - [Employees and shifts](/en/docs/staff) — the roles that decide who may assign and who may confirm - [How to get help](/en/docs/support) — if the worker is stuck and the reason is unclear --- # AI models and your own key AI works in many places in the panel: product and dish descriptions, replies to guests, call analysis, building training material, the in-panel assistant. By default we pick the model for each task — and for most people that is enough. The **AI models (LLM)** section is for those who want to decide for themselves: which service powers the account's assistant features and which model it runs on. And if you already have a contract with a provider, you can plug in **your own key** and have the calls go through it. Open: the **AI models (LLM)** card in the [app store](/en/docs/app-store) (the "Account" category) → `admin.cenaly.com/ai-models`. **The section has no entry of its own in the menu** — that is not a bug, there is a single door, from the store. The section is available **to the account owner only**. --- ## What this section is for | Scenario | What to do | |---|---| | "Let it just work" | nothing: you never have to open the section, the platform picks the model per task | | "I want a specific model to answer" | connect a ready service and make it the preferred one | | "We have our own provider contract / our own inference" | add a custom connection with your address and key | | "I need to see where AI credits go" | look at the balance cards on the [subscription](/en/docs/subscription) page | --- ## What you need to start | What | Why | |---|---| | **You are the account owner** | the section is owner-only, and that is enforced by the server, not just by the interface | | **The app store card** | it is the only door into the section; there is no separate charge for switching the card on | | **For your own key** — an OpenAI-compatible endpoint | you need the address (a base URL **with the version**, `https` only), an API key and the model id | | **An AI balance** — for the ready services | they run through our infrastructure and are paid for with AI credits by actual usage | --- ## Step 1. Connect a ready AI service The first block of the page is **Cenaly AI services**: ChatGPT (OpenAI), Gemini (Google), Grok (xAI) and DeepSeek. One click to connect: 1. Press **Connect** on the service you need — no API keys required, the request goes through our infrastructure. 2. A connected service gains a **Model** row — pick a specific model from that service's list (each has its own list, and it is refreshed from time to time). 3. A service you no longer need is switched off with **Disconnect**. Payment is in **the account's AI credits**, like any other AI feature: no separate invoice for "connecting ChatGPT" appears — you pay for the actual calls. --- ## Step 2. Connect your own key The second block is **Custom LLMs**. It is for those who already have their own access to a model: a contract with a provider, a corporate gateway or a self-hosted model with an OpenAI-compatible API. 1. Press **Add custom LLM** and fill in: the **Name** (how you will recognise it), the **API base URL** — the address including the version, for example `https://api.example.com/v1` (`https` only), the **API key**, and the **Model** — the model id at that provider. 2. Press **Test connection** — a real request goes out, and you see either "Connection OK" with the measured latency or the reason for the failure. The test works both before saving and later on a saved record. 3. Press **Add** — the connection appears in the list. It can be switched off temporarily with a toggle or **deleted** (with a confirmation: the stored key goes with the record). How the key is stored: it lives **on the server** and is never returned to the browser — the interface only shows "API key stored" and a mask. You can replace the key; you cannot read it back out of the panel. About money: **calls made with your key do not spend AI credits** — you pay your provider directly. But if your endpoint fails to answer, the call does not die: it goes out through the usual platform queue — and that call is billed in credits. Check that your endpoint is reachable if you see usage where you did not expect any. You can have several connections (up to ten) — different models for different experiments, say; the ones with the toggle on are the ones in play. --- ## Step 3. Pick the preferred model The third block is **Preferred model**, a switch for the whole account: - **"Default (recommended per feature)"** — the platform picks the model itself, separately for each feature. This is the initial state; - **a specific service or custom connection** — the assistant features will reach for it first. The order of attempts when a preference is set: first your custom endpoint (if that is what you preferred), then the platform call on the chosen model, then the usual fallback — so a feature does not die because of one unreachable provider. ⚠️ The choice does **not** apply to every AI feature — see "Limitations". --- ## Where the usage is visible AI usage lives on the [subscription](/en/docs/subscription) page, in two cards: **LLM credits** — the balance left for AI tasks — and **AI spend**: the monthly usage per feature, the forecast to the end of the month and the monthly cap. The rows show which feature is spending: descriptions, calls, the translator, training. Calls made with your own key will not be there — such calls do not touch our balance. --- ## Limitations - **The choice does not apply on `cenaly.ru`.** In the Russian cloud AI features run on YandexGPT, and this section's settings are not consulted there: the page opens and saves, but nobody applies it. That follows from data-processing requirements, not from a forgotten setting. - **The choice does not apply to calls with tools.** Some features are built as "a model plus tools" — the guest chat AI bot, the panel copilot, the [mail](/en/docs/mail) prompter. They run on their own model regardless of what is selected here. - **Owner only.** An employee will not see the section in the menu, and a direct link gives them a load-error screen with a "Retry" button rather than a polite "no access" — we know, we are fixing it. - **A custom key has neither an expiry nor automatic rotation.** If you rotate the key at your provider, replace it here too, or calls will start taking the fallback path (and spending credits). - **OpenAI-compatible API only, and `https` only.** The endpoint is given together with the version in the path; other protocols and custom response formats are not supported. - **We do not know your provider's model list** — the model id is typed by hand, from the provider's documentation. - **There are four ready services.** ChatGPT, Gemini, Grok, DeepSeek; anything else goes through a custom connection. --- ## Troubleshooting | Symptom | What to check | |---|---| | **"Test connection" returns an error** | the address must be complete, with the version (`…/v1`) and over `https`; the key must be valid; the provider must allow access from outside addresses | | **The connection is there, but answers come "as before"** | the feature may be one of those that bypass the choice (chat bot, copilot, mail prompter); or the account runs in the `cenaly.ru` cloud | | **Credits are being spent although my own key is connected** | your endpoint is not answering and calls take the fallback path. Use the test button and look at the rows in "AI spend" | | **The key field shows asterisks** | by design: the key is stored on the server and never handed back. Need a different one — type a new one | | **An employee sees "Failed to load LLM settings"** | the section is available to the account owner only | | **The page is not in the menu** | it is not there: the only entrance is the "AI models (LLM)" card in the app store | A symptom-by-symptom guide is in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — [how to get help](/en/docs/support). --- ## FAQ ### Do I have to open this section at all? No. Everything works without it: the platform picks a model per task. The section is for when you want to choose the model yourself or plug in your own key. ### Do I need my own OpenAI key to use AI? No. The ready services connect in one click and run through our infrastructure, paid for with the account's AI credits. Your own key is an alternative, not a requirement. ### Is my own key cheaper? That depends on your contract with the provider. Technically it is "off our invoice": such calls do not spend AI credits, and you pay the provider directly. ### Who can see my API key? Nobody through the interface: the key is written to the server and never returned to the browser — you only see a note that it is stored. And the section is available to the account owner alone. ### Can I choose different models for different features? No, the preference is one per account. Different models for different tasks is exactly the "default" mode, where the platform chooses. ### Why does the choice not work on `cenaly.ru`? The Russian cloud runs on YandexGPT: data does not leave the cloud, so external providers and your own endpoint are not connected there. ### What happens if my endpoint is temporarily down? The feature will not break: the call goes out through the usual platform queue — and is counted in AI credits. The request is not silently lost. ### How much does the "AI models" card cost? There is no separate charge for switching the card on — you only pay for the actual use of models through our infrastructure. --- ## Related articles - [Subscription](/en/docs/subscription) — the "LLM credits" and "AI spend" cards: balance, per-feature usage and the monthly cap - [App store](/en/docs/app-store) — the only door into the "AI models" section - [Knowledge base](/en/docs/knowledge-base) — choosing the AI provider for building the base and the consent it needs - [Staff training](/en/docs/learning) — which model builds the training material and the questions - [AI translator for the guest](/en/docs/ai-translator) — one of the features that spends the AI balance - [Guest chat](/en/docs/chat) — the AI bot that runs on its own model regardless of this choice - [Mail and the AI autoresponder](/en/docs/mail) — another "model plus tools" feature that bypasses this choice - [How to get help](/en/docs/support) — if a connection will not pass the test --- # AI translator for the guest A foreign guest at the counter usually means gestures, a translation app in someone else's phone and a hope that everyone understood correctly. And an app from the store knows neither your menu nor your rules: it will translate "does this contain nuts?", but it will not help you answer. The **AI translator** is a conversation across two phones. The guest opens a page on their own device (via the QR code on the counter, no sign-in and no app) and speaks or types in their language. The employee sees **the translation large and the original small** in the panel, and next to it **hints from the venue's knowledge base**: what your documents actually say about nuts, about delivery and about refunds. Open: **Admin panel → AI translator** (`admin.cenaly.com/translator`). The section is hidden by default — switch on the "AI translator" card in the [app store](/en/docs/app-store). --- ## What it looks like | Side | What they see | |---|---| | **The employee** | the **Conversation**, **Past conversations** and **Settings** tabs. Inside a conversation: the feed of turns, the translation large, the original small, hints from the knowledge base, an input box with a microphone and the "End" button | | **The guest** | a page with no sign-in: a consent notice → a language choice (buttons labelled in the languages themselves) → the feed, a microphone, a keyboard and a "Call the staff" button | There is also a **single-device mode**: the employee's phone is passed from hand to hand, the speaking side is chosen with a big switch, and everything internal (hints and originals) is hidden while the guest is looking. --- ## What you need to start | What | Why | |---|---| | **The extension card switched on** | the section is opt-in: without it there is no "AI translator" in the menu | | **A [knowledge base](/en/docs/knowledge-base) collection** with the "Translator" or "Call assist" purpose | it supplies the hints for the employee and the term context for the translation. Without one the translation still works but is marked "translated without knowledge-base context" | | **Two devices** (or one, in pass-the-phone mode) | the guest's phone and the employee's phone, tablet or PC. The guest needs internet to open the page | | **The account's AI balance** | translation and server-side speech are paid AI calls of the owner | | **Permissions** | the settings are changed by the owner; the conversation is run by an employee with access to the location | --- ## Step 1. Configure the translator The **Settings** tab (owner only; the employee sees it locked — they should be able to see the rules the translator works by in their room): | Setting | What it defines | |---|---| | **Knowledge base collection** | where the hints and the term context come from | | **Your language** | the employee's default language | | **Languages the guest may choose** | the buttons on the guest page; by default — the languages enabled for the account | | **Speech** | four independent modes: "The guest speaks into the phone", "You speak into the phone", "Your replies are read out to the guest", "The guest's lines are read out to you". Each is **On our server** (paid, more accurate, works on any phone), **In the browser** (free, but not on every phone) or **Off** | | **Keep conversation history** | off by default; when on — 7, 30 or 90 days. This is processing of personal data, so you choose the term yourself | | **Do not translate** | brands and names that are copied as they are | | **Glossary** | your term → how it must be translated into a particular language | | **Consent text** | what the guest sees before the start; empty means our default text | --- ## Step 2. Start a conversation and connect the guest 1. The **Conversation** tab → pick the location, your language, the guest's language (or "The guest will choose"), the knowledge base collection and the mode: **Two devices (pairing by QR)** or **One device (pass the phone)**. Press **Start conversation**. 2. **Pairing** opens: a QR code, an eight-character code in the `ABCD-EFGH` shape and a link. The guest scans the QR or types the code on their page — the code and the link are **single-use and live for two minutes**. 3. The guest sees the **consent notice** (speech is recognised, text is processed by AI, kept no longer than the conversation, typing is an option), accepts it and picks a language. 4. The conversation header turns to **Guest connected**. If the code went stale — **New code**; it disconnects the guest who is already connected, and it warns you about that. A conversation closes by itself: **30 minutes of inactivity** or **4 hours** from the start, whichever comes first. The remaining time is shown as "Closes after inactivity in …". --- ## Step 3. How a conversation goes - **The employee** types in the input box or dictates. **The guest** does the same on their side: the microphone (hold, or tap-tap; a clip of up to 20 seconds) or the keyboard. - **Voice always passes a review screen.** The recognised text is shown BEFORE sending, so it can be corrected. That is the important part: an invisible recognition error is the usual reason people stop trusting products like this. - **In the feed** — the translation large, the original small; for the employee's turn you can see whether it arrived ("accepted", "delivered", "the guest is offline — they will see it when they reconnect"). - **Honest warnings.** Phone numbers, amounts with a currency, order and booking numbers, e-mails and links are protected and restored after the translation. If the numbers in the original and the translation diverge, the turn is marked **Check the numbers**; there are also "Check names, amounts and links" and "Worth a second look". Ambiguity (who "he" is, which term exactly) arrives as an internal line **"Clarify: …"** — only the employee sees it. - **Read-aloud.** In server mode a turn has a **▶ Listen** button; in browser mode there is a 🔊 toggle. On an iPhone sound only starts after you touch the screen — that is the browser's rule, not a fault. - **Made a mistake — "Correct".** A turn can be rewritten, and the previous one is marked "Corrected". - **"The guest is calling the staff".** The guest has a call button: in the panel it raises a banner. They cannot press it more often than once every half a minute. - **Connection.** If the live channel sags, the page says so honestly — "Reconnecting…" — and the turns still arrive, just by polling every few seconds. --- ## Step 4. Hints and "Prepare a reply" To the right of the feed are the **hints from the knowledge base**: cards matched to the guest's turn from your collection. It is the same hint pack that powers [agent assist](/en/docs/call-assist) on a phone call — a separate line and **for the employee only**: a card marked **"🔒 internal — do not read out"** is visible but has no send button. The guest gets exactly what you confirmed: 1. **Prepare a reply** on a hint card or in the input box; 2. a preview in two parts — **Your text** and **What the guest will see**; 3. **Send to the guest**. What the translator does **not** do: it does not invent facts, prices or promises on your behalf. The knowledge base is a canvas for terms, not the author of the answer: "and how much is this?" will be translated as a question, not "completed" with a price out of thin air. --- ## Step 5. Ending a conversation and the history **End** — and the translator honestly asks what happens to the text: with history on, the transcript is saved to "Past conversations"; with history off, it is gone. The **Past conversations** tab appears when history is on: a list by month, the number of turns, the transcript. In a saved transcript phone numbers and long digit sequences are masked. **Audio is never stored anywhere** — neither with history on nor with it off: a clip lives exactly as long as it takes to recognise it. --- ## Limitations - **This is a young feature.** The first wave: the conversation, the hints, server-side speech. Multilingual knowledge base builds (a phrasebook, questions in the guests' languages) are the next step and do not exist yet. - **In the Russian cloud (`cenaly.ru`) speech is server-side only.** Browser mode is unavailable there under personal-data requirements, and the server converts it to the server mode. Yandex SpeechKit does the work: recognition in 15 languages, read-aloud in six voices (Russian, English, German, Kazakh, Uzbek, Hebrew). For a language outside those lists the microphone and the ▶ button simply are not shown — the keyboard remains, and the screen says so honestly. - **Browser mode is not on every phone.** It is free, but on an iPhone, for instance, it may be missing entirely; the server mode works everywhere. - **Hints need a collection with the "Translator" or "Call assist" purpose** and a built pack. No pack — translation still runs, but the turn is marked "translated without knowledge-base context". - **Limits of a single turn:** a voice clip up to 20 seconds, read-aloud up to 2000 characters, no more than 30 turns a minute per conversation. That is protection from an accidental flood, not a tariff. - **History is off by default** and, once on, keeps text only, with numbers masked. The terms are 7, 30 or 90 days — there is nothing longer. - **Settings belong to the owner.** An employee sees them but does not change them. - **The guest needs internet.** If they have none, the single-device mode on your phone is the way. - **AI calls are paid.** Translation and server-side speech are charged to the owner's AI balance; when it runs out, the employee sees "AI balance exhausted" with a link to the balance, and the guest gets an anonymous "could not translate". There is currently no separate charge for the extension itself. --- ## Troubleshooting | Symptom | What to check | |---|---| | **"No collection with the Translator purpose"** | open the [knowledge base](/en/docs/knowledge-base) and tick "Translator" on a collection (a call-assist collection works too) | | **The guest cannot connect** | the code and the link live for two minutes and are single-use — press "New code". Check that the guest has internet | | **"The code is stale — get a new one"** | the same: issue a fresh QR with "New code" | | **"The browser did not allow the microphone"** | allow microphone access in the site settings, on your side or the guest's — or simply type | | **"Recognition does not know this language"** | the language is outside the speech engine's table: the keyboard remains, and translation still works | | **"There is no voice for this language"** | there is no read-aloud for it; the guest still sees the translated text | | **No sound on an iPhone** | audio starts only after a touch on the screen; if browser mode does not work at all, switch speech to "On our server" | | **"AI balance exhausted"** | top up on the [subscription](/en/docs/subscription) page — translation is paused until you do | | **"Too many turns in a minute"** | take a pause: the flood protection kicked in | | **Turns arrive late, "Reconnecting…"** | the live channel sagged, and the page polls the server every few seconds — nothing is lost | | **The guest sees "could not translate"** | look at your own feed: the real reason is there (balance, language, provider failure) — billing details are deliberately not shown to the guest | A symptom-by-symptom guide is in [troubleshooting](/en/docs/troubleshooting); if nothing helped, write to us — [how to get help](/en/docs/support). --- ## FAQ ### Does the guest have to install an app or sign up? No. The guest opens a page from a QR code or a code — no sign-in, no account, no installation. All they do is accept the consent notice and pick a language. ### What if the guest has no internet? Then the single-device mode works: the conversation runs on your phone, which you pass from hand to hand, and you choose the speaking side with a big switch. ### Does the guest see the hints from my knowledge base? No. Hints are a separate line and are for the employee only; a card marked "internal" has no send button at all. The guest gets exactly what you confirmed with "Send to the guest". ### Is the conversation recorded? Audio never. Text only if you switched history on, and then for the chosen term (7, 30 or 90 days), with phone numbers and long digit sequences masked. ### Can the translator answer the guest instead of the employee? No, and that is deliberate. It translates, shows hints and prepares a draft reply — but a turn reaches the guest only after your confirmation. ### Which languages does it work in? We translate between your language and the guest's language from the list you allowed in the settings (by default, the languages enabled for the account). Voice has its own limits — see "Limitations", especially for `cenaly.ru`. ### How much does it cost? There is no separate charge for the extension right now. What is paid for are the AI calls themselves: translating turns and server-side speech, charged to the owner's AI balance and visible as the "AI translator" line in AI spend on the subscription page. ### Will a tablet on the counter do? Yes: the section works in an ordinary browser and in the app. A convenient setup for a hotel or a salon is a tablet for the employee and a phone for the guest. --- ## Related articles - [Knowledge base](/en/docs/knowledge-base) — collections, purposes and the glossary: where the translator gets its terms and hints - [App store](/en/docs/app-store) — where the "AI translator" is switched on - [Subscription](/en/docs/subscription) — the AI balance and the "AI translator" usage line - [AI models and your own key](/en/docs/ai-models) — which provider and model power the AI features - [Agent assist](/en/docs/call-assist) — the same knowledge-base hints, on a phone call instead - [Guest chat](/en/docs/chat) — messaging with the guest when there is no face-to-face conversation - [Employees and shifts](/en/docs/staff) — who may run a conversation and who may change the settings - [How to get help](/en/docs/support) — if the guest cannot connect or the microphone stays silent --- # Assets and equipment Equipment in a venue usually lives in someone's head and in a chat thread: who keeps the second terminal, whose laptop is whose, how old the fridge is and what it is still worth on paper. The **Assets** section turns that into a register of everything the business owns, with two things a spreadsheet never has: **a person responsible** and **depreciation** — separately for the books and separately for tax. Open: **Admin panel → Assets** (`admin.cenaly.com/assets`). --- ## What this section is The register has one entity — an **asset** — with a **class**: equipment, phone, computer, vehicle, furniture, premises, intangibles (software, licences, rights) or other. The common fields are the same for every class — name, make and model, serial and inventory numbers, quantity, location, the employee responsible, status, a note and an event history — while phones, vehicles and computers get their own "Passport" block: extension and SIP username, plate and VIN, network name and OS. There are five statuses: **Draft · In service · Idle · In repair · Disposed**; a draft is an asset with no in-service date — it is already in the register, but it is not depreciated and does not appear in the statement. | Tab | Address | What's there | |---|---|---| | **Register** | `?tab=list` | the table with search and filters, row actions, and a summary on top — "Assets", "Original cost", "Net book value", "Depreciation this month (books)" and "(tax)", **per currency** | | **Depreciation** | `?tab=depreciation` | month × book: what has been charged per asset, the total, the journal of entries to download | | **Statement** | `?tab=statement` | movement "from … to …" for the chosen book, CSV | --- ## What you need to start | What | Why | |---|---| | The **"Assets & equipment"** card in the [app store](/en/docs/app-store), the "Finance" category | the section is hidden by default — until it is switched on there is no menu item | | A role with access to **finance** | the data lives in the finance part of the account: without that access nobody sees the menu item — neither a buyer nor a stock keeper | | A **country** set for the location in [settings](/en/docs/settings) | the capitalisation threshold, groups and rates the country button applies depend on it | | Access to **[employees](/en/docs/staff)** — if you need the "Custodian" field | without it the list is empty and the "Custodian" column shows a dash (that is not an error) | | *Optional:* [counterparties](/en/docs/counterparties) | then the "Supplier" field suggests suppliers you already have and links the asset to their card | Nothing has to be installed: the section works in the browser, and so does label printing — through the ordinary print dialog. --- ## Step 1. Create an asset The **"+ Add asset"** button opens the card. It opens the way you prefer — as a window, a side panel or full screen (the choice is remembered) — and its **density** is a user setting: "minimal" leaves only the fields you cannot create an asset without, "full" shows every section at once. | Section | What you fill in | |---|---| | **General** | "Name", "Class", "Make", "Model", "Serial number", "Inventory number", "Quantity", "Location", "Custodian", "Status", "Note" | | **Passport** | fields per class: extension / SIP username / MAC / "Registers as" for a phone, "Plate" / VIN / "Year" for a vehicle, "Network name" / OS for a computer | | **Acquisition** | "Acquisition date", "Cost (net of VAT)", "Input VAT", "Currency" (the location's currency by default), "Supplier", "Invoice / document no.", "How acquired", "In service since" | | **Accounting** and **Tax accounting** | the two policies — see step 3 | | **Upgrades and repairs** | appears once the asset is in the books — the list of costs and "Cost incl. upgrades" | | **History** | who created it, put it into service, moved it, changed the custodian, disposed of it | Three fields deserve a note. **"Quantity"** is for a uniform batch on one invoice: ten identical chairs do not need ten cards. **"How acquired"** — "Purchase", "Lease", "Owner's contribution", "Gift", "Own production", "Stock-take surplus"; the field records the origin, while how to recognise it is decided by the policies. **"Cost (net of VAT)"** is the original cost without recoverable VAT: this is the depreciation base, and input VAT is recorded separately. --- ## Step 2. Put it into service As long as an asset has no in-service date it is a **draft**. There are two ways in: the "In service since" field in the card, or the **"Put into service"** item in the row's "Actions" menu — then today's date is used. At that moment the asset is **given an inventory number** like `INV-000001`, unless you set your own; depreciation runs from the in-service date, from the same or the next month, as the policy says. There is no way back: **only a draft can be deleted**. An asset that has been in service is not deleted but **disposed of** — its history stays in the register, and the statement shows it honestly as disposed. --- ## Step 3. Accounting policies and country rules The same purchase lives in two sets of books under different rules, so the card has two sections. **Accounting** — "Recognition" ("Fixed asset (capitalise)" or "Expense immediately (low value)"), "Method" ("Straight line", "Declining balance", "Not depreciated"), "Useful life" in months, "Residual value", "Acceleration factor", "Depreciation start" ("From the month after commissioning" or "From the month of commissioning"), "Group". **Tax accounting** — "Depreciate", "Expense immediately" or "Not deductible"; "Tax group / pool", "Method", a life or an "Annual rate, %", the start, a "Bonus depreciation, %" from the country's options and an "Accountant's note". You do not have to fill this in by hand: the **"Apply country rules"** button takes the location's country, the asset class and its cost and fills in **both** policies, explaining underneath why it chose that. "Useful life" is marked with an asterisk and is required while recognition is "capitalise" and the method is not "Not depreciated": without a life there is nothing to compute depreciation from, so the card will not save — press "Apply country rules", type the life yourself or switch to "Expense immediately"/"Not depreciated". If the card does not close on save, it moves the cursor to the field it is waiting for. If the cost is not above the tax threshold, the asset is expensed immediately in both books (the threshold is inclusive: a cost exactly equal to it is expensed too). Nothing is applied silently — only when you press the button. | Country | What the rule pack contains | |---|---| | **Russia** | FSBU 6/2020 for the books, chapter 25 of the Tax Code for tax: 10 depreciation groups, 10/30 % bonus depreciation | | **Georgia** | groups I–V (20/20/8/5/15 %), intangibles under art. 113, full write-off under art. 112 | | **Türkiye** | the 2026 threshold of ₺12,000, lives from the GİB schedule | | **Poland** | the KŚT 2016 classification, one-off write-off (jednorazowa) | | **Kazakhstan** | Tax Code no. 214-VIII, groups I–IV, investment preferences — ⚠️ the pack is verified **in part**, and the card says so | | **USA** | MACRS (class 57.0), de minimis, §179 and §168(k) as of 2026 | | **UK** | main pool 14 % from April 2026, special rate 6 %, SBA 3 %, AIA, full expensing, FYA 40 % | | **Germany** | GWG, the AfA tables (general and Gastgewerbe), §7g | | **Albania** | since 2024 — straight line per asset | | **Other countries** | a general pack based on IFRS for SMEs (3rd edition) | Country rules are a **default, not your accountant's signature**: the final word is theirs, and the tax section has a dedicated field for their notes. --- ## Step 4. Monthly depreciation and the journal for your accountant The **Depreciation** tab has two axes: **"Month"** and **"Book"** ("Accounting" or "Tax"). For every asset in service the table shows "Start", "Method", "This month" (tagged "bonus" or "expensed"), "Accumulated" and "Net book value", with a "Total" per currency at the bottom. Two buttons hand the same thing to your accountant — **"Download month journal (JSON)"** and **"Download CSV"** — and it is not a table dump but the **whole month as proposed journal entries**, in the same format payroll uses: | Operation of the month | What's in the journal | |---|---| | Recognition | Dr 1500 (fixed assets) or 1520 (intangibles) — Cr 2010 (payables); input VAT — Dr 1110 | | Low-value item expensed | Dr 6080 | | Upgrade | Dr 1500 / 1520 | | Repair | Dr 6090 | | Depreciation for the month | Dr 6030 — Cr 1590 / 1592, one document per currency | | Disposal | cost and accumulated depreciation removed, a loss Dr 5095 or a gain Cr 7020 | For the **tax book** the journal contains depreciation only — its other operations follow their own rules outside our side. --- ## The movement statement for a period The **Statement** tab answers "what was there at the start, what came in, what went out, what is left". You set "From" and "To", pick a book, and for every asset you see cost and accumulated depreciation at the start, additions (commissioning and upgrades), disposals, the charge for the period, the closing balance and the net book value; below that, "Total" per currency. Under the total, separate lines hold what never reaches the balance sheet: **"Expensed immediately (below the capitalisation threshold)"** and **"Repairs in the period"**. If the period ends with a month, the statement *is* the **balances on that date** for a balance sheet note; "Download CSV" saves it as a file. The statement covers assets put into service **before the end** of the period and not disposed of **before its start** — if it is empty, that is usually why, and not a fault. --- ## Upgrades and repairs The **"Upgrade / repair…"** item in the row menu (or "Add an upgrade or repair" in the card) opens the **"Upgrade or repair"** window. The "What was done" field separates two cases, and the difference matters: | Kind | What happens to the books | |---|---| | **Repair / maintenance** | an expense of the period: neither the cost nor the depreciation schedule changes; in the journal it is Dr 6090 | | **Upgrade / reconstruction** | increases the cost; from the month it takes effect the remaining amount is spread over the **remaining** life in both books | Then come "Work completion date", "Cost (net of VAT)", "Input VAT", and for an upgrade also "Extend the life by, months" (leave it empty if the life does not change — the remainder is spread over the months left), "What exactly was done", "Contractor" and "Document number". The button is **"Record"**. The edge cases are handled like this: an upgrade of an **already fully depreciated** asset without extending its life is expensed in the month it takes effect, and one made **before depreciation starts** joins the original cost; the card gains a "Cost incl. upgrades" line, and the "Cost" column in the register shows the cost including upgrades up to the current month. Where exactly the border between a repair and an upgrade runs is **your accountant's call** — the window does not guess: in Poland a tax upgrade starts at PLN 10,000 a year, in Georgia repairs are deductible within 5 % of the group's balance. --- ## Disposal The **"Dispose…"** item opens the "Asset disposal" window: "Disposal date", "Reason" ("Sold", "Written off", "Lost", "Stolen", "Transferred", "Returned to the lessor"), "Sale proceeds (net of VAT)" for a sale and a "Note". The button is **"Dispose"**. After that the asset stays in the register as a grey row, depreciation stops with the month of disposal, and the month journal gains a disposal operation with a loss or a gain. --- ## QR labels and stock-takes The **"🏷 Labels"** button above the register prints **58×40 mm** stickers for every **filtered** asset that has an inventory number; the "Print label" item in the row menu prints a single one. A sticker carries a QR code, the inventory number in large type, the name, the location and the custodian. The QR code points at **that asset's card in your admin panel** (`/assets/?asset=`): walking the premises, a phone opens the card by scanning instead of searching by number. The link only works for someone signed in with access to the section, and the sticker itself carries nothing that is not already visible on the object. Printing goes through the ordinary browser dialog, so it lands the same way on a label thermal printer and on a normal printer in "fit to page" mode; for the printer itself see [hardware](/en/docs/hardware). --- ## Phones and equipment in one click | From where | How the asset is created | |---|---| | **[Telephony](/en/docs/telephony) → "Staff & groups"** | click the equipment tag in the handset card → the **"To assets"** button: the card opens with the class "phone", the make and model from the registration string, the extension and the SIP username. A handset already added shows the badge "In the asset register · INV-…" | | **Hardware → "Account equipment register"** (`/hardware`) | for a configured device of the [bridge](/en/docs/hardware-bridge) — the **"🧰 To assets"** button: class "equipment", name and model, the device's location and the link to the bridge. An added one shows the badge "In assets · INV-…" | Nothing is substituted in the other direction: the list of phones in Telephony stays **derived from registrations** on the PBX, while the asset register holds what a human created. Cameras and devices that are still merely "discovered" are not added this way. --- ## Limitations - **There is no stock-take document yet.** QR labels and a walk-around with them exist; an act of "per register / per count" with discrepancies does not. - **The entries are a file to download.** The month journal comes as JSON and CSV; the ledger core that would accept it automatically is not connected yet — your accountant imports the file. - **Pool systems are approximated.** In the UK, Kazakhstan and Georgia the law computes depreciation annually per pool, while the section computes it per asset per month: in the year of acquisition this understates the charge. - **The Kazakhstan pack is verified only in part** (the asset classifier, the transition of balances to the new Tax Code, the annual pool), and countries without their own pack get the general IFRS for SMEs one — the card flags both as a default that needs your accountant's confirmation. - **Month, period and book are not in the address.** Only the tab lives in the link (`?tab=`) — you cannot send a colleague a link straight to "May, tax book". - **Editing from two tabs at once.** On `cenaly.com` and `cenaly.com` the write is conditional: the losing tab re-reads the register and repeats the change. On `cenaly.ru` the write is unconditional — edit the register from one place. - **The section files no tax returns.** It computes depreciation and hands over entries; declarations, property tax and vehicle tax stay with your accountant. - **Amounts are whole minor units of the currency** (cents, tiyin; the yen has none, the dinar has three). Fractions of a cent are not stored, and the monthly amounts add up to the base. --- ## Troubleshooting | Symptom | Check | |---|---| | There is no "Assets" item in the menu | whether the "Assets & equipment" card is switched on in the [app store](/en/docs/app-store); for an employee — whether they have access to finance | | The "Custodian" column shows a dash, the list is empty | there is no access to [employees](/en/docs/staff): the field fills in as soon as it is granted | | "Nothing to print: labels are printed for assets with an inventory number" | the number is assigned when an asset is put into service — commission it or set the number by hand. If no print window opened at all, the browser blocked pop-ups | | "Nothing to charge this month" | only assets **in service** with a cost and a policy are depreciated; drafts are not | | The statement is empty although there are assets | the period: it covers assets commissioned before the end of it and not disposed of before its start | | "The asset from the link is not in the register" after scanning a QR code | the asset was deleted as a draft, or the sticker belongs to another account; search by the inventory number | | The asset will not delete | only drafts are deleted. Anything that has been in service is retired through "Dispose…" | | "Failed to save" when two people edit | re-read the card (close and open it again) and repeat the change | | There is no "🧰 To assets" button in hardware | the section is off, there is no access to finance, or the device is a camera or not configured yet | --- ## FAQ ### How is "Assets" different from "Inventory"? [Inventory](/en/docs/inventory) is about stock that gets consumed: food, goods, packaging. "Assets" is about what you use for years and what loses value gradually: equipment, furniture, vehicles, premises, software. A purchase belongs to one of them, never to both. ### Do I need an accountant to use this? To keep the register and print labels — no. To sign off the policy and settle the tricky cases (is this an upgrade or a repair, capitalise or expense) — yes: the country button gives a default, not a professional opinion. ### What about small items like a kettle or a router? Nothing special: if the cost is not above the country's threshold, the country button sets "Expense immediately (low value)" in both books. In the statement such purchases appear on a separate line under the total and never reach the balance sheet. ### How do I hand the data to my accountant? The Depreciation tab → "Download month journal (JSON)" or "Download CSV": the whole month is there — recognition, upgrades and repairs, depreciation and disposals with the accounts filled in. The statement for a period has its own CSV on the Statement tab. ### Are leased assets covered? You can record them: "How acquired" has "Lease", and on return the disposal reason is "Returned to the lessor". Whether such an asset belongs on the balance sheet and should be depreciated is decided by your accountant through the card's policies — the section does not interpret lease contracts automatically. --- ## Related articles - [App store](/en/docs/app-store) — where the "Assets & equipment" card is switched on - [Hardware: what connects](/en/docs/hardware) and [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — where the "🧰 To assets" button comes from - [Telephony: your own PBX](/en/docs/telephony) — handsets and the "To assets" button in the handset card - [Labels](/en/docs/labels) — the label printer the stickers come out of - [Inventory](/en/docs/inventory) — stock and consumables, as opposed to fixed assets - [Customers and counterparties](/en/docs/counterparties) — where the supplier suggestions come from - [Employees and shifts](/en/docs/staff) — who can be made custodian - [Finance](/en/docs/finance) — revenue, costs and profit of a location, and [Documents](/en/docs/documents) — acts and contracts for purchases and write-offs - [Data export](/en/docs/data-export) — the whole account in one archive --- # Gallery: the account media library The same picture is needed in five places at once: the logo — in the menu, on the storefront and in emails; a dish photo — in the card and in a flyer; a banner — in a popup and on the website. The **Gallery** saves you from hunting for the file on disk every time: an image is uploaded **once**, and after that every image editor of the panel offers a **"From gallery"** button. Open: **Admin panel → Gallery** (`admin.cenaly.com/gallery`) — the item sits in the **"Menu"** group of the sidebar (those groups are collapsed by default). --- ## What this section is The gallery is **one per account**, not per location: the logo, background and banner are almost always shared, and duplicating them per venue makes no sense. Inside there is a plain grid of tiles with three things: the **"⬆️ Upload"** button, the **"✨ Generate with AI"** button (where the AI studio is available) and a counter that reads like `18 / 500 · 15 MB`. Tiles show a **preview**, not the original: the full file is downloaded only when an image is actually picked. The very same screen works as a **picker**: opened from an editor, it lets you choose a tile and hands the image back where it was called from. --- ## What you need to start | What | Is it needed | |---|---| | Switching the section on in the app store | no, the gallery is available right away and on every plan | | Business type | available to all except "Chat" and "Widgets" accounts | | Installing anything | no: both the upload and the preview are done by the browser itself | | **For the AI studio** — any brand except `cenaly.ru` (`cenaly.com`, `cenaly.com` and the rest) | yes: on `cenaly.ru` there is no generate button at all | | **For the AI studio** — the account's AI balance | yes, generation spends it; top-ups are in the [subscription](/en/docs/subscription) | --- ## Step 1. Upload images in advance The **"⬆️ Upload"** button takes **several files at once**; so does dragging them onto the grid — while files hover over it, the hint "Drop files to upload" appears. | Parameter | Value | |---|---| | Formats | JPEG, PNG, WebP, GIF, AVIF, HEIC/HEIF, SVG | | One file | up to 15 MB | | The library in total | up to 500 images (the counter in the toolbar shows how much is used) | | Preview | built in the browser, longest side ≤ 512 px | Every record remembers the file name, type, size, dimensions and upload date. HEIC and SVG may end up without a preview — the browser does not decode them; the tile then shows the original or a placeholder, while the image itself works as usual. Uploads do **not** go through the dish-photo processor: the library does not need storefront crops, it needs your file as it is plus a light preview for the grid. --- ## Step 2. Pick an image in an editor Next to the ordinary upload control, image editors have a **"From gallery"** button. It opens the same grid as a modal ("Pick from gallery"), a click on a tile hands the image to the editor, and from there its usual path takes over: cropping, resizing, saving where it belongs. Where that button exists: | Where | What you pick | |---|---| | A dish or product card | the item photo and extra photos | | [Labels](/en/docs/labels) | the icon of your own label | | Product features and variants | option images | | The storefront and product page | section images | | [Dish flyer](/en/docs/dish-flyer), [printed menu](/en/docs/print-menu) | images of the layout | | [Floor plan](/en/docs/tables) | the plan background | | Articles and text blocks | images inside the text | | [Consents and the cookie banner](/en/docs/cookie-consent), [campaigns and popups](/en/docs/campaigns) | the logo and the banner image | | [Website widgets](/en/docs/site-widgets), the chat widget | avatars and icons | | Posts and ads | attached images | Where a field used to say "paste a link to an image", the same picker now gives a **field with a preview and a "From gallery…" button**: you no longer need to know where the file physically sits or how to get a public address for it. Links you saved earlier are not broken — they are shown as a preview and cleared with the cross. If an editor needs several images at once, the picker works in multi-select mode: tiles accumulate and the **"Select (N)"** button hands them over in one go. --- ## Step 3. Generate an image with AI The **"✨ Generate with AI"** button opens the **AI studio** full screen. Settings on the left, the run feed on the right. | Setting | What it does | |---|---| | **"What are we creating?"** | the description in words. The **"Improve the prompt"** button expands a short phrase into a detailed one; after a run you can see "How the AI understood your request" | | **"Type"** | presets: "Dish photo", "Product on white", "Banner", "Icon", "Interior", "Free style" | | **"Format"** | "Square", "Landscape", "Portrait" | | **"Variants"** | from 1 to 4 per run | | **"Model"** | cards by role — "Recommended", "Best quality", "Budget", "Precise editing" — and an "All models" list with the price per image | | **"Advanced"** | resolution, file format, seed, aspect ratio | | **"References"** | "Reference from gallery" — a sample whose style or object the model keeps | The price is recalculated live and sits **right on the button**: you see what will be charged before you press it. In the feed a run first shows skeletons for the number of variants ordered, then the image cards. Each has its actions: **"To gallery"**, **"Refine"**, **"More variants"**, **"Another model"**, **"Use as reference"**, **"Upscale"**, **"Download"**. A failed variant is marked "Didn't work out" and **does not cancel the rest** of the run. Draft variants are kept for 30 days — save what you need with "To gallery" (or "Save and use", if the studio was opened from an editor). --- ## Refining a finished image The **"Refine"** button opens the "Refine image" window: the **"What should change?"** field ("remove the herbs", "make the background darker") and a brush — you may **mark the area** that should change, or leave it alone. The highlight goes to the model as a second reference, which makes the edit more precise than a general instruction; "Clear selection" removes the brush, "Apply" starts the regeneration — with another model if you like. Upscaling works the same way: **"Upscale"** runs the variant through a resolution model. --- ## What generation is paid with Generation spends the **account's AI balance** — the same one the other AI features of the panel use: - when a run starts, the amount is **reserved**: if the balance is short, the studio says "Not enough AI balance" and offers "Top up" **before** any model is contacted; - it is charged **on the fact** and only for **successful** variants, at the price fixed when the run started: you pay for what you were shown; - if the tab was closed halfway, the reserve does not hang: an unfinished run is cleared up by itself and the money returns to the balance. Plans and top-ups are covered in [Subscription](/en/docs/subscription), and which provider and model stand behind the AI features — in [AI models and your own key](/en/docs/ai-models). --- ## Personal data and the Russian circuit Image generation is an external service, so the studio has three safeguards built in — and on the Russian circuit they matter especially: 1. **The personal-data gate.** The prompt and the instruction are checked before they leave: a person's name, phone, email, card number, SNILS, tax number, passport, bank account, address or date of birth will not travel outside — instead of a run you get a message asking to remove them from the request. 2. **An attestation about references.** Before the first run with samples the studio asks you to confirm that "there are no people in the source images, or you have their consent": a photograph of a face is biometric personal data and may not be passed on without that person's consent. The confirmation is remembered. 3. **The "Strictly follow the data localisation law (152-FZ)" toggle.** Switched on, it leaves only models that compute **in Russia**; the rest are blocked with a "Not available in strict mode" note. Switched off, all models are available — and your account identifier is not passed to the provider either way. What technically leaves the panel: only the description itself and, if you attached them, **anonymised copies** of the references behind a temporary link — without the address of your account in storage. --- ## Deleting, and where the files live Deleting is done from the tile, with a "Delete this image from the gallery?" confirmation. Both the original and the preview go. ⚠️ **Gallery files live in your brand's public image zone.** That is deliberate: the chat widget avatar on someone else's website, `og:image` and the logo in emails must open for any visitor without signing in to the panel. The flip side is that **whoever knows the exact address of a file will open it without a password**. So the media library is not the place for scans of documents, passports or any images with personal data: those belong in sections where access is limited by permissions, not in a shared picture library. The second nuance is what happens to an image already in use after you delete it from the gallery: | Where it was picked | What happens | |---|---| | A dish photo, a label icon, a flyer layout — that is, the editor **copied the file** | nothing: that section already has its own file | | Fields of the "image by link" kind (consents, product page sections, campaigns, virtual brands, the widget avatar) | the link goes dead — change the image in the setting first, delete from the library afterwards | --- ## Limitations - **There are no folders, tags or search in the library** — just one grid of tiles. With 500 images that shows, so give files meaningful names before uploading. - **"Where it is used" is not shown.** The library does not know which sections an image has been inserted into — check yourself before deleting. - **The limits are hard:** 500 images per account and 15 MB per file; when it is full, uploads are refused ("The gallery is full"). - **Video and PDF are not accepted** — images in the listed formats only. - **No preview is built for HEIC and SVG** (the browser does not decode them) — the grid will show the original or a placeholder. - **The AI studio is not available on `cenaly.ru`.** There is no "✨ Generate with AI" button there: its server side is not switched on in the Russian cloud yet. The library itself (upload, pick, delete) works fully on `.ru`. - **The gallery is shared across the account**, with no split per location and no "this folder is for this venue only" permissions. - **There is no editing of the image inside the gallery** — no cropping, rotation or captions. Cropping lives in the editors an image is picked into; AI refinement lives in the studio. --- ## Troubleshooting | Symptom | Check | |---|---| | "File is larger than 15 MB" | shrink the file before uploading: the library does no server-side compression | | "Unsupported file format" | only JPEG, PNG, WebP, GIF, AVIF, HEIC/HEIF and SVG are accepted | | "The gallery is full (max 500)" | delete what is unused — the limit cannot be raised | | A tile is grey or has no image | no preview could be built for the format (HEIC, SVG), or the preview link expired: reload the page | | There is no "✨ Generate with AI" button | you are on `cenaly.ru` — the studio is not available there yet | | "Not enough AI balance" | top up in the [subscription](/en/docs/subscription); a run will not start until the amount is reserved | | "The request contains personal data" | remove names, phone numbers, account numbers and addresses from the description — the generation service is external | | "Not available in strict mode" on a model | the data localisation toggle is on: pick a model that computes in Russia, or switch the mode off deliberately | | A variant says "Didn't work out" | press "Retry" or choose another model: the rest of the run is unaffected | | An image vanished from the website after a library clean-up | it had been inserted **as a link** — pick a new image in that setting | | You cannot find an image in the grid | the order is by upload date and there is no search; look by the time you uploaded it | --- ## FAQ ### Is the gallery shared across locations or does each have its own? One per account. That is by design: the logo, background and banners are nearly always shared, and splitting by location would mean uploading the same file several times. ### Will deleting an image from the gallery break a dish photo? No. When an image is picked in an editor, that editor takes **a copy of the file** and lives with it. Only fields where an image is stored as a link will go dead — consents, product page sections, campaigns, virtual brands, the widget avatar. ### Can I upload scans of documents to keep them at hand? Better not. Media library files live in the public image zone: anyone with the exact address opens the file without signing in to the panel. For documents there is [Documents](/en/docs/documents), where access is limited by permissions. ### How is the AI studio different from the generate button in a dish card? The button in the card solves one task — "draw a photo of this item" — and puts the result straight into the card. The studio is general purpose: any image (a banner, an icon, an interior), several variants per run, a choice of model, references and brush refinement, with the result saved to the library and usable anywhere. ### Why is the price on the button but charged later? So that there are no surprises. Before the run you see the amount, at the start it is **reserved** (short balance — no run), and it is charged only for the variants that actually came out. Failed images are not paid for. ### Can I get a direct link to an image from the gallery? Yes — wherever a setting accepts a link, the "From gallery…" field fills it in for you, and such a link does not expire (which matters for the widget avatar and `og:image`). There is no separate "copy URL" button in the grid. ### How long are generated variants kept if I do not save them? Run drafts live for 30 days and are then cleaned up automatically. Move anything you need into the library with "To gallery" — there is no expiry there. --- ## Related articles - [Dish labels](/en/docs/labels) — the icons picked from the media library - [Dish flyer](/en/docs/dish-flyer) and [printed menu](/en/docs/print-menu) — layouts with images from the gallery - [QR menu](/en/docs/qr-menu) and [the shop storefront](/en/docs/shop) — where the guest sees those images - [Website builder](/en/docs/website-builder) and [website widgets](/en/docs/site-widgets) — logos and avatars - [Campaigns and popups](/en/docs/campaigns), [the cookie banner](/en/docs/cookie-consent) — the "image by link" fields - [Subscription](/en/docs/subscription) — the AI balance that pays for generation, and [AI models and your own key](/en/docs/ai-models) — providers and credit usage - [Security and data](/en/docs/security-privacy) — what is stored where and who can see it - [Data export](/en/docs/data-export) — the whole account in one archive --- # Custom editors Some work exists in no panel at all, because it is only yours: a price recalculation by your supplier's formula, reconciling the catalog with someone else's accounting system, a screen that fills in the features of a whole batch in one pass. The **Custom editors** section lets you write such a mini-editor yourself (or order one) and run it **inside the admin panel** — in a sandbox, with access to exactly the data you allowed. Open: **Admin panel → Custom editors** (`admin.cenaly.com/custom-editors`). The section is switched on by the **"Custom editors (SDK)"** card in the [app store](/en/docs/app-store) — it is hidden by default. The **"📌 Pin to sidebar"** button on the page itself puts it into the side menu when you need it often. --- ## What this section is A plugin is a built script (`index.js`) and its description (`manifest.json`). The panel loads the script into an **isolated frame**: it has no access to your session, to the panel's code or to the network. It can talk to data only through the **bridge** — a set of allowed requests, each checked against the permissions you granted. The page consists of blocks: | Block | What's inside | |---|---| | **Installed editors** | a card per plugin: name, "Version", "Permissions", "Placement", "Allowed network hosts", "Updated", the source (repository and tag as a link). Actions: "Open", "Enable" / "Disable", checking for updates, "Remove" | | **Install an editor** | installing from files on disk | | **Install from GitHub** | installing by the address of a public repository and a tag | | **🤖 Build with AI (vibe coding)** | a project template, a prompt for an AI agent and a catalog snapshot as test data | | **👩‍💻 Developer access** | temporary grants of developer mode to a contractor | | **🛠️ Developer mode** | running a plugin straight from your computer, without installing | An open editor takes the whole screen, and the address gains a `?app=` marker — such a link can be shared with anyone who has access. --- ## What you need to start | What | Why | |---|---| | The **"Custom editors (SDK)"** card in the [app store](/en/docs/app-store) | the section is niche and switched off by default | | You are the **account owner** | only the owner can install, enable, remove plugins and issue grants; employees see the list read-only | | A built plugin: `index.js` + `manifest.json` | yours, a developer's, or a release in a public GitHub repository | | *For development* — an [employee account](/en/docs/staff) for the developer | developer mode is granted by the email of their work login | --- ## Step 1. Decide who writes the editor There are three routes, and they differ in who holds the code: | Route | Who it suits | How | |---|---|---| | **An AI agent on our template** | an owner ready to explain the task in words | the "Build with AI" block: template + prompt → the agent assembles a release → you install it | | **Your own or a hired developer** | there is a contractor or a developer on the team | issue them a grant for developer mode, they write and debug against the live account, you install the finished release | | **A ready release from GitHub** | the plugin already exists (yours or made for you) | "Install from GitHub": the repository address and a tag | In all three cases **installation stays with the owner**: even a developer with a grant can only run their own code in developer mode, not put it into the account. --- ## Step 2. Build with AI (vibe coding) The **"🤖 Build with AI (vibe coding)"** block gives four things, so that you can hand the task to an AI agent (Claude Code, Cursor and the like) without explaining the contract from scratch: 1. **"⬇️ Download the project template (zip)"** — a ready skeleton of a plugin: the manifest, the entry point, the contract description (`GUIDE.en.md`) and instructions for the agent. The archive is assembled right in the browser, nothing external is downloaded. 2. **"📋 Copy the prompt for the agent"** — the task text in English: start from the template, follow the guide, and here is how to verify the result. 3. **A tool configuration for the agent** — with it the agent builds the plugin, launches a **local copy of the sandbox**, takes screenshots and state snapshots, and finally assembles a release: a zip for manual installation or a GitHub release. 4. **"⬇️ Download a catalog snapshot (test fixture)"** — your categories and items as a file, so the agent tests against real data instead of invented data. ⚠️ The custom fields of **other plugins are cut out of the snapshot entirely**: data that a third-party extension keeps on your cards does not leave the account with the fixture. --- ## Step 3. Install the editor **From files.** The "Install an editor" block: pick the "Bundle (index.js)" and the "Manifest (manifest.json)" → **"Validate and install"**. The panel first checks the manifest — identifier, localised name, version, minimum SDK version, placements, permissions and the list of network hosts — and then shows the **consent screen**: "This editor requests:" and the list of permissions in plain language. Until you press "Install", nothing is installed. **From GitHub.** The "Install from GitHub" block: the "Repository (URL or owner/repo)" field, the "Tag (empty = latest release)" field and the "Check repository" button. The convention is simple: `manifest.json` in the repository root, the built `dist/index.js` in the tag, the tag named `v{version}`. The manifest and the bundle are fetched straight from your browser. In both cases the **bundle fingerprint (sha256)** is computed and stored at install time: if the file is swapped later, execution is blocked and the panel asks you to reinstall the editor. --- ## Permissions and placement Permissions (also called scopes) are requested by the plugin in its manifest and confirmed by you at install time. Here is the full list — the bridge can do nothing else: | Permission | What it opens | |---|---| | **Read the catalog** | categories, items, features and the custom fields of cards | | **Create and change catalog items** | creating and editing items, batch import, own fields and feature definitions | | **Change prices, availability and stop lists per location** | the same thing the panel does in a location's menu | | **Read the stock item reference** | the [inventory](/en/docs/inventory) nomenclature, read-only | | **Keep its settings in your storage** | the plugin's own keys inside your account (up to 1 MB per key) | | **The extension's server side** | calls to the plugin's code on our server — its only way to reach the internet | Whatever is not on that list the plugin will never get, by any setting: **guests and customers, orders, receipts, finance, employees, chats and calls** are not exposed by the bridge at all. There are three placements (slots): | Slot | Where it appears | |---|---| | **Its own page** | an item inside the "Custom editors" section, opened full screen | | **A button on the catalog page** | a tool next to the item catalog | | **A tab of the "Inventory" section** | the plugin is rendered as an [inventory](/en/docs/inventory) tab — that is how our built-in "VetIS" extension is packaged | --- ## Developer mode and contractor access **Developer mode** (the "🛠️ Developer mode" block) mounts a plugin **live from your computer**: the "Bundle URL" field accepts only `localhost` / `127.0.0.1` addresses, next to it is "Manifest JSON" and the "Start dev session" button. No fingerprint is pinned, and the session lives until the tab is closed; "Stop dev session" ends it at once. **Developer grants** (the "👩‍💻 Developer access" block) are for when the author is not the owner. The developer gets an ordinary [employee account](/en/docs/staff), and then the owner issues a grant: "Developer email (their staff login)", "Allowed permissions", "Validity (days)" and an optional note → **"Grant access"**. It can be revoked at any moment with "Revoke". What a grant does and does not do: - it does give **developer mode only**, with the permissions you ticked (14 days by default, 90 at most); - permissions are cut down to the **intersection**: what the manifest requests **and** what the grant allows — the plugin gets nothing extra even if it asks for it in the manifest; - it does not give installing, enabling or removing plugins: that stays with the owner. --- ## Updating, enabling and removing | Action | How | |---|---| | **Open** | the "Open" button on the card (or a link with `?app=…`) | | **Disable temporarily** | "Disable" — the plugin stays installed but does not run and does not appear in its placements | | **Update** | for plugins from GitHub — "Check for updates" and then "Update to …"; if the version is current, the panel says "The latest version is installed". Plugins from files are updated by installing again | | **Remove** | "Remove" with a confirmation: settings and the menu item go, uploaded releases stay in storage | There is no auto-update on purpose: a new version of someone else's code means a new fingerprint and possibly new permissions, so updating is always a **deliberate act of the owner**. --- ## Built-in extensions Some of our own modules are packaged in the same format — you can tell by how they behave — but you do not install them: they ship with the panel and are switched on by a card in the [app store](/en/docs/app-store), not in this section. There is one such module today — **"Mercury/VetIS"** for Russia: it lives as a tab of the [Inventory](/en/docs/inventory) section, runs in the same sandbox and with the same fingerprint checks. Built-in extensions do not appear in the list of installed editors. --- ## What an editor can and cannot do | It can | It cannot | |---|---| | Read and change the catalog within the granted permissions | learn your password or use your session | | Show its own interface, notifications and confirmation prompts | open the code or data of the admin panel around it | | Open the panel's native item editor | reach the internet directly from the plugin window | | Keep its settings inside your account | see another plugin's data on your cards | | Reach the internet **through its server side** — and only at the https addresses listed in the manifest (no more than eight) | run after the file has been swapped: a fingerprint mismatch blocks execution | Third-party plugins carry a warning on their card: **"A third-party app in a sandbox — it never asks for your password."** If a plugin asks for your panel login, payment details or an SMS code, that is fraud, not how an extension works. --- ## Limitations - **The section is off by default** and is meant for people who write code (or commission it): an ordinary owner has nothing to do here. - **Everything except viewing is owner-only.** An employee sees the hub read-only; developer mode requires a live grant. - **Private GitHub repositories are not supported** — the repository must be public, and installation goes by tag. - **There is no auto-update**: updating a plugin is always started by the owner. - **There is no marketplace of third-party plugins.** Ready extensions are neither published nor sold through the panel — the source is your file or your repository. - **There are three slots** (own page, catalog button, inventory tab) — a plugin cannot embed itself into an arbitrary screen of the panel. - **The bridge exposes no guests, orders, finance, employees or chats** — permissions cannot change that, such requests simply do not exist. - **There is no separate "the plugin did this" log.** Permissions are visible on the card and catalog edits land in the ordinary item history; if you need control, start with a plugin granted read-only access. - **Technical ceilings:** a bundle up to 4 MB, up to 8 network addresses in the manifest, up to 1 MB per storage key; a server run lasts up to 30 seconds and makes up to 50 outbound calls. - **The plugin's data stays in your brand's cloud**: for an account on `cenaly.ru` the server side's state lives in the Russian circuit. --- ## Troubleshooting | Symptom | Check | |---|---| | There is no section in the menu | whether the "Custom editors (SDK)" card is switched on in the [app store](/en/docs/app-store); whether the section was pinned with "📌 Pin to sidebar" | | An employee sees no install controls | that is by design: installing, removing and grants are owner-only | | "The stored bundle does not match the pinned fingerprint. Execution blocked" | the plugin file was swapped after installation — reinstall the editor to record the new fingerprint | | "The editor did not start in time (no connect() within 10 s)" | the plugin never came online: an error in its code or the wrong file was built | | "Failed to load the editor bundle" | the release is unavailable or the file is damaged — reinstall | | "Editor not found or disabled" when following a `?app=…` link | the plugin was removed or disabled on its card | | "Failed to fetch the editor from GitHub" | the repository is private, there is no `manifest.json` in the root, no `dist/index.js` in the tag, or the tag is not named `v{version}` | | "Only localhost / 127.0.0.1 addresses are allowed" | developer mode deliberately refuses external addresses — serve the build locally | | The plugin does not see the data it needs | check "Permissions" on the card; for a developer with a grant, permissions are further cut to the intersection with the grant | | The plugin cannot reach an external service | there is no direct network in the sandbox: the call is made by the server side, and the address must be in the manifest | | "The editor reports unsaved changes. Close anyway?" | the plugin itself reported a draft — save your work inside it before closing | --- ## FAQ ### Do I need to know how to program? To install a ready release — no. To get that release — yes: it is written by a developer or by an AI agent on our template from the "Build with AI" block. The section is a tool for code, not a drag-and-drop builder. ### Can a third-party plugin see my customers or my revenue? No. A plugin runs in a sandbox and receives data only through the bridge, and the bridge does exactly six things: the catalog, prices and stop lists, the stock reference, its own storage, calling its own server side and interface elements. Guests, orders, receipts, finance, employees and chats are not there at all. What a particular plugin is allowed is always visible on its card in the "Permissions" line. ### How do I let a contractor develop without giving them the whole account? Create an [employee](/en/docs/staff) account for them and then issue a grant in the "Developer access" block: tick only the permissions needed and set an expiry (14 days by default, 90 at most). They get developer mode and nothing else; installing the plugin still stays with you. The grant is revoked with one button. ### Will a plugin update itself when the author ships a new version? No. Updating is started by the owner: "Check for updates" → "Update to …". This way a new version never appears in the account behind your back — the permissions it requests may have changed along with it. ### Where does a plugin keep its settings and data? Inside your account, in separate storage under its identifier (up to 1 MB per key), plus — if it uses them — in the custom fields of your cards; each plugin sees only its own space. For an account on `cenaly.ru` the server side and its state remain in the Russian circuit. ### How is this different from the API and MCP? The [developer API](/en/docs/headless) and [MCP of your phone system](/en/docs/telephony) are for programs that work **outside**: your own website, someone else's accounting system, an AI agent. A custom editor is the opposite — an interface **inside** the panel: an employee opens it like any other admin page and never leaves their working window. --- ## Related articles - [App store](/en/docs/app-store) — where the section and the built-in extensions are switched on - [Inventory](/en/docs/inventory) — the tab extensions like "VetIS" live in, and the stock reference - [Catalog import](/en/docs/catalog-import) — the standard way to load items, if that is the whole task - [Headless storefront](/en/docs/headless) — the open data contract for an external website - [API & MCP of your phone system](/en/docs/telephony) and [Guest API for AI agents](/en/docs/llm-api) — working outside the panel, not inside it - [Employees and shifts](/en/docs/staff) — an account for the developer, and roles - [Security and data](/en/docs/security-privacy) — what is stored where and who has access - [Support](/en/docs/support) — where to write if a plugin behaves suspiciously --- # Public API and webhooks The REST API lets your CRM, website backend or own bot work with cenaly.com leads and conversations the same way the admin panel does: read cards, change properties, send events, reply in conversations. Webhooks work the other way round — they notify your server about new leads, events and messages. > ⚠️ This section is in **beta**: methods and formats are stable, but the list may grow. The API version is in the address (`/v1`); breaking changes will go to `/v2`. ## What you need | What | Where | |---|---| | Role | **account owner** — the key acts on their behalf; staff do not see keys | | Section | chat enabled (leads and conversations live there) | | Key | **Integrations → API & webhooks → Keys → Create key** | | API address | `https://api.cenaly.com/public-api/v1` | | Method reference | [api.cenaly.com/public-api/v1/docs](https://api.cenaly.com/public-api/v1/docs) | | OpenAPI 3.1 | [api.cenaly.com/public-api/v1/openapi.json](https://api.cenaly.com/public-api/v1/openapi.json) | ## Step 1. Key and permissions 1. Open **Integrations** and click **API & webhooks** in the page header. 2. On the **Keys** tab click **Create key** and enter a name (“CRM”, “Website backend”, “Telegram bot”). 3. Pick a permission set or tick permissions one by one; with several locations — which locations the key may use; and the expiry. 4. Copy the `cnk_…` secret. **It is shown only once**: we keep only its fingerprint (SHA-256). | Permission | What it allows | |---|---| | `contacts:read` | list, search and card of a lead, properties | | `contacts:write` | change properties and tags, merge, erase on a data subject request | | `events:read` | the event feed of a lead | | `events:write` | send events (purchase, sign-up, anything of your own) | | `conversations:read` | conversations and messages | | `conversations:write` | operator reply, note, status, assignee, tags | | `messages:send` | a message to the lead’s latest conversation | | `segments:read` | saved segments and their members | Sets: **CRM / backend** (leads, properties, events, reading conversations and segments), **Own bot** (reads leads, replies in conversations, writes to leads), **Read only**, **Everything**. - **Permissions** change the key’s permissions and locations on the fly — the integration keeps working. - **Reissue** gives a new secret; the old one stops working immediately, permissions and the log stay. - **Revoke** — immediately and for good, the next request gets `401`. Pass the key in the `Authorization: Bearer cnk_…` header (or `X-Api-Key: cnk_…`). Keep it on your server only — never in a browser or a mobile app. ## Step 2. First requests ```bash KEY=cnk_your_key API=https://api.cenaly.com/public-api/v1 # what the key can do: permissions, locations, limit curl -H "Authorization: Bearer $KEY" "$API/me" # leads, newest first (20 per page) curl -H "Authorization: Bearer $KEY" "$API/contacts?limit=20" # search by name, email or phone curl -H "Authorization: Bearer $KEY" "$API/contacts?q=anna" ``` The response is always an envelope: ```json { "meta": { "status": 200, "requestId": "…", "nextCursor": "WyIyMDI2LTEwLTA0…" }, "data": { "total": 128, "contacts": [ { "id": "…", "status": "lead", "name": "Anna", "updatedAt": "2026-10-04T09:12:00Z" } ] } } ``` The next page is the same request with `cursor=`; no `nextCursor` — no more pages. An error is `{"meta": {...}, "error": {"code": "…"}}`. **Location.** If the key has one location, you do not need to pass it. With several — add `location=` (the list is `GET /v1/locations`), otherwise you get `400 location_required`. **Properties and events by your user_id.** You do not have to store our lead id: add `?by=user_id`, and your user identifier becomes the address. No lead with that user_id yet — we create one. ```bash # properties: operations update_or_create, set_once, add, delete, append, union, exclude curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"ops":[{"op":"update_or_create","key":"$email","value":"anna@example.com"}, {"op":"add","key":"orders","value":1}, {"op":"union","key":"interests","value":"yoga"}]}' \ "$API/contacts/u-1001/props?by=user_id" # events in a batch (up to 100); a repeat with the same id counts once curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"events":[{"id":"ord-5531","userId":"u-1001","name":"order_paid","props":{"sum":45,"currency":"GEL"}}]}' \ "$API/events" # reply in a conversation and change its status curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"text":"Hello! Your order is on its way."}' "$API/conversations//reply" curl -X POST -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -d '{"status":"resolved"}' "$API/conversations//status" ``` Writes go through the same queue as edits from the panel: changes apply within seconds, and a write by user_id answers `202` with `pending`. In the lead card the author of the change is shown as “API: ”. ## Methods | Method | What it does | Permission | |---|---|---| | `GET /v1/me`, `GET /v1/locations` | key, permissions, locations | — | | `GET /v1/contacts` | leads: `status` (`anon`, `lead`, `user`), `q`, `limit`, `cursor` | `contacts:read` | | `GET /v1/contacts/{id}` | card: properties, tags, event summary | `contacts:read` | | `POST /v1/contacts/{id}/props` | properties via operations (up to 250) or `{"props":{…}}` | `contacts:write` | | `POST` / `DELETE /v1/contacts/{id}/tags` | lead tags | `contacts:write` | | `POST /v1/contacts/merge` | merge two cards: preview, then `"apply": true` | `contacts:write` | | `POST /v1/contacts/{id}/erase` | erase on a data subject request (`"confirm": true`) | `contacts:write` | | `GET /v1/contacts/{id}/events` | the lead’s event feed | `events:read` | | `POST /v1/contacts/{id}/events`, `POST /v1/events` | events (up to 100 at once) | `events:write` | | `GET /v1/contacts/{id}/conversations` | the lead’s conversations | `conversations:read` | | `POST /v1/contacts/{id}/messages` | write to the lead’s latest conversation | `messages:send` | | `GET /v1/conversations`, `/{id}`, `/{id}/messages` | conversations and messages | `conversations:read` | | `POST /v1/conversations/{id}/reply` | operator reply or a note (`"type": "note"`) | `conversations:write` | | `POST /v1/conversations/{id}/status`, `/assign`, `/tags` | status, assignee, tags | `conversations:write` | | `GET /v1/segments`, `GET /v1/segments/{id}/contacts` | segments and their members | `segments:read` | Fields, examples and error codes of every method are in the [reference](https://api.cenaly.com/public-api/v1/docs). ## Step 3. Webhooks Webhooks are set up per location: **Chat → Settings → Webhooks** — an `https` address, events and a signing secret. Lead events were added next to the conversation events (new conversation, new message, status, rating, tags): | Event | When it arrives | |---|---| | `lead.created` | a new lead appeared (contact left in the chat, a form, or created via the API) | | `lead.props_changed` | lead properties changed — the keys are in `changedProps` | | `lead.event_tracked` | the lead has an event; by default all your events without system ones (`$…`), the list of names is set in “Which events to send” | | `message.goal_reached` | the lead reached a message goal (pop-up, campaign) | ```json { "event": "lead.event_tracked", "deliveryId": "WD…", "at": "2026-10-04T09:12:03Z", "webhookId": "…", "locationId": "…", "contact": { "id": "…", "status": "user", "userId": "u-1001", "props": { "orders": 3 }, "tags": ["vip"] }, "leadEvent": { "name": "order_paid", "at": "2026-10-04T09:12:00Z", "props": { "sum": 45 } } } ``` The lead’s name, email and phone go into the body only if the webhook has “Send guest contacts” ticked. Verify the signature with HMAC-SHA256 of the body using the webhook secret: ```bash # header X-Meni-Signature: sha256= echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" ``` Answer `2xx` within 5 seconds — otherwise the delivery is retried; after a long run of failures the webhook is switched off, and you see it in the settings. Drop duplicates by `deliveryId`. ## Limitations - **60 requests per minute per key**; above that — `429` with a `Retry-After` header. What is left — in `X-RateLimit-*`. - Up to **200** records per page (50 by default), up to **100** events per batch, up to **250** property operations per request, up to **30** tags at once. - Up to **20** live keys per account. - A key’s call log is kept for **30 days**: time, method, path template (no ids or body), response code, duration. - Events sent via the API land in the lead card (feed, summary, segments), but not in the raw visit analytics log. - You can write to a lead only in an existing conversation: no conversation — `409 no_conversation`. ## Troubleshooting | Response | What it means | What to do | |---|---|---| | `401 api_key_missing` / `api_key_invalid` | no key in the request, or it is wrong, revoked or expired | check the header; reissue the key if needed | | `403 scope_required` | the key lacks the permission | **Permissions** of the key — add it | | `400 location_required` | the key has several locations | add `location=` | | `404 location_not_found` | the location is not among the key’s locations | check `GET /v1/locations` | | `404 not_found` | no such lead or conversation | for your own ids use `?by=user_id` | | `429 rate_limited` | more than 60 requests per minute | wait `Retry-After` seconds, batch events | | `502 upstream_error` | temporary failure | retry later | Every request is visible on the **Call log** tab — with the response code and the key name. ## FAQ **Can I call the API from a browser?** No: the key gives access to all leads of a location. Call the API from your server. **How is user_id different from a lead id?** A lead id is our card identifier. user_id is your user identifier (a CRM number, a website account id); with `?by=user_id` you can address the card by it. **What happens if I send an event twice?** An event with the same `id` counts once — feel free to retry the request after a network error. **Do I need a separate key per location?** No: one key can work with several locations, the location is chosen with the `location` parameter. ## Related sections - [Guest chat](/en/docs/chat) — conversations, leads and webhook settings - [Leads](/en/docs/leads) — the unified inbox - [API and MCP of your PBX](/en/docs/pbx-api) — the separate telephony API - [Integrations](/en/docs/integrations) --- # Phone as a mobile computer (handheld scanner): getting started A handheld terminal (mobile computer) is a scanner with a screen that warehouse staff use to receive goods, count stock and pick orders. You don't have to buy one: the **Warehouse / Handheld** module turns any staff or owner smartphone into it. The phone scans, keeps working without the internet, and a manager in the browser sees its work live and posts the documents. The scanner mode is included in inventory at no extra cost. It is a new feature in beta: it has been tested on Android smartphones; on iPhone it has so far only been verified as a build. --- ## What the phone scanner is | Where | Who | What | |---|---|---| | **Work** app (Android, iPhone) | stock keeper, buyer, sales assistant, picker | the "Warehouse / Handheld" mode: operations allowed by the role | | **Business** app (Android, iPhone) | owner | the same module: on Android — "Warehouse / Handheld", on iPhone — the warehouse terminal tile | | Browser: **Inventory → 📱 Scanner** (`admin.cenaly.com/inventory/tsd`) | owner, manager | phone sessions, posting, discrepancy report, tasks, log and KPIs, settings | Every piece of work on a phone is a **session** — a shared draft document on the server. Several phones can scan into the same receiving or stocktake at once. Until the session is posted, stock does not change; "Post" turns it into an ordinary inventory document. --- ## What you need to start | What | Why | |---|---| | The **[Inventory](/en/docs/inventory)** section and at least one warehouse at the location | the phone works with a warehouse: catalog, stock, documents | | Items with **barcodes** | the phone finds an item by its barcode; an unknown code can be attached to an item right from the phone | | A staff member with a role that includes inventory and a login ([Staff](/en/docs/staff)) | rights on the phone are the role's rights; "Stock keeper" records but does not post | | An Android 8+ smartphone or an iPhone (iOS 16+) with the [Work or Business app](/en/docs/mobile-apps) | the camera is already a scanner; for volume — a [Bluetooth scanner or an Android handheld](/en/docs/tsd-scanners) | | *Optional:* a label printer | price and shelf labels from the phone over Wi-Fi/Bluetooth or through a computer with the [bridge](/en/docs/hardware-bridge) | --- ## Step 1. Warehouse and staff 1. In **Inventory**, create the location's warehouse and items (or import the catalog). Item barcodes live in the item card. 2. In **Staff**, add an employee with a login and the **"Stock keeper"** role (or your own role with inventory access). 3. Decide who will **post**: the owner, a manager, or a role with the "Post stocktake" ability. By default a stock keeper only records and submits. --- ## Step 2. Turn on the scanner mode on the phone - **Android, Work**: sign in → mode selection → **"Warehouse / Handheld"** (or the chip in the app settings). - **Android, Business**: the "Warehouse / Handheld" card in mode selection or the icon in the header. - **iPhone, Work**: the "Warehouse / Handheld" mode; **iPhone, Business**: the **warehouse terminal** tile (mode selection or the "Account" tab). Pick a warehouse — the phone downloads a copy of the catalog, prices and stock. The home screen shows operation tiles, your own and open sessions, and a freshness badge for the copy. An operation you can't use is shown greyed out with the reason: no permission, turned off in the warehouse settings, bin locations required. If you connect an external scanner, run the **"Scanner check"** wizard on the home screen (Android): it checks that the whole code comes through. More in [Which scanner to choose](/en/docs/tsd-scanners). --- ## Step 3. Your first receiving 1. The **"Receiving"** tile → basis: **purchase order** (there will be a plan), **invoice photo**, or **no document**. 2. Scan items: each scan is +1 (or the phone asks for the quantity — a warehouse setting). You can type the quantity or receive **by packs**. 3. Against an order you see plan versus actual: waiting, short, matched, over, "not in the order", unknown code. 4. For items with a shelf life, the phone takes the lot and expiry from the GS1 barcode or asks for them. 5. Need a second person? **"Receive together"**: the second phone scans the session QR and writes into the same receiving. 6. **"Submit"** sends the session for review. If you have the right — **"Post"** straight from the phone. Differences from the order — the **discrepancy report** button (PDF). --- ## Step 4. Review and post in the office Open **Inventory → 📱 Scanner**. The **"Sessions"** tab lists every receiving, transfer, stocktake and write-off from phones: status, participants, number of lines. ![Scanner office: tabs "Sessions", "Tasks", "Log and KPIs", filters "In progress", "To review", "Posted", "Cancelled", "All" and the list of sessions with operation, status, participants and lines; "Scanner settings" and "Bin locations" at the top right](/images/tsd/en/tsd-office-sessions-1200.webp) The session window shows plan versus actual, the line log (who, when, from which phone) and the participants. A live session refreshes every 5 seconds — you can watch the stock keeper scan. Buttons: **"Post"** (submitted sessions only), **"Return to work"**, **"Cancel"**, **"Discrepancy report (PDF)"**. If new lines arrived from a phone after you opened the window, "Post" asks you to refresh — you post exactly what you saw. --- ## Step 5. Configure the warehouse **Inventory → 📱 Scanner → ⚙ Scanner settings**. Settings are set for all warehouses, a location or a specific warehouse; the nearest level wins, and each field shows where its value comes from. ![The "Scanner settings" window: tabs for operations, scanning, receiving and counting, bin locations, device and printing; the operations tab shows switches for price check, barcode collection, receiving and put-away marked "Default"](/images/tsd/en/tsd-settings-window-800.webp) | Tab | Main options | Default | |---|---|---| | Operations | which operations the phone shows | all on | | Scanning | +1 per scan or ask for quantity; weight barcodes | +1; prefixes 20–29, weight in the code | | Receiving and counting | blind receiving; "more than ordered"; blind stocktake; photo on write-off; FEFO | off; warn; **on**; not required; warn | | Bin locations | bin storage, mandatory bin scan, picking check by someone else | off; on; off | | Device and printing | posting offline, sign-out on a shared phone, where to print | off; 5 min; the computer's print queue | Only the owner and managers can change the settings. Role rights always win: a setting can only narrow what is allowed. --- ## What else the phone can do | Operation | In short | |---|---| | Price check | scan → price, stock per warehouse, lots and expiry, bin | | Barcode collection | unknown code → "New item" with a photo or "Add barcode to item"; a list of codes → CSV or into receiving | | Transfer | dispatch → "in transit" → receiving at the destination warehouse with discrepancies | | Write-off | reason, photo above the amount set in settings, hint about expired lots | | Return to supplier | supplier and the basis order, or without receiving | | Stocktake | whole warehouse, categories, suppliers, bins or a list; several phones by zones; recount of discrepancies by another employee | | Bin locations | put-away with a "where it already is" hint, moves between bins, "Find", stocktake by bins | | Order picking | a pick list from orders "To ship", route by bins, scan of every item, packages, check, "Packed" in shipments | | Repricing and labels | new price → "Apply prices" → print price labels; shelf price-label audit | | Tasks | the office assigns a task, the employee gets a push and takes it; "My work" and reports on the phone | --- ## Without the internet Scans, lines and counts are kept on the phone and sent automatically when the connection is back; a badge shows how many are waiting. You can't **post** offline unless the warehouse allows "posting without network". --- ## Limitations - Beta: on iPhone the module has only been verified as a build; on cenaly.ru the scanner mode on iPhone does not work yet (Android only). - iPhone has no built-in scanner and no scanner-check wizard — use the camera or a Bluetooth scanner in keyboard mode. - When picking, shortages and substitutions don't change the order contents — the order is edited by hand. - There is no full scanner app in the browser: the admin panel has a camera scanner on the inventory page and the office. --- ## Troubleshooting | Symptom | What to check | |---|---| | An operation is missing or greyed out | the reason is on the tile: role permission, warehouse setting ("Operations"), bin locations | | A stock keeper has no "Post" | by design: the owner, a manager or a role with "Post stocktake" posts | | An item isn't found by scan | refresh the warehouse copy (button on the home screen); code not registered — "Add barcode to item" | | The scanner beeps but no line appears | [scanner and GS setup](/en/docs/tsd-scanner-gs), the "Scanner check" wizard | | Lines are "waiting to send" | no connection — they will go automatically; the "not accepted" list explains server refusals | --- ## FAQ ### Do I need a dedicated handheld? No. Any Android 8+ or iPhone with a camera already reads barcodes and DataMatrix codes. For hundreds of items per shift a [Bluetooth scanner or an Android handheld](/en/docs/tsd-scanners) is more convenient. ### How much does it cost? It is included in inventory at no extra cost. ### Can two people receive one delivery? Yes: "Receive together" on the first phone, the second one scans the session QR. Repeats are never double-counted. --- ## Related sections - [Which scanner to choose](/en/docs/tsd-scanners) - [Setting up the GS character](/en/docs/tsd-scanner-gs) - [Inventory](/en/docs/inventory) — stock, documents, suppliers - [Mobile apps](/en/docs/mobile-apps) — Work and Business - [Staff and shifts](/en/docs/staff) — roles and logins - [Hardware](/en/docs/hardware) and [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — printers and printing through a computer - [Offline mode](/en/docs/offline) --- # Which scanner to choose for the phone handheld The [phone handheld](/en/docs/tsd-phone) takes scans in three ways, all equal: the camera, an external scanner in keyboard mode and the built-in scanner of an Android handheld. You can start with no purchases at all — with the camera. Below: how to choose for your volume and what to look for when buying. > ⚠️ We describe the hardware in this article from the vendors' documentation: a model on the list is supported by a profile, but not everything has been tested by hand on that device. Where it hasn't, the table says so. --- ## How to choose | Your situation | What to take | |---|---| | Dozens of items a day, deliveries once a week | the **phone camera** — nothing to buy | | Hundreds of items per shift, receiving by boxes, full stocktakes | a **2D Bluetooth scanner** for the employee's phone | | The warehouse works all day, several people share one device | an **Android handheld** with a built-in scanner | | DataMatrix product codes, lot and expiry in a GS1 barcode | only a **2D** scanner (imager) or the camera — a 1D laser scanner can't read DataMatrix | --- ## What you need to start | What | Why | |---|---| | An Android 8+ smartphone or an iPhone (iOS 16+) with the Work or Business app | the "Warehouse / Handheld" module, see [getting started](/en/docs/tsd-phone) | | For an external scanner — **keyboard (HID)** mode with an **Enter** suffix | that is how the phone tells a scan from typing | | For GS1 and DataMatrix product codes — the **GS** character | [how to set up GS](/en/docs/tsd-scanner-gs) | --- ## Phone camera The camera reads product barcodes (EAN, UPC, Code128, ITF-14 on cases), **DataMatrix**, **PDF417** and QR. Three modes: - **single** — aim, hear the beep, the line grows; - **continuous** — the camera stays open between scans, the same code in the frame counts once; - **multi-scan** — every code in the frame at once, the "Count all (N)" button: handy for cases on a pallet. There is a torch and zoom. Read small DataMatrix codes on a budget phone closer and with light; if the camera often misses, take a Bluetooth scanner. --- ## Bluetooth or USB scanner Any scanner with a **keyboard (HID)** mode works — on Android and on iPhone. 1. Put the scanner into HID mode and turn on the **Enter** suffix using the vendor's programming sheet. 2. For GS1 and DataMatrix codes, turn on sending **GS** as F8 or Ctrl+] — [details](/en/docs/tsd-scanner-gs). 3. Pair the scanner with the phone in the phone's Bluetooth settings (a USB scanner — via an OTG adapter on Android). 4. Open the handheld module and scan: no need to tap an input field, the on-screen keyboard doesn't pop up. 5. On Android, run the **"Scanner check"** wizard on the handheld home screen. What to look for when buying: a **2D imager** (not a laser), Bluetooth HID, a programmable suffix and GS/FNC1 output, a battery that lasts a shift. SPP mode on iPhone works only with MFi-certified models — choose HID. --- ## Android handheld with a built-in scanner The handheld's built-in scanner sends the code to the app as a broadcast. The app detects the model and listens on the right channel. | Vendor | How it connects | Profile status | |---|---|---| | Zebra | the DataWedge profile is created automatically | per documentation | | Honeywell | the app claims the scanner itself | per documentation | | Newland | its own configuration command | per documentation | | Urovo, Sunmi | broadcast by default | per documentation | | ATOL (Smart.Droid), iData, Chainway, M3 | broadcast | per integrators' publications | | Point Mobile, Mertech | broadcast | not tested | If your model isn't listed or the scanner "beeps but the app is silent", turn on broadcast (Intent) output on the handheld or switch its scanner to keyboard mode — HID works too. --- ## Label and price-tag printer The phone prints price tags, warehouse and shelf labels, and picking package labels. | Channel | Android | iPhone | |---|---|---| | Wi-Fi / network (port 9100) | yes | yes | | Classic Bluetooth (SPP) | yes | **no** — an iPhone limitation | | Bluetooth LE | yes | yes | | Through a computer with the [bridge](/en/docs/hardware-bridge) | yes (PIN pairing) | yes | Printer languages — **ESC/POS, TSPL, ZPL, CPCL**. The whole label is sent as one image, so any alphabet prints without printer fonts. Templates and sizes are the same as in the admin panel. The warehouse decides where to print: if printing from the phone is disallowed, the phone prints only through the computer. --- ## Limitations - Real handhelds, Bluetooth scanners and Bluetooth printers were tested with emulation, not by hand on the devices — first user feedback will refine the profiles. - iPhone has no built-in scanner and no "Scanner check" wizard; the printer is Wi-Fi, BLE or through a computer only. - The phone doesn't print DataMatrix product codes — print them in the office. --- ## Troubleshooting | Symptom | What to check | |---|---| | The scanner beeps, no line | HID and the Enter suffix; the scanner is paired with this phone; on a handheld — broadcast output | | Letters instead of digits | the scanner's keyboard layout | | A DataMatrix code is "incomplete" | the scanner drops GS — [set up GS](/en/docs/tsd-scanner-gs) | | The camera doesn't take DataMatrix | closer, torch, zoom; if it fails often — a Bluetooth scanner | | The printer isn't found on iPhone | classic Bluetooth doesn't work on iPhone — Wi-Fi, BLE or through a computer | --- ## FAQ ### Will my old laser scanner do? For product barcodes — yes, in keyboard mode. For DataMatrix and GS1 DataMatrix — no: you need a 2D scanner. ### Does it work on a handheld without Google services? Yes. Camera recognition is built into the app and doesn't need Google services. --- ## Related sections - [Phone as a handheld: getting started](/en/docs/tsd-phone) - [Setting up the GS character](/en/docs/tsd-scanner-gs) - [Hardware](/en/docs/hardware) - [Cenaly Hardware Bridge](/en/docs/hardware-bridge) --- # The GS character: setting up a scanner for GS1 and DataMatrix product codes A GS1 DataMatrix with a lot and expiry date — and a track-and-trace product code — consists of several fields. Between the fields there is an invisible control character **GS** (Group Separator, code 29). If the scanner drops it, the fields stick together: the lot "eats" the following fields and the expiry date isn't recognised. On the [phone handheld](/en/docs/tsd-phone) you set this up once. --- ## What GS is and why it gets lost | Where it occurs | What happens without GS | |---|---| | GS1 DataMatrix and GS1-128 with a lot (AI 10) and expiry (AI 17) | the lot swallows the next fields, the expiry isn't read | | Track-and-trace DataMatrix product codes | the code fails verification | | An ordinary EAN/UPC barcode | there is no GS — nothing to set up | The phone camera and the built-in scanner of an Android handheld usually pass GS through as is. It is most often lost by a **scanner in keyboard (HID) mode**: a keyboard has no key for character 29, so by default the scanner simply skips it. --- ## What you need to start | What | Why | |---|---| | A **2D scanner** (imager) | a 1D laser scanner can't read DataMatrix at all | | The programming sheet of your model — a PDF on the vendor's site | the service barcodes that change the scanner's mode | | A test GS1 DataMatrix code | to check the result with the wizard | --- ## Step 1. Turn on GS output in the scanner In the programming sheet, find the section about **GS / FNC1 / Group Separator** (sometimes "non-printable character replacement" or "function key mapping"). The scanner should send, instead of the invisible character, a key the app understands: | What the scanner sends | Understood by the app | |---|---| | **F8** | yes | | **Ctrl+]** | yes | | **Tab** | yes | | the character with code **0x1D** ("as is") | yes | Also check the **Enter suffix** after the code — without it the phone can't tell the scan has ended (a scanner without a suffix works too, but is distinguished from typing more slowly). --- ## Step 2. Check with the wizard On Android, open **"Scanner check"** on the handheld home screen and scan a test code. The wizard reports one of three results: | Result | Meaning | |---|---| | **OK** | the code arrived whole, GS is in place | | **Incomplete code** | GS is lost — go back to step 1, the wizard suggests how to turn it on | | **OK with a warning** | GS was lost, but the app restored it by the code template — better to set up the scanner anyway | The wizard also shows the input speed (for a keyboard scanner). On iPhone there is no wizard — check the scanner with your first receiving: the app marks an incomplete code. --- ## Built-in scanner of an Android handheld The built-in scanner passes the code to the app directly (broadcast), and GS usually arrives as is. If not, in the handheld's scanner settings (DataWedge on Zebra, "Scanner settings" on others) turn on **GS1/FNC1** output and the DataMatrix and GS1 DataMatrix decoders. On Zebra the app's profile is created automatically with the right decoders. --- ## Camera The phone camera reads DataMatrix together with GS — nothing to set up. If the code is small, move closer, turn on the torch or zoom. --- ## Limitations - Restoring GS by template works only for track-and-trace codes; for GS1 with a lot and expiry the scanner has to be set up. - The "Scanner check" wizard exists only on Android. - We describe scanner settings from the vendors' documentation. --- ## Troubleshooting | Symptom | What to check | |---|---| | The wizard says "Incomplete code" | GS isn't on, or is replaced by a key the app doesn't understand (not F8, Ctrl+], Tab, 0x1D) | | The expiry from the barcode wasn't filled in | GS lost in the GS1 code — step 1 | | Extra `]C1`, `]d2` characters after a scan | the scanner sends the symbology identifier (AIM ID) — the app understands it, but for other programs it's better off | --- ## FAQ ### Do I need GS if I don't work with track-and-trace codes? Only if your GS1 barcodes carry a lot and expiry and you want the phone to fill them in. For ordinary EAN codes — no. --- ## Related sections - [Phone as a handheld: getting started](/en/docs/tsd-phone) - [Which scanner to choose](/en/docs/tsd-scanners) - [Hardware](/en/docs/hardware) --- # POS (Point of Sale) The **POS** screen is the workstation for waiters and admins to punch in orders right in the admin panel. An order is assembled from menu tiles in a few taps, bound to a table, and instantly lands in the kitchen and the shared orders feed. Open: **Admin panel → POS** (`admin.cenaly.com`). The screen is optimized for tablets — menu tiles on the left, the current order ticket on the right (on a phone — "Menu" and "Order" tabs). --- ## Who can use the POS There is no fixed list of "POS roles" any more: access is granted by the **POS section inside a job role**. Roles are built with the role constructor on the [Staff](/en/docs/staff) page — 21 built-in presets plus as many custom roles as you need. The POS section is granted by default to: **Owner**, **Manager**, **Waiter**, **Shift administrator**, **Cashier**, **Sales assistant**, **Bartender**, **Receptionist** and **Pickup point operator**. Cook and Courier do not have it — they work on the Kitchen (KDS) and Courier screens. Any role can be given or denied the section. Besides access itself, every role has its own **POS permissions**: | Permission | What it sets | |------|--------| | Discount cap | Maximum receipt discount without a supervisor's approval | | Refund / void | Right to void and refund without approval | | Refund without a source receipt | Right to issue a refund with no original receipt found | | Approving others' operations | Right to authorise a colleague's over-limit operation with your PIN | | Hall panel | Access to the floor scheme, reservations and the shift day on the POS | | Reprint under PIN | Require a manager PIN for a receipt reprint | If the order is created by a waiter, it is automatically bound to that waiter — visible in the order and in reports. --- ## Creating an order 1. **Pick a location** (if you have several) — at the top of the screen. 2. **Bind a table** (for dine-in orders): **"Scan QR"** — point the camera at the table's QR code, or **"Pick table"** — choose from your client codes. If the QR belongs to another location, the POS switches to it automatically. 3. **Add dishes**: tap the tiles. Search and category filters are available. If a dish has variants and add-ons, the options picker opens. 4. **Set the order type**: Dining area, Pickup or Delivery. 5. Add an **order note** if needed. 6. **Send** — the order appears in Orders, on the Kitchen (KDS) screen and on the orders monitor. Quantities are changed with "+/−" right in the ticket; an item can be removed before sending. --- ## Tables and open orders - The POS shows **open orders on the selected table** — you can continue an existing order (add a course) or start a new one. - **"Unlink table"** removes the binding when the order has no table. - The table list comes from **Client codes** — every table QR code acts as a "table" for the POS. See [Floor Plan](/en/docs/tables) for arranging tables. --- ## Payment at the till Once the order is assembled, the cashier moves to the payment screen inside the ticket: **cash** (with change calculation), **card** through a terminal, and **online providers** where connected (see [Online payment](/en/docs/payments)). A payment can be split across several methods. An open cash shift is required to take payment. **Split bill.** The bill is split at the till in two ways: **by items** (the guest marks their dishes) and **equally** (the total divided by the number of guests). Each part is closed with its own payment method; the order counts as paid once all parts are closed. The guest cannot split the bill on their side. **Corporate account.** A company employee pays for lunch from a corporate balance: the cashier enters the **phone number and account code**, the system checks the daily allowance and deducts the amount. If the order is cancelled, the deduction is reversed automatically. See [Corporate accounts](/en/docs/corporate-accounts). **Gift cards.** A card is accepted right at the till: the cashier picks the “Gift card” tender and types or scans the code — the till shows the balance and takes the amount needed. The server caps the amount against the live balance, so you cannot spend more than the card holds and a double tap cannot charge it twice. The part covered by the card becomes its own line on the receipt and the remainder is closed by any other method; the card works alongside bill splitting, corporate accounts and loyalty. The same card applies to an order once — to cover a remainder, use a second card or a regular tender. **Selling a certificate.** The “Sell a certificate” action issues a card for the chosen value: the guest pays as usual, the code is printed on the receipt and e-mailed to the recipient when an address is given. Selling a certificate is not revenue but a liability of the venue: the “issued / redeemed / outstanding” summary lives in [Finance](/en/docs/finance). In Russia the sale is fiscalised as a **prepayment**, and redemption enters the goods receipt as **offsetting a prepayment** — redemption is never rung up as a second sale. **“On account” (deferred payment).** The familiar café tab is built into the till: the “On account” tender closes an order without money and records the amount against a guest — searched by phone or name, and a new guest can be created right in the payment window. When a **credit limit** is set for the location, going over it is blocked: a member of staff with approval rights, or a manager entering a PIN, can let it through, and that approval lands in the risky-operations log. The order gets an “On account” badge in the orders panel and the receipt journal, and the guest's balance is visible in [Customers](/en/docs/customers) and in [Needs attention](/en/docs/attention). Repayment goes through the same window — the “Take a debt payment” action: cash or card, partial amounts allowed. In Russia the sale on account is fiscalised as “transfer on credit”, and the repayment as a “credit payment” receipt. **Loyalty.** The "Loyalty" panel looks the guest up by phone, shows the stamp and point balances and applies a reward or a redemption as an ordinary discount — see [Loyalty program](/en/docs/loyalty). --- ## Pre-check (the guest bill) Before payment the waiter brings the guest a **pre-check** — a bill with items, service charge and total. It is a **non-fiscal** document, and it says so on the paper. The **"🧾 Pre-check"** button is not limited to the dining room — it is available at the bar and at the counter too. Where the paper comes out, in order: 1. the **receipt printer** through [Cenaly Hardware Bridge](/en/docs/hardware-bridge); 2. the **fiscal register**, as a service (non-fiscal) document. This is the main path for a venue that never bought a separate receipt printer: a guest bill is not a fiscal document, and printing it through the till registers nothing. On paper it comes out marked "not a fiscal document" and laid out to the real width of the till's paper; 3. the **browser** — if there is nothing to print with, or the till cannot print free text. From a waiter's tablet or phone with no bridge of its own, the bill prints on the till's hardware **through the cloud relay** — all it needs is the order's location. The outcome is reported honestly rather than as "printed / not printed": five states — printed by the receipt printer, printed by the fiscal till (not a fiscal receipt), printer offline so the bill is not printed yet, printed in the browser, not printed at all. > Changing the order **after** the pre-check has printed is worth keeping an eye on: the guest has already seen the total. Such operations land in the risky-operations log, see [Loss control](/en/docs/loss-control). --- ## Upsell prompter After an item is rung up, **"Suggest with this"** chips appear above the ticket — what is most often bought together with that dish. Sources of the suggestion, in priority order: 1. **manual pairings** set by the owner on the dish card — you know your menu better than any statistic; 2. **"frequently bought together"** — statistics from your own orders. There is no AI involved: everything is computed from order facts. Dishes on the "86" stop list or outside their schedule **never** appear — suggesting what you don't have is the fastest way to teach a cashier to ignore suggestions. The chip price is the price "right now", happy hour included. The toggle is ⚙ → POS appearance → "Upsell hints" (on by default). --- ## Items sold by weight For dishes sold by weight (canteen, deli, salad bar), the dish card has a **price by weight** option: the guest sees a price per kilogram and the final amount is computed from what is weighed at the pass. If **scales** are connected to the till through the [hardware bridge](/en/docs/hardware-bridge), the weight is filled into the line automatically — no typing needed. --- ## Hall panel The 🗺 button opens the **[Hall panel](/en/docs/hall-panel)** — the host's eight tabs, in this order: **"Now"**, **"Waitlist"**, **"Scheme"**, **"Reservations"**, **"Calls"**, **"Day"** (who is on shift right now: planned vs actual timesheet, clock-in and clock-out by PIN), **"Tasks"** and **"Analytics"**. Next to the hall panel there is the **hall monitor** — a full-screen floor scheme for a TV or tablet in the dining room: pan-zoom, live badges with the open order total and a timer since seating, and for a hotel the guest, nights and folio balance. It opens with the 📺 button on the Floor Plan (see [Floor Plan](/en/docs/tables)). --- ## Printing Sale and refund receipts, the pre-check and X/Z reports print through [Cenaly Hardware Bridge](/en/docs/hardware-bridge); when the bridge is unavailable, through the browser. Kitchen tickets per station and item stickers go only through the bridge. **The exception is a venue whose only hardware is a fiscal register.** The bridge will not push our documents through it: the guest receipt is printed by the till itself as a fiscal document, while our slip would look like a receipt without being one. The browser fallback does **not** kick in here — the POS explains that "the till prints the receipt itself". Only a test print and the pre-check are allowed through the register. The POS header shows a **print queue indicator**: if the printer is offline the job is not lost, but there is physically no paper yet. You can also print to a printer attached to **another PC** — over the cloud, with no VPN: the POS sends the job to the location's bridge, not only to the bridge on its own computer. In full — [Kitchen and front-of-house printing](/en/docs/kitchen-printing). **Reprinting an issued receipt** is **always** written to the risky-operations log; it asks for a manager PIN only for roles where "reprint under PIN" is enabled. **If the fiscal till refuses**, the cashier sees a reason and the steps to take instead of the raw driver text: the shift has been open for more than 24 hours and needs a Z report, the till is not in the right mode, wrong operator password, an unclosed receipt is hanging, out of paper, fiscal memory full, the bridge is offline, the till could not reach the tax server. The message does not disappear after a couple of seconds — the sale is stuck and it has to be read. --- ## Control of risky operations Manual discounts, cancellations, voids of items already sent to the kitchen, refunds, opening the drawer without a sale and reprints are logged against the current cashier (quick PIN switching counts). Some operations can be gated behind a **supervisor's PIN approval**. If a bridge camera is connected to the location, a short video clip is attached to the event. Rules, thresholds and the owner digest — [Loss control](/en/docs/loss-control). --- ## What you need to get started - **Any computer or tablet with a browser.** The POS is a page in the admin panel; you do not need to buy dedicated hardware. The layout is built for a tablet, and on a phone it is compact. - **An open cash shift.** Until a shift is open, payment is blocked — see [Cash shift](/en/docs/cash-shift). - **An employee role and PIN.** The real permission layer on the POS is role plus PIN, not a cosmetic narrowing of the interface: deleting items, discounts, refunds and reprints above the threshold require a manager's confirmation. - **A menu with prices** — the POS tiles come from the same catalog as the guest storefront. - **The bridge on the same computer** — if you need receipt printing, a fiscal printer, scales, a scanner, a customer display or a bank terminal: [Cenaly Hardware Bridge](/en/docs/hardware-bridge). - **A service mode** — hall, bar or counter; the default comes from the venue type, and the toggle sits in the ticket header ([Bar mode](/en/docs/bar-mode)). --- ## Limitations - **The receipt registry runs on the AWS contour.** On the Russian brand (`cenaly.ru`) functions built on the analytics databases are unavailable — taking payments is unaffected, but receipt history is not built there. - **Offline covers the POS and printing, and nothing else.** The kitchen display, the bank terminal and syncing between devices over the local network do not work without the internet — [If the internet goes down](/en/docs/offline). - **The bridge only serves its own computer.** A browser cannot reach a bridge on a neighbouring PC: either install the bridge on every POS device, or print through the cloud to a "ported" printer on another PC. - **PIN thresholds cover POS operations only.** Risky inventory actions (write-offs, adjustments above an amount) are not yet behind a separate threshold. - **Changing a price right in the pre-bill** is planned but the button does not exist yet. - **POS voice commands are in beta**: recognition quality depends on the language, and accuracy in production has not been measured. - **The "on account" ledger is last-write-wins** (concurrent edits are not locked), and one gift card applies to an order once. - **Cashier biometrics** are deliberately postponed. --- ## Troubleshooting **The payment button is inactive.** No cash shift is open. Open one with a float — [Cash shift](/en/docs/cash-shift). **An item is missing from the tiles.** Check the [schedule and the 86 list](/en/docs/scheduled-menus): the dish may be outside its availability window or taken off as "86". The second place to look is the item's visibility and price at this location. **The receipt does not print.** It is not the POS: check that the bridge on this computer is "connected" and a printer is selected — [Cenaly Hardware Bridge](/en/docs/hardware-bridge), [Printing](/en/docs/kitchen-printing). **The POS asks for a manager PIN.** By design: deleting items, discounts, refunds and reprints above the threshold are confirmed by a manager and written to the risk log. **An order paid with a corporate account will not merge with another bill.** That is a deliberate restriction — an order paid from an organization's account cannot be merged ([Corporate accounts](/en/docs/corporate-accounts)). **Loyalty points were not credited for a POS sale.** Crediting requires the guest's phone number on the receipt: without it the guest is not identified and loyalty is not counted. --- ## Related - [Orders](/en/docs/orders) — order lifecycle, statuses, orders monitor - [Hall panel](/en/docs/hall-panel) — waitlist, seating, calls and the heat map - [Kitchen and front-of-house printing](/en/docs/kitchen-printing) — printers, queue and code pages - [Loss control](/en/docs/loss-control) — the risky-operations log and the rules - [Loyalty program](/en/docs/loyalty) — stamps, points and the regular-guest discount - [Corporate accounts](/en/docs/corporate-accounts) — paying for lunches from a company account - [Kitchen (KDS)](/en/docs/kds) — the kitchen screen receiving POS orders - [Floor plan & reservations](/en/docs/tables) — table layout and QR binding - [Staff & shifts](/en/docs/staff) — waiter roles and order binding --- ## FAQ ### Do I need special hardware? No. The POS runs in a browser on any tablet, phone or computer. Just sign in to the admin panel with your staff account. ### Can guests order by themselves, without the POS? Yes — guests scan the table QR and order via the [QR menu](/en/docs/qr-menu). The POS is for orders taken by staff (by phone, at the counter, tableside). ### What happens after the order is sent? The order gets the "New" status and shows up on every work screen: Orders, Kitchen (KDS), orders monitor. The kitchen then takes it — see [Kitchen (KDS)](/en/docs/kds). ### Is the order bound to a waiter? Yes. An order created by a waiter is bound automatically. A waiter can also be assigned to tables in the "Waiters" mode of the Floor Plan page. --- # Expo **Expo** is a third operational screen next to the [kitchen (KDS)](/en/docs/kds) and [POS](/en/docs/pos): the workstation for the person at the pass who hands ready orders to couriers. Open **Admin Panel → "Handoff (Expo)"** — that is exactly what the sidebar item is called. The screen solves a very concrete problem: six bags on the shelf, three couriers at the door — who takes which bag? --- ## The handoff queue The screen shows pickup/delivery orders in the "ready"/"awaiting pickup" status — that is, after the kitchen but before being handed to a courier. Own-delivery orders that **already have a courier assigned** (manually or automatically) stay here too while the bag is still on the shelf: assigning a courier does not mean the order has left, so the card only drops off once the handoff is marked here or the courier marks "Picked up" on their side. Each order card shows: - a **channel badge** — Glovo / Wolt / Yandex Eda / own website / own courier, detected automatically from the order source; - the **courier's name and phone**, once assigned; - an **ETA** (estimated courier arrival time) or a **"courier has arrived"** highlight; - **time elapsed since the order became ready** — so you can see which order is already getting cold; - a one-line order composition summary. Cards are sorted by courier ETA (soonest arrival on top), falling back to arrival order (FIFO) when ETA is unknown. --- ## Handing an order to a courier When a courier picks up the order, expo staff mark the handoff with one tap: - for **own delivery** — the order moves to "delivering" status (the same transition as in [Own Delivery](/en/docs/delivery)) and gets a "courier picked up" mark, which is what removes the card from the pass. If the location has couriers in Staff and the order has no courier yet, the screen first asks **which courier** took the bag (there is also an "Outside courier" option); if a courier is already assigned, there is no question — the screen just records the handoff and names the courier in the confirmation. Handing the order to a different courier is done with "↪ Reassign" in [Own Delivery](/en/docs/delivery); - for **aggregators** (Glovo/Wolt/Yandex Eda) — the card is marked as locally handed over and drops off the queue; the aggregator itself confirms the actual pickup on its side. Updates arrive live via WebSocket, with a polling fallback in case of a dropped connection — the same as on the kitchen screen. If the location has an external courier service connected, an **own-delivery** order card carries a **"Call a courier"** button — a courier can be summoned right from the pass, without switching sections. No service connected means no button; aggregator and pickup orders never show it either. See [Own Delivery](/en/docs/delivery). --- ## Printing the manifest and bag stickers Two documents print from the handoff screen — both through [Cenaly Hardware Bridge](/en/docs/hardware-bridge): - the **bag manifest** — a slip **inside** the bag with the order contents: order number, channel, guest name, items with quantities and an "Items: N" total. Courier and guest check completeness against it, and a "you didn't pack an item" dispute with an aggregator is closed with printed evidence; - **60×40 stickers** — labels for the bag and for individual boxes, so bags don't get mixed up between couriers. If there is no bridge, the manifest prints through the browser. Printing details, the job queue and code pages — [Kitchen and front-of-house printing](/en/docs/kitchen-printing). > In the current version the manifest prints item names and quantities; modifiers ("no onions", "oat milk") go onto the **item sticker** printed by the kitchen when a ticket is bumped to "ready". --- ## Fullscreen mode Like [KDS](/en/docs/kds), the Expo screen is designed for a monitor that stays on at the pass: - fullscreen mode and screen wake-lock; - a sound chime when a new order arrives in the queue. --- ## What you need to get started - **A tablet or monitor with a browser** — the handoff screen opens next to the shelf of ready orders. - **Pickup and delivery orders** — expo shows exactly those. - **Ready station tickets** — assembling an order builds on item readiness from the [kitchen display](/en/docs/kds). - **The bridge and a printer** — for bag labels and the shift manifest ([Printing](/en/docs/kitchen-printing)). - **A secure connection (HTTPS)** — the handoff code is computed with browser cryptography and is simply not shown over plain `http`. --- ## Limitations - **Dine-in orders do not enter the expo queue.** They are marked handed over with the "Given to the customer" button in the order details — a hall mode ("handing over to a server by table") on the handoff screen itself is planned but not built. - **Only orders in handoff statuses (plus own-delivery orders with an assigned courier, until the bag is picked up) and without a handover mark are shown** — earlier statuses live in Orders and on the kitchen display. - **The list of aggregator channels is fixed** (Glovo, Wolt, Yandex Eda); "own courier" is detected by the presence of a courier name. - **The screen is a cloud surface** — it does not work without the internet ([If the internet goes down](/en/docs/offline)). --- ## Troubleshooting **An order is missing from the queue.** It is either dine-in, or has not reached a handoff status yet, or is already marked as handed over. **The handoff code chip is not visible.** The screen is open over an insecure connection — open it over `https`. **A bag label does not print.** Check the bridge and the selected label printer; labels are currently printed as a raster on a receipt printer. **A courier took the wrong bag.** That is exactly what the handoff code and handover confirmation are for — make them part of the shift routine. --- ## Related sections - [Kitchen (KDS)](/en/docs/kds) — the kitchen screen an order comes from before reaching the expo queue - [POS](/en/docs/pos) — order intake and payment - [Own Delivery](/en/docs/delivery) — the venue's own courier screen - [Kitchen and front-of-house printing](/en/docs/kitchen-printing) — manifest, stickers and the print queue --- ## FAQ ### Is Expo useful if the venue only has its own couriers? Yes — the screen is useful anywhere there's delivery or pickup. It shows both your own couriers and aggregator couriers on one screen, which helps with a mixed delivery channel. ### Do dine-in orders show up on Expo? No, the screen only collects pickup and delivery orders — dine-in orders are handled through POS and the kitchen without a courier handoff. ### How does the screen know an aggregator courier's ETA? ETA and courier data come from the order data, updated via the aggregator's webhooks, or from own-delivery data — Expo simply displays it. --- # Cenaly Hardware Bridge — Your Venue's Hardware A browser on its own can't print receipts on a POS printer, open a cash drawer or read weight from a scale. That's what the **Cenaly Hardware Bridge** solves — a small free app installed on the POS computer that runs in the background and connects the admin/POS page to your venue's local hardware. Open: **Admin Panel → Hardware** (`admin.cenaly.com`). --- ## What it connects | Device | What for | |---|---| | **Receipt printer** (POS printer) | sale and refund receipts, pre-check, X/Z report, bag manifest | | **Kitchen printer** | station tickets and 60×40 stickers — see [Kitchen printing](/en/docs/kitchen-printing) | | **Cash drawer** | opens on a sale and manually | | Barcode **scanner** | receiving, selling, marking | | **Scale** | product weight on receiving and dish weight at the pass | | **Customer display** | shows the guest the total and the items | | **Card terminal** | card payments, reconciliation and end-of-day settle | | **Fiscal register** | fiscal receipts per country — see [Fiscalization](/en/docs/fiscal) | | **EGAIS** (RU) | exchange with the universal transport module | | **Pour controller** | draft-beverage accounting (tap flow meters) | | **Camera** | short video clips attached to risky till operations — see [Loss control](/en/docs/loss-control) | > **How the printer connects.** Receipt and kitchen printers connect **over the network**: Ethernet or Wi-Fi, an IP address and port 9100; the bridge discovers such printers on the local network itself, and the address can be typed in by hand. **USB and Bluetooth printer connections are in development:** a device with such a transport can be added in the wizard, but it sits in the list with a note about its transport and does not print (till documents fall back to the browser dialog) — for now buy a networked model. A class-by-class overview of the hardware — [Hardware: what connects](/en/docs/hardware). > **The cash drawer** does not need its own bridge device: it plugs into the receipt printer — into the **DK** socket (RJ-11/RJ-12) or over **USB** — and it is opened, on a command from the till, by the device it is plugged into. A fiscal register opens the drawer the same way, from its own socket. Both connections are tested; the "Open drawer" button is available both at the till and on the Hardware page. > Fiscal devices and online cash registers by country are covered in the separate [Fiscalization](/en/docs/fiscal) section. --- ## The print queue Printing through the bridge is not "send and hope". The bridge keeps its own **restart-safe job queue with retries**: if the printer is switched off or runs out of paper, the job is not lost and prints once the device comes back. Because of that, printing has **five distinct outcomes** rather than "worked / didn't": printed, queued (no paper yet!), printed by the browser, printed by the fiscal register itself, failed. The POS header shows a queue indicator with the number of waiting jobs. Jobs are idempotent: re-sending the same document does not produce a second slip. Details, binding printers to stations, and code pages for Cyrillic and Georgian — [Kitchen and front-of-house printing](/en/docs/kitchen-printing). --- ## Installing the bridge If the bridge isn't found on this PC, the page offers to install it: 1. Download the version for your OS — **Windows**, **Linux (x64)** or **Linux (ARM64)** (macOS is coming soon). A SHA-256 is provided for verification. 2. Run the app. **Windows** — double-click: the bridge goes to the background (tray icon) and opens its status page. **Linux** — prefer the one-line install as a background service, shown on the Hardware page (`curl … | sudo … bash`): it starts at boot and restarts itself. Running the downloaded file by hand (`chmod +x`, then run) works too, but the bridge only lives as long as the terminal stays open and will not come back after a reboot; on Linux open the status page yourself — `http://127.0.0.1:9100`. 3. On the status page, confirm the bridge is running — **there's no code to enter, pairing is automatic**. 4. Come back to the admin panel and click **"Search again"** — the POS finds the bridge on this PC and connects on its own. If Windows shows a warning on download/run, that's expected: choose "Keep", and on run "More info" → "Run anyway". For Linux there's a one-line install as a background service. **Removing the bridge from a computer (Linux).** The same one-liner from the Hardware page, with a subcommand — the page keeps them under "Linux — stop or remove the bridge": - `… | sudo bash -s -- stop` — stop the service and take it off autostart; files and settings stay, `start` brings it back; - `… | sudo bash -s -- uninstall` — remove the service and the program itself. Settings and the till pairing stay, and the script prints where they are; - `… | sudo bash -s -- uninstall --purge` — the same plus the settings: the equipment list and the location binding. After that the till has to be paired again; - `… | sudo bash -s -- status` — is the bridge running, and at which address (when 9100 is busy it takes the next free port, up to 9109). On **Windows** use the usual Add/Remove Programs (the "Cenaly Bridge" entry) — its uninstaller removes the autostart entry as well. --- ## Management and checks Once the bridge is connected, the page shows: - **Devices** — a list with each device's state (connected / attention / error / not found); - **Hardware checks** — a quick test of printing, scanning, weighing; - **Hardware settings**; - **Live activity** — a real-time feed of events (scan, weight, print); - **Update** — if a new bridge version is out, you can install it right here. --- ## Related sections - [POS](/en/docs/pos) — where receipt printing and the cash drawer are used - [Receipts & refunds](/en/docs/receipts) — printing and reprinting receipts - [Fiscalization](/en/docs/fiscal) — fiscal printers and online cash registers - [Kitchen and front-of-house printing](/en/docs/kitchen-printing) — stations, stickers, the queue and code pages - [Products by weight and labels](/en/docs/inventory) — working with scales, units and shelf labels - [Hardware: what connects](/en/docs/hardware) — the class-by-class overview and minimum kits per format - [Telephony: your own PBX](/en/docs/telephony) — phones and gateways need no hardware bridge and live in their own contour - [Loss control](/en/docs/loss-control) — video clips of risky operations from the bridge camera --- ## FAQ ### Do I need to enter a code to pair? No. Pairing is automatic: the bridge runs on the PC and the POS finds it via the "Search again" button. ### Which operating systems does the bridge run on? Windows and Linux (x64 and ARM64). A macOS version is coming soon. ### The hardware isn't showing — what should I check? Make sure the bridge is running (status page) and click "Search again". Each device's state and quick checks are available on the "Hardware" page. If the device still does not appear, open **"PC details"** for that machine in the account hardware registry: it shows everything the computer itself sees — drives with free space, connected hardware and every COM port with a note on who is holding it — which is usually enough to tell whether the problem is the cable, the port or another program occupying it. --- # POS Shift and Z-Report **POS shift** is a way to keep accurate track of cash in the POS: the cashier opens a shift with a starting cash float, records all cash movements, and at the end closes the shift and reconciles the actual balance with the calculated one. The result goes to the "Finance" section. To open: **Admin panel → POS**. Shift management is in the header of the POS ticket (the POS icon or the menu next to it). --- ## Why you need a shift Without an open shift, the payment button in the POS is unavailable. This ensures that every payment is linked to a specific cashier and shift — this is how cash reconciliation is formed. Shifts are tracked **per cashier**: if several people work at the POS, each has their own shift for the location. Sales data for each shift is not mixed. --- ## Opening a Shift 1. In the ticket header, click **"Open Shift"**. 2. Enter the **cash float** — the amount of cash already in the drawer before starting work. 3. Confirm. The shift is open: the payment button becomes active, and a badge with the cashier's name appears in the header. The **"Drawer"** chip shows how much cash should be in the drawer **right now**: it grows with every cash payment, and goes down by the change handed back (the chip counts the receipt total, i.e. tendered minus change), by pay-outs, cash drops and cash refunds. Hover the chip — the tooltip breaks the amount down into opening float, cash sales, pay-ins, pay-outs and drops. > Between X-reports the chip counts sales made on **this** till. If someone settles into the same shift from another device (a waiter's remote receipt, a cash-on-delivery parcel handed over at a pickup point), the chip will show less than the drawer holds until you open an X-report — that one recounts everything on the server and gives the chip a new baseline. When reconciling or closing the shift, the X/Z report is the source of truth, not the chip. If **shift opening checklists** are configured for the location, the system will automatically create tasks from them right at the moment of opening and show how many items were added — "turn on the coffee machine, take meter readings, check the display case" appear automatically, without reminders from the manager. You can find them in the **Work Chat**, under the **"Tasks"** section: as of 29.08.2026, the shift task board lives there, and there is no separate "Tasks" item in the sidebar (see [Tasks](/en/docs/tasks)). Once opened, the shift is cached on the device — in case of a temporary network outage, the cashier can continue accepting orders. --- ## Cash Movements During a shift, you can record three types of transactions: | Transaction | When to use | |----------|--------------------| | **Cash In** | Adding cash to the drawer (e.g., change) | | **Cash Out** | Removing cash from the drawer (e.g., for business expenses) | | **Cash Drop** | Transferring excess cash to the safe or to a cash collector | Each transaction is recorded with an amount and an optional comment, and is included in the final report. --- ## X-Report — Mid-Shift Snapshot The **X-report** displays the current shift status without closing it: cash sales processed, cash in/out, cash collections, and the expected cash drawer balance. The shift continues, and data is not reset. Use the X-report for mid-shift cash drawer audits during the workday. Card sales are broken down **by terminal**: if the counter has two of them, you can see how much went through each — as “Card sales · ” lines right below the combined card total. The breakdown appears both in the report card on the POS and in the printed X/Z-report; it is additive and never inflates the total (a card payment with no terminal attached simply does not appear in it). The mobile app does not show this breakdown yet. Payments that are neither cash nor card — a gift certificate, a deposit or advance offset, a “on credit” share, a part the guest paid from their own phone — are rolled up into an **“Other”** line. It shows up at shift closing, in the report card and in the printed X/Z-report, but only when the shift actually had such payments. “Other” is not part of the expected cash balance: that money is not in the drawer. **A bill settled in separate parts** lands in the report under the tender of each part: a part closed in cash goes into cash sales and into the expected drawer balance, a part paid by card goes into card sales and into the per-terminal breakdown. There is still one order, and it is counted once in the order count. > Sales for the report are aggregated by the server, so the **X-report cannot be generated offline**. That said, you can still open and close a shift without network access — Z-report figures will be calculated once the connection is restored. --- ## Z-Report — Shift Closing and Reconciliation **The Z-report** closes the shift. Sequence: 1. Click **"Close Shift (Z)"** in the POS menu. 2. Enter the **actually counted cash** in the drawer. 3. The system calculates the **expected balance**: ``` Expected = Float + Cash Sales + Pay-ins − Pay-outs − Cash Drops ``` For a pickup point, cash **cash on delivery** for third-party parcels is added to this amount: the money physically sits in the same drawer, but is not included in the location's revenue — it is accounted for as a separate agency line item. 4. The **discrepancy** is displayed — the difference between the expected and actual balance. The discrepancy is recorded in the report (normal, shortage, or overage). 5. The shift closes. New sales can only be started after opening the next shift. The report is saved and becomes available in the "Finances" section. ### Printing X and Z Both reports are printed on a thermal printer via [Cenaly Hardware Bridge](/en/docs/hardware-bridge); if there is no bridge, printing is handled via the browser. If the printer is offline, the job is queued and will print once the device comes back online — the interface will indicate this, while no paper has been printed yet. **A location where the only hardware is a fiscal recorder** is a special case: the bridge does not print our documents through the fiscal recorder (only test printing and pre-bills are allowed for it), and the browser fallback **is not triggered** here. X- and Z-reports at such a location are viewed on-screen, while fiscal shift reports are generated by the POS itself. Learn more in [Kitchen and Dining Area Printing](/en/docs/kitchen-printing). > **A discrepancy at shift closing is a loss control event.** It is logged in the risky operations journal and can trigger the "POS discrepancy" rule if it exceeds your threshold or noticeably stands out from the overall cashier pattern. See [Loss Control](/en/docs/loss-control). --- ## Shift History in Finances All closed shifts are available in **Finances → POS Shifts**: a table by cashiers and dates with totals for sales, cash movements, and discrepancies. This is convenient for daily reconciliation and monitoring cash discipline. The section is available to the account owner, manager, and any role granted access to the **"Finances"** section — for example, the built-in **"Accountant"** role (see [Staff](/en/docs/staff)). --- ## What you need to get started - **The POS** — a shift is opened from the ticket header; it has no section of its own. - **Permission to open a shift** — the employee's role on the POS. - **A cash float** — the amount the shift starts with; expected cash is counted from it (and so is the "Drawer" chip, which adds cash sales and movements on top). - **The bridge and a printer** — if you want X and Z reports on paper ([Printing](/en/docs/kitchen-printing)). ## Limitations - **Without an open shift, payment on the POS is blocked** — that is cash-control protection, not a failure. - **The X report is unavailable offline.** The interim snapshot is computed on the server from sales; you can close a shift without a connection, and the Z report will be produced once the link is back — [If the internet goes down](/en/docs/offline). - **A shift opened offline gets a temporary number** and is swapped for the real one when the queue drains. - **Shift history lives in the Finance section**, and that runs on the AWS contour: on `cenaly.ru` there will be no shift history there. - **A shift never closes itself.** A forgotten open shift stays open until someone closes it. ## Troubleshooting **Payment is not allowed.** No shift is open — open one with a cash float. **Cash does not add up at closing.** Check the movements: pay-ins and pay-outs must be recorded in the shift, not kept in someone's head. The discrepancy is recorded in the Z report as is — that is exactly what the reconciliation is for. **A shift has been open since yesterday.** Close it manually; the next one opens with its own float. **The X report will not build.** There is no connection to the server — offline it is impossible by design: sales aggregation is computed in the cloud. **There is no Z report after closing offline.** It will be produced once the connection returns and the queue of POS operations drains. ## Related Sections - [POS](/en/docs/pos) — order management, tables, payment - [Finance](/en/docs/finance) — management dashboards, shift history - [Receipts](/en/docs/receipts) — receipt registry, refunds - [Tips](/en/docs/tips) — tracking tips in shifts and financial reports - [Staff and Shifts](/en/docs/staff) — roles, access permissions - [Loss control](/en/docs/loss-control) — the cash discrepancy alert rule - [Kitchen and front-of-house printing](/en/docs/kitchen-printing) — printing X/Z through the hardware bridge --- ## Frequently Asked Questions ### Can one cashier open multiple shifts at the same time? No. Each cashier can have only one open shift per location. To start a new shift, the current one must be closed with a Z-report. ### What happens if the internet goes down during a shift? The open shift is saved on the device — the cashier continues accepting payments. Shift opening, cash movements, and shift closing are queued and sent to the server once the connection is restored. Offline, only the X-report cannot be generated, and the Z-report reconciliation is calculated after synchronization: sales data is aggregated by the server. ### What does a discrepancy in the Z-report mean? This is the difference between the amount the system expected to find in the drawer (based on the accounting formula) and the amount the cashier physically counted. A minor discrepancy is normal (change errors). A systematic discrepancy is a signal for an audit. ### Are card sales also included in the shift? Card sales are linked to the shift and visible in the report. However, cash movements (cash-in, cash-out, cash drop) apply only to cash; the final reconciliation of the expected balance is calculated based on cash receipts only. ### Who can see POS shifts? An employee in any role assigned the **"POS"** section can open a shift and work with X/Z-reports — by default, this includes "Manager", "Waiter", "Shift Administrator", "Cashier", "Salesperson", "Bartender", "Receptionist", and "Pickup Point Operator", but the list is customizable. Shift history in the "Finance" section is accessible to the owner, manager, and roles with access to the "Finance" section (for example, "Accountant"). --- # Loss control and cash risks One manual discount means nothing. Twenty discounts under one PIN in a shift, when everyone else averages three, mean something. Loss control has two layers. The first is the **log of risky operations**, which answers "what happened". The second is **six rules**, which answer the owner's question: "what should I look at". > **Available on AWS brands** (`cenaly.com`, `cenaly.com` and others), **not on `cenaly.ru`.** The platform's analytical database these figures come from is not deployed in the Russian contour: the till still writes events, but the risky-operations stream there is empty, the rules are not evaluated and no alerts appear. Everything else on this page — PIN approval and the server-side limit gate — works on every brand. --- ## The log of risky operations The till writes an event stream of risky actions attributed to the **current cashier** (quick PIN switching counts, not just whoever is logged into the device): | Event | When it is written | |---|---| | Manual discount / price override | the cashier lowered a price or granted a discount by hand | | Order cancellation | the whole check was voided | | Item voided after being sent to the kitchen | a dish already being cooked was removed | | Refund against a receipt | a refund was issued | | Cash drawer opened with no sale | the drawer was opened outside a sale | | Reprint of an issued receipt | a reprint — the classic way to swap a guest's receipt | | Cash discrepancy at shift close | the actual cash didn't match the expectation | The stream itself, with filters by cashier and operation type, lives on the **"Risky operations"** tab of the Statistics section — see [Site traffic and sales summary](/en/docs/statistics). It is not duplicated here. > The log is written by the till app as actions happen (best-effort) and reaches the server within a couple of minutes. **The log has a second, server-side leg.** Risky operations are not only recorded by the till — the server also **derives them on its own**, from the way the order itself changed: voiding an item already sent to the kitchen, a manual discount, a price override, reopening a closed order, cancelling after payment, a refund, an edit after the pre-bill. The till cannot bypass this record: it is made on the side that accepts the order, not in the browser. The two legs feed a rule of their own — **“log mismatch”**: when an operation appears in the till log but not in the server one (or the other way round), it is worth a closer look — the app was offline, the log never arrived, or the cashier tried to dodge the record. Such a mismatch shows up in “Till risks” on the [“Under control”](/en/docs/attention) tab alongside the other alerts. --- ## The six rules Rules are evaluated on the server against the log and your accounting data. The observation window is **one week**; a "shift" is approximated by the location's calendar day. | Rule | When it fires | |---|---| | **Void series** | one cashier accumulated enough voids in a shift that it is no longer "just happens" (8 by default, roughly one an hour over a full shift) | | **Discount spree** | the cashier's total manual discounts for a shift are **three times** (×3) the **median across all cashiers of the account** for the window | | **Cash discrepancy** | the shortage/overage at shift close is above the owner's threshold, or **three times** (×3) the median discrepancy | | **Consumption above norm** | for an inventory cycle, actual consumption exceeded the theoretical one (from recipes) by more than N % (**5 %** by default) — "where did the difference go" | | **Purchase price spike** | a product was received above the median of its own price (15 %+ by default) | | **Log mismatch** | an operation is in the till log but not in the server one (or the other way round) — see the section above | **Why money thresholds self-calibrate.** A constant doesn't work here: accounts have different currencies and different check sizes. So the money rules compare a cashier with the median across all cashiers of the same account and only fire when it is exceeded threefold. **The median purchase price** is computed over 30- and 90-day windows, with one invoice counting as one sample point (a supplier who splits a delivery into five lines does not shift the median five times harder). Fewer than three deliveries is not a sample and the rule stays silent. The same median powers the **"+N % vs median"** badge right on the receiving line — see [Inventory](/en/docs/inventory). Every alert carries a severity (high/medium), the amount at risk, the event count and the period. Re-running the calculation does not create duplicates: the same anomaly on the same day is the same alert. --- ## Where to look and how to configure The **"Cash risks"** block sits in **Work chat → Needs a decision → the [“Under control”](/en/docs/attention) tab**, together with the rest of the to-dos. There is no separate "Needs attention" section in the panel any more; the old address leads here. The "Review" button opens the event stream. **Thresholds** open from the **⚙️ gear in the header of the "Statistics" section**, the "Alert thresholds" item: it switches to the "Risky operations" tab and expands the collapsed thresholds block for you (the item is visible to the owner and the manager). You can also get there by hand — the "Risky operations" tab → the thresholds block. What you set: - total manual discounts per shift — **raises** the bar: both conditions are required, the threshold *and* exceeding the median (what counts as a normal discount is relative and depends on promos); - void series per shift — a count threshold; - cash discrepancy — **replaces** the median: here the owner knows their tolerance in absolute money; - losses above theoretical consumption, %; - purchase price above median, %. An empty threshold means "no threshold": the rule works from the median (money rules) or from a conservative default. **The owner's e-mail is opt-in.** By default alerts are calculated and visible in the admin panel, but nobody gets letters. The e-mail switch lives in the same settings, and the design is **one letter per run** summarising new alerts, rather than one letter each: a void series usually arrives in a batch. --- ## Video clips of risky operations If a camera is connected to the till device through [Cenaly Hardware Bridge](/en/docs/hardware-bridge), a short video clip can be attached to an event: a few seconds **before** and **after** the operation. It is configured **per location** (every till has its own room and its own camera angle) in the hardware section: - on/off (**off by default** — video of the till area is personal data and cannot be switched on silently on the client's behalf); - the till-area camera from the bridge device list; - how many seconds before and after the event go into the clip — **30 and 30** by default, 5 to 120 seconds allowed; - a daily clip quota per location — **40** by default, 1 to 200 allowed; - how many days a clip is kept — **30 days** by default, 1 to 365 allowed. The log works fully without a camera — video is an addition, not a condition. --- ## PIN approval Risky operations can be gated behind a supervisor's confirmation: the cashier requests the action, a manager enters their PIN, and the log records both the operation and who approved it. Per-role limits on discounts, refunds and voids are set by the owner in [Staff and shifts](/en/docs/staff); the till uses them to decide whether an operation needs PIN approval. Reprinting an issued receipt also goes through PIN and is written to the log. --- ## Related sections - [Site traffic and sales summary](/en/docs/statistics) — the "Risky operations" stream itself and the "Pour" tab - [Attention](/en/docs/attention) — the work chat's "Under control" tab, home of the "Cash risks" block - [POS](/en/docs/pos) — PIN roles, pre-checks, refunds - [Cash shift](/en/docs/cash-shift) — cash reconciliation and the Z-report the discrepancy comes from - [Inventory](/en/docs/inventory) — stocktakes, variance and the "+N % vs median" badge on receiving - [Staff and shifts](/en/docs/staff) — per-role limits on discounts, refunds and voids --- ## FAQ ### Is this surveillance of staff? It is a conversation tool, not a punishment tool. The rules do not accuse — they show that one person's numbers stand sharply out of the overall picture. What happens next is the manager's call. ### Why didn't a rule fire even though the discount was huge? Money rules look at the **shift total against the median across all cashiers**, not at a single operation. If large discounts are the norm across the venue, the median is high too. Set an explicit threshold if you want to catch absolute amounts. ### Do I get the same alert several times? No. An alert's identifier is built from the rule, location, cashier and period — recalculation produces the same alert, and the letter about it goes out once. ### Can I enable e-mail without enabling video? Yes, they are independent settings: e-mail lives in the rule thresholds, video in the location's hardware settings. ### What do I do when "Consumption above norm" fires? Compare theoretical consumption from recipes with the stocktake result: the usual causes are an inaccurate recipe, unrecorded waste write-offs, or portions served "by eye". The breakdown lives on the "Variance" tab of [Inventory](/en/docs/inventory). --- # Receipts, Refunds, and Exchanges **Receipt register** — a history of all sales for each location. Each receipt is an immutable snapshot of a payment: what was purchased, for what amount, by which method, by which cashier, and during which shift. Based on a receipt, you can issue a refund or exchange directly from the POS interface. Open: **Admin Panel → POS → "Receipts"** (🧾 icon in the POS menu). There is no separate "Receipts" section in the sidebar — the register lives inside the POS. --- ## Receipt Register Each location maintains its own receipt numbering — numbers run sequentially and do not repeat. The register displays: - sale date and time; - receipt number and associated order number; - items, quantities, and totals; - payment method — cash, card, online, **gift card**, **"on credit"**, corporate account, as well as split payments (part cash, part card) — amount due and change; - cashier and shift; - type: **Sale**, **Refund**, or **Advance** — an advance receipt for an order that is not yet closed; the advance button appears only where the POS is connected to a fiscal device capable of printing such receipts (Russia, 54-FZ). The receipt is printed as a **tax receipt** — with seller details and a breakdown of tax amounts by rate — if **a tax number is specified in the location details**. The country itself does not affect anything: locations where receipts are printed by a fiscal registrar (Georgia, Russia) simply leave these fields blank, and the receipt prints as before. The type of number (VAT, GST, ABN, TRN, INN, TIN) only changes the field label when printed. A refund inherits the details and proportional share of the tax from the original receipt — as a snapshot from the moment of sale, not from current settings. Receipts can be **reprinted** at any time — using the "Print" button next to each receipt in the history. ### Printing and Reprinting Sale and refund receipts are printed on a thermal printer via [Cenaly Hardware Bridge](/en/docs/hardware-bridge), with browser print fallback. If the printer is offline, the job is queued in the bridge — this is a distinct outcome, meaning that **the guest has not yet received the receipt**. Learn more in [Kitchen and Dining Area Printing](/en/docs/kitchen-printing). **Fiscal and non-fiscal locations are different stories.** If the location hardware includes only a fiscal registrar, the bridge does not print our receipt through it and **the browser fallback is not triggered**: the POS reports that the fiscal cash register itself is printing the receipt — and that is true, the guest received the document. If there is no fiscal registrar at the location at all, the POS displays a **"Non-fiscal mode"** badge explaining that "what the POS prints is not a fiscal receipt," and the receipts themselves include the line "Not a fiscal document." > **Reprinting an issued receipt is always logged in the sensitive operations log** — swapping a guest's receipt is a classic way to siphon money from the cash register. It does not prompt everyone for a manager PIN: only staff roles with "reprint under PIN" enabled. See [Loss Prevention](/en/docs/loss-control). A receipt refund is also an operation recorded in this log. --- ## Receipt Refund Refunds are processed from the receipt history. Available only with an **open POS shift**. ### Full Refund Click **"Refund"** on the desired receipt and select "Entire receipt". The system will refund the full amount, including service charge and tips. ### Partial Refund Select specific items and specify the quantity to refund. You cannot refund more than was sold: the system checks the remaining balance taking into account previous refunds for the same receipt. A partial refund returns the cost of the items themselves: service charge and tips are refunded in full only with a full receipt refund. Tax (where present on the receipt) is recalculated proportionally to the refunded amount. ### Refund Method When processing a refund, specify: - **Refund method** — cash or card; - **Reason** — custom text (a list of reasons can be preset: "Settings" → "Orders" → "Refund reasons"). If the refund is issued in cash, the amount is automatically recorded as a **payout from the current POS shift** — the transaction is immediately visible in the POS report. **A card refund is processed on the payment terminal itself** if the original sale contained a terminal transaction ID and the terminal is connected to the [bridge](/en/docs/hardware-bridge): the POS sends a refund command to the terminal, and the operator confirms it on the device. Without these conditions, the refund remains only a record in the log, and the operator refunds the money manually. Where supported by the POS, a **fiscal "refund receipt" is additionally printed**. After saving, a new receipt of type **"Refund"** is created with a negative amount, linked to the original sales receipt. --- ## Return to Inventory Returned items are **always** returned to inventory: the system automatically restores stock balances for each return line item with a separate document — this is visible in the [Inventory](/en/docs/inventory) section as a guest return. There is no separate "return to inventory" checkbox, and automatic restocking cannot be disabled. If the item was returned damaged or spoiled and cannot be resold, write it off using a separate inventory document. --- ## Item Exchange Exchange is a two-step process: 1. **Return** — process a return based on the original receipt (full or partial). 2. **New order** — the POS opens an empty ticket, already marked as "Exchange". Add the new items and process the payment as usual. This way, each step has its own receipt, and the history remains transparent. --- ## Refunds in Financial Reports All refunds are accounted for in the [Finance](/en/docs/finance) section: - **"Refunds" KPI** — the total amount of refunds for the period; - refunds **are deducted from revenue** — the final figures reflect net turnover; - refund dynamics are compared with the previous period. This allows you to track the reasons and frequency of refunds and make quality-related decisions. --- ## What you need to get started - **A receipt rung up on the POS** — the registry consists of immutable snapshots of payments; entries are not created by hand. - **A role and a PIN** — refunds and reprints above the threshold are confirmed by a manager and written to the risk log. - **Inventory switched on** — if a refund should return stock ([Inventory](/en/docs/inventory)). - **The bridge and a printer** — to print the refund receipt and reprints. ## Limitations - ⚠️ **The registry runs on the AWS contour.** On the Russian brand (`cenaly.ru`) functions built on the analytics databases are unavailable, so receipt history is not built there. - **There is no separate sidebar section** — the registry lives inside the POS. - **Refunding one guest's share of a split bill is not implemented**: if guests split the bill, the refund is issued in full from the POS. - **One gift card applies to an order once**; a physical card with a barcode does not exist yet — only a certificate code. - **Offline you get the last snapshot of the registry**, while the refund record itself joins the queue and leaves when the connection is back. ## Troubleshooting **The receipt is not in the registry.** Check the location — the registry is kept per point of sale. On the Russian brand there is no registry at all. **The refund will not go through.** A manager PIN is required; also check that the receipt belongs to this location and has not already been refunded in full. **The refund did not return stock.** Returning to stock is a separate step of the flow: it only happens if inventory is switched on and the item has a recipe card or a product card. **A reprint asks for confirmation.** That is by design: above the threshold a reprint is confirmed by a manager and recorded in the log. **A fiscal refund did not print on the POS.** Check the bridge and the fiscal printer: if the model does not support the required document type, the refund is recorded in the registry but no fiscal receipt is produced. ## Related Sections - [POS](/en/docs/pos) — order taking and payment processing - [Cash Shift](/en/docs/cash-shift) — opening/closing shifts, cash payouts - [Finance](/en/docs/finance) — revenue, KPIs, and period comparison - [Inventory](/en/docs/inventory) — stock tracking and inventory movement documents - [Orders](/en/docs/orders) — order statuses and history - [Kitchen and front-of-house printing](/en/docs/kitchen-printing) — printing receipts through the bridge, the queue and reprints - [Loss control](/en/docs/loss-control) — reprints and refunds in the risky-operations log --- ## FAQ ### Can a refund be issued without an open shift? No. Issuing a refund requires an open POS shift — especially if the refund is made in cash (the amount is processed as a cash payout from the POS register). Open a shift in the [POS](/en/docs/pos) section and retry the operation. ### What happens if a single receipt is refunded multiple times? The system tracks all previous refunds for each item. With a partial refund, you can only return the quantity that has not yet been refunded previously. It is impossible to refund more than what was sold. ### Does a refund decrease inventory stock? On the contrary — a refund **restores** inventory stock, and always does so without requiring a separate option. The original sale already depleted the stock; the refund partially or fully restores it. ### Does the receipt appear immediately after payment? Yes. The receipt is generated automatically upon processing payment through the POS and is immediately available in the receipt history. It can also be printed from there. ### Are refunds visible to staff? The "Receipts" log and the "Refund" button are visible to any employee whose role includes access to the "POS" section, provided their shift is open; permissions for refunds and for refunds without an original receipt are configured separately in the role's POS permissions (see [POS](/en/docs/pos)). Financial dashboards with the "Refunds" KPI are accessible to the owner, manager, and roles with access to the "Finance" section. --- # Tips **Tips** — an optional amount that a guest leaves on top of the order cost. Cenaly allows accepting tips both during online ordering via QR menu and at the POS. Important: tips **are not counted as venue revenue** and are displayed in reports as a separate line. --- ## Enabling and Setup Tips are configured separately for each location: 1. Go to **Admin Panel → Locations** and select the desired location. 2. In the settings section, find the **"Tips"** block. 3. Turn on the **"Tips enabled"** toggle. 4. Specify **suggested percentages** — for example, `5, 10, 15`. These are quick presets that the guest or cashier will see. If left blank, the system will apply default values. 5. Optionally, allow a **custom amount** — the guest or cashier will be able to enter any amount manually. Save your settings. Presets will immediately appear at checkout and on the POS. ### Country Matters a Lot There are two mechanisms, and it is helpful not to confuse them. **Country preset in location settings.** In the location card, there is an "apply country presets" button, and the same preset is applied automatically when you change the country of jurisdiction. Presets are configured for 65 countries and set percentages right away — along with currency, tax, and service charge. At the same time, the preset determines the status of the block itself: where tips are expected (USA, Canada, Mexico), it enables them; where they are not customary (Japan, Korea, China, Singapore), it disables them, hiding the block in the form by default with a "show anyway" button; in other countries, the field is left untouched. The preset is a starting point, which you can customize further. **Storefront fallback.** If percentages are set neither manually nor via preset, the guest is shown values based on the establishment's country: USA and Canada — 18/20/25%, Georgia, Australia, and New Zealand — 5/10/15%, rest of Europe and the world — 10/15/20%. In Japan, Korea, China, Singapore, Taiwan, and Hong Kong, no prompt is displayed at all. The POS also has its own fallback set — 5/10/15%, if percentages are not configured for the location. For over-the-counter and non-food verticals, the tips block on the POS is disabled by default: retail store, pickup point, online store, professional services, blog, business card website, widgets, and chat — tips are not collected there. --- ## Guest adds tips during online ordering When a guest places an order via the QR menu and selects online payment, a tip selection section appears on the checkout screen: - Quick percentage buttons (for example, **5% / 10% / 15%**). - Custom amount field (if enabled in settings). - Tips are calculated from the item subtotal (**excluding the service charge**). - The total amount due is displayed with a breakdown: order cost + service charge + tips. If the guest does not want to leave a tip, they simply do not select a preset and leave the field blank. ### Self-service kiosk The [kiosk](/en/docs/kiosk) payment screen also features its own tip section: the same location percentages (or country fallback), a "No tip" button, and three presets. It is enabled via a separate toggle, **"Prompt for tips at checkout"**, in the kiosk settings — completely independent of the section in the QR menu and POS. --- ## Cashier or Waiter Adds Tips in the POS When working via the [POS](/en/docs/pos), tips are added at the payment acceptance stage: 1. Assemble the order in the ticket as usual. 2. Click **"Pay"**. 3. Percentage preset chips will appear on the payment screen — tap the desired one. The tip amount will be recalculated from the subtotal and displayed in the ticket. 4. If a different amount is needed, enter it manually in the tip field. 5. Complete the payment: the total amount includes tips. Tips are saved in the order. If the distribution policy has not been changed, in reports they are assigned to the waiter to whom the order is linked (usually the one who created it; the assignment is set automatically if the order was placed by an employee with the waiter role). When tip pooling is enabled, distribution is calculated differently — see the next section. --- ## Who gets the tips A separate setting determines how the collected tips are split among staff for a period. Go to: **Staff → "Payroll" tab → "Tips" section**, field **"Distribution method"**. There are three options: | Mode | How it is split | |---|---| | **Directly (to whom the order is assigned)** | default mode: tips go to the person to whom the order or bill is assigned | | **Tip pool — by hours** | all tips for the period are pooled together, and shares are calculated proportionally to actual hours worked | | **Tip pool — by role weights** | the same pool, but with coefficients by job positions: weight fields appear nearby, and a role without a weight does not participate in the split | Nearby is the checkbox **"Pay out via payroll"**. It does not affect accounting, but rather the payout itself: with it checked, tip shares are included in the employee's payroll calculation and paid out together with it; without it, tips are only tracked (including in tax bases where required). > The "Payroll" section is available to the account owner. For more details on the tab and calculations, see [Staff and shifts](/en/docs/staff). --- ## Tips in the Order List In the [Orders](/en/docs/orders) section, each order with tips displays a breakdown: | Row | Includes | |--------|-------------| | Subtotal | Sum of menu items | | Service charge | If configured for the location | | Tips | Amount selected by the guest or cashier | | **Total** | Total amount due | This way, staff can immediately see what portion of the total is tips. --- ## Reporting in the "Finance" Section The [Finance](/en/docs/finance) section displays tips **separately from revenue**: - **"Tips" KPI** — total amount of tips for the selected period (7 / 30 / 90 days or 12 months), broken down by currency if you have multiple locations with different currencies. The card can be hidden from the dashboard in the section view settings. - **"Tips by Waiter"** — a chart on the "Sales" tab showing how much each waiter collected in tips over the period. Orders without an assigned waiter are grouped into a separate line. Since tips are not venue income, they are not included in revenue and gross profit metrics. --- ## What you need to get started - **Tips switched on in the settings** — preset amounts are filled in from the location's country. - **Working online payment** — if the guest leaves a tip on the storefront, when paying the bill at the table or at the kiosk ([Payments](/en/docs/payments)). - **Employees in the system** — so there is someone to distribute tips to ([Staff](/en/docs/staff)). - **A distribution policy** — to a specific server, or into a shared pool by hours worked. ## Limitations - **Tip reporting lives in the Finance section**, and that runs on the AWS contour: on `cenaly.ru` these reports do not exist. - **Online tips depend on online payment** — where there is no payment provider, the guest cannot leave a tip; at the POS tips are always available. - **In a guest split, the tip is calculated against that guest's share**, not against the whole bill. - **Distribution feeds the payroll databases**, but the wage fund is not posted as a separate expense line in the finance database — treat it as management accounting, not bookkeeping. ## Troubleshooting **The guest does not see a tip selector.** Tips are switched off in the settings, or the location has no live online payment. **The tip did not reach the server.** Check whether a server is assigned to the order and which distribution policy is selected: a pool by hours splits the amount between everyone on shift. **The presets look wrong for us.** Presets are filled in from the location's country — change them manually in the settings. **There is no tip report.** On the Russian brand the Finance section does not work, and this reporting goes with it. ## Related Sections - [POS](/en/docs/pos) — order taking and payment acceptance by the waiter - [Finance](/en/docs/finance) — management dashboards: revenue, purchasing, staff - [Online payment](/en/docs/payments) — payment methods for guests - [Orders](/en/docs/orders) — order lifecycle and monitoring - [Staff](/en/docs/staff) — roles and assigning orders to waiters --- ## Frequently Asked Questions ### Are tips included in the venue's revenue? No. Tips are accounted for separately and do not affect revenue, food cost, or gross profit metrics in the "Finances" section. ### Can I set up different presets for different locations? Yes. Percentage presets and custom amount permissions are configured individually for each location in its settings. ### Is a guest required to leave a tip? No, tipping is always voluntary. If a guest does not select a preset and does not enter an amount, the tip is zero. ### Can tips be shared across the entire shift instead of per waiter? Yes. In **Employees → Payroll → "Tips"**, select "Tip pool — by hours" (shares are proportional to hours worked) or "Tip pool — by role weight" (with coefficients by job title). Tip payouts via payroll are also enabled there. ### How can I find out which waiter collected the most tips? In the **Finances → Sales** section, there is a "Tips by waiter" block that shows the tip total for each employee over the selected period. ### Are tips included in online payments? Yes. If a guest pays for an order online and adds a tip at checkout, it is included in the final amount charged. --- # Bar Mode **Bar mode** is a POS workflow for venues where guests pay at the counter: coffee shops, bars, and fast food. Unlike dining area mode, there is no link to a table or a waiter — select menu items, accept payment, done. The POS immediately resets for a new receipt. There are three service modes on the POS, and the switch in the ticket header has three positions: | Mode | What it does | |-------|-----------| | **Dining area** | full service: table, waiter, serving courses, bill stays open until payment | | **Bar** | counter with **open tabs**: the bill is assigned a name and additional items are ordered into it throughout the evening | | **Counter** | fast food, cafeteria, retail shop, pickup point: select — pay — ticket resets, no open bills | "Bar" and "Counter" are both about paying at the counter; the only difference is that open tabs are available exclusively in bar mode. "Counter" has its own POS appearance toggles designed to speed up sales: **"One-tap payment"** (instead of a "Pay" button — direct "💵 Cash" and "💳 Card") and **"Quick round amounts"** (buttons with preset denominations for change). Both are located in ⚙ POS appearance settings, see [POS](/en/docs/pos). For venues with both a counter and a dining area, the mode can be switched on the fly during a shift — each terminal is configured independently. To open: **Admin Panel → POS** → mode switch in the ticket header. --- ## How to enable bar mode The mode operates at two levels. ### Location default Sets the mode in which the POS opens on any device at this location: 1. Go to **Admin Panel → Locations → [your location] → Settings**. 2. Find the **"POS Mode"** section and select **Bar** (instead of "Dining Area"). This is a three-button segmented control: Dining Area / Bar / Counter. 3. Save. All employees who open the POS at this location will see bar mode by default. > Don't confuse this with the **"Service Mode"** section — that is a completely different setting used to pause receiving orders on the storefront (inventory count, renovation, seasonal closure). If no setting is specified, the mode is derived from the venue type: | Default mode | Venue types | |---|---| | **Dining Area** | restaurant, cafe, hotel | | **Bar** | bar, **beauty salon** | | **Counter** | fast food, canteen, **store**, pickup point, online store, appointment services, professional services, blog, corporate website, widgets, chat | Bars don't need to enable anything: the bar POS opens right away. For ten business types — store, beauty salon, pickup point, online store, appointment services, professional services, blog, corporate website, widgets, and chat — the POS opens **without the mode switcher, dining area panel, or table assignment**: the screen immediately displays without "restaurant" attributes. Meanwhile, [one-tap sales](/en/docs/pos) are enabled by default only for stores, pickup points, and online stores — for salons and the rest, you need to enable it manually. Important: these are **starting defaults, not restrictions**. An outlet can enable any toggle manually — for example, a store with a cafe area can bring back the mode switcher and dining area panel — and its choice will be saved. ### Switching on a specific device If one terminal operates in dining area mode and another in bar mode: 1. Open the **POS**. 2. In the ticket header, click the **Dining Area / Bar / Counter** switcher. 3. The choice is saved on this device **for this location** and does not affect other devices or other chain locations: "Dining Area" selected at the restaurant will not carry over to the store. --- ## Working with Open Tabs An open tab is a named bill to which items can be added until payment. It is ideal for situations where a guest orders multiple drinks throughout the evening or sits at the bar counter for several hours. In the bar vertical (and in hotels, where the tab is linked to a room), the tab is **persistent**: multiple orders throughout the evening are added to it, the list shows the current balance and how long the tab has been open, and it is closed with a single payment. In other venue types, a "tab" is simpler — it is a saved open order to which additional items can be added and then closed upon payment. ### Create a New Tab 1. In bar mode, enter the **tab name or label** (for example, guest name, bar stool number, "Table 2"). 2. Add dishes and drinks from the menu tiles. 3. Click **"Open Tab"** — the ticket is saved, and the POS resets for the next guest. ### Add Items to an Open Tab 1. Click the open tabs list icon (📋) in the POS header. 2. Select the desired tab from the list. Open tabs are marked with a colored 🍸 marker. 3. Add menu items and save again. ### Close a Tab with Payment 1. Open the desired tab from the list. 2. Click **"Pay"** and select a payment method. 3. The tab is closed and moves to [Orders](/en/docs/orders) and the POS shift. After payment, the **"Next Guest"** button instantly opens a blank ticket. --- ## Mixed mode: bar and dining area simultaneously If the venue has both a counter and tables with waiters, configure different devices differently: - **Counter terminal** → "Bar" mode (via local toggle). - **Waiter terminal** → "Dining area" mode linked to a table and QR code. In bar mode, optional table binding is also available — the **"➕ Table"** button allows you to add a table to the bill if needed. Until a table is chosen, the table and waiter fields are hidden to avoid cluttering the counter screen. A table chosen without this button — "Start order" at a table on the [Hall panel](/en/docs/hall-panel) floor plan, an open order that already has a table, or moving the order to another table — is shown in the ticket header right away, in both "Bar" and "Counter" modes. --- ## What you need to get started - **The POS** — the mode is switched with a three-position toggle in the ticket header; bar mode has no section of its own. - **Venue type "bar"** makes this the default mode and turns on the open-tab views; for a cafe or restaurant you pick the mode manually. - **Tab names** — an open tab lives under a guest name or a number; without them you will not collect "the whole evening on one tab". - **The bridge and a printer** — for the receipt and the pre-bill ([Printing](/en/docs/kitchen-printing)). ## Limitations - **Open tabs are a POS contract, not tables.** The floor plan and reservations have nothing to do with bar mode: the guest pays at the counter. - **Counter mode keeps no tabs at all** — ring up, take payment, the ticket resets. That is deliberate: a canteen or a fast-food counter has nothing to "keep open". - **Pour control works as analytics only.** The "Pour" view counts against bar sales; connecting flow sensors and dispensers to the bridge has not been done, so reconciling "poured vs. sold" on real hardware is not possible yet. - **Refunds are processed in the receipt registry**, and it runs on the AWS contour — on `cenaly.ru` there is no receipt history ([Receipts and refunds](/en/docs/receipts)). ## Troubleshooting **There is no mode toggle.** It sits in the POS ticket header; if you only see one position, check the venue type and the POS settings. **A tab cannot be found by name.** Open tabs belong to a location: make sure you are on the same location where the tab was opened. **An order went straight to payment instead of staying open.** The POS is in counter mode — tabs are not kept there by design. **Pour data never appeared.** The "Pour" view counts against bar sales; there is no sensor data in it and there will not be until dispenser hardware is connected. ## Related Sections - [POS](/en/docs/pos) — general POS interface, creating orders, service types - [POS Shift and Z-Report](/en/docs/cash-shift) — opening/closing a shift, revenue reconciliation - [Tips](/en/docs/tips) — adding tips to bar orders - [Orders](/en/docs/orders) — monitoring all orders, statuses and payment --- ## Frequently Asked Questions ### Do bar orders go to the kitchen? Yes. Orders from bar mode are sent to the [kitchen display (KDS)](/en/docs/kds) just like orders from the dining area. If you run a bar without a kitchen, simply do not open KDS. ### Can you operate without open bills? Yes. If a guest pays immediately, simply tap "Pay" without saving the bill first. Open bills are only needed when a guest continues ordering throughout the evening. ### Are bar orders visible in the main order list? Yes — all orders appear in a single feed on the [Orders](/en/docs/orders) page. Bar orders are tagged with a mode badge. ### Can you switch modes in the middle of a shift? Yes — the switcher in the ticket header is accessible at any time. For ten "counter-service" business types (retail store, salon, pickup point, online store, and others), it is hidden by default, but this is merely an initial POS layout setting rather than a restriction: a venue with a hybrid format can enable it manually, and its choice will be saved. Already created orders and open bills remain in the system regardless of the device's current mode. ### Does bar mode affect the Z-report and finances? No, financially the orders are equivalent. Bar mode is only a POS UX change. All revenue is recorded in the POS shift and in the "Finances" section as usual. --- # Kitchen (KDS) — kitchen display **Kitchen (KDS)** (Kitchen Display System) is the kitchen screen that replaces paper tickets: new orders appear automatically, and the cook marks them ready with one tap. Open: **Admin panel → Kitchen (KDS)**. Runs in a browser on any device — tablet, monitor or TV. --- ## Putting KDS on a kitchen screen Two ways: 1. **Staff login** — a cook signs in with their own account (the "Cook" role only sees kitchen screens). 2. **Device code** — in **Devices**, create a code for a kitchen display and enter it on the device. The tablet/TV connects without a password and shows only the KDS. Useful modes: **fullscreen** and a **sound alert** for new orders (toggled on the screen). --- ## Working with tickets Every order is a ticket card with the table, type (Dining area / Delivery / Pickup), items and note. | Action | What happens | |--------|--------------| | **"Start"** | All ticket items move to "Preparing" | | Tap an item | Cycles the item status: Queued → Preparing → Ready | | **"Done"** (bump) | The ticket closes for the kitchen; the order becomes ready | | **"Recall"** | Brings a closed ticket back if it was bumped by mistake | A **timer** runs on each ticket from the moment the order was placed — overdue orders get highlighted. Cancelled items are marked on the ticket automatically. For delivery orders, after "Done" the order moves to **"Ready for pickup"** — couriers see it on the [Courier](/en/docs/delivery) screen; for pickup orders the guest is notified. --- ## Stations If the kitchen is split into stations (hot, cold, bar, desserts), enable the **Stations** filter: pick menu categories and the screen will show only dishes from those categories. Put a separate display at each station — everyone sees only their own queue. The chosen set of categories is saved as a **station preset**, shared across all kitchen screens of the account. A physical device is bound to a station through a link (the stations panel offers a QR code and a copy button): the tablet opens straight into the right station. If the link goes stale, the screen does not hide orders — it simply stops filtering and warns about it. Each station can have **its own printer**, so station tickets print there, with a backup printer in case it fails. Setup and details — [Kitchen printing](/en/docs/kitchen-printing). --- ## All-day summary The **Summary** tab shows total quantities per dish in the queue: "Khinkali — 24, Khachapuri — 7". The cook sees what to batch-cook without counting tickets manually. --- ## Courses and guests Full service brings dishes in waves: starters first, then mains, then dessert. Turn **coursing** on in the KDS settings (off by default) and the rail starts to understand them: - every line gets a **course number**; the waiter sets it at the till, or it comes from the "default course" setting of the dish category; - lines of courses whose turn has not come are grouped on the ticket into a **"🔒 HELD · "** block — the kitchen sees them but does not cook them; - the 🔥 **"Fire"** button releases a course to the kitchen when the table is ready for the next wave; - course names are configurable: three by default ("Starters", "Mains", "Desserts"), up to six in total. Independently of courses, a line shows the **guest number** if the waiter split the items between guests on the till ticket. Combo slots the guest picked arrive in the line's options. --- ## Smart prep time The **Smart prep** section of the KDS settings solves the main headache of delivery: how many minutes to promise the marketplace. Instead of the channel's fixed value it turns on an **automatic prep-time quota** computed from the current kitchen load and sent to Wolt and Yandex Eda. It is off by default; once enabled you set: | Parameter | Default | |---|---| | Min / Max (quota clamps) | 10 and 45 minutes | | Base per order | 8 minutes | | Per item | 2 minutes | | Per active ticket | 3 minutes | Ticket urgency itself is measured against the **promised time** where one is known (slot time or estimated readiness) rather than raw age; separately, a dish that is taking longer than its own cooking time is highlighted on its line. A separate toggle inside the section — **"Cook for courier arrival"** — floats tickets with a known courier arrival time to the top of the rail and sorts them by that time instead of ticket age. --- ## Handoff ("Expo") mode on a tablet In the Android KDS app the same tablet can work in a **second mode — "Handoff"**: instead of the kitchen rail it shows the queue of ready bags to pass to couriers and guests. The data is exactly the same as on the web [Expo](/en/docs/expo) screen — selection, grouping and sorting of the queue match. Switching between "Kitchen" and "Handoff" happens inside the app; no separate device is needed for the pass. The differences are worth knowing up front. The app has a **"Send back to the kitchen"** button (ready items are rolled back and the order returns to the rail) — the browser has no such action — and it beeps both on a new card and on a courier arrival, while the web beeps only on the latter. On the other hand, the app's handoff mode has **no** voice assistant, no manifest and bag-sticker printing and no dark-kitchen virtual brands — for those, use the web Expo screen. ## The tablet app The kitchen screen has a native Android app, **Cenaly KDS**. Things the browser does not have: - **kiosk mode** (pinning the app to the screen) — a toggle in settings, off by default; - **starting up after the tablet reboots** — the app tries to bring the board back by itself (there is no guarantee: without device-owner Android forbids background activity starts, so the tablet is granted the "Display over other apps" permission); - a **brightness slider** for the window plus a "System" chip; - **device-level overrides** of urgency thresholds and filters — what you set on this tablet does not travel to the account; - **"Hey Cenaly" voice commands** right in the kitchen. --- ## What you need to get started - **A tablet, monitor or TV with a browser** — the screen opens at the admin panel address and is bound with a device code ([QR codes and devices](/en/docs/device-codes)). - **Stations set on dishes** — otherwise there is nothing to route items by (grill, cold station, bar). - **Orders that actually reach the kitchen.** By default a guest order reaches the kitchen display only after an operator accepts it in the Orders section; the location setting "guest order needs confirmation" switches back to "straight to work". - **The cook role.** An employee with the "Cook" role lands directly on the kitchen display after signing in. - **A station printer** — if tickets are also printed on paper ([Kitchen printing](/en/docs/kitchen-printing)). --- ## Limitations - **The screen is not adapted to a phone.** It is built for a tablet and a monitor — it has no mobile breakpoints. - **Course firing** for full-service fine dining is postponed. - **Without the internet, tickets do not arrive.** Updates come over a websocket with 30-second polling as a fallback; there is no local network between the POS and the kitchen — [If the internet goes down](/en/docs/offline). - **Kitchen analytics runs on the AWS contour.** The "Kitchen" view in statistics (cooking time, station load, lateness) is unavailable on the Russian brand. - **The feed includes aggregator orders** — the kitchen does not care where an order came from, and there is no "our own only" filter here. --- ## Troubleshooting **An order did not appear on the screen.** Go in order: the order has not been accepted by an operator in Orders (the "guest order needs confirmation" setting); items have no station set while the screen is filtered to a specific one; the screen is showing a different location. **A ticket was bumped by mistake.** The **"Recall"** button returns an already bumped ticket to work, and it survives a screen reload. **There is no sound for new orders.** The browser blocks autoplay until the page is touched once — tap the screen after opening it. **The screen goes dark.** That is a tablet setting, not the kitchen display: turn off auto-lock and put the device into the OS kiosk mode. **Items go to the wrong station.** The station is set on the dish in the menu card — check that, not the screen settings. --- ## Related - [POS](/en/docs/pos) — where waiters send orders from - [Kitchen printing](/en/docs/kitchen-printing) — station tickets and stickers through the hardware bridge - [Expo](/en/docs/expo) — the handoff screen for ready orders - [Orders](/en/docs/orders) — the shared feed and order statuses - [Own delivery](/en/docs/delivery) — what happens to an order after the kitchen - [Staff & shifts](/en/docs/staff) — the "Cook" role --- ## FAQ ### What hardware do I need? Any device with a browser: a tablet, smart TV, all-in-one PC or an old laptop. No special kitchen terminals required. ### Does the screen refresh itself? Yes, new orders and status changes arrive automatically without reloading. If the connection drops, the screen shows an "offline" indicator and reconnects on its own. ### Can I run several screens for one kitchen? Yes, unlimited. With the Stations filter, each screen shows only its own categories. ### Where do KDS orders come from? From every channel at once: guest QR menus, the [POS](/en/docs/pos), the venue website, Telegram, WhatsApp, plus [Wolt](/en/docs/integration-wolt) and [Glovo](/en/docs/integration-glovo). --- # Kitchen and front-of-house printing All physical printing in the venue goes through **[Cenaly Hardware Bridge](/en/docs/hardware-bridge)** — a small program on the till device the printers are attached to. A browser cannot talk to a thermal printer directly: it sends the document to the bridge, and the bridge speaks ESC/POS to the hardware. Through the bridge you print: **kitchen tickets per station**, **item and bag stickers**, **sale and refund receipts**, the **pre-check**, **X and Z reports**, and the **bag manifest** on the handoff screen. --- ## Kitchen tickets per station A ticket has to arrive where the dish is cooked: cold station to its own printer, grill to its own, bar to its own. Configuration lives in **Kitchen (KDS) → the "Stations" panel**, in the "station → printer" table inside it. For each station you set: | Field | What it means | |---|---| | Printer | a specific bridge device; empty means "any printer with the kitchen role" | | Backup printer | where the ticket goes if the main one doesn't answer | | Who prints | **off**, **POS** or **KDS** | | Paper width | 42 characters or another width | | Code page | see below | | Item stickers | print labels when a ticket is bumped to "ready" | > **"Who prints" is a choice, not a checkbox.** POS and KDS are different devices with different bridges, and the record of what has been printed lives on whichever one printed it. Turn both on and the kitchen gets two identical tickets. The printer list is fetched from the **local** bridge, so a station has to be configured from the machine the printer is physically attached to. **What goes on the ticket.** A large font (the cook reads the slip across a table), dish name, quantity, modifiers on their own lines under the dish, the note ("no onions"), the guest number and the course if the order is split by them. There are no prices or totals on a kitchen ticket. **Only new lines print.** A second tap by the waiter does not produce a second ticket: the system remembers which lines already went to the station. If an item was added or its quantity changed, an **"addition" ticket** goes out — not a full duplicate of the order. --- ## Item and bag stickers A 60×40 mm label on the cup and on the box solves two handoff problems: bags stop getting mixed up between couriers, and the guest can see on the cup that the milk really is lactose-free — the modifier no longer stays on the kitchen ticket alone. - **item sticker** — printed when a ticket is bumped to "ready", if the station has that setting on; - **bag sticker** — printed at handoff; - **bag manifest** — the slip **inside** the bag with the full order contents: courier and guest use it to check completeness, and a "you didn't pack an item" dispute with an aggregator is closed with printed evidence. The button is on the [Expo](/en/docs/expo) screen. > The bridge does have a “label printer” role: a sticker goes to the device assigned that role, and when there is none, to an ordinary 60 mm receipt head as a narrow 32-character ESC/POS document, with the tear bar doing the separation. The native TSPL/ZPL languages of label printers are not supported — the same ESC/POS is printed. --- ## Cashier documents | Document | Via bridge | Note | |---|---|---| | Sale / refund receipt | yes | falls back to browser printing | | Pre-check (guest bill) | yes | non-fiscal, explicitly marked as such on paper | | X and Z reports | yes | see [Cash shift](/en/docs/cash-shift) | | Bag manifest | yes | the [Expo](/en/docs/expo) screen | | Kitchen ticket, stickers | yes | no browser fallback | > **A venue whose only hardware is a fiscal register.** Since 31.08.2026 the bridge does not push our documents through the register: a receipt printed as the till's service document would look like a receipt without being one. The bridge refuses, and instead of a print dialog the POS says that **the till prints the receipt itself** — the browser fallback does **not** kick in here. Exactly two documents are allowed through the register: a **test print** (otherwise there is no way to check whether such a till prints at all) and the **pre-check** (a guest bill is not a fiscal document by law). A separate receipt printer removes the restriction entirely. **Reprinting an issued receipt is always written to the risky-operations log**; it asks for a manager PIN only for roles where "reprint under PIN" is enabled — see [Loss control](/en/docs/loss-control). A fiscal receipt is a separate story: it is printed by the fiscal register and follows the country's law, see [Fiscalisation](/en/docs/fiscal). --- ## The print queue and what the outcome means The bridge has a **restart-safe queue with retries**: if the printer is offline, the job isn't lost — it waits and is retried. A queue indicator is shown in the POS header. **A stuck job can be cancelled.** The classic kitchen disaster: a printer jams, it is fixed half an hour later, and on power-up it spits out fifty stale tickets. Jobs are cancelled one at a time from the queue in the till header: the bridge marks the job cancelled and simply skips it when the printer comes back. If the job has already gone to print, the cancel says so honestly — that paper will come out. **The "cancel" button appears only on stuck jobs** — the ones that have been waiting for the printer for more than **three minutes**. Fresh jobs are listed but cannot be cancelled, and that is deliberate: a momentary hiccup (the printer woke up, a cable was nudged) is normal and the bridge will finish printing on its own, while a cancel button next to such a job would mean a lost receipt. The print outcome has four states, and for a cashier they are very different news: | Outcome | What happened | |---|---| | **Printed** | the bridge confirmed physical printing | | **Queued** | the bridge accepted the job but the printer is unavailable — **the guest has no receipt in hand** | | **Browser** | no bridge, or it refused the document, so printing went through the browser dialog | | **Failed** | nothing printed | On "queued" the browser fallback does **not** kick in — otherwise one receipt would print twice. Jobs are idempotent: re-sending the same document does not produce a second slip. --- ## Code pages and non-Latin scripts A thermal printer has no idea what UTF-8 is: it draws one glyph per byte from the currently selected single-byte table. That is why the code page is set **per configured printer**: | Value | What it does | |---|---| | `auto` (default) | Cyrillic found → switches the head to CP1251; Latin and extended Latin (Turkish, Polish, Albanian) are left as they are | | `cp1251` / `cp866` | an explicit Cyrillic table — cheap heads ship with one of the two | | `georgian-academy` / `georgian-ps` / `georgian-expert` | font-ROM layouts of Georgian devices | | `utf8` | historical behaviour: mojibake on any non-Latin text | **About Georgian, honestly.** Which table a given print head speaks is a property of the physical unit and is absent from the protocol spec; that is why the table is chosen per device. If none fits, the text is **romanised**: a line reading `bazuri tarifi` is legible to the guest at the till, `?????? ??????` is not. Georgian does get printed in Georgian letters after all: when the head speaks no suitable table, the bridge renders the line as an **image** (raster printing with a built-in font) and sends it to the printer as graphics — the receipt carries real Georgian text rather than a romanisation. Romanisation stays as the fallback for devices that cannot do raster either. > Raster printing and the label-printer role need **Cenaly Hardware Bridge 0.18.0 or newer** (the current version is 0.23.0). Older bridges keep the previous behaviour: romanisation of non-Latin text, and stickers on the receipt head. Turkish, Polish and Albanian Latin are deliberately **not** forced through CP1251, where `ş`, `ğ`, `ą` would turn into `?`. --- ## What you need to get started - **The bridge on the POS computer** — [Cenaly Hardware Bridge](/en/docs/hardware-bridge). All physical printing goes through it. - **A printer connected to that same computer** — USB, LAN or Bluetooth; the bridge discovers devices itself. - **A "station → printer" mapping** — otherwise there is nothing to route tickets by. - **A roll of the right size** for item and bag labels. - **Stations on dishes** — a ticket is assembled by the item's station ([KDS](/en/docs/kds)). --- ## Limitations - **The bridge only prints from its own computer.** A browser cannot reach a bridge on a neighbouring PC: install the bridge on every POS device, or use cloud printing to a printer on another PC. - **TSPL/ZPL label printers have not been verified on live hardware** — labels are currently printed as a raster image on the receipt printer. - **The device decides the paper width.** It is taken from the printer setting, otherwise from the fiscal printer model, otherwise a safe value is assumed; an 80 mm document width is not carried over to a fiscal printer, because such a printer does not wrap a line — it truncates it together with the amounts. - **A pre-bill does not stay in the queue.** If a receipt printer is configured but offline, the guest's bill is printed on the fiscal printer: the paper is needed now, and a copy an hour later on top of a paid order is a second piece of paper. A sales receipt behaves differently — it does wait for a retry. - **A pre-bill is never sent to a kitchen printer** — for a guest bill such a printer is considered unsuitable, and the job goes to the POS instead. --- ## Troubleshooting **A ticket did not print.** Check the bridge status: if it is offline, the job waits in the print queue and will go out when the link to the bridge is back — the queue survives a restart. **It prints on the wrong printer.** The station has no printer of its own, so the resolver picked "any available". Set the station mapping explicitly. **Hieroglyphs or empty squares instead of letters.** This is a printer code-page problem: switch on the raster font — it draws text as an image and prints any language. **Amounts are cut off on the right.** The configured paper width is too large: set the real width in the device options. **Labels come out the wrong size.** Check the roll format and that printing goes to a label printer rather than a receipt printer (labels on a receipt printer are currently printed as a raster). --- ## Related sections - [Cenaly Hardware Bridge](/en/docs/hardware-bridge) — installing the bridge, device list, printer roles - [Kitchen (KDS)](/en/docs/kds) — stations, courses and print settings - [POS](/en/docs/pos) — receipt, pre-check, reprint - [Expo](/en/docs/expo) — bag manifest and stickers - [Cash shift](/en/docs/cash-shift) — X and Z reports - [Loss control](/en/docs/loss-control) — reprint as a risk event --- ## FAQ ### The ticket printed twice — why? Most likely the station has printing enabled on both POS and KDS. Those are two different devices with two bridges, and each printed its own copy. Leave one value in "Who prints". ### The printer was unplugged — are the orders lost? No. The job goes into the bridge queue and prints once the printer is back. But while it is queued there is physically no paper — and the interface says so plainly. ### Can I print to the kitchen without the bridge? Kitchen tickets and stickers — no, they only go through the bridge. Cashier documents have a browser fallback: printing through the ordinary print dialog. The exception is a venue whose only hardware is a fiscal register: there the till prints the receipt itself and the browser fallback is not used. ### Why is the printer list empty? The list comes from the bridge on **this** device. If the bridge isn't running, or the printer is attached to another machine, no devices appear — configure the station from the machine the printer is physically attached to. ### Are modifiers printed on the bag manifest? No, in the current version the manifest holds item names and quantities. Modifiers appear on the kitchen ticket and on the item sticker. --- # Floor Plan **Floor Plan** is a visual map of your venue in the admin panel: halls, tables, walls and zones. Tables get QR codes and waiters assigned to them, guests book tables, and orders and reservations show up right on the map. Open: **Admin panel → Floor Plan**. Section settings sit under the gear icon in the window header: **Booking deposits** (opens the reservation list and expands the deposit rules), **Booking widget**, **Staff** and **Client codes**. --- ## Plan editor 1. Create **halls** — main hall, terrace, VIP. Each hall has its own dimensions (width/depth). 2. Add elements from the palette: - **Tables** — round, square, long; each with a label, seat count, shape and rotation; - **Structure** — walls, doors, windows, stairs, elevators; - **Zones** — bar, kitchen, WC, entrance, plants, text labels; - **For hotels** — rooms and beds (room service). 3. Select an element to edit its properties, duplicate or delete it. The editor will not let you stack one table on another, nor place a table or a bed **across a wall** — in any venue, not just a hotel: while a bed stands inside a room, the room's walls hold it just like the hall walls do, and an element cut by a wall or hanging half-way out of a room turns red and snaps back when you release it. Standing flush against a wall is fine — that is the normal layout; a bed outside any room (a shared dorm, a floor with no rooms drawn) is fine too. The plan is saved per location — every location has its own map. --- ## Binding QR codes to tables Each table links to a QR code from **Client codes**. Select a table on the map — the "QR code" block offers three ways: 1. **Create QR & link** — the shortest one: the code is created automatically, named after the element ("Table 5", "Room 101"), and linked right away. 2. **Scan QR** — if the code is already printed and sits on the table, point your camera at it. Scanning the same code at another table **moves the binding** — handy when rearranging the room. 3. **Select from list** — link one of the codes already created for this location (searchable by name). Done — orders from that QR code show on that table. A linked code can be previewed, its link copied, or saved with **Download QR (SVG)**. After binding: a guest scans the QR → orders → the order is visible on the floor plan at the right table, in the [POS](/en/docs/pos) and in the [kitchen](/en/docs/kds). --- ## Hall monitor: putting the plan on a TV The **📺 Hall monitor** button in the editor header opens the selected hall as a full-screen map in a new tab — for a TV near the entrance, a host's tablet or a second monitor. There is no sidebar and no panels: the screen shows one thing, the whole room at once. Tables carry live badges: the total of open orders and a timer since seating. For a hotel it is the guest name, the number of nights and the folio balance instead. Tap an element and a details panel opens on the right; Esc closes it. Data refreshes on its own: orders arrive over a websocket and are additionally polled every 30 seconds, hotel rooms and folios once a minute. The screen stays awake (a wake lock is requested), the scale is controlled by the zoom buttons and "Fit", and there is a separate full-screen button. The monitor is **read-only**: you cannot change an order or a room status from it. --- ## Waiters mode In the **Waiters** mode you assign tables to specific employees: pick a waiter and mark their tables. Orders from those tables are automatically bound to the waiter — visible in the order card and staff reports. Add waiters on the [Staff](/en/docs/staff) page. At a hotel, rooms and beds are not assigned to waiters — a room is not served by a waiter (an assignment left over from before is cleared by tapping the room). In other venues a "Room" on the plan is an ordinary place, such as a meeting room, and a waiter can be assigned to it. --- ## Table reservations Reservations work from both sides: **For guests** — the QR menu and the venue website show a booking button: the guest picks a date, time, party size and leaves a contact. After submitting they can see their reservation status. **For the venue** — reservations open from the Floor Plan page with the **📅 Reservations** button (it also carries a counter of pending requests): a separate window with the request list and table assignment. The manager confirms or declines a booking, and can create one manually (e.g. after a phone call). The same window holds the **Deposit** button (with a card icon), where you set the booking deposit rules: which weekdays, hours and party sizes require it and how much. A paid deposit can be **waived** — for example, when the guest warned you about the cancellation. Details are in [Table reservations](/en/docs/reservations). The reservation block in an element's properties depends on the kind of place: a table is booked by the hour (60–240 minutes), while a hotel room or bed gets **"Room bookings"** — a booking **by nights, one night minimum** (see [Hotel](/en/docs/hotel)). --- ## Waitlist and heat map live in the Hall panel This section is the **editor** of the plan: here you draw halls and tables and bind QR codes. Working on top of that plan during a shift lives in the [Hall panel](/en/docs/hall-panel), opened from the till: - the **waitlist** (the queue of guests with no free table, invitations by phone call or Telegram, a suggestion of who to seat at a freed table); - the **hall heat map** — revenue and average check per table for today; - the "Now" tab with occupancy, upcoming reservations and waiter calls. None of these tools exist on the "Floor plan" page — don't look for them here. --- ## What you need to get started - **The section switched on for your venue type.** For a restaurant, cafe, bar and hotel it is on by default; for retail, fast food, canteens, salons and pickup points it is off and is switched on in the [App Store](/en/docs/app-store). - **At least one room and tables on the plan** — the plan is drawn here, and it is used by the [Hall panel](/en/docs/hall-panel) and the [POS](/en/docs/pos). - **QR codes bound to tables** — [QR codes and devices](/en/docs/device-codes): it is the binding that gives a guest's order a table number. - **A deposit policy** — if reservations are taken with a prepayment (the gear icon in the window header). - ⚠️ **The Interior Ministry register (109-FZ)** appears only for locations with the country set to Russia and only on the Russian brand. --- ## Limitations - **This is a plan editor, not a shift workspace.** The waitlist, seating guests, waiter calls and the heat map live in the [Hall panel](/en/docs/hall-panel) — they are deliberately not here. - **At least one room must remain** — the last one cannot be deleted. - **The reservation widget for your own website is a paid extension.** Until it is paid for, the "Book a table" button does not travel to an external site: an unpaid widget is stripped from the site data on the server. The install code and the widget card are in the [My website](/en/docs/site-widgets) section. - **The guest does not choose a table or a room.** The widget and the in-menu form take a **request** — date, time, party size and contact; where to seat them is decided by the venue in the "Reservations" window. - **The widget does not wait for confirmation** and honestly tells the guest "your request has been sent, the venue will confirm": the decision stays with you. - **The guest picks a time in the venue's time**, since they are booking "on site", not in their own time zone. Your own screens show the booking on the same clock: the "Bookings" panel, the floor plan and the POS Hall panel name the hour the guest picked, even when the tablet or computer sits in another time zone. The venue's time zone is set in "Venues" on the "Hours" tab; until it is set, times follow the device clock. --- ## Troubleshooting **There is no booking button on my site.** 1. **Booking is switched off for the location** — the same toggle that shows the booking button on the storefront. 2. **The "Reservations" extension is not paid for** — the widget will not reach the page even with the toggle on. 3. **The tag was not found** — press "Check installation" in the [My website](/en/docs/site-widgets) section; a tag inserted through Google Tag Manager will not be seen by the check. 4. **Changes have not arrived yet** — widget files are served through a CDN with a **5-minute** cache: wait and reload the page with the cache cleared. 5. **The multibutton swallowed the button** — if its fan contains a "Book a table" item, the widget's own button is hidden deliberately. **A guest's request never arrived.** Reservations live in the **📅 "Reservations"** window on this page, not in the order list; the button carries a counter of unconfirmed ones. The common inbox of incoming items (reservations, appointments, popup leads and callbacks) is in the "Leads" section. **A QR code on a table points to the wrong place.** Scan it again at the right table — the binding moves; you do not need to reprint codes or delete anything. **A table is not visible on the plan.** Check that the right room is selected: tables belong to a specific room and will not show up in a neighbouring one. --- ## Related - [Hall panel](/en/docs/hall-panel) — waitlist, seating, calls and the heat map - **Hall monitor** — the full-screen map for a TV or tablet, opened with the 📺 button in this section - [Table reservations](/en/docs/reservations) — guest bookings, statuses and deposits - [POS](/en/docs/pos) — picking a table when taking an order - [Orders](/en/docs/orders) — orders from tables - [QR menu](/en/docs/qr-menu) — what the guest sees after scanning - [Staff & shifts](/en/docs/staff) — roles and waiters --- ## FAQ ### How many halls can I create? Unlimited — main hall, terrace, banquet room, second floor. At least one hall must remain. ### What if a table was moved or its QR re-glued? Just re-scan the QR at the right table — the binding moves automatically. ### Does the floor plan work for hotels? Yes: add rooms and beds instead of tables. A QR code in a room binds just like a table QR — you get a room service setup. ### Can a guest book a table without calling? Yes, right from the QR menu or the venue website. The request instantly appears in the admin panel and the guest sees the confirmation. --- # Hall panel The **Hall panel** is the host's and manager's workstation inside the till. It opens with the 🗺 button in [POS](/en/docs/pos) and takes over the whole screen. Two conditions make that button visible. First, the role: it needs the hall management permission, so a waiter who switched at the till with a PIN will not see it. Second, the **Hall panel chip** toggle in **POS appearance**: restaurants and hotels have it on by default, while non-restaurant business types (retail, beauty, pickup point, e-commerce, services, corporate site, blog, widgets) have the panel off by default — switch the toggle on if you need it. Eight tabs answer eight different questions, but they share one live data set: orders, calls and reservations arrive over a websocket, nothing has to be refreshed by hand. **The panel remembers that it is open.** While it is on screen, the POS address carries `?panel=hall`, so a page reload (F5) keeps you in the panel instead of taking you back to the till; after a reload the panel opens on its default tab. The browser's **Back** button closes the panel and returns you to the till, and from the till it opens the panel again — for example, you seat a guest, take the order and get back to the floor with one click. The ✕ still closes the panel as before. You can bookmark the till with the panel open: the panel opens only if the staff member at the till can see the Hall button (the same two conditions as above). > The floor plan is **drawn** in [Floor plan](/en/docs/tables); the Hall panel displays it and works on top of it. --- ## "Now" The first tab is a single screen showing the state of the venue this minute, as tiles: | Tile | What it shows | |---|---| | Seats taken | taken / total, and how many tables that is | | Bookings within the hour | who has to be seated in the next hour | | Ready, not served | orders waiting for a waiter | | Calls | active waiter calls | | Rooms to clean | (hotels) | | Guest requests | (hotels) | | Overdue tasks | and how many of them have no assignee | | Revenue today | the day's total | **Tapping a tile highlights the matching objects right on the floor plan** — that is the difference between a dashboard and a list of numbers. Empty tiles are hidden: a small café with no hotel and no tasks sees a living screen, not a table of zeros. When nothing needs attention, the tab says so. --- ## "Waiting" — the waitlist The queue of guests for whom there was no free table. **A waitlist entry** holds name, phone, party size, the wait time you quoted, and a comment. The phone is typed in the same country format as in a reservation, and the "Call" button in the queue row shows the number the same way. **Statuses**: `queued` → `invited` → `seated`; terminal ones are `no-show` and `cancelled` (left on their own). Once invited, a no-show timer starts ticking. **How to invite.** There are exactly two channels, and both are real: - **Phone call** — a `tel:` link right in the row, nothing to configure; - **Telegram** — the button appears **only if the guest already has a conversation with this location's Telegram bot**. Telegram does not let a bot message first: until the guest starts the dialogue, the chat simply does not exist. There are no stubs here that look functional. SMS and WhatsApp are not supported in the waitlist yet. **Seating.** When a table frees up, the panel suggests a matching party by itself: among those still queued who fit the table, it picks the one that leaves the fewest empty seats, and on a tie the one who has waited longest. Seating creates an ordinary reservation and hands the table to the till — the same path as seating a reservation from the scheme. The number of parties waiting is shown on the tab itself. --- ## "Scheme", "Reservations", "Calls" **Scheme** — a live floor plan with table statuses: free, occupied, waiting, reserved. The waiter assigned to a table is shown right on the plan — a circle in their colour with their initials at the table's top-right corner; hover over it (tap it on a tablet) and a tooltip shows their name. Waiters are shown the same way on the "Now" tab's plan. Tapping an occupied or reserved table opens a card: open the order, seat a reservation, **assign a waiter to the table** (or change/clear the assignment). When a table has several reservations for today, the card lists them all by time — the nearest one first, and that is the one the “Seat” button takes; on the plan itself the table badge shows the nearest reservation plus “+N” for the rest of the day. For the plan, “today” runs to the end of the day, and from 06:00 it also covers the night until 06:00 the next morning: a 01:00 or 04:00 reservation made in the evening shows at its table right away — and at the new table after the guest is moved — not only after midnight. Reservations for later days are not drawn on the plan; they are on the “Reservations” tab. Tapping a free table does not open the card — it simply hands the table to the till so you can ring up the order right away. You can still change or clear the waiter of a free table: tap the waiter's circle on the table and the same card opens with the list of waiters already expanded (next to “Start order”); the circle works the same way on an occupied table. At a **hotel** a room on the plan is not a table: its card shows **"🛏️ Check in"** instead of "Seat" — it leads to the room check-in window on the "Floor plan" page (guest folio, room status, guest registration; see [Reservations](/en/docs/reservations)) — and there is no waiter row, since a room is not served by a waiter. A room means a room or a bed in a venue of type "Hotel"; in other venues a "Room" on the plan is an ordinary place, like a table. **Reservations** — the same reservation list as on the floor plan page: create, edit, confirm, assign a table, change status. Each row shows the window the table is held for the guest — for example "Today 11:00–13:00". The **"✏️ Edit"** button opens a form right in place of the row: you can move the date and time, make the reservation longer or shorter, and change the party size, table, name, phone and comment. If the table is already taken at the new time, the changes cannot be saved; if the table was taken from another screen at the same moment and the server refuses, the row goes back to its previous values and the panel says the changes were not saved. A guest who left an e-mail gets a message about the new time. Availability is shown inside the form: for the chosen window a taken table is marked "· Occupied" and cannot be picked, an overlap is refused with "Overlaps another reservation on this table", and when every table is taken the form says "No free tables" (a reservation with no table can still be created — the table is assigned by hand). A time that has already passed is not accepted. The guest phone is written the way a number is written in the location's country — "+7 (912) 575-19-38": the grouping appears as you type, and an empty field shows an example number for the country. The number is shown the same way in the reservation row and in the table card on the floor plan. Not a single digit is changed, and free-form text such as "ext. 101" or two numbers separated by a comma stays as typed. Unconfirmed reservations show as a number on the tab — exactly the requests in the list. A request whose time has passed without being confirmed leaves the list (it is visible under "Show past") and is no longer counted. Moving a reservation to another time does not create a new one: the same record changes. The 🗺 button in POS carries the same number plus active waiter calls. At a **hotel**, rooms and beds are not offered in the reservation form or when moving a reservation — a room is booked by nights on the calendar ([Hotel](/en/docs/hotel)); a reservation that already sits on a room shows **"🛏️ Check in"** instead of "Seat": it opens the standard check-in window on the "Floor plan" page with the guest from the reservation, rather than just changing the status. **Automatic no-show release.** The **"⏱ Auto no-show"** button in the tab header opens the setting right in place: a checkbox "Release the table if the guest does not turn up" and how long to wait after the reservation starts — from 5 to 240 minutes, 15 by default. It is off by default: running late is not the same as not coming, and releasing a real guest's table costs more than an empty table does. Once it is on, a confirmed reservation counts down in its row ("⏱ auto no-show in N min"), and when the time is up the reservation goes to "no-show", the table is free again and the panel shows a toast with the table name. Reservations released by the machine are visible under "Show past" marked "🤖 released automatically". This also works when the POS is closed — the server catches up on overdue reservations. What the machine will not do: it never touches reservations older than a day, never touches guests already seated or requests not yet accepted, and **never releases a reservation with a paid deposit** — a member of staff closes those with "No-show", because the status decides what happens to the guest's money. The same pair of settings lives in the "Guest journey" block of the appointments journal: the rule belongs to the venue, not to one screen. More in [Table reservations](/en/docs/reservations). **Calls** — waiter calls sent by guests from the QR menu (see [Orders](/en/docs/orders)). A row with the table number and reason, an "Acknowledged" button, and a global sound toggle. The same bell is mirrored in the Orders section. --- ## "Day" and "Tasks" **Day** — who is on shift right now: today's planned-vs-actual roster grouped into "on shift", "on break", "shift left open", "expected", "finished" and "off schedule". Clock-in and clock-out happen from the shared till terminal: an owner or manager can mark anyone without a PIN, everyone else enters their own. An employee can have only one open shift, so a forgotten clock-out (a shift open for more than 20 hours) goes into the **"Shift left open"** group: the row names the day of that shift and carries the **"Clock out"** button that closes it. While it hangs, the server refuses that employee's clock-in — and the tab says so in words, naming the date, instead of a generic error. Even a shift from the previous month, absent from the tab's list, can be closed: the refusal itself supplies the button. In the hotel vertical the tab adds a guest-requests block. **Tasks** — a compact version of the [shift tasks board](/en/docs/tasks): quick add, "open / doing / done" groups, tick to complete. The full kanban with tags and due dates lives on its own page. The number of open tasks is shown on the tab. --- ## "Analytics" — the hall heat map Which square metres bring in money. The floor plan is coloured by a value — revenue or average check per table — with a table of numbers and a legend underneath. Two honest limits: - it covers **today only** — the tab works from the live 24-hour order cache and has no backend of its own; periods (week, month, revenue per seat) are not supported yet; - **a table with no QR code bound to it means "no data", not "zero revenue"**: orders are linked to a table through its code, and about a table without a code nothing can be claimed. --- ## What you need to get started - **Access to the POS.** The hall panel is not a separate sidebar item: it opens with the **"Hall" (🗺)** button inside the [POS](/en/docs/pos). - **A drawn floor plan** — rooms and tables are created in the [Floor plan](/en/docs/tables) section; the panel only displays them. - **QR codes bound to tables** — without the binding the "Calls" view stays empty and orders are not linked to tables. - **Booking switched on** — for the "Reservations" view and deposit policies ([Table reservations](/en/docs/reservations)). - **Accumulated orders by table** — the revenue and average-check heat map is built from them, and on empty history it is empty. --- ## Limitations - **The panel lives inside the POS** — it has no address or menu item of its own. - **Updates come over a websocket.** Without a connection the views do not refresh themselves — you will have to reload manually. - **There is no reservation timeline by table** and no seating-grid engine: overlaps are visible, but there is no automatic seating. - **There is no "guest arrived" status** and no automatic reminders N hours before a reservation. - **Automatic no-show release is off by default** and is switched on by the venue: running late is not the same as not coming. A reservation with a paid deposit is never released automatically. - **Hall analytics counts by table** — takeaway and delivery orders are by definition not shown on the heat map. --- ## Troubleshooting **There is no "Hall" button in the POS.** The tables section is off for your venue type — switch it on in the [App Store](/en/docs/app-store). **The "Calls" view is empty although guests are calling the waiter.** That means the QR code is not bound to a table: rescan the code at the right table and the binding will move. **There are no tables on the plan.** Check that the right room is selected — tables belong to a specific room. **No reservations are visible.** Booking is switched off for the location, or you are looking at a different point of sale. The plan also shows only today’s reservations (in the evening — the night until 06:00 as well): look for a reservation on a later day on the “Reservations” tab. **The heat map is empty.** There are no orders bound to tables for the selected period. --- ## Related sections - [POS](/en/docs/pos) — where the panel is opened from - [Floor plan](/en/docs/tables) — the plan editor and binding table QR codes - [Table reservations](/en/docs/reservations) — booking, deposits, statuses - [Orders](/en/docs/orders) — the waiter call and where it goes - [Shift tasks board](/en/docs/tasks) — the full board --- ## FAQ ### How is the Hall panel different from the "Floor plan" section? "Floor plan" is the editor: that is where you draw tables and halls and bind QR codes to them. The Hall panel is the work done on top of that plan during a shift: seating, the queue, calls, analytics. The waitlist and the heat map do not exist on the editor page. ### Can a guest join the waitlist by themselves? No, the host adds them. The guest gets a call or a message from the venue when a table frees up. ### Why is a table empty in analytics? It has no QR code bound to it. Orders are linked to a table through its code, so without one there is no data for that table — and the panel honestly shows "no data" rather than zero. ### Can I open the panel on a separate tablet at the entrance? Yes — it is part of the till app, so open POS on the host's tablet and keep the panel expanded. ### Are waiter calls duplicated in "Orders"? Yes, it is the same signal: the bell in the Orders section and the "Calls" tab show the same active calls. --- # Self-Service Kiosk **Kiosk mode** turns a tablet or touchscreen terminal into a full-featured self-service point: the guest chooses dishes themselves, builds the order, and pays — without staff assistance. The order is automatically sent to the kitchen and appears in the general order feed, just like a regular order placed via QR menu. The interface runs in a browser on any tablet: Android, iPad, or Windows terminal. It is configured in the [App Store](/en/docs/app-store) — via the **"Self-Service Kiosk"** card in the integrations block of the selected location. The extension is included in Premium and higher plans. Next to the "Configure" button on the card, there is **"Open Kiosk"** — this is a standard link to the storefront with the `?kiosk=1` parameter. The mode is remembered in the device's browser itself, so a tablet "stuck in kiosk mode" can be restored by opening the URL with `?kiosk=0`. --- ## Guest Order Flow The kiosk guides the guest through a fixed route: 1. **Attract screen** — displayed in idle mode. The guest taps the screen to start. 2. **Order type selection** — "Dine-in" (at the table) or "To go" (pickup). Available types are configured in the settings — you can keep only one so that the step is skipped automatically. 3. **Menu** — a full touch-optimized interactive catalog: large category tiles, photos of dishes, options (size, doneness, etc.), and add-ons. The guest adds items to the cart directly from the screen; a counter and order total are always visible at the bottom. 4. **Cart** — a list of selected dishes with the ability to change the quantity or remove a menu item. 5. **Payment** — the guest selects a payment method and confirms the order (more details below). 6. **Order number** — after confirmation, the screen displays the number. The guest says it at the counter or waits to be called. After a few seconds, the kiosk returns to the splash screen on its own, ready for the next guest. You can go back between any steps — the order is not created until it is confirmed. --- ## Payment On the payment screen, the kiosk displays the following buttons: | Method | Description | |--------|----------| | **Pay at POS** | The guest picks up the order and pays the staff. The order is created immediately with the "Placed" status. Enabled via a toggle in the kiosk settings. | | **Online Payment** | Card via a connected provider (Stripe, BOG, TBC, and others). The kiosk redirects the guest to a secure payment page and returns them back; the order is marked as paid as soon as the provider confirms the payment. | | **Card on Terminal** | Payment on a bank terminal connected to the same computer via the hardware bridge. Appears only if the terminal is linked to the kiosk (see below). | Online buttons are pulled from the location's **Payments** settings: only the providers that are enabled and support the venue's country and currency are displayed. There is no separate toggle for online payment in the kiosk settings. **Card on a terminal next to the kiosk.** If a bank terminal is connected to the same computer via the [hardware bridge](/en/docs/hardware-bridge), a third button appears on the kiosk — payment by card right on the spot, without redirecting to a provider's page. The terminal is linked to the kiosk in the "QR Codes" section → "Devices" tab (the panel must be opened directly on the kiosk computer itself — it only detects its own local terminals). After a successful payment, the kiosk marks the order as paid and, if enabled, prints a receipt and fiscalizes the sale. Card decline — the guest can **retry** the attempt or proceed to **pay at the POS**: the order remains the same, preventing duplicates. If the connection drops during the charge, the kiosk checks with the terminal; when the outcome cannot be verified, the retry button **is not displayed** — the guest is invited to the POS to prevent double charging. If online payment is not configured, the "Pay at POS" button is always displayed — even when the toggle is turned off, ensuring the kiosk is never left without a payment method. Providers can be connected in the [Payments](/en/docs/payments) section. ### Card payment on the kiosk terminal If a bank terminal is connected to the kiosk computer via the [hardware bridge](/en/docs/hardware-bridge), the guest pays **on the spot**, without navigating to a provider's page or approaching a cashier: the kiosk displays a "Pay by card on terminal" button, sends the amount to the terminal, and guides the guest step by step — "insert card", "processing payment", "paid". Once approved, the order is immediately marked as paid (including the terminal transaction details), and the receipt is printed and fiscalized via the bridge if printing and POS integration are configured. What happens in non-standard situations: | Situation | What the guest sees | |---|---| | Card declined | "Payment failed" and two buttons: try again (a new attempt is sent to the terminal as a separate transaction) or pay at the POS | | Terminal does not respond before timeout | The kiosk stops waiting and offers payment at the POS; the order remains unpaid | | Connection to the bridge dropped mid-charge | The kiosk **does not** offer a retry — funds may have been debited; the guest is directed to the cashier, who will verify the transaction on the terminal | | Bridge is not running on this computer | The terminal button is not shown at all — standard payment methods remain available | Linking the kiosk to the terminal is done once directly on the kiosk computer: **"QR Codes" section → "Devices" tab** → device code and selection of the bridge terminal. The bridge only listens to the local computer, so the setup must be accessed right from it. Do not confuse this with the separate "Devices" section in the admin panel — that section manages staff devices, not the kiosk. On the same screen, if the corresponding options are enabled, the guest enters their name and selects tips; the venue's service charge is automatically added to the total. --- ## Idle Auto-Reset If a guest does not interact with the screen for a specified time (configured in seconds), the kiosk: - displays a warning with a countdown (15 seconds; the "Continue" button brings the guest back to their order); - clears the incomplete order; - returns to the screensaver. This protects against "abandoned" carts at busy locations. Completed and paid orders are not affected by the reset. --- ## Interface Protection In kiosk mode, a guest cannot: - switch to the standard menu or QR interface; - open settings or other sections of the app; - exit the mode accidentally. To exit the mode — for example, to reload settings — there is a hidden gesture: **5 consecutive taps in the top right corner**. If a PIN is set in the settings, the kiosk will prompt for it; if no PIN is set, it will exit immediately. ⚠️ **The PIN only protects the gesture.** The **Ctrl + Shift + K** key combination exits the mode immediately without asking for a PIN — which is why it is best not to connect a keyboard to the kiosk at all. The mode is saved on the device: the tablet remains a kiosk after a reboot or page refresh until explicitly exited from the mode. --- ## Kiosk setup in the admin panel 1. Open **Admin Panel → App Store**. 2. Go to the integrations list **by location** and select the location you need. 3. Find the **"Self-Service Kiosk"** card and click **"Configure"**. 4. In the wizard that opens, set the parameters: - **Enabled** — activation toggle. - **Order types** — "Dine-in", "Takeaway" or both (at least one is required). - **Payment at POS** — whether to show a payment-to-staff button. - **Idle timeout** — from 15 to 600 seconds, 60 by default. - **Ask for guest name** — optional, displayed in the order. - **Tips** — whether to show a tip prompt on the payment screen. - **Exit PIN**. 5. Save the settings. Next to it is an **"Open Kiosk"** button — it opens your location's menu in kiosk mode. Open it on the tablet (or copy the address into its browser) — the device will remember the mode. The welcome text on the splash screen is taken from the location's **Appearance** settings ("Welcome text" field). --- ## Hardware and Browser The kiosk works in any modern browser. Recommendations for stationary use: - **Android tablet or iPad**: lock the browser in kiosk mode (Guided Access on iOS, pinned apps or owner mode on Android). - **Windows terminal**: Edge or Chrome kiosk mode (`--kiosk` flag) so that the user cannot close the tab. - Screen size from **10 inches** — a smaller screen will result in an inconvenient interface. - Set **portrait** or **landscape** orientation and lock it in the tablet settings. An internet connection is required: the order is created in real time. --- ## What you need to get started - **A tablet or touch terminal with a browser** — Android, iPad or Windows. - **The kiosk switched on** in the [App Store](/en/docs/app-store) — the "Open kiosk" button is there too. - **A menu with photos and prices** — the kiosk shows the same storefront as the QR menu. - **A payment method**: online payment on the storefront, or payment at the POS by order number. - **The bridge** — if the guest pays by card on a bank terminal connected to the same computer. - **A queue display** — if the guest needs to see the number of a ready order. ## Limitations - **Terminal payment through the bridge has not been run on real hardware.** It is written and will only reach POS computers with a new bridge release — plan for payment at the POS as the primary scenario. - **Online payment is not available everywhere.** There are few live payment integrations, and on the Russian brand there is currently no online payment at all ([Payments](/en/docs/payments)). - **The queue display shows one pickup point.** Several windows and spoken announcement of the number are in the backlog. - **The kiosk is a cloud surface**: it does not work without the internet, and guest-facing screens keep their own queue for only an hour. ## Troubleshooting **The kiosk drops out of kiosk mode.** The mode is remembered by a URL parameter — pin the tab in the tablet operating system's own kiosk mode and disable gestures. **Payment does not go through.** Check which method is selected: if it is card-on-terminal, that scenario has not been verified on live hardware yet; if it is online payment, check whether a provider is connected for your country. **The order is not printed in the kitchen.** Printing goes through the bridge on the POS computer, not through the kiosk tablet. **The screen does not reset after a guest.** Check the idle auto-reset setting. **A guest cannot see a dish.** Same as on the storefront — check the 86 list and the availability schedule. ## Related Sections - [Orders](/en/docs/orders) — how kiosk orders are displayed in the feed and change statuses - [Kitchen (KDS)](/en/docs/kds) — the kitchen screen where kiosk orders are received - [POS (POS)](/en/docs/pos) — staff workstation for employee orders - [Payments](/en/docs/payments) — connecting online providers for payments at the kiosk - [QR Menu](/en/docs/qr-menu) — alternative scenario: a guest orders from their smartphone --- ## Frequently Asked Questions ### Is a separate app or special software required? No. The kiosk runs in a standard browser on any tablet or touchscreen monitor. No additional installations are required. ### How does the kiosk differ from a QR menu? With a QR menu, the guest scans the code with their phone and orders through it. A kiosk is a stationary tablet of the venue: guests approach it and order right there. Both options can be used simultaneously. ### How do kiosk orders look to the staff? They appear in the "Orders" section and on the kitchen display screen (KDS) in exactly the same way as orders via QR menu or POS — with the "Dine-in" or "To go" type and the guest's name, if it was asked for. The "kiosk" source is recorded in the order data, but there is currently no separate badge on the order card: to the staff, it's just a regular guest order. ### Can the menu be restricted for the kiosk? Currently, there is no separate "kiosk version" of the menu — the full catalog of active dishes of the location is displayed. Dishes hidden in the menu settings are not shown to the guest. ### What happens if the tablet loses internet connection in the middle of an order? The kiosk requires an internet connection to create an order. If the connection is lost before confirmation, the order is not saved. Once the connection is restored, the guest can start over. --- # Own delivery (couriers) If your venue delivers with its own staff, Cenaly gives couriers a dedicated screen: an order queue, a map with the route, and one-tap status changes. The owner sees which courier carries which order and when it was delivered. Open: **Admin panel → Courier**. Available to the owner, managers and employees with the **Courier** role. --- ## Setup 1. **Enable delivery** in the location settings (delivery zones and fees — see [Orders](/en/docs/orders)). Zones are drawn in one and the same editor, opened either from the Courier screen ("Delivery dispatch & zones" block) or right from the delivery conditions — the "Set up zones" button next to the radius and the pricing, in Websites and in the online-order hub; mind the main consequence — **an address outside every zone cannot be ordered to**. The one exception: if the address is served by one of the [shipping methods](/en/docs/commerce) of the Commerce section (flat rate, local radius from the warehouse, a delivery service), the guest orders with that method at its price — zones and the radius bound your own delivery, not every method. With no zones at all, the existing pricing applies. 2. **Create couriers** on the [Staff](/en/docs/staff) page with the "Courier" role — each gets their own login; a courier sees only the delivery screen. 3. The courier opens **admin.cenaly.com** on their phone — the screen is mobile-friendly. --- ## The courier screen Two tabs — **Orders** and **Map**. Orders are grouped by stage: | Section | What's in it | |---------|--------------| | **Preparing** | The kitchen is still cooking — the courier sees what's coming | | **Ready for pickup** | Ready to grab: the **"Take order"** button | | **On the way** | The courier's own orders: address, phone, the **"Delivered"** button | | **Delivered today** | Today's history | The **Map** tab shows delivery points and the **route to the customer**; the courier's own location is shown too. If an address has no coordinates, navigation falls back to the address text. **A route across every order a courier took.** Above the map, in the route panel, there is a “🛵 Courier route…” list: pick a courier and every order they have taken lines up into one trip, calculated from where that courier is right now. With two or more stops the visiting order is optimised automatically. You no longer have to tick orders one by one with “Include in route”, yet you can still add another order to the built route with that same checkbox. A dispatcher can pick any courier out on delivery; a courier only sees themselves. --- ## Delivery order statuses ``` New → Preparing → Ready for pickup → Out for delivery → Delivered ``` - **Ready for pickup** — the kitchen finished (bump on the [KDS](/en/docs/kds)); - **Out for delivery** — the courier tapped "Take order" (the order is assigned to them); - **Delivered** — the courier confirmed the handover; the time is recorded; - **"Return"** — releases the order if it was taken by mistake. The guest sees their order status in real time on the order page. --- ## Payment on delivery The order card shows the payment method: - **Cash on delivery** — a "Collect from customer" note with the amount; - **Card on delivery** — take payment with a terminal; - **Paid online** — nothing to collect. --- ## What you need to get started - **The "Courier" section** — it is on by default but can be switched off in the [App Store](/en/docs/app-store). - **Delivery zones and fees** — polygons or radii on the map with a price, a minimum order and free delivery above an amount. - **Couriers as employees** with the "Courier" role: the section is available to the owner, managers and couriers; other roles are refused. - **A courier's phone with a browser** — the courier web app opens on it. --- ## Limitations - **Assignment is one-way.** A courier cannot accept or decline an offered order — the dispatcher assigns, the courier delivers. - **There is no PIN confirmation of handover** in the courier web app. - **The freelance courier network is not deployed.** The network settings and the "Send to network" button are rendered, but on the backend this currently does nothing; your own delivery does not depend on it and works fully. - **Delivery-as-a-service providers** (Wolt Drive and others) are verified on mocks; there are no live shipments. - **A courier's cash accountability** with reconciliation in the cash shift is not closed: cash on delivery is accepted, but handing the money back to the till is tracked outside the system. - **Routes are built on a public demo service with no availability guarantees** — worth knowing for critical routes. - **Courier-stage statuses and the channel-pause banner are not shown to guests everywhere** — an open task. - **The section is one large window** (queue, fleet, map, zones, settings), and our internal clarity review gives it 3 out of 5. --- ## Troubleshooting **The courier sees no orders.** Check the employee's role and that the order is assigned to them: auto-assignment works by zone, and an order outside a zone will not be assigned. **An order did not reach delivery.** The order type must be "delivery", the address must fall inside a zone, and the minimum must be met. If any of these fails, the order stays in the general list. **The guest cannot see tracking.** Courier-stage statuses do not reach every storefront surface — a known limitation. **The "Send to network" button does nothing.** That is correct: the freelance courier network is not deployed. Use your own couriers. **The delivery fee was calculated incorrectly.** Check the order of zones: an address falls into the first matching one, and free delivery above an amount overrides the zone fee. --- ## Related - [Orders](/en/docs/orders) — delivery zones and fee setup - [Kitchen (KDS)](/en/docs/kds) — where "Ready for pickup" comes from - [Wolt](/en/docs/integration-wolt) and [Glovo](/en/docs/integration-glovo) — delivery via aggregators - [WhatsApp orders](/en/docs/integration-whatsapp) — taking orders in a messenger --- ## FAQ ### How is own delivery different from Wolt/Glovo? Aggregators charge a commission and provide their couriers; own delivery means your couriers and 0% commission. Many venues combine both: aggregators for new customers, own delivery for regulars. Orders from all channels land in one feed. ### Does the courier need an app? No, a phone browser is enough. The courier signs in with their login and sees only the delivery screen. ### Can the owner see who delivered an order? Yes — the order stores the courier, pickup time and delivery time. A delivery summary is available in [Finance](/en/docs/finance). --- # Virtual Brands A **virtual brand** is an additional delivery-only name (a "dark" or ghost-kitchen brand) that sells a subset of your location's menu on Glovo, Wolt, and Yandex Eats while staying physically the same kitchen. The section lives in **Admin Panel → [App Store](/en/docs/app-store)**: switch the storefront's top-level scope from **"Account"** to **"Per location"**, pick the location, and at the bottom of its integrations block you'll find **"Virtual brands (dark kitchen)"**, next to channel commissions. The block has no card of its own in the extensions catalog, so searching the catalog for it won't help. The idea comes from dark-kitchen practice: a single prep location can list several names on aggregators — "Mario's Pizza," "Asia Woks," "Midnight Burgers" — instead of opening a physically new spot for every niche. Each brand gets its own menu, logo, and page on the platform, but orders are still cooked by the same kitchen and shown on the same KDS screen. --- ## Brand registry and menu subset Each virtual brand at a location is a registry entry with: - **name, "Logo URL" and "Cover URL"** — how the brand looks on the delivery platform, separate from the location's main brand. The images are given as **links** to files you already host: there is no file upload in this block; - **an item subset** — which categories and dishes from the main menu belong to the brand (picked with the same reusable table used for per-channel menu overrides). An item can belong to several virtual brands and the main menu at the same time — it's just a different slice of one catalog, not a duplicated dish. --- ## Linking a brand to delivery channels Each brand has its own storefront identifiers per channel, connected separately from the location's main storefront: | Channel | Identifier | |---|---| | [Glovo](/en/docs/integration-glovo) | Store ID | | [Wolt](/en/docs/integration-wolt) | Venue ID | | [Yandex Eats](/en/docs/integration-yandex) | Place ID | Registering the second storefront itself — i.e., making the platform aware that "Mario's Pizza" is a separate store on Glovo/Wolt/Yandex Eats — is an operational step in that aggregator's own partner dashboard; the platform doesn't do it for you. cenaly.com connects an ID already issued by the platform to your brand, and from that point manages its menu and orders. Once linked, each brand's own card carries a **"Publish menu"** button — one per channel: the system builds a separate menu file from the brand's item subset, adds the brand's name and logo to the metadata, and publishes it to the channel's storefront — without touching the main location's menu or other brands. --- ## Per-channel overrides on top of a brand The same [per-channel overrides](/en/docs/delivery) that apply to the main location menu also apply to a virtual brand's menu — only the item subset of the brand is taken first, and then channel-specific edits are applied on top of it: - **hide an item** — don't show a dish on that channel; - **custom price** — a markup or a distinct price to cover the platform's commission; - **custom name, description and photo** — for cases where a dish card on the aggregator needs to look different from the main menu. Order matters: the brand subset filter is applied first, then channel overrides on top of the result — an override cannot bring back into the brand's menu an item that isn't part of the brand. --- ## How an order shows up in the kitchen An order that arrives on a virtual brand's storefront is automatically tagged with that brand on intake, based on exactly which channel storefront it landed on. From there, the brand shows up: - as a **badge on the ticket** on the [kitchen (KDS)](/en/docs/kds) screen — the cook sees which name the guest ordered under; - **in the order list** — a brand filter and column next to the channel (Glovo/Wolt/Yandex Eats); - **on the [Expo](/en/docs/expo) card** — expo staff see the brand when handing the order to a courier. No separate queue or screen is created per brand — every brand's orders flow into the same kitchen queue and the same expo queue, just tagged with where the order came from. --- ## Related sections - [Delivery channels](/en/docs/delivery) — per-channel menu overrides, stop-list, pauses - [Glovo](/en/docs/integration-glovo) · [Wolt](/en/docs/integration-wolt) · [Yandex Eats](/en/docs/integration-yandex) — connecting channels - [Kitchen (KDS)](/en/docs/kds) — the prep screen with the brand badge - [Expo](/en/docs/expo) — handing an order to a courier with its brand shown --- ## FAQ ### Do I need a separate physical location for a virtual brand? No, that's the whole point — one prep line and one kitchen serve every brand at the location. You only need to set up a storefront (Store/Venue/Place ID) in the aggregator's partner dashboard and a menu subset in cenaly.com. ### Does a virtual brand get its own website or QR menu? No, virtual brands only sell through the connected delivery channels (Glovo/Wolt/Yandex Eats). The platform doesn't create a separate public storefront or a dedicated domain for a brand. ### Can I see revenue broken down by brand? Financial reports are currently computed for the location as a whole, without a per-virtual-brand breakdown. You can tell orders apart by channel and storefront in the order list. ### What if I only have one brand? The section is optional — without virtual brands, a location keeps working exactly as before: one menu across every connected channel. --- # Staff & shifts The **Staff** page gives your team personal logins to the admin panel: everyone signs in with their own email and password and sees only the sections their role allows. The same page hosts the shift schedule and time tracking. Open: **Admin panel → Staff** (only the account owner manages the list). --- ## Roles and access | Role | What they see and can do | |------|--------------------------| | **Manager** | Menu, orders, POS, inventory, locations and devices | | **Waiter** | Orders and POS only | | **Cook** | Orders and the kitchen screen (KDS) only | | **Courier** | Delivery screen only: their orders, map and routes | The owner keeps full access to everything, including finance, subscription and settings. ### Three levels per section A section is not granted "all or nothing": every section allowed to a role has three levels — **👁 view**, **✏️ edit data** and **⚙️ section settings**. You can, for example, let a stock keeper view and edit inventory but keep them out of its settings, and leave an accountant with read-only finance. What the level changes on the employee's screen: - **👁 view only** — the section header shows a "View only" note explaining who grants the edit level, and the "add", "create", "delete" buttons are disabled (hovering explains why). Lists, search, filters, printing and exports keep working. - **✏️ edit** — normal work with the section. The server additionally issues a write grant for that section's data; without this level writing is physically impossible, even around the interface. - **⚙️ settings** — the "Section settings" gear in the window header. Without this level the gear is simply not there. In the general **Settings** hub such a role keeps only the personal tabs — "Interface" (how the admin panel looks for them) and "Personal SIP accounts"; account-wide parameters are hidden. The levels are already honoured by **Menu**, **Orders**, **Inventory**, **Staff**, **Customers**, **Appointments**, **Tables & bookings**, **POS**, **Finance** and **Settings**; the "Section settings" gear is gated by the ⚙️ level in every section at once. The remaining sections still show a role everything they contain, without splitting view from edit — we are rolling them out one by one. --- ## Adding an employee 1. Click **"Add employee"**. 2. Enter the **email** (used as the login), name and **role**. 3. Set a password or click **"Generate"**. 4. Hand the credentials to the employee — the password is shown only once (there's a "Copy credentials" button). At any time you can **reset the password**, add **notes** (schedule preferences, contacts, documents) or delete the employee — they immediately lose access. --- ## Workspaces The admin sidebar has a **Workspace** switcher: Administration, Hall, Kitchen, Delivery, Marketing. It trims the menu to relevant sections — handy on a waiter's tablet (just Orders, POS, Kitchen, Floor Plan) or a kitchen device. A workspace is a filter on top of role permissions: access is defined by the role, the workspace just hides the clutter. --- ## Shifts: plan vs fact The staff page includes a **shift schedule**: - **Plan** — the manager lays out shifts per day (start and end time). Once a month's timesheet is closed, its shifts can no longer be added or edited: the grid says so with a “🔒 The <month> timesheet is closed” note before the first click, and the account owner can reopen the month on the Plan vs fact tab; - **Annual vacation plan** (the HR tab → “Vacation plan”) — employees suggest their dates in their own cabinet, the manager agrees them and HR approves the whole plan. The **“🖨 Print”** button puts the plan on paper as a vacation schedule: an “APPROVED” block with a line for the head’s signature, the approval date and document, columns “department, position, employee, days, vacation dates, note” and an “Acknowledged: signature, date” column. A plan that is not approved yet prints marked “Draft”; if people belong to several legal entities, you pick the legal entity above the form. A Russian legal entity also gets a “T-7 (print)” button with the unified schedule form; - **Fact** — the employee taps **clock-in** and **clock-out**; time is recorded server-side, so it can't be forged from a device. Clock-in can be restricted to the venue — by geofence or **only from a venue terminal** (a tablet with a PIN pad or a monitor with a QR code) — and forgotten shifts can be closed automatically, see [Clock-in and clock-out](/en/docs/time-clock); - **Plan vs fact** — the summary highlights deviations: late arrivals, overtime, no-shows. Plan and deviation are counted **as of today**: shifts still ahead are not treated as unworked hours — their hours are shown on a separate grey line, “ahead: 16h 40m”. “Today” and “already over” follow the location’s time zone (from its profile), not your computer’s clock. The timesheet sign-off block uses the same rule: a shift without a clock-out lands in the “to resolve” list only once its planned time is over, and only then does it get the “Mark as absent” button — you can’t mark an absence for tomorrow’s shift. Shifts are grouped by role. Worked hours feed into [Finance](/en/docs/finance) (the Staff tab) — labor costs are visible next to revenue. --- ## What you need to get started - **Owner permissions** — employees are created by the account owner; the "Employees", "Roles and access", "Payroll" and "Labour cost" views are available to them only, while the schedule and HR views are also open to a manager. - **The employee's email** and a chosen role — with those the person signs into the admin panel as themselves. - **A shift schedule** — for plan vs. fact and for distributing tips into a pool. - **Pay rates** — for payroll and labour cost calculations. - **Login codes and device QR codes** — to put the POS, kitchen display or kiosk on a tablet ([QR codes and devices](/en/docs/device-codes)). --- ## Limitations - **The invitation email may not arrive — the access is not lost then.** If mail fails, the invitation dialog itself shows the sign-in address, login and temporary password: hand them over any way you like. The previous password no longer works at that point. - **Access levels are enforced in the interface.** Writing a section's data to storage is already refused by the server for an employee without the "edit" level, but individual API operations are so far limited by the interface only — the server-side check of levels is still being written. - **Restricting an employee to specific locations does not apply yet** — the field exists in the contract but access is not narrowed by it. - **Russian HR records are written only on the Russian contour** (a personal-data residency requirement); for Kazakhstan the HR module is unavailable anywhere — the system says so honestly and shows an article. - **The "My documents" block does not work for line staff** — a known access defect. - **A shift reminder arrives within a window, not to the minute** — the mailing runs on a shared half-hourly tick, so "2 hours before" in practice means 1.5–2 hours before. Employee self-service itself works: shift swaps, leave requests, clock-in from a phone and the "My details" block in the "Mine" section (phone and emergency contact change instantly; address, payout details and the identity document — type, number, issuing authority, issue date and "valid until" — go to the manager for approval). - **There is no export to 1C.** - **The target labour-cost percentage is stored in the browser** — on another device you will have to set it again. - **The "Roles and access", "Payroll" and "HR records" screens are complex** — our internal clarity review gives them 2 out of 5; they were written for an HR specialist, not for an owner. --- ## Troubleshooting **The employee did not receive an invitation.** Check the address in their card and the spam folder — the email is sent from the brand address. If it did not go out at all, the invitation dialog shows the login and the temporary password: give them in person. The previous password no longer works after an invitation. **The employee sees the wrong sections.** Check the role: the set of sections is defined by it, and the "workspace" only narrows the interface visually. On the POS the real permission layer is role plus PIN. **The employee cannot open "My documents".** A known access defect for line staff — hand the document over another way. **The HR section is blocked.** This is the personal-data residency gate: Russian HR records are kept only on the Russian brand. **Payroll was not calculated.** Pay rates are missing, or there are no closed shifts in the period. **There are no deductions in the pay window.** That is by design: deductions, tax residency and the person's other tax details are not pay terms but facts about the person, with a start date and a history of changes. They are set in the employee card, “HR file” tab → “Tax details” (for Russian employees the same tab also has the “Income tax: children and deductions” window). In the pay window (💰), under “Tax profile”, there is an “Open tax details” link — the card opens in a new tab and the unsaved pay rate stays where it is. The monthly calculation and the take-home pay picker read deductions from there: after changing them, pick the gross amount again. Tax details belong to the person's hire: if the hire has not been registered yet (this happens to the account owner too), the card opens at the “Tax details” block with a hint to register the hire on the card's “Employment history” tab first. **Payroll does not cover every employee.** A payroll calculation is a snapshot of the moment it was made: anyone added (or given a pay rate) later is not in it. The screen says so — above the table of an approved month there is a line "These employees are not in the approved calculation" with every name and reason. To include them in that month, go back to the draft (undo the payment record → correct the approved calculation) and press "Refresh the data and recalculate" — manual amounts survive a recalculation. You can also leave a paid month alone and pay these people in the next one. --- ## Related - [Clock-in and clock-out](/en/docs/time-clock) — venue terminal, QR from a monitor, auto clock-out - [POS](/en/docs/pos) — the waiter's work screen - [Kitchen (KDS)](/en/docs/kds) — the cook's work screen - [Own delivery](/en/docs/delivery) — the courier's work screen - [Floor plan](/en/docs/tables) — assigning waiters to tables - [Finance](/en/docs/finance) — staff reports --- ## FAQ ### How many employees can I add? Depends on your plan — see [pricing](/pricing). The system tells you when the limit is reached. ### Can a waiter see finance or settings? No. A waiter sees only orders and the POS. Role isolation applies to every section of the admin panel. ### How does a waiter get bound to an order? Automatically: an order created by a waiter at the POS is bound to them; orders from the waiter's tables ("Waiters" mode on the Floor Plan) too. The binding is visible in the order card. ### Can I track shifts without daily admin usage? Yes, the shift schedule works for any employee regardless of how often they use the admin panel. --- # Clock-in and clock-out Employees clock **in** and **out** themselves — and those marks immediately become the fact in the timesheet (the **Plan vs fact** tab of the Staff section) that payroll is computed from. The server always sets the time: it cannot be tampered with from a device. Open: **Admin panel → Staff → My cabinet** (employee) and **Staff → ⚙ Schedule and clock-in settings** (owner; managers see them read-only). --- ## What ends up in the timesheet A shift in the timesheet is a plan (if it was on the schedule) plus the fact: clock-in, clock-out and breaks. Every fact has a **source**: | Source | How the fact appeared | |--------|-----------------------| | The employee | “I’m in” / “I’m out” in the personal cabinet — from a phone or a shared computer | | Venue terminal | PIN on the tablet terminal or a QR code from the venue monitor (see below) | | POS | A colleague marked from the shared POS terminal by their PIN, or a manager did | | Device presence | Auto timesheet: a waiter logged in on a tablet is on shift (per-location option) | | Manual | The owner or a manager edited the time in plan vs fact | A manual edit always wins over automation: after it no automation touches the shift. If the employee arrives without a scheduled shift, the clock-in creates an **unscheduled** shift — visible in plan vs fact with its own marker. --- ## Clock-in from the employee’s phone In **My cabinet**, the “Today” block shows the status (“Not on shift” / “On shift since 09:02” / “Shift from 18 September is still open”) and buttons: - **I’m in** — opens the shift: if there is a scheduled shift today the fact attaches to it, otherwise an unscheduled shift is created; - **Break / Back** — actual breaks inside the shift; a break left open is closed with the clock-out time; - **I’m out** — closes the open shift (including a night shift started yesterday and one forgotten for days: for such a shift “Today” shows only this button and a hint about the correction request). Forgot to clock? The cabinet has **“Forgot to clock”** — a timesheet correction request confirmed by a manager. --- ## Where clock-in is allowed: geofence or venue terminal The **“Clock-in gate”** setting in “Schedule and clock-in settings” decides whether clock-ins are accepted from anywhere: | Mode | Behaviour | |------|-----------| | **Off** | Accepted from anywhere, no checks | | **Warn** (default) | The browser sends its position; a clock-in farther than 300 m from the venue goes through but is flagged “outside location” — managers see the flag in plan vs fact | | **Strict** | A clock-in beyond the configured radius is refused with a message like “you are 800 m away, 300 m allowed”. No position (browser permission denied) — refused too. Clocking a colleague in by PIN from the POS is refused as well: a PIN proves who is clocking in, not where; bind the POS as a terminal (below) or allow it geolocation | | **Only from a venue terminal** | Accepted **only with proof from a bound device** — a tablet, phone or monitor that physically stays at the venue. Position is not requested | The geofence compares the browser position with the coordinates of the **shift’s location** (set in the location card). If the location has no coordinates, there is nothing to check and the clock-in passes. **The gate does not have to be the same everywhere.** The **“Per-venue and per-role overrides”** block below sets the mode, the radius and auto clock-out separately for a given location and for a given role: 1. Press **“+ Add override”**, choose **“Venue”** or **“Role”**, then pick which one (venues come from your locations, roles from those your employees actually hold). 2. Fill in only what must differ. Anything left as **“as for the account”** keeps coming from the settings above — that is not “off”. 3. Save: the block saves itself, independently of the panel’s “Save” button. Which rule wins when several apply: **employee role → shift venue → account**, field by field. So “strict, 80 m at the downtown venue” together with “gate off for couriers” means a waiter of that venue clocks in within 80 m while a courier clocks in from anywhere — the role outranks the venue rule. > **When you need a terminal.** Browser geolocation is soft evidence: it can be spoofed, and in dense areas the error exceeds the radius. A terminal is as hard as its mode: the **tablet with a PIN pad** requires standing at the tablet; the **QR on a monitor** is single-use and lives for two minutes — a screenshot forwarded to a colleague works once and only until it expires, so “clock in the whole shift with one photo” is off the table, but a single collusion per scan is not ruled out. If you need strictness, use a tablet, not a monitor. --- ## Venue terminal: binding a tablet or monitor A terminal is any tablet, phone or computer with a browser that stays at the venue. One account can bind several terminals (one or two per location). 1. Open **Admin panel → Staff → ⚙ Schedule and clock-in settings** **on the device itself**. Sign in as the owner, a manager or with a [device code](/en/docs/device-codes). 2. In the **“Clock-in terminals”** block press **“Bind this device”**, name it (“Tablet at the entrance”) and optionally pick a location. 3. The device receives its secret and keeps it in the browser — it is never sent again or shown. The “This device is terminal …” note and the **“Open terminal screen”** button appear right away. 4. Switch the clock-in gate to **“Only from a venue terminal”** and save. 5. Open the terminal screen (`/clock-terminal`) and leave it on: the screen keeps itself awake, and the mode (tablet or monitor) is remembered in the address. A terminal with a location accepts clock-ins only for shifts **at that location**: a shift elsewhere is refused with “today’s shift is at another location”. An unscheduled shift started from a location’s terminal gets that location automatically. **Revoke** a terminal from the same list: a device with the old secret is refused at its next clock-in. If the browser’s site data is cleared, the secret is gone — just bind the device again. Under every terminal in the list you can see **when it was last used** (“5 min ago”, “3 h ago”) or “not used yet”. If a terminal has been silent for more than a day, its row is highlighted with a warning — check that the tablet is on, online and showing the terminal screen. --- ## Tablet mode: PIN pad The terminal screen shows four large buttons — **I’m in**, **I’m out**, **Break**, **Back from break**. The employee taps one and enters **their cashier PIN** (4–6 digits, issued in the employee card). No list to search and no login switching: the PIN is unique within the account, so the server knows who clocked in — the screen shows “Anna: clocked in at 09:02” for a few seconds. A wrong PIN gets a neutral “Wrong PIN” with a delay, and after ten failures within a quarter of an hour the terminal (or the employee entering a PIN from a phone) is locked for 15 minutes — guessing other people’s PINs is pointless. All errors are spelled out: “already clocked in”, “not on break”, “this month is closed”, “an open shift from 17 September is still running”. --- ## Monitor mode: QR on screen The terminal shows a large **QR code that changes every 30 seconds**. The employee scans it **with their own phone camera** — their personal cabinet opens with a green “Venue terminal confirmed” note and the usual “I’m in” / “I’m out” buttons. No position is requested: the code from the screen already proves the person is standing in front of the monitor. The code stays valid for about two minutes after it is shown; too late — the note changes to “The QR code has expired — scan it again”. One scan is good for one clock action. **Every QR is single-use.** The monitor fetches a fresh one from the server every 30 seconds, and after the first clock action the code is burnt on the server: a forwarded screenshot works once — for whoever opens it first — and only until it expires; the second person sees “terminal not confirmed — scan again”. If the monitor loses its network, it falls back to the old-style code (valid for the same two minutes, but not single-use) so the screen at the entrance never goes blank. This mode fits any screen without touch — a TV at the entrance, a monitor at the bar — and requires nothing from the employee beyond the phone they already use for the cabinet. Hours **do not** go to whoever photographed the screen: the code is single-use and lives two minutes, and the clock action comes from the employee’s personal login. --- ## Ways to register leaving with minimal effort Clock-out is forgotten more often than clock-in: people are tired and leave. Cenaly offers several ways to close a shift, and they combine — from the cheapest to the most precise: | Method | What it needs | Precision | When to enable | |--------|---------------|-----------|----------------| | **Auto clock-out by schedule** | Nothing: an account setting | Scheduled end of the shift | Always, as a safety net when a schedule is kept | | **Auto clock-out by cap** | Same setting | Clock-in + N hours | For unscheduled shifts, so they do not hang for weeks | | **“I’m out” from the phone** | Personal login | To the minute | Default for everyone | | **PIN on the terminal** | A tablet at the exit | To the minute | When leaving must be marked on site | | **QR from the monitor** | Any screen | To the minute | When there is no tablet but everyone has a phone | | **A colleague marks from POS** | POS terminal | To the minute | Cashier leaving together with closing the cash shift | | **Device presence** | Waiter tablets on the venue Wi-Fi, per-location option | Last tablet signal | Fully automatic timesheet for a hall with tablets | | **“Forgot to clock” correction** | Employee request, manager decision | As stated by the employee | Always available as the last resort | Deliberately **not** done: background phone geolocation (browsers do not offer it, and an app tracking employees after the shift is a privacy question) and biometrics (dedicated hardware and stricter personal-data rules). --- ## Auto clock-out of forgotten shifts The **“Auto clock-out for forgotten shifts”** block in “Schedule and clock-in settings”: - **Close open shifts automatically** — the switch, off by default; - **Wait after the scheduled end, minutes** — the grace period (default 30): if no clock-out arrives within it, the shift is closed **at the scheduled end**, not at the current time — the automation never invents hours beyond the schedule; - **Cap for unscheduled shifts, hours** — for shifts without a plan or started after the scheduled end: close N hours after clock-in (default 12; 0 — leave them alone, they stay in the plan-vs-fact list of open shifts). Auto clock-out is overridable too: in the “Per-venue and per-role overrides” block a venue or a role can get its own grace and cap (a courier — 8 hours instead of 12), or auto clock-out can be enabled at one venue only while staying off everywhere else. The check runs every 30 minutes. An auto-closed shift carries the **“⏱ auto-closed · awaiting confirmation”** badge in the timesheet (with a hint — by schedule or by cap), and the employee gets a work-chat notice: “No clock-out recorded — your shift was closed automatically at 18:00 per the schedule. Confirm the time in “My hours”; if you left at a different time, request a correction.” A manual edit removes the badge. Closed months and presence-based shifts are never touched. The inferred time is an assumption, not a clock action, so a person has to confirm it: - the **employee** sees two buttons on such a shift in **“My hours”**: **“Correct”** — the time is confirmed as is, and **“Set clock-out”** — a window opens with the inferred time where they enter the real one; a regular correction request goes to the manager and the hours change after approval; - the **manager**, when closing the period, sees the exception **“Auto-closed shift awaiting confirmation”** and reviews it with **“Confirm as is”** — the period cannot be closed while it is open; - in the **payroll draft** the employee’s line with such shifts carries a **⏱ n** badge — the amount is computed from the inferred hours as is, the badge only reminds that the hours are assumed. After confirmation the badge becomes **“⏱ auto-closed · confirmed”** (the hint says by whom). For the floor and delivery the shift is closed from the moment of auto clock-out — confirmation concerns only the timesheet and payroll. --- ## Sources of the fact and payroll Payroll is computed from timesheet hours, so every fact stores where it came from, and plan vs fact shows it with badges: “📡 auto” for presence, “⏱ auto-closed” for auto clock-out, the “outside location” flag for a distant clock-in. The terminal that confirmed a clock action is recorded in the shift too. Managers see all of it in **Plan vs fact**, employees in **My hours**, and both can start a correction until the month is closed. Every shift with a fact has a 🕘 **“Clock-in history”** icon in Plan vs fact: the full list of attempts for that shift — time, action (in / out / break), who pressed it (the employee, a manager by name or the automation), from where (phone, POS, terminal by name, auto clock-out) and the result — recorded, or denied with the reason (wrong PIN, “terminal only”, outside the location). Denials are kept too: a run of wrong PINs from one tablet is visible at once. A clock-in is not lost when the connection drops: if the phone did not get the server’s reply, the app repeats the same request by itself, and the server recognises the repeat and does not record a second clock-in — you see the same shift, not an “already clocked in” error. --- ## FAQ ### Can an employee without a login clock in? On the terminal — yes: the tablet accepts the PIN of any employee who has one; no login is needed. From a phone or by QR — no: there the clock action comes from the personal login. ### What if the terminal breaks or is taken away? Revoke it in the terminal list and temporarily switch the gate to “Strict” or “Warn” — employees clock in from their phones. Forgotten shifts are closed by auto clock-out. ### Can the terminal be required for one location only? Yes. In “Schedule and clock-in settings” open the **“Per-venue and per-role overrides”** block → **“+ Add override”** → **“Venue”** → pick the location and set its gate to **“Only from a venue terminal”**. The account-wide setting stays as it was (“Warn”, say), and locations without a terminal keep working as before. The same way you can lift the gate where it gets in the way: an override for the **“Courier”** role set to “Off” lets couriers clock in from anywhere even when the whole account is on “Strict”. The role outranks the venue, the venue outranks the account. ### The employee opened the QR link but did not press “I’m in” Nothing happened: the scan only proves presence, the button makes the clock action. After two minutes the code expires and must be scanned again. ### Will auto clock-out inflate hours? It never invents hours beyond the schedule: by schedule the shift closes at the scheduled end even if the check ran later, and by cap exactly the configured number of hours after clock-in. But it does not know when the person actually left: someone who left early is credited until the scheduled end, someone who stayed late only until it. That is why the inferred time is not a fact but awaits confirmation: the shift is marked “⏱ auto-closed · awaiting confirmation”, the employee is notified and, in “My hours”, either presses “Correct” or “Set clock-out” and enters the real time (a correction request goes to the manager, who approves it). Until the shift is confirmed, its line in the payroll draft is flagged and the period cannot be closed — the manager reviews such shifts with “Confirm as is”. If the manager then reopens the shift (removes a wrong clock-out), the automation leaves it alone. ### I forgot to clock out yesterday — today “I’m in” does not work An employee can have only one open shift. The cabinet, the terminal and the “Day” tab of the [hall panel](/en/docs/hall-panel) tell you which one is still running (“an open shift from 17 September”): press “I’m out” (“Clock out” in the employee's row at the till) — it closes at the current time — then clock in and request a correction for yesterday’s clock-out. Enable auto clock-out so it does not happen again. ### “The timesheet for this month is closed” — the cabinet has the buttons, but clocking fails A closed month accepts nothing: no clock-in or clock-out, no shift edit, no correction request — its hours are final and payroll is already computed from them (auto clock-out stays away from such a month too). Managers close the timesheet with **“Close the timesheet”** in plan vs fact, or with **“Close the period”** when confirming the timesheet. This works for the **current** month as well: close it mid-month and nobody can clock in until the month is over. Only the **account owner** can lift the lock (“Reopen the timesheet” in the same place) — the manager who closed the period cannot. That is why the employee's cabinet says “ask the owner to reopen it” instead of “reopen it yourself”. --- ## Related - [Staff & shifts](/en/docs/staff) — roles, schedule, plan vs fact, payroll - [QR codes and devices](/en/docs/device-codes) — login codes for tablets and monitors - [POS](/en/docs/pos) — marking colleagues from the POS terminal - [Cash shift](/en/docs/cash-shift) — opening and closing the cashier’s shift - [Finance](/en/docs/finance) — labour cost by hours worked --- # Inventory The **Inventory** section tracks stock of ingredients and goods. The core idea: you describe each dish's recipe once, and then **components are deducted automatically when an order is completed** — stock stays accurate without manual bookkeeping. Open: **Admin panel → Inventory**. Three tabs: **Stock**, **Documents**, **Suppliers**. --- ## Stock - A **product** = an ingredient or a stock item: name, unit, current quantity. - **Minimum stock** — when the quantity drops below this level the row is highlighted: time to reorder. - A product can be archived — it disappears from the list but stays in the document history. --- ## Recipes: auto-deduction on orders Each dish (in the Menu section) gets a **recipe** — which products and how much go into one serving. When an order is completed: - components of every order item are deducted according to their recipes; - for **combo sets**, the deduction unfolds the recipe of every dish inside the combo; - all movements are visible in the **Documents** tab. To link products to dishes quickly there are **AI suggestions**: the system analyzes your menu and proposes which dishes use a product — you just confirm. --- ## Semi-finished products (preps) For preps (sauces, dough, broths) a product gets its own **recipe**. The **"Produce"** button creates a production document: the prep is added to stock while its components are deducted. In dish recipes a prep is used like any other product. --- ## Goods receipt Two ways to register incoming goods: 1. **Manually** — the "Receipt" button: pick products, quantities, prices and the supplier. 2. **By invoice photo** — snap a photo of the delivery note: AI recognizes line items, quantities and prices and matches them to your products. You review and confirm. New products can be created right from the recognized invoice. If a product with the same name is already in your list, the line shows that it goes into that product and converts the quantity to its unit ("2 kg" → 2000 g). Packs such as "3 boxes × 12 l" are recognized and offered as a conversion to litres or millilitres — quantity and price change only when you press "Apply". Every receipt is stored as a document linked to a supplier — purchases flow into [Finance](/en/docs/finance) (food cost, gross profit). ### Purchase price control on receiving On receiving, every line is compared with the **median price of that product** over the last 30 and 90 days. If the price is noticeably higher, a **"+N % vs median"** badge lights up next to the line — the storekeeper sees the increase at the moment of receiving, not a month later in a report. A few details that matter: - the sample unit is the **invoice**, not the line: a supplier who splits a delivery into five lines does not shift the median five times harder; - **fewer than three deliveries is not a sample**, so no badge appears; - a discrepancy confirmed by the storekeeper lands in the **supplier's journal** — the counterparty gets a history of price shifts and a marker on the "Suppliers" tab; - the same median feeds the **"purchase price spike"** risk rule — the owner sees it in the "Cash risks" block, see [Loss control](/en/docs/loss-control). The storekeeper's and the owner's numbers match, because they are computed once, on the server. --- ## Suppliers The **Suppliers** tab is your counterparty database: legal name, tax ID, bank and account, address, contact persons, phone, email. A supplier is selected when registering a receipt, so each counterparty has a purchase history. An archived supplier disappears from the list but stays in documents. A supplier can have several contact persons — each with a role and their own channels. For every contact you pick **where the order should be sent** — the "Send via" field: e-mail, WhatsApp or Telegram. The list only offers channels that are actually filled in for that person, so an order can never be addressed to nowhere. The chosen channel comes first in the send dialog and is marked with a star; and it decides what the daily auto-order does: **e-mail is sent by the system itself**, while for a messenger it prepares a ready **draft** order — nobody but a human can write into a messenger first — and you send it in one click. --- ## Variance: where the difference went The **"Variance"** tab answers a question invisible in both sales and receipts: between two stocktakes more left the store than was sold. Consumption over the cycle is split into three parts: | Part | What it is | |---|---| | **Sales** | cost of goods sold, recorded at the moment of sale from recipes | | **Explained** | waste write-offs, production of semi-finished items, transfers between locations | | **Unexplained (variance)** | what the stocktake found: expected quantity minus counted quantity | The third line is the loss: an inaccurate recipe, portions served "by eye", unrecorded waste, or theft. It has to be read together with the first two — otherwise you cannot tell "we served more than the norm" from "we wrote it off as waste". An honest caveat: a manual stock adjustment inside the cycle stores an absolute value rather than a delta, so part of the "unexplained" is in fact explained by an operator's hand — such documents are counted separately and shown alongside. Losses exceeding theoretical consumption by more than a configured percentage raise the **"consumption above norm"** rule — see [Loss control](/en/docs/loss-control). --- ## Demand forecast and prep plan The **"Forecast"** tab turns sales history into a plan for tomorrow: how many dishes will sell on this weekday, what has to be prepped (with recipes exploded and a "be ready by" hour), what to order from suppliers, and what risks running out before the day ends. Details — [Demand forecast](/en/docs/demand-forecast). --- ## Products by weight and labels **Products by weight.** A product can be measured in kilograms/litres rather than pieces: stock, recipes and write-offs all use those units. If **scales** are connected to the till through the [hardware bridge](/en/docs/hardware-bridge), the weight is filled in automatically — both on receiving and when selling a dish priced by weight (canteen, deli). Price-by-weight is configured on the dish card, see [POS](/en/docs/pos). **Shelf labels.** Products get warehouse labels with a barcode, name, price and an **expiry date**: if the product has a shelf life in days, the expiry is computed as the print date plus that period. The price on a tag is the same one the POS charges — the catalog price (the location's own price if set). A different in-store price is set in the stock card with «Set own price…» and a reason: both the tag (marked «*») and the POS use it, the online store keeps the catalog price. This is not the same as order stickers — those are printed by the kitchen, see [Kitchen and front-of-house printing](/en/docs/kitchen-printing). > There is no batch tracking or FEFO yet: the system knows a product's shelf life and prints a label from it, but does not keep separate batches with different dates. --- ## What you need to get started - **The "Inventory" section** — it is on by default; at 30 or more SKUs the system will suggest setting it up itself. - **Ingredient and product cards** with units of measure and pack sizes. - **Recipe cards on dishes** — without them automatic write-off on sale will not work. - **Purchase prices** — otherwise cost of goods, food cost and [menu engineering](/en/docs/menu-engineering) cannot be calculated. - **Permissions**: running a stocktake is available to the owner and the manager. - **The bridge and a label printer** — for prep labels and price tags. --- ## Limitations - **Inventory analytics runs on the AWS contour.** On the Russian brand functions built on the analytics databases are unavailable — parity is tracked as an open task. - **Negative stock is allowed** deliberately: an incoming delivery "forgives" the shortfall rather than blocking a sale. - **There is no batch tracking or FEFO in stock quantities.** FEFO exists only in marking (which opened pack to finish) and does not affect quantities. - **There are no automatic unit conversions** — grams and kilograms are described by the card's pack size rather than converted on the fly. - **Recipe cards for variants and add-ons are not counted**: the base dish composition is what gets written off. - **There is no mobile stocktake with a phone scanner.** - **Auto-ordering works from the reorder point, not from the forecast**: the daily cron builds a purchase order for items below the reorder point (opt-in switch in "Procurement → Alerts"), sends it by e-mail itself and leaves a draft for messenger channels; ordering by forecasted demand does not exist yet. - **The email digest of what to order exists** (an opt-in switch with its own address); push notifications are sent on the AWS contour only. - **EGAIS and Chestny ZNAK are Russian specifics**: those views appear only for locations with the country set to Russia; live exchange with the state marking system over API is not connected (submission is semi-manual), and the regulator's EGAIS test contour has not been passed. VetIS (Mercury) works on mocks — the API access key has not been obtained. --- ## Troubleshooting **Stock was not written off after a sale.** The dish has no recipe card, or a variant/add-on was sold — their composition is not included in the write-off. **Stock went negative.** By design: the system does not block a sale, and the shortfall is closed by the next delivery. **Cost of goods is empty.** Purchase prices for ingredients are not filled in — without them neither food cost nor the menu-engineering matrix can be built. **I do not see the marking or alcohol views.** They appear only for a Russian location. **A stocktake cannot be run.** Running one is available to the owner and the manager; other roles get read-only access. **No purchasing email arrives.** There is no email digest here — shortage and expiry alerts go to the team chat and push. --- ## Related - [Demand forecast](/en/docs/demand-forecast) — prep plan, purchase draft and run-out risk - [Loss control](/en/docs/loss-control) — the "consumption above norm" and "purchase price spike" rules - [Menu engineering](/en/docs/menu-engineering) — what to do with a dish once its cost is known - [Finance](/en/docs/finance) — purchases, food cost and gross profit - [Orders](/en/docs/orders) — completing an order triggers deduction - [QR menu](/en/docs/qr-menu) — dishes and combo sets the recipes are attached to - [Shop](/en/docs/shop) — the stock level is visible to the buyer on the storefront: "only a few left" or the exact number --- ## FAQ ### Do all dishes need recipes? No. Start with your bestsellers and add the rest gradually. Dishes without recipes simply don't deduct stock. ### What happens when an order is cancelled? Deduction is tied to order completion: cancelled orders don't touch stock. ### Which languages do invoice photos work with? The AI handles typical delivery notes in the region's main languages (Georgian, Russian, English and others). You always review the result before confirming. ### Can I run inventory across several locations? Yes, stock and documents are kept per location — pick the location at the top of the page. --- # Demand forecast Every morning a chef answers the same question: **how much of what to prep**. The buyer answers the neighbouring one: **how much of what to order**. Usually both answer from memory. Open **Admin Panel → Inventory → "Forecast" tab** (`admin.cenaly.com/inventory`). The tab takes your sales history and turns it into three concrete artefacts: a prep plan, a supplier order draft, and a list of what risks running out before the day ends. If nothing is at risk, that block is not shown at all. > **Available on AWS brands** (`cenaly.com`, `cenaly.com` and others), **not on `cenaly.ru`.** The platform's analytical database that computes the sales history for the forecast is not deployed in the Russian contour. The "Forecast" tab does open there, but it always says there isn't enough order history yet — no matter how many sales have actually piled up. --- ## How the forecast is calculated Exactly two statistics, both explainable to a chef out loud: 1. **How much of this dish usually sells on this weekday.** The history window is **8 weeks**. The point estimate is the **median**, not the mean: eight Tuesdays, one of which was a 40-person birthday, tell you through the mean to "prep for 40" every week — the median ignores that Tuesday. Next to the number you get the honest **observed range** (min–max) and the number of observations. 2. **How that demand is spread across the day** — shares by daypart: morning (6–11), lunch (11–16), evening (16–23), night (23–6). The boundaries are the same for every venue. > **No machine learning — and that is a decision, not an omission.** A venue with one to ten locations has a history measured in dozens of weeks, not years, and outliers punch straight through it: rain, a concert next door, one generous table. Models fitted to such data fit the noise and produce confident numbers you cannot trust. **Fewer than three observations of a weekday means no number.** The tab shows "too few" instead. A forecast you cannot trust is worse than no forecast: people prep and buy against it. The selector at the top chooses the day to forecast — **today** or **tomorrow**. --- ## The prep plan The dish forecast is exploded through **recipes** into a need for products and semi-finished items. The explosion uses the **current** recipes, at the moment you open the tab — if the chef changed a recipe this morning, the plan reflects it. Nested semi-finished products are exploded fully: if a sauce is made from stock and the stock is itself a semi-finished item, **both** appear in the plan — otherwise a cook would be told to make the sauce without being told there is no stock for it. The plan table: | Column | What it means | |---|---| | Product | the semi-finished item to produce | | Current qty | how much you already have | | Needed | gross demand for the day from the forecast | | To produce | the shortfall — what actually has to be cooked/prepped | | By | the hour stock stops covering demand | **The deadline is not "start of shift".** If the sauce covers the morning but not lunch, the cook has to be ready by 11:00, not by 6:00. Rows are sorted by deadline: the earliest first. Semi-finished stock is spent **once**: if the same stock goes into both a sauce and a soup, a naive calculation would subtract it twice and the purchase order would come up short. The **"Send to shift board"** button turns the plan into a checklist of tasks — see [Shift tasks board](/en/docs/tasks). Dishes **without a recipe** do not enter the plan and are listed in a separate warning: the forecast can say nothing about them, and saying so out loud beats pretending the order is complete. --- ## The supplier order draft The second block of the tab is the **purchase draft** for a chosen coverage horizon ("Cover, days": usually lead time plus a buffer). For each product two values are computed and the **larger** one wins: - **forecast need** over the horizon minus current stock; - **top-up to the reorder point** (par level / minimum quantity) — ordinary stock logic. Why the larger and not one instead of the other: the reorder point is a safety buffer "so we don't run dry", and it knows nothing about tomorrow's double-booked Friday; while the forecast knows nothing about products that never appear in recipes (packaging, consumables) — for those the reorder point is the only reference. The row shows which of the two rules fired. Quantities are rounded up to the pack size where one is set on the product. Checked rows turn into supplier orders with one button — from there they are ordinary purchases in [Inventory](/en/docs/inventory). --- ## "Runs out around 19:00" The third block is the **run-out risk before the day ends**. It compares current stock with the expected consumption over the remaining hours, computed from the daypart profile, and names the hour when stock hits zero. There is a correction for **today's pace**: if you have already used more than usual by lunch, the expectation for the rest of the day rises proportionally. The factor is clamped to ×0.5…×2 — a correction for "busy today" is useful, a prediction from a single receipt is not. If there is nothing to measure the pace from, the tab says plainly that the usual weekday profile was used. --- ## What the forecast needs | Needed | Why | Without it | |---|---|---| | A brand on the AWS contour (`cenaly.com`, `cenaly.com`…) | the sales history is computed by the server-side analytical database, and it only runs there | on `cenaly.ru` the tab always says there isn't enough order history — a message about history, but the real reason is different: there is nothing to compute it with | | Sales history | to take the weekday median | the tab says there isn't enough history yet | | ≥ 3 of the same weekday in history | to have a sample at all | the dish shows "too few" | | Dish recipes | to explode the forecast into products | the dish lands in the "no recipe" list | | Up-to-date stock | to compute shortfall and risk | the plan proposes prepping everything from scratch | The history aggregate is recalculated regularly on the server; recipe explosion and stock subtraction are computed when you open the tab, against current data. --- ## Related sections - [Inventory](/en/docs/inventory) — recipes, stock, receiving and purchasing - [Shift tasks board](/en/docs/tasks) — where the prep plan goes - [Menu engineering](/en/docs/menu-engineering) — what to do with a dish once you see both demand and margin - [Analytics](/en/docs/analytics) — sales by dish and period --- ## FAQ ### Why does the forecast say "too few" for half of the dishes? Because those dishes have fewer than three sales on this weekday in the history — for example, the dish went on the menu two weeks ago. The number appears by itself once there are enough observations. ### Why the median and not the mean? The median is robust to outliers. One 40-person banquet shifts the mean enough to make the venue over-prep for weeks. The mean is in the data too — it shows how skewed the history is. ### Does the forecast account for weather, holidays, football? No. It knows only the weekday and the time of day. A holiday week or a match next door is still the manager's job — and that is more honest than a model pretending it accounted for them. ### Can I forecast a week ahead? The tab shows today and tomorrow. For purchasing the horizon is set separately — the "Cover, days" field: the one-day forecast is multiplied by it. ### Does the purchase draft send the order to the supplier straight away? No. It is a draft: you check rows, adjust quantities, and only then create the orders — ordinary purchases in the Inventory section. --- # Finance The **Finance** section is a set of management dashboards built from your orders, inventory purchases and staff shifts. No manual exports or spreadsheets: the data is collected automatically as the venue operates. Open: **Admin panel → Finance**. Periods: **7 / 30 / 90 days** or **12 months**; view all locations together or each one separately. > **Supported on both the international and Russian services.** Sales, purchases and cash-shift figures come from an analytical database. If loading fails, do not treat missing figures as zero: check the selected location and period, then the reported error. Some new interface changes may reach your account after the server update. --- ## Tabs | Tab | What it shows | |-----|---------------| | **Overview** | Key KPIs: revenue, order count, average check, cancellations, delivery fees, purchases, gross profit | | **Sales** | Revenue by day/month, sales channels, payment methods, **gross → net by channel** (with platform commissions), per-location breakdown | | **Purchases** | Inventory purchase documents, spending dynamics, food cost | | **Expenses & P&L** | Venue expense tracking and the profit-and-loss report | | **Cash shifts** | Closed shift history, cash sales, cash reconciliation (discrepancies) | | **Delivery channels** | Integration "health": online / paused / offline, downtime hours, estimated lost revenue, cancellations | | **Order sources** | Attribution: where the order came from — UTM tags, search, social, referrals | | **Staff** | Worked hours from employee shifts | All key metrics are compared **to the previous period** — growth and decline are visible at a glance. The one exception is the **"12 months"** period: it has no comparison, being a calendar slice without a preceding stretch. --- ## Sales channels and payments Revenue is broken down by channel: - **Dining area** — table orders (QR menu and POS); - **Delivery** — your own delivery; - **Pickup**; - **Glovo** and **Wolt** — aggregator orders (via [integrations](/en/docs/integrations)); - **Other**. A separate breakdown covers payment methods: cash, card on delivery, online. ### Channel commissions and net margin 100 GEL from the dining room and 100 GEL from an aggregator are different money: the platform takes a percentage and often a per-order fixed fee too. Until commissions are set, "revenue by channel" compares incomparable things. Set them in **Extensions → the "By location" tab → the "Channel commissions" card**: a **percentage** and a **fixed per-order fee** for each channel. Rates are set **per location + channel pair**: different venues have different contracts. After that the "Sales" tab gains a **"Gross → net by channel"** table: | Column | What it is | |---|---| | Gross | the channel's order total before the cut | | Commission | percentage of revenue + the allocated share of the fixed fee | | Net | the expected payout after commission | The same arithmetic is applied to individual dishes in [Menu engineering](/en/docs/menu-engineering): a dish with an average in-house margin can go negative in an aggregator taking 30 %. > This is the **expected** payout computed from your own rates. Reconciliation against the platforms' real settlement reports is not done yet. Commissions are stored separately from the integration's own settings, so they can also be set for channels with no integration at all (your own site, dine-in, pickup), and orders from a channel disconnected yesterday keep counting with the commission that applied. --- ## Delivery channel health The **"Delivery channels"** tab answers the opposite question: how much you did **not** earn, and why. - the **current status** of the location on each platform: online / paused (your own pause) / offline (the platform deactivated the venue); - **hours of pause and offline** over the period; - an **estimate of lost revenue** — downtime hours × the channel's average hourly revenue for that hour of the week; - **cancellations** broken down by reason. The status is polled by a background job roughly every 10 minutes; an involuntary offline sends the owner a push. --- ## Purchases, food cost and gross profit If you use [Inventory](/en/docs/inventory), receipt documents automatically form the cost side: - **Purchases** — total receipts for the period; - **Food cost** — purchases as a share of revenue; - **Gross profit** — revenue minus purchases. So the dashboard shows not just turnover but the venue's real economics. --- ## Gift cards and guest debts Two amounts that must not be confused with revenue get their own place in the finance section — both summaries sit on the **"Cash shifts"** tab and load the first time you open it: - **Gift-card liabilities** — an “issued / redeemed / outstanding” summary. A certificate sold is not money earned but a promise to deliver goods: revenue is recognised when the guest pays with the card, not when they buy it. The outstanding balance is what the venue still owes its guests. - **Guest debts** — the totals of orders closed at the till with the “On account” tender, and their repayments. Open debts and each guest's balance are also visible in [Customers](/en/docs/customers) and on the [“Under control”](/en/docs/attention) tab of the work chat. Selling a card and closing an order on account are fiscalised by each country's rules (in Russia, “prepayment” and “transfer on credit”), so they appear in X and Z reports as payment-method lines — see [Cash shifts](/en/docs/cash-shift). --- ## Staff The Staff tab sums **worked hours** from [employee shifts](/en/docs/staff) — plan and fact per employee and role for the selected period. --- ## What you need to get started - **Accumulated sales** — the dashboards are computed from your orders and receipts, and on empty history they are empty. - **Recipe cards with purchase prices** — for cost of goods, food cost and gross margin ([Inventory](/en/docs/inventory)). - **Shifts and payroll settings** — for the "Staff" view ([Staff](/en/docs/staff)). - **Channel commissions** — so that "net by channel" is not computed against zero. - **Expenses** are entered manually (rent, utilities, subscriptions) — they do not appear on their own. --- ## Limitations - **Data loading matters.** Cash shifts and delivery-channel history require the analytical database; the browser fallback cannot reconstruct them. On the Russian service, direct order-history listing is also unavailable. Report a database error instead of interpreting it as an empty sales period. - **Aggregator commissions are estimates**: the rates come from your channel settings, not from the marketplace's actual deductions. - **Labour cost is computed from the payroll databases but is not posted as an expense line** in the finance database. - **There is no single metric glossary.** The same revenue in Statistics, Finance and at the POS may be computed differently — when comparing numbers, check the period and exactly what falls into the slice. - **There is no reconciliation of acquiring or aggregator payouts against a bank statement.** - **There is no custom report builder** — deliberately: for now we cover this with standard dashboards and export. --- ## Troubleshooting **The section is empty or unavailable.** On the Russian brand you will see the notice "Order history cannot be read in this cloud yet" — that is expected, and it has no Retry button. On other brands the notice "Could not load the figures" with a Retry button means a read failure — retry; if there are simply no figures, check the period: 7 days is the default. **The numbers do not match the POS.** Look for the difference in the period and in what the slice contains: refunds, tips, channel commissions and unclosed orders land in different reports differently. There is no single "truth about the number" yet, and we say so plainly. **Food cost is not calculated.** There are no recipe cards or no purchase prices. **"Net by channel" looks too high.** Commissions are taken from your channel settings — check the rates against the marketplace contract. **There are no expenses in the P&L.** Recurring expenses are entered manually — add them in the expenses view. --- ## Related - [Orders](/en/docs/orders) — the sales data source - [Inventory](/en/docs/inventory) — the purchases data source - [Staff & shifts](/en/docs/staff) — the labor data source - [Analytics](/en/docs/analytics) — guest behavior in the menu (views, popular dishes) - [Menu engineering](/en/docs/menu-engineering) — dish margin adjusted for channel commission - [Loss control](/en/docs/loss-control) — cash discrepancies and stock losses as alert rules --- ## FAQ ### How is Finance different from Analytics? [Analytics](/en/docs/analytics) is about guest behavior in the menu (views, dish popularity). Finance is about money: revenue, average check, purchases, profit. ### How often does the data refresh? Automatically, several times an hour. The "Refresh" button pulls fresh data immediately. ### Can employees see finance? No, the section is available to the account owner. Waiter, cook and courier roles don't see finance. ### Are cancelled orders counted? Cancellations are shown as a separate metric and are excluded from revenue. --- # Corporate Accounts — Employees Paying from an Organization's Balance The **"Corporate Accounts"** section manages ledger accounts for organizations whose employees eat at your venue on a regular basis — an office cafeteria, corporate catering, an arrangement with a nearby company. An employee pays with their own account code instead of cash or a card, and the charge is automatically billed to their employer's account. Open **Admin Panel → Corporate Accounts** (`admin.cenaly.com/corporate-accounts`). The section works separately per location. --- ## Organizations and employee accounts The model has two levels: - **Organization** (employer) — company name, contact person, phone, email, notes, settlement currency and, optionally, a default daily allowance applied to all its employees. - **Employee account** — tied to an organization: employee name, phone, a unique account code, current balance and, if needed, a personal daily allowance that overrides the organization's default. An organization's details can be changed at any time: the **✎** button next to its name opens the same form used to add it. Employee accounts and their balances stay as they are, and a new organization daily allowance applies right away to employees who don't have their own. An account code can be set manually or generated automatically (in the form `CA-XXXX-XXXX`) — after creation it's shown once with a copy button; afterward the interface only shows it masked (last 4 characters). --- ## Topping up balances Balances are topped up manually — by the venue's owner or accountant: - **Single top-up** — an amount for one account; - **Bulk top-up** — a list pasted into a text field, one row per employee: name, code (optional), amount, phone (optional). Existing employees are matched by name; new ones get an account created; each row's result is shown. --- ## Daily spending limit Only a **daily** limit exists, and conceptually it is the employer's **daily allowance**: how much the company is willing to cover per employee per day. The organization has a default value, and an individual employee can have their own that overrides it. The allowance resets every day. The amount available to charge is the **lesser of two**: the remaining balance and the remaining allowance for today. If no allowance is set at all, only the balance limits the charge. A refund **frees the allowance back up**: the day's spend is reduced by the refunded amount. --- ## Paying at the register [POS](/en/docs/pos) has a dedicated **"Pay with corporate account"** button: 1. the cashier enters the employee's account code; 2. the system shows the balance and remaining daily allowance, and charges the order (or part of it — the remainder can be covered with another payment method, combined payment is supported); 3. if the paid order is later cancelled, the charge on the corporate account is **reversed automatically** — the money returns to the account and the daily allowance is freed. The reversal is idempotent: reprocessing a cancellation will not refund twice. --- ## Guest self-checkout A location-level **"Guest self-checkout"** toggle lets an employee pay for their own order directly on the customer-facing menu: a "Corporate account" payment method appears at checkout, where they enter their **phone number and account code** — no cashier needed. The checks are the same as at the till: balance, remaining daily allowance, idempotent charging. --- ## Spend report A report for any date range shows, per employee, the amount spent and the number of transactions — exportable to CSV for bookkeeping or for billing the organization at the end of a period. --- ## What you need to get started - **The "Corporate accounts" section switched on** — it is off by default and is enabled with a toggle in the [App Store](/en/docs/app-store). - **The employer organization** and personal accounts for its employees. - **A topped-up balance** — top-ups are entered manually by the owner or the bookkeeper. - **A daily allowance limit** — how much an employee may spend per day at the employer's expense. - **The POS** — payment by corporate account is accepted as a separate payment method ([POS](/en/docs/pos)). --- ## Limitations - **Top-ups are manual only.** There is no separate employer payment portal in the first iteration — you top the account up once the organization has paid. - **An order paid with a corporate account cannot be merged with other bills** — the POS will honestly refuse. - **The allowance is limited by day.** Weekly and monthly limits are not a separate axis. - **The spend report lives inside the section** — you are the one who hands it to the employer. --- ## Troubleshooting **The section is not in the panel.** It is off by default — switch it on with the toggle. **An employee is not found at the POS.** Check whether their account exists in the right organization and whether it is blocked. **Payment was declined.** Most likely the daily allowance limit is exhausted or the organization's account has no funds. **It will not merge with another bill.** That is a deliberate restriction: an order with corporate payment applied is not merged with other guests' bills. **The employer cannot see the spending.** The spend report is produced in the section and passed to the organization by you — the employer has no portal of their own yet. --- ## Related sections - [POS](/en/docs/pos) — paying for an order from a corporate account - [Finance](/en/docs/finance) — the venue's overall financial picture - [Returning Guests](/en/docs/customers) — recognizing guests by phone number --- ## FAQ ### Can I set a monthly limit instead of a daily one? Currently only a daily limit is available — as an organization-wide default and, if needed, per individual employee. ### Who tops up the balance — the organization itself or the venue? The venue's owner or accountant tops it up manually (a single top-up or a bulk list) — there isn't yet a separate portal for the organization to top up its own balance. ### What if an employee forgets their account code? The code is shown masked in the venue's interface — the full code can be looked up by the owner/accountant who created the account. ### Can only part of an order be paid with a corporate account? Yes, combined payment is supported at the register — part of the amount is charged to the corporate account (within the remaining daily allowance), and the rest is paid with any other method. --- # Shift Tasks Board The **Shift Tasks Board** is a shared list of unfinished items and reminders for staff that helps hand information off between shifts: whatever one shift didn't get to is immediately visible to the next one. Open **Admin Panel → Tasks** (`admin.cenaly.com/tasks`), or use the "Shift Tasks" item right inside the POS menu. The board is shared per location — one board for every staff member at that venue. --- ## List view The main view is a Todoist-style list: - **Quick-add** — an input field at the top; a task is created with a single click. - Tasks are grouped by status: **"Open"**, **"In Progress"**, **"Done"**. - Each task has a title, tags, priority, and an optional due date. - Marking a task done records who closed it and when. --- ## Kanban view The second view is a kanban board with three columns (**Open / In Progress / Done**). Tasks move between columns by drag-and-drop — and on touch screens the same action also has dedicated buttons, so it doesn't rely on touch precision. The board header has a **"Page view"** gear with three ready presets — **Simple** (My day, compact rows, meta hidden, done items hidden), **Standard** (list with all the meta) and **Detailed** (kanban with all the meta) — plus row density, per-field meta toggles and "hide done". The chosen view is stored **in your profile**, so the board looks the same on every device you sign in from. --- ## Tags, priority and due date Each task can have: - **Tags** — your own labels with a custom name and color (e.g., "Kitchen", "Hall", "Purchasing") for grouping and filtering. - **Priority** — normal or high, so urgent tasks don't get lost in the general list. - **Due date** (optional) — a date by which the task should be closed. The tag manager lets you create and rename tags right from the board. --- ## Access from POS The tasks board is built into the POS workflow: - The [POS](/en/docs/pos) menu has a dedicated **"Shift Tasks"** item with a counter of open tasks — staff instantly see how many unfinished items the location has. - The **shift-close modal** (see [Cash Shift](/en/docs/cash-shift)) lets you quickly add a task for the next shift without switching sections. --- ## The shift coordinator: checklists, DoD and blockers On top of the plain board runs a **coordinator** — a set of rules that takes routine hand-outs off the manager. There is no text generation involved: everything is deterministic and predictable. ### Checklist templates A checklist ("Opening the shift", "Closing the bar", "Waiter onboarding") is defined by a **template**: a root task plus its items. Recurrence lives on the template, not on the task — every run creates a fresh set of tasks, so history and already-completed work never get tangled. The assignee on a template is a **role, not a person**. At the moment the checklist is materialised the system picks who gets it: active employees of that role → whoever currently has an open cash shift → the least loaded one. Nobody suitable — the task simply stays unassigned. Checklists are materialised automatically on events: | Event | What happens | |---|---| | **Cash shift opened** | the opening checklist appears by itself, and the till shows a notification. Re-opening a shift does not duplicate it | | **Employee hired** | an onboarding checklist is materialised — filtered by position, so a waiter's onboarding doesn't land on a cook | | **Employee dismissed** | an offboarding checklist: revoke the PIN, close the mailbox, collect the keys | There is a built-in catalogue of **standard checklists** (waiter, cook and cashier onboarding, a generic offboarding) — a button copies a blank into your own list, and from there it is an ordinary template: editable and switchable. The "Checklists" dialog is available to owners and managers. ### Definition of Done A task can require that before closing someone **attaches a photo**, **leaves a note**, or **closes all subtasks**. The check runs on the server, so dragging the card into "Done" cannot bypass it — the system returns a clear error instead. Closing the task and attaching the photo in one save still works. ### Dependencies and blockers - **"Cannot start before"** — a task can wait on other tasks; the card shows how many it is waiting for; - **Blocked** — a separate marker with a reason: waiting for another task, a person, or an external event. It is a reason, not a fourth kanban column; - closing a blocking task **automatically** unblocks everything that was waiting on it. ### Time estimate A task has an **estimate in minutes** — a human one, not a computed one: the system neither invents it nor "refines" it after the fact. The estimate shows as a badge on the card and adds up into a sense of how much labour a shift costs. Every action on tasks (creation, status and assignee changes, due date, estimate, blocks, moves, checklist materialisation) is written to an event log — the foundation for future metrics. ### At the till When a shift opens, the till shows a notification about the created checklist; when it closes, a **"Not closed from the checklist"** block appears with a "Leave for tomorrow" button. --- ## Related sections - [Cash Shift](/en/docs/cash-shift) — opening/closing a shift, where you can also leave a task for the next shift - [Hall panel](/en/docs/hall-panel) — a compact tasks board right inside the till - [Demand forecast](/en/docs/demand-forecast) — the prep plan, sent to the board with one button - [Staff & Shifts](/en/docs/staff) — staff roles and shift schedule - [POS](/en/docs/pos) — the cashier's workspace, from which the tasks board is accessible --- ## FAQ ### Is the tasks board the same as shift open/close notes? No, opening/closing notes are a short entry inside a single cash shift. The tasks board is a full list with statuses, tags, priority and due dates, shared across the whole location rather than tied to one shift. ### Can I use the board without POS? Yes, the "Tasks" section in the admin panel works independently and is available to any staff member with access to the location, even if POS isn't used. ### Who sees the tasks — the whole chain or just one location? The board is separate per location — tasks aren't shared between different venues in a chain. ### Can tasks be deleted? Yes, any task can be deleted from the board, in both the list and kanban views. --- # Documents: Templates and AI-Assisted Filling The **"Documents"** section is a builder for HR, contractual and warehouse paperwork: orders, employment contracts, supply agreements, powers of attorney and other documents a venue routinely needs. Open **Admin Panel → Documents** (`admin.cenaly.com/documents`). The section has two tabs: **"Templates"** and **"Documents"**. Documents are kept per location, chosen in the list in the section header. If the location you need doesn't exist yet, the last item of the same list — **"+ Add a location…"** — opens the new-location form right here, without sending you to "Locations": the same fields (name, address, phone, email, currency, country), and once it is saved the section switches to the new location. The item is shown to those who can edit documents. If your plan has already used up its location limit, the form says so and offers to switch plans. When a text document or a text file (.md, .txt, .csv and the like) is open, the line above its name shows where it is: the location and the folder path, for example "Files / Contracts / 2026". Every folder in the path is a link: click it to open that folder's list, while "Files" takes you to the very top. Unsaved edits are saved before you leave, and the browser's Back button returns you to the file. --- ## Templates: your own and from the catalog The **"Templates"** tab has: - **Your own templates** — created from scratch, with arbitrary placeholder fields (`{{field_name}}`) inside the text. - **Global catalog** — a set of ready-made standard templates (HR orders, employment contract, supply agreement, service agreement, power of attorney for receiving goods, etc.), grouped by category — HR, suppliers, customers. A catalog template can be added in two modes: | Mode | What happens | |---|---| | **Linked** | The template stays synced with the catalog (updates arrive automatically), but its text can't be edited directly | | **Copy** | The template is copied to your account and becomes fully editable, but stops receiving catalog updates | Choose "Copy" if you plan to adjust the wording for your own needs, and "Linked" if you'd rather always have the up-to-date standard version. The whole catalog is also open **on the website, no sign-up needed** — the [Document templates](/en/templates) section: read any template in advance, toggle its optional clauses (probation period, bonus, payment method) and see which fields the system fills in by itself from the company, employee and counterparty cards. Handy for picking the right paper before creating an account, or for sending a link to a colleague. --- ### Questionnaire: clauses not everyone needs The same contract usually differs in small things: one hire needs a probation period, one client pays cash and another by bank transfer. Instead of three nearly identical templates, set up a **questionnaire** — the "Questionnaire (optional sections)" section of the template editor. A question comes in two kinds: - **toggle** — yes/no ("Is there a probation period?"); - **choice** — several answers; each has its own text in any language and a short Latin **code** (`cash`, `bank`) that addresses the answer in the template body. The optional clause itself is marked in the body with tags. You don't have to type them: select the paragraph, press **"⑂ Optional section"** in the toolbar above the body and pick what turns it on. A choice question lists **every answer**, and each button shows the ready-made tag: | Picked in the menu | What appears in the body | When the clause goes into the document | |---|---|---| | a toggle question | `{{#if probation}} … {{/if}}` | the toggle is on | | **"Any answer"** | `{{#if payment}} … {{/if}}` | the question got any answer at all | | a particular answer | `{{#if payment=cash}} … {{/if}}` | that exact answer is chosen | | **"plus an 'otherwise' branch"** | `{{#if payment=cash}} … {{#else}} … {{/if}}` | before `{{#else}}` — on that answer, after it — on the rest | Here `payment` is the question key and `cash` is the answer code; both are shown in the questionnaire table. You can type the same tags by hand — the form is exactly that. Below the body the editor hints if a tag points at a question or answer that doesn't exist, a block is left open, or a question is never used; none of this blocks saving. The template preview gets live switches, so you see the paper with the clause and without it. When a document is created from such a template, the questionnaire becomes a step of the "New document" wizard: answers are ticked or described in words for the AI to fill in. Fields that are left only inside switched-off sections are hidden in the form and not required to finalize. ## Creating a working document A **working document** (a specific order for a specific employee, a specific contract with a specific supplier, etc.) is created from a template — on the **"Documents"** tab. Each working document has its own set of field values, independent of other documents created from the same template. Fields can be filled manually right in the form — or with AI assistance, as described below. --- ## AI-assisted field filling A working document has two ways to quickly fill fields with AI: 1. **Chat** — describe the situation in plain language (e.g., "create a hiring order for waiter Ivanova starting August 1st, salary 45000") — the AI recognizes the relevant values and fills them into the template fields. 2. **Photo** — take a photo of an already filled-out paper form, or of a passport/ID from which data needs to be transferred — the AI reads the text in the photo and fills the matching fields. The AI **does not invent** values that aren't present in your description or the photo — unfilled fields stay empty and are highlighted in the preview, while fields filled by AI are marked separately so you can review them before printing. --- ## Preview, print and PDF Next to the form is a live **A4 preview** of the document: values are substituted into the template text as fields are filled, and unfilled `{{placeholders}}` are highlighted so you don't miss them. The finished document can be: - **printed** directly from the browser; - **exported to PDF** — for emailing or archival storage. --- ## Related sections - [Staff & Shifts](/en/docs/staff) — HR data useful when filling out orders and contracts - [Inventory](/en/docs/inventory) — suppliers you'll draft supply agreements with - [App Store](/en/docs/app-store) — account modules and extensions --- ## FAQ ### What's the difference between a "linked" template and a "copy"? A linked template can't be edited directly, but automatically receives catalog updates. A copy is fully yours and editable, but catalog updates don't propagate to it. ### Can the AI make up data that isn't in the photo? No — filling is designed to never substitute values absent from your description or the photo. Such fields stay empty for manual filling. ### Can I create several documents from one template? Yes, you can create as many independent working documents from one template as you like — for example, a hiring order for each new employee. ### How do I get a document on paper? Open the working document and use the print button — your browser's standard print dialog opens with the A4 version of the document. --- # Hotel: Rooms, PMS and Guest Service Cenaly combines its own PMS with guest services: room inventory, reservations, rates, check-in, guest folios, housekeeping and food service. The Hotel business type sets the terminology and initial sections; integrations and new modules have separate availability conditions. Open: **Admin Panel → Rooms** (the same section restaurants see as "Floor Plan" — `admin.cenaly.com/tables`, renamed for hotels). --- ## Floors and rooms The floor-plan editor works the same way as for restaurants ([Floor Plan](/en/docs/tables)), except halls are called floors, and instead of tables you place **"Room"** and **"Bed"** elements (beds are for hostels and shared dorms). Each room has a label (numbering starts at 101) and, just like a table, can be bound to a QR code by camera scan. Once a bed is placed inside a room it only moves within that room: the room's walls hold it just like the hall walls do, and the editor will not let you lay a bed across a wall or half-way into the corridor — it turns red and snaps back. Beds in a shared dorm with no rooms drawn are not affected. You don't have to add rooms one by one — the **"+ Add rooms"** button opens a bulk-creation form: a range (say, 201–230), an optional prefix, a live preview ("N rooms across M floors will be created"), and a line listing numbers that already exist and will be skipped. The same step is available right inside the onboarding wizard when you pick the "hotel" vertical. QR codes are bound per room with the **"Create QR & bind"** button on the room card (or in bulk — one button for the whole floor), which also lets you download the SVG for printing. --- ## Room types and rates The **"Room types"** button opens a catalog: name (Standard/Deluxe/…), rate per night, capacity, description. A type is assigned to a room or bed in the properties panel on the floor plan — its rate is then pre-filled automatically in the check-in form (front desk can still override it for a specific stay). Rates support **seasonality**: you can set date ranges with a different price for a specific room type or for all rooms at once. At check-in the system applies the most specific rule (a season on that type → a season on "all rooms" → the rate snapshotted at check-in → the type's base rate), while a rate entered by hand at the desk always wins. Location settings let you enable a **tourist tax** — a percentage of the rate with a minimum per-night amount, or a flat per-night fee; the tax is posted to the folio as its own line item. --- ## Check-in and check-out The rooms panel is a housekeeping board: a card per room showing status, folio balance and nights stayed. A room's status moves through this chain: | Status | Meaning | |---|---| | Available | ready for check-in | | Reserved | guest hasn't arrived yet, the slot is held | | Occupied | a guest is staying | | Dirty | after check-out, awaiting cleaning | | Cleaning | housekeeping is in progress | | Inspected | cleaned and checked, waiting to flip to "Available" | | Out of order | taken out of service (maintenance, etc.) | **Check-in** opens a form: rate (pre-filled from the room type), check-out date, and a **guest card** — phone, e-mail, ID document, nationality, date of birth. If the guest has stayed before (matched by normalized phone/e-mail), the system shows a "returning guest" badge and bumps the visit counter. Checking in opens a folio and makes the room's QR order path available. **Check-out** closes the folio: every charge is rolled into a single fiscal receipt, and the room flips to "Dirty." Besides the daily board there's a **calendar view** (a 21-day window) — a view toggle on the same page: bars showing bookings and current stays across rooms, so you can see ahead what's free and when the next guest arrives. --- ## Folio and charges A **folio** is a room's running bill, opened at check-in and kept until check-out: - every night, a nightly cron (around 03:00 in the location's timezone) automatically posts the room charge — a multi-night stay accumulates on its own, no manual entry needed; - the tourist tax, if enabled, is posted the same way; - orders a guest places from the room (room service) are attached to the folio automatically — the link happens server-side the moment the order moves to "placed," so no staff member has to attach it by hand; - the folio balance is visible at the till in the folio tab of [POS](/en/docs/pos) and on the room's card on the board. At check-out, the folio closes with a single settle signal — the consolidated fiscal receipt is generated automatically. --- ## Room service — guest ordering by QR A guest scans the QR code in the room and orders from the menu exactly like from a restaurant table. Two server-side rules protect against orders going nowhere: - **an order from an unoccupied room is blocked** — if the room's QR has no open stay behind it, the order is automatically cancelled with the reason "room not occupied," and the guest sees a warning in checkout before the order is even sent; - when placing an order in an occupied room, the **"Charge to room"** payment method is available — the amount is added to the folio and paid at check-out together with the whole stay; the guest sees a consent line with the exact amount and room number before confirming. --- ## Guest service requests and the housekeeping panel Besides ordering food, the guest has a separate service-request button (in the cart/menu of the room's QR code): **towels**, **cleaning**, **do not disturb**, **wake-up call** (with a time picker), **maintenance issue**, **other**. A request is gated by check-in status the same way — it can't be filed from an unoccupied room. On the staff side there's a **"Guest requests"** panel on the rooms board: an active-request counter on each room's card, a list with type/note/wake-up time, and **"Start"** / **"Done"** actions. Updates arrive live. --- ## "My Bill" for the guest The guest's menu (a settings item next to booking and calling staff) has **"My Bill"** — the guest sees a list of charges (newest first) and payments on their folio, and the running balance, with no staff involvement needed. Before check-in it shows an empty state ("your bill will appear after check-in"); after settlement, a "Paid" badge. --- ## Bookings and iCal export to OTAs Beyond instant check-in, the hotel also supports full **bookings with check-in/check-out dates** — they show up on the calendar as separate bars and turn into a stay with one action on arrival day. There are two places to create one, and the form is the same: an empty cell of the **calendar**, and — right on the **floor plan** — the selected room's properties, block **"Room bookings"** (the nearest arrivals by date with the number of nights, plus a **"📅 Book the room"** button); a right click on the room offers it as well. A room booking is always a **pair of dates, one night minimum**: a room has no hourly booking the way a restaurant table does — rooms appear in the table list neither in the reservation form on the "Floor plan" page nor in the [hall panel](/en/docs/hall-panel) at the till. And **"Check in"**, wherever it appears, is a real check-in (folio, room status, guest registration): on the rooms board, on a reservation in the reservations list and in the hall panel at the till the button opens the same check-in window. If the hotel has a restaurant, its tables are still booked by the hour — see [Table reservations](/en/docs/reservations). **Early check-in and late check-out.** The hotel's usual check-in and check-out times and paid early check-in and late check-out are set in **"Room types" → "Check-in and check-out"**: "Check-in from" and "Check-out by" (14:00 and 12:00 by default — the guest sees these times on the booking page and in the confirmation email), the **"Sell early check-in"** and **"Sell late check-out"** switches, the price — a fixed amount or a percent of the night rate (the first night for early check-in, the last night for late check-out; a rate plan can set its own price) — and the "Not earlier than" / "Not later than" limit. Services that are turned on are offered by the room booking form itself — both on the calendar and behind the "📅 Book the room" button on the floor plan: tick the service and pick the time, and once the booking is created the service is added to it with its price. The form does not accept a time outside the allowed window; if a service could not be added for some reason, the booking is still created and the window tells you to add the service in the booking card. For a booking that already exists, early check-in and late check-out are added or removed in its card. The line goes to the stay bill at check-in, or straight away if the guest is already in the house. In the "Room bookings" block on the floor plan a booking shows "early check-in from …" and "late check-out until …". Until the services are turned on, the booking form shows the hotel's usual times and tells you where to turn them on. From the venue's website a guest can leave a **room booking request**: pick a room type and dates, leave a contact — the request appears on the calendar as a regular booking awaiting staff confirmation; no prepayment is collected at this step. To sync with booking channels, every room has an **iCal feed** (`ical-*.ics`) — the link can be added as a calendar in Booking.com, Airbnb, or any other service that supports iCal import, so the room's occupancy is visible externally. The reverse direction works too: paste an export link from Booking.com or Airbnb in the room settings and external bookings will block those dates for you (refreshed roughly every 15 minutes), with clashes collected into a "resolve manually" list. A full two-way **channel manager** (rates and availability pushed to channels, bookings pulled back) is written but not yet connected to live channels: it needs a partner account with the provider, so the loop currently runs against the provider's test environment. Until then, iCal in both directions is the working path. The rooms board has a reports tab with **Occupancy, Average Daily Rate (ADR) and Revenue per Available Room (RevPAR)** for a period — a quick read on how full the hotel is running. --- ## Extended hotel workflows The PMS is expanding beyond room reservations. The following workflows have server or interface implementations and are being introduced in stages. Check that the relevant screen and connection are enabled for your hotel. | Workflow | What it adds | Before using it | |---|---|---| | Payments and guarantees | Deposits, holds, payment schedules and no-show fees | Confirm the provider supports this specific operation; a provider supporting a payment may not support a hold | | Pre-arrival | Guest details before arrival, with document and signature options | Enable the required fields and retention settings; reception still checks the submitted information | | Night audit | A business-day report and closing of the period | Resolve pending charges; closed-day corrections follow the permitted adjustment workflow | | Corporate billing | Transfer the guest balance to a company and issue business documents | Check the payer, company details and settlement terms | | Housekeeping and maintenance | Cleaning tasks, inspection, minibar and repair work | Assign employee roles and configure the hotel's process | | Door locks | Guest access connected to the stay | A supported vendor account, device and completed setup are required | iCal exchange is supported on both services and transfers occupied dates. It does not exchange prices. Channex currently uses a test environment; live OTA distribution requires a separate connection. An external-PMS demo adapter is not a live connection to every PMS vendor. Guest-registration reporting depends on the destination country and connector. For Russia, the documented workflow is a register, printed/exported forms and a staff record of submission. It does not automatically submit reports to the authorities. ## Related sections - [Floor Plan](/en/docs/tables) — the shared floor/room editor, QR binding - [Table Reservations](/en/docs/reservations) — the same booking engine applied to restaurant tables - [POS](/en/docs/pos) — folio tabs at the till - [Staff & shifts](/en/docs/staff) — housekeeping tasks and assignment - [Appointments](/en/docs/appointments) — similar booking logic for beauty salons - [Hotel telephony](/en/docs/hotel-room-phones) — the guest's smartphone as the room phone: QR, front desk code, disconnect at check-out --- ## FAQ ### What happens if a guest orders from a room no one has checked into? The order is automatically cancelled and marked "room not occupied" — the server checks check-in status for every order coming from a room QR code, regardless of what the client shows. ### Does a guest pay for room service right away or at check-out? Either — a regular payment (cash/card on the spot) or "Charge to room," in which case the amount lands on the folio and is settled with one receipt at check-out along with the whole stay. ### Can a room's calendar sync with Booking.com? Yes, in both directions. Export — the room's iCal link, added as a calendar on the channel's side. Import — paste an export link from Booking.com or Airbnb in the settings, and external bookings start blocking those dates for you (refreshed roughly every 15 minutes). That is the working path today; the two-way channel manager is waiting on a partner account with the provider and currently runs against a test environment. ### What does the nightly cron do, and do I need to wait for it? It automatically posts the night's room charge to every occupied room's folio — there's nothing to trigger manually, and it runs on the location's own timezone. --- # Table Reservations **Reservations** work on the same principle as orders: the guest and the venue exchange signed signals rather than writing directly into a shared file — that protects other people's bookings from being forged. For a general overview of the "Floor Plan" section, see [Floor Plan](/en/docs/tables); this article covers the booking flow itself in detail: creation, statuses, table binding, and booking through AI agents. --- ## Where to manage reservations Two equivalent entry points: - **The hall panel at the till** — the **🗺** chip in the POS ticket header, **"Reservations"** tab (with a badge showing the pending count). The hall panel is a separate opt-in layer, gated both by role (owner/manager, or a PIN operator with the "hall" permission) and by the **Hall panel chip** toggle in **POS appearance** — non-restaurant business types have it off by default; - **The floor plan in the admin panel** (`/tables`) — the same list, plus table binding right on the plan. --- ## New reservation The **"+ New reservation"** button opens a form: - **date** and **time** (15-minute steps); - **duration** — 60/90/120/180/240 minutes; - **party size** (1–50); - **table** — a specific one or "any table" if you'll assign it later. At a hotel this list holds **no rooms and no beds**: a room is booked by nights, with its own form — see below; - **guest name** (required) and **phone** — the number is written the way it is written in the venue's country, e.g. "+7 (912) 575-19-38": the grouping is applied as you type, an empty field shows a sample number for the country, no digit is ever changed, and an entry like "ext. 101" or two numbers separated by a comma stays exactly as typed; the reservation list shows the number in the same format; - **comment**. > 🏨 **This is not how a hotel room is booked.** The form holds a table for hours > (60–240 minutes). A room or a bed is booked **by nights, one night minimum**: it has > check-in and check-out dates, its own rate and its own calendar. On the floor plan > pick the room — in its properties, instead of the "Reservations" block, you get > **"Room bookings"** with a **"📅 Book the room"** button that opens the date-based > form (the same one you get by clicking an empty cell of the calendar). A right click > on the room offers it too. The rule is the same in the "Floor plan" and in the > [hall panel](/en/docs/hall-panel) at the till: rooms are not offered there either. > A room means a room or a bed **in a venue of type "Hotel"**. In other venues a > "Room" element on the plan is an ordinary place booked by the hour (a meeting > room, a private room). See [Hotel](/en/docs/hotel). Reservations created by staff start out **"Confirmed"** right away (unlike guest bookings, which always begin as a request). --- ## Statuses | Status | Meaning | |---|---| | Pending | a guest request, awaiting the venue's confirmation | | Confirmed | the venue accepted the booking (staff bookings start here) | | Seated | the guests are at the table | | Completed | a normal end of the visit | | Cancelled | cancelled by the guest or the venue | | No-show | the guests never showed up | Actions for each reservation live right in the list row: **confirm** (from "Pending"), **seat** (from "Confirmed" — if a table is assigned, "Seat" opens a ticket on that table at the till right away), **complete** (from "Seated"), and **"No-show"** / **"Cancel"** available from "Pending"/"Confirmed." When the reservation sits on a **hotel room** (such bookings are left over from the time a room could be booked by the hour), the button reads **"Check in"** instead of "Seat", and it is a real check-in, not a mark in the list: it opens the same window as the "Check in" button on the rooms board. The guest's name and phone are already filled in from the reservation; you pick the rate and, if needed, fill in the ID document. After check-in the guest has an open room folio, the room becomes occupied, the stay goes to the guest registration log (in Russia — the migration register), and the reservation is marked "Seated". If the room is not ready for check-in (occupied, dirty, out of order), the window does not open and you get an explanation. In the [hall panel](/en/docs/hall-panel) at the till such a reservation also shows "Check in": the button leads to the "Floor plan" page, into the same window. Restaurant tables inside the same hotel keep "Seat". The terminal action stays "complete" for a room too: checking the guest out, closing the folio and sending the room to housekeeping is done by "Check out" on the rooms board. --- ## Table assignment and overlaps A reservation's table can be picked or changed right in the list row — the dropdown includes "Any table." Moving a booking onto a table already held by another one in an overlapping window is **refused** with "Overlaps another reservation on this table" — the server would drop such a change anyway, just silently. In the hall panel's new-reservation form the occupancy is visible before you pick: a table taken for the chosen window is marked "· Occupied" and cannot be selected, and when every table is taken the form says "No free tables" (a booking with no table still goes through — the table is assigned by hand). A time that has already passed is not accepted either. Note the rule itself: only confirmed and seated bookings hold a table — a pending request does not, and clashes over it are triaged by hand. On the floor plan itself, a table with an active or upcoming reservation is highlighted amber with a badge showing the time and guest name — you can see at a glance which tables are booked right now. --- ## Guest-side booking In the QR menu and on the venue's website, the guest opens a booking sheet, sees the floor plan (**free/busy/selected** based on actual active bookings) and picks a table themselves — or several at once for a larger party, in which case the booking is split evenly across the selected tables. The guest sets the time the same way you do in the Hall panel: a **start** and a **duration** — 60/90/120/180/240 minutes, **2 hours** by default. Below the list the sheet says until when the table is held (“Until 21:00”); a booking that runs past midnight (22:00 plus 3 hours, say) is worked out for you. In a hotel, a guest who opened the menu from a room's QR code is booking a restaurant table, not their room: if no table is picked on the plan, the booking arrives "without a table" and is not tied to the room (a room is booked by nights — see [Hotel](/en/docs/hotel)). The fields come in the same order as in the Hall panel booking form: **date and time** first, then **duration and party size**. The sheet opens at the **next full hour** — late in the evening that already means tomorrow — and does not accept a time that has already passed: “That time has already passed” appears under the field, and the request cannot be sent until the time is fixed. So you never receive a request for last night, which the reservations list would have hidden among past bookings straight away. Availability on the guest's floor plan is computed from the same active statuses (pending/confirmed/seated) used at the till — a table already booked for the chosen time simply isn't offered to the guest. If the guest left an email address, right after booking they receive a **"Table booking request received"** email: the time, party size, table and a clear note that the booking is awaiting your confirmation. When you confirm the booking, the guest gets a **"Table booking confirmed"** email; moving or cancelling the booking sends an email too. A guest who moves their booking is making a new request: you confirmed the old time, not the new one. So a confirmed booking goes back to **"Pending"** after a guest reschedule — the hall panel shows the "Confirm" button again, and the guest sees "Awaiting confirmation" until you confirm the new time (if the guest left an email address, they get an email when you do). A booking with a deposit — paid or awaiting payment — stays confirmed after a move, as does a booking moved by your staff. You hear about the move right away instead of spotting a silently changed row: any open screen (floor plan, POS hall panel, appointments journal) shows "Guest moved the booking: name, was → now" — the journal adds a sound and a browser notification — and the owner gets a push in the mobile admin app plus a message from the venue's Telegram bot, if one is connected. A move made by your own staff is not echoed back to them. The section only shows up for the guest if reservations are enabled in the location's website settings — it's a per-location switch, not a global one. ### Reservation deposit A table deposit is a set of rules (weekday, time range, party size from N), each with a **fixed** amount charged either **per guest** or **per booking** — there is no percentage option here, unlike the service-appointment deposit (see [Appointments](/en/docs/appointments)). The guest sees the required amount and the free-cancellation window when booking on the website, pays the deposit online, and the slot is confirmed immediately. Cancelling inside the free window refunds it automatically; a no-show or a late cancellation keeps the deposit with the venue. Deposits only work with online payments configured — without a provider, bookings stay free of charge, as before. ⚠️ Automatic no-show release (Hall panel → "Reservations" → "⏱ Auto no-show") NEVER keeps a deposit: the machine does not touch a paid booking at all, a member of staff closes it with "No-show" — the status decides what happens to the guest's money. --- ## Booking through AI agents The same booking engine is available to voice and text AI assistants through the public [Guest API](/en/docs/llm-api): an agent checks table availability (`check_table_availability`), creates a request (`create_reservation`), and can check status or cancel (`get_reservation_status`, `cancel_reservation`). From the venue's side, such a booking looks no different from a regular guest request — it lands in the "Pending" list and needs confirmation the same way. --- ## Banquets There's no dedicated "banquet" entity — a banquet is booked as a regular reservation with a large party size and an event description in the comment, assigned to a banquet hall or a cluster of tables on the floor plan. --- ## What you need to get started - **Booking switched on for the location** — for a restaurant, cafe, bar and hotel it is on by default; for canteens and fast food it is deliberately off. - **A floor plan with tables** — so a reservation can be seated at a specific table ([Floor plan](/en/docs/tables)). - **A channel to receive requests** — the storefront, a booking widget on your site, Telegram or the guest AI agent. - **A deposit policy** — if reservations are taken with a prepayment; a deposit requires working online payment. - **A place to review reservations** — the "Reservations" window and the "Reservations" view in the [Hall panel](/en/docs/hall-panel). --- ## Limitations - **An unpaid reservation with a deposit holds the slot for 30 minutes** and then releases it. - **There is no reservation timeline by table and no seating grid** — availability is your decision rather than an automatic seating engine. - **There is no "guest arrived" status**, and no automatic reminders N hours before a booking; Telegram reminders to guests follow their own rules. - **The guest does not choose a table** in the widget or the storefront form: they leave a request, and you assign the table. - **Deposits use the shared payment mechanism**, so where online payment is not connected a deposit cannot be taken. --- ## Troubleshooting **A guest cannot book.** Booking is switched off for the location, or the booking widget on your site is not paid for as an extension. **The reservation was not linked to a table.** The venue does the linking — the guest does not set it. **The deposit was not returned on cancellation.** The refund follows the deposit policy; check its terms and the payment status. **Reservations are not visible in the hall panel.** You are looking at a different location, or booking is switched off. **A slot was double-booked.** Overlaps are shown, but there is no hard availability grid — set a quota manually for busy hours. --- ## Related sections - [Floor Plan](/en/docs/tables) — the plan editor, QR codes, waiters - [POS](/en/docs/pos) — the hall panel and opening a ticket from a reservation - [Guest API for AI Agents](/en/docs/llm-api) — booking on the guest's behalf programmatically - [Appointments](/en/docs/appointments) — the same booking model for beauty salons - [Staff & shifts](/en/docs/staff) — roles and access to the hall panel --- ## FAQ ### Can a guest book a table without calling? Yes, right from the QR menu or the venue's website — the request appears in the hall panel instantly, and the guest immediately sees confirmation or a "Pending" status. ### What happens if two staff members seat the same table at the same time? The interface refuses the second one: both assigning a table in the list row and creating a booking on a taken table are rejected with "Overlaps another reservation on this table" — the same rule the server uses to drop such a signal. If two people clicked in the same second, the server rejects the second booking. A pending request does not hold a table, so clashes over it are still triaged by hand. ### Is there a dedicated banquet mode? No dedicated entity — a banquet is a regular reservation with a large party size, assigned to the right area of the floor plan. --- # Appointments **Appointments** is the working screen for a beauty salon (and other services that take bookings). It's a daily grid: columns are specialists, the vertical axis is time. Here you create service appointments, move them and track them by status. Open: **Admin Panel → Appointments** (`admin.cenaly.com`). > This section belongs to the beauty-salon vertical. --- ## Rooms, equipment and visit planning Add specialists as people and rooms or equipment as separate booking resources. Set the resources each service requires. Availability checks combine the specialist's schedule, resource occupancy and service buffers. Reception can create a **multi-service visit** or a **series of visits** from the staff appointment book. These actions are not automatically available in the guest widget. Check the proposed dates and conflicts before confirmation. The schedule uses the **location's time zone**. Set it before opening online booking, especially when reception works from another country. A pending status change still needs server confirmation; an error or unconfirmed action must be resolved before treating the visit as updated. For a clinic, choose the Clinic preset: doctor, room, patient and visit. Patient history here is administrative. Medical records, diagnoses and treatment protocols are outside this module. Doctors' actions are restricted by their role and assigned visits. For a school, use appointments for trial and individual lessons. Regular group attendance and family balances belong to the dedicated school workflow described in [First day](/en/docs/first-day). ## Daily grid At the top is a day panel with **today / previous day / next day** buttons. Each specialist has their own column with appointments by time; appointments with no assigned specialist go into a separate **"Unassigned"** column. ### Sound and alerts for new appointments The **🔔 / 🔕** icon in the book's header turns on sound and pop-up alerts for new appointments. They only work while this page is open; if the browser has blocked notifications, the button turns amber with a hint to allow them in the site settings. That is why a banner sits under the header: **"While the admin panel is closed you will not hear about new appointments"**, with a **"Connect Telegram alerts"** button that opens the setup wizard right there, without sending you off to the app store. When the location's bot is already connected, a quiet hint with a link stays instead: open it from the Telegram account that should receive the alerts. The banner can be dismissed with "Do not show again". --- ## Specialists roster The **"Specialists"** button opens the roster. For each specialist: - **Name**; - **Color** — used to highlight their appointments in the grid; - **Active** — whether they're part of the schedule; - **Services** — which services they perform (all or selected); - **Work schedule** — working hours per weekday; a day left unchecked counts as a day off; - **Daily breaks** — lunch and similar windows, cut out of every working day; - **Leave and sick days** — date ranges when the specialist is unavailable, with an optional note. The schedule, the breaks and the leave apply not only to the book but to self-service booking too: those hours are simply never offered to a guest. If there are no specialists yet, add the first one — you can't fill the grid without them. --- ## New appointment The **"New appointment"** button opens a form: - **Client** and **phone**; - **Service** (from the list) and its **duration** in minutes; - **Specialist**; - **Date and time**; - **Comment**. After saving, the appointment appears in the specialist's grid column. --- ## Visit statuses Open an appointment to move it through statuses: | Status | Meaning | |--------|---------| | Pending | the appointment was created | | Confirmed | the client confirmed | | Seated | the guest has arrived | | Completed | the service was performed | | Cancelled | the appointment was cancelled | | No-show | the client didn't turn up | Actions (confirm / mark seated / complete / no-show / cancel) switch the status right on the appointment card. --- ## Self-service booking Clients can book by themselves — service → specialist → free slot → contact details: - on your storefront; - on **your own website** — with the “Appointments” widget, see [My Website](/en/docs/site-widgets). The widget appears once your menu has at least one item of type “Service”; - in **Telegram** — the booking mini-app inside your bot. Wherever a booking comes from, it lands in the same appointment book. Free time is worked out from the specialist's schedule, their breaks and leave, the length of the service and the time already taken. The limits for the whole location are behind the **⚙️ “Booking settings”** button in the book, block “Online booking hours”. The words **“You are booked”** only appear once the appointment really exists. If the slot got taken during the seconds the guest was filling in their contacts, they get an honest refusal and the grid is rebuilt straight away — the system will not let two guests into the same time with the same specialist. When the guest doesn't pick a specialist themselves, we assign a free one as the appointment is created. If the confirmation is delayed for some reason, instead of “You are booked” the guest sees “We could not confirm it right away, the venue will call you back”. Such a booking usually still reaches the book — check it and call the guest. --- ## What the guest gets right after booking The confirmation screen shows the **booking number** and, depending on your location: - **🔔 Telegram reminders** — the button leads to your bot (shown if a bot is connected); - **Manage booking** — a link to the page for moving and cancelling; - **Add to calendar** — an event for the phone's or computer's calendar; - **an email** — if the guest left an address. --- ## Managing a booking by link The **“Manage booking”** link opens a separate page. The guest needs no account, no password and no app — the link itself is enough; the same link comes in the confirmation email. On that page the guest can: - see the service, the specialist, the date and the time; - **move** the booking to another free slot; - **cancel** the booking; - switch on Telegram reminders. Moves and cancellations show up in the book immediately — nothing extra to confirm. ⚠️ The link is the key to the booking: anyone the guest forwards it to can also move or cancel the visit. --- ## The confirmation email The booking form has an optional **email** field. If the guest leaves an address, an email goes out right after confirmation: the service, the date and time (in the venue's time zone), the duration, the venue address, the booking number and a “Manage booking” button. If they don't, we simply send nothing — the booking itself is not affected. The email is **not** sent when the appointment was created by a manager in the book, when the system refused the booking, or when the service needs a deposit that hasn't been paid yet. A guest's repeat attempt does not produce a second email. Emails come in Russian, English, Georgian and Turkish — the language follows the one the guest booked in; for any other language the email is in English. --- ## The venue's time zone The guest-facing side works in **the venue's time**, not the time on the guest's device. A guest in another zone sees the note “venue time (Asia/Tbilisi)” next to the time picker, and the line “Times are given in the venue's time zone” in the email. Emails and reminders go out in the same zone. The **book's grid, however, is drawn in the administrator's device time**: an appointment's hours and minutes are printed the way the browser sees them. While you work from your own country there is no difference; if an administrator opens the book from another time zone, double-check the zone — a 14:00 appointment will look like a different time to them. The zone comes from the location settings — the **“Locations”** section, time zone field. Check it before you switch self-service booking on: especially if the account was created from outside your country. --- ## Telegram reminders If the location has a Telegram bot connected, a guest who booked through it receives: - a **confirmation**, plus messages when the appointment is moved or cancelled; - a **24-hour** and a **2-hour reminder** with “I'll be there” and “Cancel” buttons — a tap changes the appointment status in the book immediately. The owner and managers get notifications about new bookings and cancellations in their own chat — a separate “Owner notifications” block. Times in all messages are shown in the location's time zone. Reminder texts are translated into four languages — English, Russian, Georgian and Turkish (emails, by contrast, go out in eight). If the guest booked in another language, the reminder arrives in English. ⚠️ Cancelling from a bot button does **not** refund a deposit automatically — if you charge a deposit for a visit, process the refund manually. --- ## Where the bookings came from Appointments a guest made through the widget on your site carry a **“From website”** badge in the book — you can see at a glance whether the channel works. The **“🌐 Website widget”** button opens the widget funnel for 7, 30 or 90 days: | Step | What it means | |--------|-------| | Widget shown | the booking button loaded on a page of your site | | Opened | the guest opened the booking panel | | Reached contacts | picked the service, the specialist and the time | | Tapped “Book” | submitted the form | | Booked | the appointment was confirmed | Shown separately: **“Slot taken while choosing”** (bookings lost — a reason to add a specialist or shorten the steps), **technical failures** and the languages the widget was opened in. These are counters only: they hold no personal data about your guests. --- ## Related sections - [My Website](/en/docs/site-widgets) — the appointment widget for an external site - [Telegram](/en/docs/telegram) — connecting the bot - [Staff & shifts](/en/docs/staff) — tracking staff working time - [Returning guests](/en/docs/loyalty) — client history - [Table reservations](/en/docs/tables) — similar booking logic for restaurants --- ## FAQ ### What happens to an appointment with no specialist? It goes into the "Unassigned" column — assign a specialist later by opening the appointment. ### Where do services in the form come from? From your service catalog; each has a duration that's filled into the appointment. ### How do I mark a no-show? On the appointment card, choose the "No-show" action — the status is recorded as a no-show. ### Can two guests book the same time with the same specialist? No. The slot is tied to the appointment the moment it is created: the second guest gets a refusal and sees a refreshed grid with the times that are still free. ### How do I close a day, or part of a day, for a specialist? Lunch and similar windows — "Daily breaks" on the specialist's card; whole days — "Leave and sick days". To close hours for the whole location, change "Online booking hours" in the booking settings. ### The guest booked but no email arrived Check whether they left an email at all: the field is optional. No emails go out for appointments a manager created in the book, or for unpaid deposits. If an address was given — ask the guest to look in their Spam folder. ### The guest is in another time zone — which time are they picking? The venue's time. The widget labels the time zone next to the time picker, so "14:00" means exactly 14:00 at your place, not at theirs. --- # Knowledge Base — Your Documents, AI Search and Staff Training The **"Knowledge Base"** section is a private store for your business materials: price lists, return and booking rules, procedures, instructions, contracts, website pages. AI turns them into verified answers, and your assistants answer from those — customers about prices and rules, staff about procedures. It works the same for a café or restaurant, a shop, a salon, a hotel, a clinic, a school or any other business. Open **Admin Panel → Knowledge Base** (`admin.cenaly.com/knowledge-base`). **Three words the section uses:** - **Materials** — what you added: files, website pages, folders from your computer (the "Sources" and "Library" tabs). - **Prepared answers** — what AI built from your materials and checked against them: only what is confirmed, with citations. Technically a set of such answers is called a **collection**; you can have several — for example, one for customers and one for staff. - **Connected assistants** — who answers from the prepared answers: the AI secretary, website chat, call coach, staff training, the "Questions" tab. **For example, what people will ask:** a shop — "Can I return an item without a receipt?" (you need a return policy), a salon — "Can I move my appointment?", a hotel — "Can I have a late check-out, and how much is it?", a clinic — "What documents should I bring to my appointment?", a school — "Can I make up a missed lesson?", a café — "Does this dish contain nuts?". Staff ask their own: "How do I process an exchange?", "What do I do if a guest loses their key card?". In an empty section such examples are matched to your location's business type. They are hints, not a promise: the base answers only if such rules are in your materials. > **The knowledge base and the "Help portal" are different things.** The knowledge base is internal knowledge for assistants and staff. The **"Help portal"** (the neighbouring tab) holds public articles for your customers on your website: categories, folders, your own look and subdomain. > Don't confuse this with the general help-center articles [Cenaly Product Reference](/en/docs/kb-product) or [HoReCa Knowledge Base](/en/docs/kb-horeca) — those are documentation about the platform itself and about hospitality in general. The "Knowledge Base" admin section, by contrast, is private: it holds only your own documents, visible only to you. --- ## Uploading documents Documents are added by drag-and-drop or an upload button. Supported formats: PDF, DOCX, spreadsheets (XLSX/XLS/CSV), text/markdown (TXT/MD), and photos (JPG/PNG/WEBP — text in a photo is recognized automatically). The limit is roughly 25 MB per file. After upload, a document is processed in the background (a live staged progress indicator is shown); text and images are extracted, the text is split into meaningful chunks and indexed for search. A document's card shows its status — Processing, Ready, or Error. --- ## Collecting pages behind a login Some documents you need aren't files — they're pages on internal supplier or service portals you first have to sign into. For that there's the Cenaly **"Digital worker"** browser extension, in its "Knowledge base & reviews" mode (an install link is right in the Knowledge Base section; if you already use it for the Digital worker, you don't need a second one): it opens and "scans" such pages under your own browser session and adds them to the knowledge base as regular documents — the same search and AI Q&A work on them afterward. Before first use, the extension asks for your consent — responsibility for accessing third-party systems rests with you as the one initiating access; the platform is just the tool. --- ## AI search and Q&A The **"Search"** tab is a hybrid search over your own documents (combining exact word matches with semantic search), with highlighted matching fragments and matched terms. The **"Ask"** tab is a chat: ask a question in plain language, and the AI answers **strictly based on the content of your uploaded documents**, with numbered citations to specific sources ([1], [2]…, clicking one opens the document). If the answer isn't in the knowledge base, the AI says so honestly instead of making something up. Repeated identical questions are answered instantly from a cache. --- ## Glossary A separate **"Glossary"** tab is a table of terms and entities (people, organizations, amounts, dates, products) the AI has automatically extracted from all your documents, with a definition and links to the documents where each term appears. --- ## Building learning materials The **"Build"** button on the **"Learning"** tab compiles from your knowledge base: - **core concepts** — tagged by importance (core / supporting / peripheral), with verbatim quotes pulled from your documents; - **5–12 topics**, each with a summary; - **quizzes** — multiple-choice questions with an explanation and a link to the source document for each question. Materials become "stale" automatically once the set of documents changes (something was added or removed) — the section will suggest rebuilding them. --- ## Staff training sessions An employee logs into the admin panel with their own login and sees only a **"My Training"** section — no access to the owner's other sections. A training session is built adaptively: - first, a review of concepts and questions that are due (following a forgetting-curve schedule — the same spaced-repetition principle used in flashcard apps like Anki); - then, a small batch of new concepts, prioritizing ones that build on what's already been learned. The section shows a "time to review N" badge whenever overdue reviews have piled up. --- ## Owner statistics The owner has access to an **"Employees"** tab with detailed statistics per person: mastery by topic, answer accuracy over the last 7 and 30 days, the number of overdue reviews, a day streak, and the concepts they find hardest. --- ## Access for the guest chat bot If you have [guest chat](/en/docs/chat) enabled with an AI bot, you can allow that bot to search your knowledge base for answers — across all documents, or only the ones explicitly flagged with the "Available to chat bot" toggle on a document's card. By default, internal documents stay off-limits to the bot until you open them up yourself. --- ## Related sections - [Chat with Guests](/en/docs/chat) — the AI bot's access to your knowledge base - [Documents](/en/docs/documents) — contract/order templates with AI-assisted filling - [Staff & Shifts](/en/docs/staff) — the employee list used to assign training --- ## FAQ ### Can the AI answer with something that isn't in my documents? No, answers are built strictly from the content of your uploaded knowledge base, with citations to sources. If the information isn't there, the AI will say so directly. ### Who can see my knowledge base? Only you — and, with your explicit permission, your guest chat's AI bot (limited to documents you've marked as available to it). Knowledge bases never overlap between different accounts. ### Do I have to build learning materials before I can use search? No, search and Q&A over your documents work as soon as they're uploaded — building learning materials is only needed for the "Learning" section. ### Does an employee need a separate account? Yes, to go through training on their own an employee logs in with their own account — the same one used to access their other work sections. --- # Knowledge Base — Cenaly Product Guide > A complete guide to all platform features. Use in-page search (Ctrl+F) to quickly find an answer. --- ## 📌 Table of Contents 1. [Account and registration](#1-account-and-registration) 2. [Locations and venues](#2-locations-and-venues) 3. [Menu: categories and items](#3-menu-categories-and-items) 4. [Photos and AI](#4-photos-and-ai) 5. [Multilingual support and translations](#5-multilingual-support-and-translations) 6. [QR code and NFC](#6-qr-code-and-nfc) 7. [Orders and KDS](#7-orders-and-kds) 8. [Payments and tips](#8-payments-and-tips) 9. [Allergens and nutrients](#9-allergens-and-nutrients) 10. [Analytics and reports](#10-analytics-and-reports) 11. [Loyalty and CRM](#11-loyalty-and-crm) 12. [Integrations](#12-integrations) 13. [Multi-location and chains](#13-multi-location-and-chains) 14. [Printed menu](#14-printed-menu-and-promo-materials) 15. [Security and GDPR](#15-security-and-gdpr) 16. [Troubleshooting](#16-troubleshooting) 17. [Floor plan and table management](#17-floor-plan-and-table-management) 18. [Stop list](#18-stop-list) 19. [Table reservations](#19-table-reservations) 20. [Room service for hotels](#20-room-service-for-hotels) 21. [Bill splitting](#21-bill-splitting) 22. [Menu scheduling](#22-menu-scheduling) 23. [Multi-currency](#23-multi-currency) 24. [Inventory and stock management](#24-inventory-and-stock-management) 25. [Offline mode](#25-offline-mode) 26. [AI capabilities](#26-ai-capabilities) 27. [Custom domain and SEO](#27-custom-domain-and-seo) 28. [POS](#28-pos) 29. [Staff and shifts](#29-staff-and-shifts) 30. [Own delivery and couriers](#30-own-delivery-and-couriers) 31. [Finance](#31-finance) --- ## 1. Account and registration ### How do I sign up? Go to [admin.cenaly.com](https://admin.cenaly.com) and click "Sign up". Registration is available via email or a Google account. ### I forgot my password On the login page, click "Forgot password?" — you'll receive a reset link by email. ### How do I change my email? In the admin panel → **Settings** → the **Access** tab → the **"Danger zone"** block → **Change email**. You'll need to confirm the new address. On the Russian contour (`cenaly.ru`) changing the address is not supported yet — the block is not shown there. ### Can I have multiple accounts? One email = one account. But one account can manage an unlimited number of venues. --- ## 2. Locations and venues ### What is a location? A location is a single venue (restaurant, café, bar, hotel). Each location has its own menu, QR code, settings, and analytics. ### How do I create a location? Admin panel → **+ Add location** → fill in the name and address, upload a logo. ### How many locations can I create? Unlimited. Centralized management is available for chains and franchises. ### How do I set business hours? In location settings → **Business hours** — set hours for each day of the week, including breaks and days off. ### How do I delete a location? **Location settings** → **Danger zone** → **Delete location**. This action is irreversible. --- ## 3. Menu: categories and items ### How do I add a category? In **Menu**, click **+ Add category**, enter a name. Auto-translation will run automatically. ### How do I add an item to the menu? Inside a category, click **+ Add item** → fill in the name, description, price, upload a photo. ### How do I change the order of categories/items? Drag & drop categories and items into the desired order. ### What are combo sets? A combo is an item assembled from several menu dishes (e.g. a business lunch: soup + main + drink) with its own price. When a combo is sold, inventory automatically deducts the ingredients of every dish inside the set according to their recipes. ### Can I create subcategories? Yes. For example: Drinks → Hot drinks, Cold drinks, Alcoholic. ### How do I add variants (sizes)? In the item editor → **Variants** → add sizes with different prices (Small, Medium, Large). ### How do I add add-ons? In the item editor → **Add-ons** → specify additional ingredients with prices. ### How do I temporarily hide an item? Toggle the switch next to the item — it will become invisible to guests but remain in the system. ### How do I bulk update prices? In **Menu**, use bulk editing — change prices for multiple items at once. --- ## 4. Photos and AI ### What photo formats are supported? JPEG, PNG, WebP. Recommended size: from 800×600px. ### Are photos optimized automatically? Yes. The system automatically crops, improves brightness/contrast, and converts to an optimal format. ### What if I don't have a dish photo? AI can generate an image based on the dish name and description. Click **🤖 Generate photo** in the item editor. ### How do I adjust cropping? Click the photo → use crop and pan tools to fine-tune how it's displayed. --- ## 5. Multilingual support and translations ### How many languages are supported? 45 languages: English, Russian, Georgian, Turkish, Armenian, Chinese, Hindi, Spanish, French, Arabic, Bengali, Portuguese, Indonesian, Urdu, German, Japanese, Korean, Vietnamese, Italian, Polish, Ukrainian, Persian, Hebrew, Azerbaijani, Kazakh, Uzbek, Abkhaz, Albanian, Serbian, Macedonian, Bulgarian, Romanian, Greek, Dutch, Maltese, Swedish, Norwegian, Danish, Finnish, Czech, Hungarian, Croatian, Lithuanian, Thai, Malay. ### How does auto-translation work? Enter text in the primary language — AI automatically translates into all selected languages. You can edit any translation manually. ### How do I switch the primary language? **Settings** → the **Languages** tab → choose the primary language and additional ones. This is the **account-wide** language pool, shared by all venues; an individual venue can narrow its menu languages in its own card. ### How is the guest's language determined? By the phone browser language. If that language is enabled, the menu is shown in it. Otherwise, it's shown in the primary language. The guest can switch manually. ### Is RTL supported (Arabic, Hebrew)? Yes. For right-to-left languages, the interface is mirrored automatically. --- ## 6. QR code and NFC ### How do I generate a QR code? In the admin panel → **QR code** section → customize the design → download. ### Can I add a logo to the QR code? Yes. Upload a logo — it will be placed in the center of the QR code. ### Do I need to regenerate the QR code when the menu changes? No. The QR code points to a permanent link — menu changes appear automatically. ### What is NFC? NFC is a contactless technology. A guest taps their phone on an NFC stand and instantly sees the menu (without scanning a QR code). ### Where should I place QR codes? On tables, at the entrance, at the counter, on business cards, on delivery packaging, on social media. --- ## 7. Orders and KDS ### What order types are supported? Dine-in (from the table), delivery, takeaway, WhatsApp, Telegram. ### How do I set up table orders? Online-ordering conditions live on the venue, not in account settings: **Locations** → the venue card → the **WEB** tab (or the single **My Website → Online ordering** hub, `/embed/order`). That is where **dine-in** is enabled; then lay out the room in **Floor plan** and assign QR codes to tables in the **QR codes** section. ### What is KDS? Kitchen Display System — a kitchen screen with the order queue. Works on any tablet or Smart TV via a browser. In the admin panel it's the **Kitchen (KDS)** section: item statuses, stations, all-day summary, recall and timers — see the [KDS guide](/en/docs/kds). ### How is the POS screen different from Orders? **Orders** is the shared feed of all orders and their statuses. **POS** is the screen for punching in a new order as a waiter: menu tiles, table binding via QR, sending to the kitchen — see the [POS guide](/en/docs/pos). ### How does a guest call a waiter? The "Call a waiter" button in the digital menu (with a reason: water, the bill, help with the menu) → a bell in the Orders section and the "Calls" tab of the [Hall panel](/en/docs/hall-panel), with sound and an "Acknowledged" button. ### Can the kitchen serve dishes in waves? Yes — turn on **coursing** in the KDS settings: lines are grouped into "HOLD · Course N" blocks and the waiter releases a course with the Fire button. See [KDS](/en/docs/kds). ### Can tickets print to different printers per station? Yes: each KDS station gets its own printer (plus a backup) — [Kitchen and front-of-house printing](/en/docs/kitchen-printing). ### Can a guest order "for a time"? Yes, and with **pre-order slots** enabled they pick a slot from a grid (15/30/60 minutes) that respects capacity and lead time — see [Orders](/en/docs/orders). --- ## 8. Payments and tips ### What payment methods are supported? Pay on delivery and cash — always. Online payment by the guest goes through a provider the venue connects itself; **eight providers are live**: Stripe, Bank of Georgia (BOG), TBC Bank, PayPal, Square, Airwallex, iyzico and PayTabs. Apple Pay and Google Pay are not connected separately — they come with the acquiring, if the provider supports them. Local systems (Kaspi Pay, LiqPay, Yandex Pay and others) are in the catalogue but still marked "planned": the card is visible, connecting is not available yet. ### How do I connect online payments (Stripe, for example)? Payments are connected **per venue**, not per account: **Locations** → the venue card → the **"Payments"** tab → pick a provider and enter your own keys. The same form is available from the **My Website → Online ordering** hub (`/embed/order`). There is no "Settings → Payments" section in the panel. ### Can I accept tips online? Yes. Tips are configured in the **venue card**: that is where you enable them and set the options. There are **three** presets, and by default they depend on the country: US and Canada — 18/20/25%, Georgia, Australia and New Zealand — 5/10/15%, Japan, China, Korea, Taiwan, Hong Kong and Singapore — no tips at all, the rest of the world — 10/15/20%. Your own values can be set manually. ### Are online payments secure? Cenaly does not store card data: the guest pays on the provider's own secure page, and the money goes straight to the venue's account — the platform never holds funds. The certification level (for example PCI DSS Level 1 at Stripe) is the one of the provider you connected. --- ## 9. Allergens and nutrients ### Is it mandatory to list allergens? In the EU — yes (14 allergens under Regulation 1169/2011). In other countries — it depends on local legislation. ### How do I add allergens to an item? In the item editor → **Allergens** section → select the allergens present. ### Can a guest filter the menu by allergens? Yes. The digital menu includes a filter — the guest excludes allergens and sees only safe dishes. --- ## 10. Analytics and reports ### What reports are available? Sales, average check, ABC analysis, staff KPIs, profitability, P&L, item popularity. ### Can I export data? Yes, to Excel (XLSX), CSV, and PDF. ### How often is analytics updated? In real time. Data is available immediately after an order is completed. --- ## 11. Loyalty and CRM ### How does the loyalty program work? The guest earns points for each order (% of the amount), accumulates them, and redeems them on future orders. ### How do I create a promo code? **Marketing** → **Promo codes** → **+ Create** → specify the code, discount, limit, validity period. ### Can I send campaigns? Yes — email, push notifications, Telegram, SMS. Triggered campaigns (automatic based on events) are available. --- ## 12. Integrations ### Which POS systems is Cenaly compatible with? The honest answer: there are **no direct integrations with iiko, r_keeper, 1C or MoySklad yet**. Their cards in the extension store are "Coming soon" requests: you leave an application, there is no connection behind them. What actually works: - **Poster POS** — a one-off **migration**: the **Migrate** wizard imports a Poster export (menu, products, stock). That is a migration, not continuous sync. - **Saby (SBIS) Documents** — the only live connector in the Russian systems registry: exchange of documents and customers. - **SumUp** — not a POS system but a payment **terminal**, connected through the hardware bridge. - **Square** — connected as an online-payment **provider** (and separately as a Square Terminal reader). If your system is not there, the REST API and file import/export remain. ### Is there an API? Yes, a REST API for managing menus, orders, customers, and analytics. ### Is there a Telegram integration? Yes. The menu works as a Telegram Mini App. More details: [Telegram Mini App](/en/docs/telegram). --- ## 13. Multi-location and chains ### Can I manage multiple venues? Yes. Create multiple locations in one account with centralized management. ### Can I have different prices in different locations? Yes. Each location can have its own prices, even in different currencies. --- ## 14. Printed menu and promo materials ### How do I create a PDF version of the menu? In the admin panel → **Marketing → 🖨️ Print** (or the print button in the "Menu" and "Locations" sections) → customize the design → "Save PDF". Next to it are the "Print" and "Share" buttons and a PNG export of the current page. ### Can I print only part of the menu, or a menu without prices? Yes. The builder has a category picker ("What to print"), a "price list" mode and a "Hide prices" option. ### Can I use AI for the background? Yes. AI will generate a unique background from your description. ### How do I make a promo leaflet for a single dish? Open the flyer designer (the button on the dish card or **Marketing → 🖨️ Print**): 45 layouts — from a leaflet and a table tent to a sticker, a poster and cards for marketplaces and social media. The result can be printed, saved as PDF, downloaded as PNG or sent as a public link; small formats are printed several copies per A4 sheet. More details: [Printed menu — guide](/en/docs/print-menu) · [Dish flyer designer](/en/docs/dish-flyer) --- ## 15. Security and GDPR ### Where is data stored? In the cloud of your brand, encrypted. The platform has two contours: **AWS** (EU/US regions) for international domains and **Yandex Cloud** for Russian ones (`cenaly.ru`). Data never leaves the contour of its own jurisdiction; that is why some features are deliberately switched off in the Russian contour (changing the email, AI document filling). ### Is Cenaly GDPR-compliant? Yes. We process personal data in accordance with GDPR. See details in the [Privacy Policy](/en/privacy). ### How do I delete a customer's data? At the customer's request (GDPR right to erasure) — contact support or use the API. --- ## 16. Troubleshooting ### QR code won't scan - Make sure the QR code is printed large enough (minimum 3×3 cm) - Check contrast (dark code on a light background) - Make sure the phone camera works ### Menu won't load - Check the internet connection - Try opening the menu link directly in the browser - Clear the browser cache ### Photo won't upload - Check the format (JPEG, PNG, WebP) - Maximum file size: 10 MB - Try reducing the resolution ### Translation is incorrect - Open the item → go to the required language → edit the translation manually ### Order doesn't come through - Check that orders are enabled in settings - Check that the floor plan is configured (for dine-in) - Check the internet connection on the staff device --- ## 17. Floor plan and table management ### How do I create a floor plan? 1. Open the **Floor Plan** section in the admin panel 2. Create halls (main hall, terrace, VIP) and set their dimensions 3. Add elements from the palette: tables (round, square, long), walls, doors, bar, entrance; for hotels — rooms and beds 4. For each table set a label, seat count, shape and rotation Full guide: [Floor Plan](/en/docs/tables). ### How do I bind a QR code to a table? Select a table on the map and **scan with the camera** the QR code sitting on that table. Re-scanning at another table moves the binding. After binding, orders from that QR show on the right table. ### Can I assign waiters to tables? Yes — the **Waiters** mode on the Floor Plan page: pick an employee and mark their tables. Orders from those tables are automatically bound to the waiter. ### How does the table QR code work? Each table is assigned a QR code. The guest scans it — the system automatically detects the table number and links the order. ### Where are the waitlist and the hall heat map? Not on this page but in the **[Hall panel](/en/docs/hall-panel)**, opened from the till. That is where you find the guest queue, invitations by phone call or Telegram, the "who to seat at the freed table" suggestion, the "Now" tab and today's per-table revenue heat map. ### A table is empty in the heat map — does that mean zero revenue? No, it means "no data": no QR code is bound to that table, and orders are linked to a table precisely through it. --- ## 18. Stop list ### What is a stop list? Items temporarily unavailable to order (ingredients ran out). ### How do I add an item to the stop list? - **Quick way**: in the admin panel, toggle "Stop" next to the item - **Automatically**: when inventory reaches zero - The item is shown in the menu as "Temporarily unavailable" (or hidden) - Staff notification when an item is added to/removed from the stop list --- ## 19. Table reservations ### How do I enable reservations? The reservations toggle lives on the venue: **Locations** → the venue card → the **WEB** tab (the same switch is in the widget settings modal of the **My Website** hub). It enables both the "Book a table" button in our storefront and the booking widget. The booking widget for an **external website** is a paid extension ($9/month), configured in the **My Website** section (`/embed`). ### What can a guest reserve? - Date and time - Number of guests - Zone (terrace, VIP, etc.) - Special requests (high chair, birthday) ### How do I manage reservations? - Requests appear on the **Floor Plan** page in the admin panel - Confirm or decline a booking, assign it to a table - Create a booking manually (e.g. after a phone call) - Guests book right from the QR menu or the venue website and see their request status More: [Floor plan & reservations](/en/docs/tables). --- ## 20. Room service for hotels ### How does it work? 1. QR code in the room → the guest opens the menu 2. Chooses dishes → enters the room number 3. The order goes to the kitchen linked to the room 4. Cost → charged to the room bill or paid online ### Setup - Integration with the hotel PMS (optional) - Night menu (limited selection by hours) - Room-service markup (% or fixed amount) --- ## 21. Bill splitting ### What splitting options are available? - **Evenly**: the amount is split by the number of guests - **By items**: each guest marks their dishes Each part is closed with its own payment method; the order counts as paid once all parts are closed. Details — [POS](/en/docs/pos). ### Can the guest split the bill themselves? No. A guest can pay the table's bill **in full** — the "Bill" button at a QR table (pay-at-table, see [Orders](/en/docs/orders)). Splitting is done by a waiter at the till. --- ## 22. Menu scheduling ### Why? Automatic menu switching by time of day: - Breakfast: 07:00 – 11:00 - Lunch: 11:00 – 16:00 - Dinner: 16:00 – 23:00 - Night: 23:00 – 07:00 ### How do I set it up? 1. **Menu** → **Schedule** 2. Create time slots 3. Assign categories or items to slots 4. Outside the schedule, items are hidden automatically --- ## 23. Multi-currency ### How does it work? - The venue's primary currency is set in settings - The guest sees prices in **their currency** (determined by IP or selection) - Rates update automatically once a day from openexchangerates.org (base currency — USD) - Payment is processed in the venue currency; the guest sees the equivalent ### Supported currencies GEL, USD, EUR, TRY, GBP, AMD, AZN, UAH, RUB, KZT and others (50+ currencies) --- ## 24. Inventory and stock management The **Inventory** section in the admin panel has three tabs: **Stock**, **Documents**, **Suppliers**. Full guide: [Inventory](/en/docs/inventory). ### Recipe cards - For each dish, set the composition (ingredients + quantity) in the dish card - When an order is completed, ingredients are deducted automatically; combo sets unfold to the recipes of included dishes - AI suggestions help link products to the dishes that use them ### Semi-finished products (preps) - A product can have its own recipe (sauce, dough, broth) - The **"Produce"** button adds the prep to stock and deducts its components ### Receipts and suppliers - **Receipt**: manual entry or **by invoice photo** — AI recognizes line items, quantities and prices and matches them to your products - **Suppliers**: a counterparty database with requisites; every receipt is linked to a supplier - Purchases automatically feed [Finance](/en/docs/finance) (food cost, gross profit) ### Alerts - A product is highlighted when it drops below the minimum stock level - Movement history lives in the Documents tab - A **"+N % vs median"** badge on a receiving line when a product came in dearer than usual — [Loss control](/en/docs/loss-control) ### Where did the difference between stocktakes go? The **"Variance"** tab splits consumption into three parts: sales from recipes, explained (write-offs, production, transfers) and unexplained. The third line is the loss — see [Inventory](/en/docs/inventory). ### Will the system tell me how much to prep and order? Yes, the **"Forecast"** tab: the weekday sales median → a prep plan with deadlines → a supplier order draft → a "runs out around 19:00" risk. No AI, just statistics — [Demand forecast](/en/docs/demand-forecast). --- ## 25. Offline mode ### Does Cenaly work without internet? - **Digital menu**: cached as a PWA, works with weak internet - **Admin panel**: orders are saved locally and synced when restored - **KDS**: continues showing active orders ### How do I enable it? Offline mode is enabled by default. The guest can "Add to Home Screen" and open the menu like an app. --- ## 26. AI capabilities ### Dish photo generation - AI creates photorealistic images from descriptions - Ideal for new items without a photoshoot - Choose from multiple options - Manual prompt adjustment for precise results ### Automatic descriptions - AI generates appetizing descriptions based on the name and ingredients - In all selected languages at once ### Smart translation - Context-aware translation with culinary terminology - Preserves the tone and style of the description ### Menu recognition - Upload a photo of a paper menu → AI recognizes items - Automatic creation of categories and items - Review and correction of the result --- ## 27. Custom domain and SEO ### How do I connect my own domain? 1. **Locations** → the location → the **"Site"** tab → the **"Custom Domain"** block → enter a subdomain (e.g. `menu.yourdomain.com`) 2. The system shows a **Host** and a **Value** — add a **CNAME record** with these values at your DNS provider 3. SSL certificate is issued automatically 4. Activation within 5–15 minutes For the full step-by-step guide, DNS-provider examples and troubleshooting, see [Custom Domain](/en/docs/custom-domain). ### SEO optimization Cenaly automatically generates: - Meta tags, Open Graph, Schema.org (Restaurant, Menu) - Sitemap.xml and robots.txt - Structured data for Google Rich Results --- ## 28. POS ### What is it? The **POS** screen in the admin panel is the waiter's workstation: order entry from menu tiles, table binding via QR code, sending to the kitchen. Guide: [POS](/en/docs/pos). ### Who can use the POS? The owner, managers and waiters. An order created by a waiter is automatically bound to them. ### Do I need hardware? No — the POS runs in a browser on a tablet, phone or computer. Printers, cash drawer, scanner, scales, card terminal and camera connect through [Cenaly Hardware Bridge](/en/docs/hardware-bridge). ### What else can the till do besides taking orders? Pre-checks, splitting the bill, corporate-account payment, the loyalty panel, an **upsell prompter** ("suggest with this"), weight-priced items with bridge scales, and the **[Hall panel](/en/docs/hall-panel)** behind the 🗺 button — see [POS](/en/docs/pos). ### Can a gift card be accepted at the till? No. A card is redeemed at online checkout or used as store credit on a refund — see [Loyalty program](/en/docs/loyalty). ### Who sees that a cashier is issuing a lot of voids and discounts? Such operations are logged against the cashier, and rules raise an alert to the owner — [Loss control](/en/docs/loss-control). --- ## 29. Staff and shifts ### How do I give an employee admin access? The **Staff** section → "Add employee": email (login), name, role, password. Guide: [Staff & shifts](/en/docs/staff). ### What roles exist? There are five tiers: **Manager** (menu, orders, POS, inventory, locations, devices), **Waiter** (orders and POS), **Cook** (orders and KDS), **Courier** (delivery screen) and **Specialist** (the appointment book — for salons and services). The owner keeps full access. On top of the tiers there is a job-title constructor: **21 ready-made presets** (cashier, sales assistant, host, bartender, accountant, purchaser, stock keeper, HR, receptionist and more), each editable, plus three access levels per section — 👁 view, ✏️ edit data, ⚙️ configure the section. More details: [Staff & shifts](/en/docs/staff). ### How do shifts work? On the staff page: the manager plans shifts (plan), the employee clocks in/out (fact, time recorded server-side). The plan-vs-fact summary shows late arrivals and overtime; hours feed into Finance. --- ## 30. Own delivery and couriers ### How do I run delivery with my own staff? Create employees with the **Courier** role — they get the **Courier** screen: an order queue (preparing → ready for pickup → out for delivery → delivered), a map with the route to the customer, "Take order" and "Delivered" buttons. Guide: [Own delivery](/en/docs/delivery). ### What statuses does a delivery order go through? New → Preparing → Ready for pickup → Out for delivery → Delivered. The guest sees the status in real time. ### How does the courier take payment? The order card shows: cash on delivery (with the amount), card on delivery, or "paid online". --- ## 31. Finance ### What does the Finance section show? Management dashboards: revenue, average check, cancellations, sales channels (dine-in/delivery/pickup/Wolt/Glovo), payment methods, purchases and food cost, gross profit, staff worked hours. Periods of 7/30/90 days and 12 months with previous-period comparison. Guide: [Finance](/en/docs/finance). ### Where does the data come from? Automatically from orders, inventory documents and staff shifts — no exports needed. ### How do I account for aggregator commission? Set the percentage and per-order fee in the **"Channel commissions"** card in the location's integrations — the "Sales" tab gains a "gross → net by channel" table, and in [Menu engineering](/en/docs/menu-engineering) a dish's margin is recomputed per channel. See [Finance](/en/docs/finance). ### Where can I see how much we lost to channel downtime? The **"Delivery channels"** tab: online / paused / offline status, downtime hours, estimated lost revenue and cancellations by reason. ### Which dish should I reprice, and which should I drop? The **"Menu engineering"** tab in menu statistics: the Kasavana & Smith matrix with a ready recommendation per dish — [Menu engineering](/en/docs/menu-engineering). --- ## Support contacts - **Email:** support@cenaly.com - **Telegram:** @meni_support - **Response time:** up to 24 hours (usually 1–2 hours during business hours) --- # HORECA Knowledge Base — Staff Training > A handbook for food service employees. Service standards, working with digital tools, food safety, and skills development. --- ## 📌 Contents 1. [Introduction to HORECA](#1-introduction-to-horeca) 2. [Guest Service Standards](#2-guest-service-standards) 3. [Working with the Cenaly Digital Menu](#3-working-with-the-cenaly-digital-menu) 4. [Staff Roles and Responsibilities](#4-staff-roles-and-responsibilities) 5. [Food Safety and Hygiene](#5-food-safety-and-hygiene) 6. [Allergens — What Every Employee Must Know](#6-allergens) 7. [Handling Complaints and Conflicts](#7-handling-complaints-and-conflicts) 8. [Upselling — Techniques to Increase Average Check](#8-upselling) 9. [Working with International Guests](#9-working-with-international-guests) 10. [KDS and Kitchen: Working with Orders](#10-kds-and-kitchen) 11. [Delivery and Pickup](#11-delivery-and-pickup) 12. [Staff Checklists](#12-checklists) 13. [Onboarding a New Employee](#13-onboarding-a-new-employee) --- ## 1. Introduction to HORECA **HORECA** (Hotel, Restaurant, Catering) is the hospitality industry. It includes restaurants, cafés, bars, hotels, catering, and any venue where guests are served. ### Key principles - **The guest comes first** — every guest should feel welcome - **Speed** — fast service without sacrificing quality - **Attention to detail** — small things create the impression - **Teamwork** — front of house and kitchen work as one system - **Continuous improvement** — learn from every service ### What guests value most 1. **Speed** — quick greeting, quick serving 2. **Friendliness** — smile, eye contact, genuine interest 3. **Competence** — menu knowledge, ability to recommend 4. **Cleanliness** — table, dishes, dining area, restroom 5. **Food quality** — taste, presentation, temperature, portion --- ## 2. Guest Service Standards ### Service stages | Stage | Action | Time | |------|----------|-------| | 1. Greeting | Welcome, escort to the table | Immediately upon entry | | 2. Seating | Offer a seat, provide the menu (or point to the QR code) | 30 seconds | | 3. First contact | Introduce yourself, offer drinks | 2 minutes | | 4. Taking the order | Write down the order, clarify preferences | 5–7 minutes | | 5. Serving drinks | Bring drinks | 3–5 minutes | | 6. Serving food | Serve in the correct sequence | As ready | | 7. Check-back | Ask "Is everything okay?" | 2 min after serving | | 8. Dessert / coffee | Offer additionally | After the main course | | 9. Bill | Bring quickly upon request | 1–2 minutes | | 10. Farewell | Thank them, invite them back | When leaving | ### Communication rules - **Smile** — sincerely, not formally - **Use the guest's name** — if they introduced themselves - **Don't interrupt** — let them finish the order - **Repeat the order** — to avoid mistakes - **Don't argue** — even if the guest is wrong - **Be proactive** — offer, don't wait ### What you must not do - ❌ Ignore the guest (even if you're busy) - ❌ Discuss guests among yourselves - ❌ Use your phone in front of guests - ❌ Eat/drink in front of guests - ❌ Argue with a guest - ❌ Say "That's not my area / not my shift" --- ## 3. Working with the Cenaly Digital Menu ### How to explain the QR menu to a guest **Waiter script:** > "Welcome! Our menu is available via the QR code on the table—just point your phone camera at it. The menu is in your language with photos of all dishes. If anything is unclear, I'm always nearby!" ### Frequently asked guest questions | Question | Answer | |--------|-------| | "I don't have internet" | "Our Wi-Fi: [network name], password: [password]" | | "My phone won't scan the QR" | "Open your camera and point it at the code. Or I can bring a tablet with the menu" | | "I want a regular paper menu" | "Of course! One moment. But the QR menu has photos of all dishes and translations—it can be convenient" | | "How do I order via my phone?" | "Choose items in the menu, tap 'Order'—the order will go straight to the kitchen" | | "Can I pay via my phone?" | "Yes, if we have online payment enabled — with a card right in the menu (and on an iPhone or Android, via Apple Pay / Google Pay too, if our acquiring bank supports them)" | > ⚠️ Check with your manager about payment. Guest online payment is an opt-in extension: the venue connects its own payment-provider account, and until that is done there is no payment button in the menu at all. Apple Pay and Google Pay are not connected as separate methods — they only appear if the connected acquirer offers them. ### Helping a guest with the QR menu 1. Show where the QR code is located on the table 2. Show how to switch the language (the language-flag button at the top) 3. Explain the structure: categories → dishes → photos → price 4. Show where allergens are (icons next to the dish) 5. If the guest orders via phone, confirm the order on the tablet ### When the QR menu doesn't work In exceptional cases (guest without a phone, elderly guest, children): - Offer the venue's **tablet** with the menu open - Keep **a few paper copies** as a backup - Personally describe dishes and take the order verbally --- ## 4. Staff Roles and Responsibilities ### Host/Hostess - Greets guests at the entrance - Escorts to a table, considering dining room load - Manages reservations and the queue - Creates the first impression of the venue ### Waiter/Server - Serves guests from seating to farewell - Knows the menu, ingredients, allergens - Takes orders (verbally or confirms digital ones) - Serves food and drinks - Processes payment ### Bartender - Prepares drinks (alcoholic and non-alcoholic) - Serves guests at the bar counter - Knows the wine list, cocktails, craft beer ### Chef/Cook - Prepares dishes according to recipe cards - Controls quality and plating - Follows sanitary standards - Tracks product expiration dates ### Floor Manager - Coordinates staff work - Resolves conflict situations - Controls service standards - Analyzes reports and KPIs --- ## 5. Food Safety and Hygiene ### Golden rules 1. **Wash your hands** — before work, after the restroom, after contact with raw products 2. **Separate** — raw and ready-to-eat, meat and vegetables (different boards, knives) 3. **Store correctly** — fridge ≤4°C, freezer ≤-18°C 4. **Cook thoroughly** — minimum internal cooking temperatures 5. **Follow FIFO** — First In, First Out ### Temperature control | Product | Storage | Serving | |---------|----------|--------| | Meat (raw) | ≤4°C | — | | Poultry (cooked) | — | ≥74°C | | Fish | ≤2°C | ≥63°C | | Dairy | ≤4°C | — | | Hot dishes (serving) | — | ≥63°C | | Cold dishes (serving) | — | ≤8°C | ### Personal hygiene - Clean uniform every shift - Hair tied back (or under a cap in the kitchen) - No jewelry on hands (kitchen) - Nails trimmed short - Cover wounds with a bandage + gloves - If sick (fever, vomiting, diarrhea) — **do not come to work** ### HACCP — basics HACCP (Hazard Analysis and Critical Control Points) is a food safety management system: - Identify hazards (biological, chemical, physical) - Identify critical control points - Set limits - Monitor - Document --- ## 6. Allergens ### 14 main allergens (EU) Every employee MUST know the 14 allergens: 1. 🌾 Gluten (wheat, rye, barley) 2. 🦐 Crustaceans 3. 🥚 Eggs 4. 🐟 Fish 5. 🥜 Peanuts 6. 🫘 Soybeans 7. 🥛 Milk (lactose) 8. 🌰 Nuts (almonds, hazelnuts, cashews, walnuts) 9. 🥬 Celery 10. 🟡 Mustard 11. ⚪ Sesame 12. 🧪 Sulphites (sulfur dioxide) 13. 🌿 Lupin 14. 🦪 Molluscs ### What to do when asked about allergens 1. **Don't guess** — if you're not sure, ask the chef 2. **Check in the system** — allergens are listed for each dish in Cenaly 3. **Warn the kitchen** — mark the order as "allergy" 4. **Prevent cross-contamination** — separate dishes, tools ### Anaphylactic shock — emergency actions 1. **Call an ambulance** (112 / local number) 2. Help the guest take a **comfortable position** (sitting if breathing is difficult) 3. If there is an **EpiPen** (epinephrine) — help them use it 4. **Do not give food or water** 5. Stay with the guest until the ambulance arrives --- ## 7. Handling Complaints and Conflicts ### The LAST method | Step | Action | Example | |-----|----------|--------| | **L** — Listen | Listen without interrupting | "Please tell me what happened" | | **A** — Apologize | Apologize sincerely | "I'm very sorry this happened" | | **S** — Solve | Offer a solution | "Let me replace the dish / apply a discount" | | **T** — Thank | Thank them for the feedback | "Thank you for telling us—we'll improve" | ### Typical situations | Complaint | Solution | |--------|---------| | Long wait | Apology + complimentary item (dessert/drink) | | Dish is cold | Immediate replacement | | Hair in food | Replace the dish + apology + discount | | Wrong order | Fix + apology | | Too noisy | Offer another table | | Incorrect bill | Check and correct in front of the guest | ### Rules - **Never argue** with a guest - **Resolve immediately** — don't postpone - **Inform the manager** — for serious complaints - **Record it** — in the system (for analytics and improvement) --- ## 8. Upselling ### What upselling is Upselling is offering the guest additional items or more expensive options. It is NOT pushy selling — it's care and expertise. ### Techniques | Technique | Example | |---------|--------| | **Recommendation** | "Our house wine pairs perfectly with this steak" | | **Upgrade** | "For +200₽ you can get a larger portion—enough for two" | | **Dessert** | "Today we have fresh chef's tiramisu—I recommend it!" | | **Drinks** | "A glass of Chianti goes great with pasta" | | **Combo** | "Business lunch: soup + main + drink—save 15%" | ### Upselling rules - ✅ Recommend what you personally like / know well - ✅ Maximum 1–2 suggestions per visit - ✅ Consider the context (budget, mood, group) - ❌ Don't push - ❌ Don't recommend the most expensive item "just because" ### Impact on average check Proper upselling increases the average check by **15–25%** without leaving a negative impression. --- ## 9. Working with International Guests ### Language barrier - **Cenaly QR menu** solves 90% of issues — the menu automatically appears in the guest's language - Learn basic phrases in the main tourist languages - Use gestures and a smile - As a last resort — Google Translate on your phone ### Basic phrases | Russian | English | Deutsch | Français | |---------|---------|---------|----------| | Welcome! | Welcome! | Willkommen! | Bienvenue! | | Here is your table | Here is your table | Hier ist Ihr Tisch | Voici votre table | | Our menu is via QR code | Our menu is via QR code | Unsere Speisekarte per QR-Code | Notre menu par QR code | | Enjoy your meal! | Enjoy your meal! | Guten Appetit! | Bon appétit! | | Thank you, goodbye! | Thank you, goodbye! | Danke, auf Wiedersehen! | Merci, au revoir! | ### Cultural specifics - 🇸🇦🇦🇪 **Arab guests** — halal menu, separate family area - 🇮🇱 **Jewish guests** — kosher menu, Shabbat - 🇮🇳 **Indian guests** — vegetarian options, no beef - 🇯🇵 **Japanese guests** — value quiet and attention to detail - 🇺🇸 **American guests** — expect fast service, large portions --- ## 10. KDS and Kitchen ### Kitchen Display System (KDS) in Cenaly KDS is a kitchen screen that replaces paper tickets: 1. The order comes from the QR menu / from the waiter → appears on the screen 2. The chef sees: dish, quantity, comments, table number 3. The chef taps "Start" → the status updates 4. Dish is ready → "Ready" → the waiter receives a notification ### Priorities - 🔴 Red — the order has been waiting more than 15 minutes (critical) - 🟡 Yellow — the order has been waiting more than 10 minutes - 🟢 Green — the order is within the normal range ### Front-of-house / kitchen coordination - The waiter confirms the order → the kitchen starts work - The kitchen is ready → the waiter picks up and serves - If delayed → the kitchen informs the floor → the waiter warns the guest --- ## 11. Delivery and Pickup ### Packaging - Use thermal packaging for hot dishes - Separate sauces and salads (so they don't get soggy) - Check order completeness before sending - Add napkins, cutlery, a business card with a QR code ### Courier workflow 1. Check the order against the checklist 2. Pack into a thermal bag 3. Deliver at the specified time 4. Hand over to the customer, take payment (if cash) 5. Mark "Delivered" in the system ### Pickup 1. Customer orders via Cenaly → selects a time 2. Kitchen prepares by the specified time 3. Customer arrives → states the order number 4. Hand over the packed order --- ## 12. Checklists > These checklists do not have to live on paper: the platform has a [shift tasks board](/en/docs/tasks) with checklist templates. A template is materialised by itself when the cash shift opens, the assignee is picked by role, and closing an item can be required to carry a photo or a note. Whatever is left open is visible to the next shift. ### Opening shift (front of house) - [ ] Check cleanliness of tables, chairs, floor - [ ] Check QR codes on tables (in place, not damaged) - [ ] Turn on the tablet / KDS - [ ] Check availability of napkins, cutlery, spices - [ ] Check the restroom (cleanliness, soap, paper) - [ ] Check the temperature in the dining area - [ ] Check music / lighting - [ ] Review the stop list (what's unavailable today) - [ ] Review promotions / daily specials ### Closing shift (front of house) - [ ] All tables are clean - [ ] All orders are closed - [ ] Cash register is reconciled - [ ] Equipment is turned off - [ ] Dining area is cleaned ### Opening shift (kitchen) - [ ] Check refrigerator temperatures - [ ] Check product expiration dates - [ ] Prepare prep items - [ ] Check the stop list → pass it to the floor - [ ] Turn on KDS - [ ] Check cleanliness of work surfaces --- ## 13. Onboarding a New Employee > Onboarding is automated too: an "Onboarding: waiter / cook / cashier" checklist is materialised on the tasks board as soon as the employee is hired, while menu and policy training is handled by the **Training** section — learning materials and quizzes are built from the [Knowledge Base](/en/docs/knowledge-base), repetition is scheduled along the forgetting curve, and the owner sees per-employee accuracy and weak topics. A learning track can be assigned with a due date. ### First week | Day | Program | |------|-----------| | 1 | Introduction to the venue, team, rules. Tour. Paperwork | | 2 | Menu study (categories, items, ingredients, allergens) | | 3 | Working with the Cenaly system (admin panel, QR menu, KDS) | | 4 | Observing an experienced colleague (shadowing) | | 5 | First independent service under mentor supervision | ### What an employee should know after 1 week - [ ] All categories and key menu items - [ ] Ingredients of the TOP 10 dishes - [ ] 14 allergens and how to check them in the system - [ ] How the QR menu works (explain it to a guest) - [ ] How to take / confirm an order - [ ] Service standards (stages, timing) - [ ] Where everything is (kitchen, bar, storage, restroom) ### What an employee should know after 1 month - [ ] Full menu assortment and dish ingredients - [ ] Pairing recommendations (wine + dish) - [ ] Upselling techniques - [ ] Handling complaints (LAST) - [ ] Basic phrases in the main tourist languages - [ ] All Cenaly system features - [ ] Food safety standards ### Assessment After 1 month — oral assessment: 1. Name the 14 allergens 2. Describe the ingredients of 5 random dishes 3. How do you explain the QR menu to a guest? 4. What do you do if a guest complains about a cold dish? 5. Recommend a wine for fish / meat / pasta --- ## Useful resources - 📖 [Cenaly Quick Start](/en/docs/getting-started) — how to start using the platform - 📖 [QR Menu — Complete Guide](/en/docs/qr-menu) — menu creation and setup - 📖 [Allergens and Nutrients](/en/docs/allergens) — EU regulation - 📖 [Orders](/en/docs/orders) — order setup - 📖 [Product Knowledge Base](/en/docs/kb-product) — reference for all Cenaly features --- # Integrations — POS, delivery, messengers, API ## Overview Cenaly integrates with popular automation systems, payment platforms, delivery services, and messengers. This makes it possible to embed the digital menu into your venue's existing infrastructure. --- ## POS Systems ### Supported POS | POS system | Region | Integration type | |------------|--------|------------------| | **iiko** | 🇷🇺🇺🇦🇰🇿 CIS | Two-way API | | **Poster POS** | 🇺🇦🇷🇺 CIS | API | | **1C:Food Service** | 🇷🇺 Russia | Data export | | **MoySklad** | 🇷🇺 Russia | API | | **SumUp** | 🇪🇺 Europe | Payment terminal | | **Square** | 🇺🇸🇬🇧 USA, United Kingdom | API | ### What gets synced - **Menu** → items, prices, categories are synced both ways - **Orders** → orders from Cenaly automatically appear in the POS - **Inventory** → stock levels are updated upon sale - **Reports** → data is combined for a complete picture ### Setup (example: iiko) 1. In the Cenaly panel → **Settings** → **Integrations** → **iiko** 2. Enter the iiko API key 3. Select the restaurant and terminal 4. Configure category and item mapping 5. Enable synchronization --- ## Delivery Platforms ### Aggregators | Platform | Regions | |----------|---------| | **Uber Eats** | 🌍 Global | | **Glovo** | 🇪🇸🇮🇹🇵🇱🇷🇴🇬🇪 Europe, Georgia | | **Yemeksepeti** | 🇹🇷 Turkey | | **Getir** | 🇹🇷 Turkey | | **Trendyol** | 🇹🇷 Turkey | | **Just Eat** | 🇬🇧🇳🇱🇩🇰 Europe | | **Deliveroo** | 🇬🇧🇫🇷🇦🇪 Europe, Middle East | | **Wolt** | 🇫🇮🇩🇰🇬🇪 Europe, Georgia | | **Bolt Food** | 🇪🇪🇱🇻🇱🇹 Baltics, Europe | ### Benefits of your own delivery With Cenaly, you can accept delivery orders **directly**, bypassing aggregators: - 0% commission (aggregators charge 15–30%) - Full control over your customer base - Ability to offer a discount to the customer and still earn more --- ## Messengers ### Telegram - **Mini App** — a full-featured menu inside Telegram - **Ordering bot** — accept orders via a bot - **Notifications** — broadcasts, promotions, order status More details: [Telegram Mini App — guide](telegram) ### WhatsApp - **Order button** — the guest builds a cart in the QR menu and sends the order as a ready-made WhatsApp message (wa.me link, no server or Business API) - **Mirrored in the admin panel** — the order is also recorded in the Orders section with the WhatsApp channel Learn more: [WhatsApp Integration — guide](integration-whatsapp) --- ## Hardware ### Receipt printers | Manufacturer | Models | Connection | |--------------|--------|------------| | **Epson** | TM-T20III, TM-T88VI | USB, Ethernet, Wi-Fi | | **Star Micronics** | TSP143III, mC-Print3 | USB, Bluetooth, Wi-Fi | ### Kitchen Display System (KDS) - Any tablet or Smart TV - Works via a web browser - No app installation required ### Payment terminals | Terminal | Region | |----------|--------| | **SumUp** | 🇪🇺 Europe | | **Square** | 🇺🇸🇬🇧 USA, UK | | **iZettle** | 🇪🇺 Europe | --- ## API and Webhooks ### REST API Cenaly provides a full REST API for: - Menu management (CRUD for items, categories) - Retrieving orders - Customer base management - Analytics ### MCP Protocol For AI assistants (Claude, ChatGPT, Cursor) there are two MCP servers. The **guest** one — menu, orders and reservations on behalf of a guest, no key ([Guest API](llm-api)). **Your phone system's MCP** — call log, recordings, click-to-call, forwarding and call rules with a key from "Telephony → API & MCP" or via OAuth. - More details: [Telephony → API & MCP](telephony) ### Webhooks Configure webhooks to receive event notifications: - New order - Order status change - New customer - Payment --- ## Accounting | System | Format | Description | |--------|--------|-------------| | **1C:Accounting** | XML/API | Automatic export | | **MoySklad** | API | Real-time synchronization | | **Excel** | XLSX/CSV | Manual export | | **QuickBooks** | CSV | Transaction export | --- ## Marketing Integrations | Service | Purpose | |---------|---------| | **Google Analytics** | Track menu views | | **Facebook Pixel** | Retargeting based on views | | **Google Maps** | Display the venue on the map | | **TripAdvisor** | Link to reviews | | **Instagram** | Link to the menu in the profile | --- ## 8. Delivery Zone Management ### Setup 1. **Settings** → **Delivery** → **Zones** 2. Draw zones on the map (polygons) or specify a radius 3. For each zone, set: | Parameter | Example | |----------|---------| | Delivery fee | Zone 1: free, Zone 2: 5₾, Zone 3: 10₾ | | Minimum order amount | 20₾ / 30₾ / 50₾ | | Delivery time | 20 min / 35 min / 50 min | | Availability | Mon–Fri 10:00–22:00 | ### Own delivery vs aggregators - **Own**: venue couriers, full control, lower commission - **Aggregators** (Glovo, Wolt, Bolt Food): wider reach, but 15–30% commission - **Hybrid**: own delivery in nearby zones + aggregators in farther ones --- ## 9. SEO for the Restaurant Website ### Automatic SEO optimization Cenaly automatically generates: - **Meta tags**: title, description for each page - **Schema.org**: structured data (Restaurant, Menu, MenuItem) - **Open Graph**: preview when shared on social networks - **Sitemap.xml**: sitemap for search engines - **Robots.txt**: indexing rules ### Recommendations - Connect **Google Search Console** for monitoring - Use a **custom domain** (menu.yourrestaurant.com) - Fill in the **venue description** in detail (for Google Maps) - Add **photos** — they are indexed by Google Images - Enable **reviews** — the rating is shown in search results --- # Wolt Integration Connect your restaurant to the Wolt platform to receive delivery orders. --- ## 1. Overview **Wolt** is one of the largest food delivery platforms in Europe (25+ countries). Integration with Cenaly allows you to: - **Sync the menu** — changes in Cenaly are automatically updated in Wolt - **Receive orders** — orders from Wolt flow into Cenaly's unified order system - **Manage the stop list** — an item in the stop list is hidden in Wolt as well - **Unified analytics** — revenue via Wolt is shown in the overall dashboard --- ## 2. Requirements To connect, you need: - ✅ A Cenaly account (plan **Basic** or higher) - ✅ An active Wolt for Merchants account - ✅ Access to the **Wolt Merchant Portal** (merchant.wolt.com) - ✅ An API key from Wolt (requested from your Wolt manager) --- ## 3. Step-by-step setup ### Step 1. Get an API key from Wolt 1. Log in to the [Wolt Merchant Portal](https://merchant.wolt.com) 2. Go to **Settings** → **Integrations** → **API Access** 3. Click **Generate API Key** 4. Copy the key (it is shown only once) > ⚠️ If you don't have the API Access item, contact your Wolt manager and request access to the Restaurant API. ### Step 2. Connect in Cenaly 1. In the Cenaly admin panel: **Settings** → **Integrations** → **Delivery** 2. Find **Wolt** → click **Connect** 3. Enter: - **Venue ID** (from the Wolt Merchant Portal → your restaurant's URL) - **API Key** (from step 1) 4. Click **Test connection** 5. If the connection is successful: **Save** ### Step 3. Configure menu synchronization | Parameter | Description | Recommendation | |----------|-------------|----------------| | Menu auto-sync | Send changes to Wolt automatically | ✅ Enable | | Price sync | Use the same prices or separate ones for Wolt | Your choice | | Stop-list sync | Automatically hide unavailable items | ✅ Enable | | Photo sync | Send dish photos to Wolt | ✅ Enable | | Categories | Mapping Cenaly categories → Wolt categories | Configure manually | ### Step 4. Configure order intake 1. **Settings** → **Integrations** → **Wolt** → **Orders** 2. Choose the intake method: - **Automatic** — orders are accepted immediately - **With confirmation** — a manager confirms each order 3. Set the default preparation time (min) 4. Select a KDS screen for Wolt orders (or a shared one) --- ## 4. Working with orders ### Order flow ``` Guest orders in Wolt ↓ Order arrives in Cenaly (tagged 🟣 Wolt) ↓ Displayed on the kitchen KDS screen ↓ Kitchen prepares → marks "Ready" ↓ Wolt receives the status → courier picks up ``` ### Order statuses | Status in Cenaly | What happens in Wolt | |--------------|-----------------------| | Accepted | Wolt starts looking for a courier | | Preparing | The courier is heading to the restaurant | | Ready | The courier picks up the order | | Rejected | Wolt notifies the guest | ### Differences from regular orders - Wolt orders are marked with a **purple label** 🟣 - Restaurant price = Wolt price minus commission (15–30%) - Preparation time is sent to the courier automatically - You can't change an order after confirmation (Wolt limitation) --- ## 5. Pricing for Wolt You can set **separate prices** for Wolt: 1. **Menu** → select an item → **Channel pricing** 2. Enable **"Separate price for Wolt"** 3. Set the price (usually +15–25% to cover the commission) Or use a **default markup**: - **Settings** → **Integrations** → **Wolt** → **Markup**: +20% --- ## 6. Managing the availability schedule Set Wolt operating hours separately from your main schedule: - **Settings** → **Integrations** → **Wolt** → **Schedule** - You can reduce hours (e.g., not accepting delivery during peak time) - Emergency shutdown: **"Pause Wolt"** button (for 30/60/120 min) --- ## 7. Wolt analytics In **Analytics** → filter **"Channel: Wolt"**: - Number of orders via Wolt - Average check (before and after commission) - Top items on Wolt - Comparison with direct orders (via QR) - Average preparation time --- ## 8. FAQ ### How do I temporarily stop accepting Wolt orders? **Settings** → **Integrations** → **Wolt** → **Pause** (30/60/120 min). Or the "Pause Wolt" button directly from the orders dashboard. ### Wolt shows an old menu — what should I do? Click **Settings** → **Integrations** → **Wolt** → **Force sync**. Updates in Wolt take 5–15 minutes. ### Can I use Wolt and my own delivery at the same time? Yes. Wolt orders and direct orders are shown in one order list, but marked with different colors. ### Wolt commission? Wolt charges 15–30% of the order amount (depends on your contract). Cenaly shows amounts with and without commission in analytics. --- ## 9. Wolt countries and cities Wolt operates in 25+ countries: | Region | Countries | |--------|-----------| | Scandinavia | Finland, Sweden, Denmark, Norway | | Central Europe | Germany, Austria, Czechia, Hungary, Poland | | Southern Europe | Greece, Croatia, Slovenia, Cyprus, Malta | | Baltics | Latvia, Lithuania, Estonia | | Caucasus & Central Asia | Georgia, Azerbaijan, Kazakhstan | | Other | Israel, Japan | --- ## 10. Support - **Wolt for Merchants:** merchant.wolt.com → Support - **Cenaly:** support@cenaly.com → subject "Wolt integration" - **Wolt API documentation:** developer.wolt.com --- # Glovo Integration Connecting your restaurant to the Glovo platform to receive delivery orders. --- ## 1. Overview **Glovo** is the largest delivery platform in Southern Europe, Eastern Europe, and Central Asia (25+ countries). Integration with Cenaly allows you to: - **Sync the menu** — changes in Cenaly are updated in Glovo - **Receive orders** — orders from Glovo flow into the unified Cenaly system - **Manage the stop list** — unavailable items are hidden in Glovo as well - **Unified analytics** — Glovo data in a single dashboard --- ## 2. Requirements - ✅ Cenaly account (plan **Basic** or higher) - ✅ Active Glovo for Partners account - ✅ Access to the **Glovo Manager Portal** (managers.glovoapp.com) - ✅ Store ID from Glovo (from your dashboard or from your manager) --- ## 3. Step-by-step setup ### Step 1. Get connection details from Glovo 1. Log in to the [Glovo Manager Portal](https://managers.glovoapp.com) 2. Go to **Settings** → **Integrations** 3. Write down your **Store ID** (unique location identifier) 4. Request from your Glovo manager: - **API Token** for the integration - Confirmation that POS integration has been activated > 💡 With Glovo, the integration is activated on Glovo's side. Your manager must enable "POS Integration" for your location. ### Step 2. Connect in Cenaly 1. **Settings** → **Integrations** → **Delivery** → **Glovo** 2. Click **Connect** 3. Enter: - **Store ID** - **API Token** 4. Click **Test connection** 5. If successful: **Save** ### Step 3. Menu mapping Glovo uses its own catalog structure. After connecting: 1. The system will suggest **automatic mapping** of categories 2. Verify the match: | Category in Cenaly | Category in Glovo | |-----------------|-------------------| | Pizza | Pizza | | Salads | Salads | | Drinks | Drinks | | Desserts | Desserts | 3. Adjust manually if needed 4. Click **Sync menu** ### Step 4. Configure orders | Parameter | Description | |----------|-------------| | Auto-accept | Orders are accepted automatically (recommended) | | Preparation time | Default: 20 minutes | | KDS screen | Select the screen for Glovo orders | | Notifications | Push / sound on new Glovo order | --- ## 4. Working with orders ### Order flow ``` Guest orders in the Glovo app ↓ Order arrives in Cenaly (tagged 🟠 Glovo) ↓ Appears on the KDS screen ↓ Kitchen prepares → marks "Ready" ↓ Glovo receives the signal → courier (glovers) picks up ``` ### Glovo order specifics - Marked with an **orange label** 🟠 - The Glovo courier arrives at the readiness time you specify - **Glovo Express** orders require preparation within 15 minutes - You can reject an order with a reason ### Statuses | Action in Cenaly | Result in Glovo | |----------------|------------------| | Accept order | Courier starts heading to the restaurant | | Start cooking | Courier ETA is updated | | Ready | Courier receives "Order is ready" notification | | Reject | Glovo offers the guest an alternative | --- ## 5. Pricing ### Separate prices for Glovo 1. **Menu** → item → **Channel pricing** → **Glovo** 2. Set the price for Glovo (usually +20–30% to cover the commission) ### Global markup **Settings** → **Integrations** → **Glovo** → **Markup**: +25% > 💡 Glovo's commission is usually 20–35% depending on the contract and country. --- ## 6. Glovo promotions You can participate in Glovo promotions: - **Delivery discount** — Glovo reduces the delivery fee - **2 for 1** — configured via Glovo Manager - **Promo codes** — created in the Glovo Manager Portal - **Glovo Prime** — your restaurant appears in a selection for subscribers Promotion data is displayed in Cenaly analytics. --- ## 7. Availability management - **Glovo pause**: button in the dashboard → pause for 30/60/120 min - **Schedule**: separate working hours for Glovo - **Holidays**: disable for specific dates - **Auto-pause**: when the kitchen is overloaded (> N active orders) --- ## 8. Analytics **Analytics** → filter **"Channel: Glovo"**: - Orders: count, average check, conversion - Popular items on Glovo - Preparation time: average, median - Glovo rating (if available via API) - Comparison: Glovo vs direct orders vs Wolt --- ## 9. Glovo countries | Region | Countries | |--------|----------| | Southern Europe | Spain, Portugal, Italy | | Eastern Europe | Ukraine, Romania, Bulgaria, Moldova, Croatia | | Caucasus & Central Asia | Georgia, Kazakhstan, Kyrgyzstan, Uzbekistan | | Africa | Morocco, Tunisia, Kenya, Uganda, Côte d'Ivoire, Ghana | | Other | Poland, Latvia, Lithuania | --- ## 10. FAQ ### How do I connect multiple locations to Glovo? Each location in Cenaly is connected separately with its own Store ID. For chains, configure from the master account. ### Glovo shows different prices — what should I do? Check the markup setting: **Settings** → **Integrations** → **Glovo** → **Markup**. Force sync: **"Update menu in Glovo"** button. ### Can I use Glovo + Wolt + my own delivery? Yes. All channels work in parallel. Orders from different channels are color-labeled: 🟠 Glovo, 🟣 Wolt, 🔵 Direct. --- ## 11. Support - **Glovo for Partners:** managers.glovoapp.com → Help - **Cenaly:** support@cenaly.com → subject "Glovo integration" - **Glovo Partner API:** developers.glovoapp.com --- # Integration with Yandex Eats Connecting your restaurant to the Yandex Eats platform to receive delivery orders. --- ## 1. Overview **Yandex Eats** is the largest food delivery platform in Russia, Belarus, Kazakhstan, Armenia, Kyrgyzstan, and Uzbekistan. Integration with Cenaly allows you to: - **Sync the menu** — a single source of truth: update in Cenaly → it updates in Yandex Eats - **Receive orders** — orders from Yandex Eats arrive in the unified order feed - **Manage the stop list** — automatic availability synchronization - **Unified analytics** — all delivery in one dashboard --- ## 2. Requirements - ✅ Cenaly account (plan **Basic** or higher) - ✅ Yandex Eats for restaurants account (vendor.eda.yandex.ru) - ✅ Connection to the **Yandex Eats API** (via your manager) - ✅ Restaurant identifier (Restaurant ID) --- ## 3. Step-by-step setup ### Step 1. Request API access 1. Log in to [Yandex Eats for Business](https://vendor.eda.yandex.ru) 2. Contact your Yandex Eats manager 3. Request: - Activation of **"POS integration"** for your location - **Client ID** and **Client Secret** for OAuth - **Restaurant ID** (location identifier) > ⚠️ API connection is approved by a Yandex Eats manager. It usually takes 3–5 business days. ### Step 2. Connect in Cenaly 1. **Settings** → **Integrations** → **Delivery** → **Yandex Eats** 2. Click **Connect** 3. Enter: - **Restaurant ID** - **Client ID** - **Client Secret** 4. The system will perform OAuth authorization 5. If the connection is successful: **Save** ### Step 3. Menu synchronization After connecting: 1. Cenaly will send your current menu to Yandex Eats 2. Check category mapping: | Cenaly | Yandex Eats | |------|------------| | Category → Category | | Item → Product | | Variant (size) → Option | | Modifier (add-on) → Modifier | 3. Photos are sent automatically (Yandex Eats requirement: min. 1200×800 px) 4. Moderation: Yandex Eats reviews photos (1–3 days) ### Step 4. Configure order acceptance | Parameter | Description | |----------|-------------| | Auto-accept | Automatic confirmation (up to 3 min to cancel) | | Prep time | Default, or per category | | KDS screen | Separate or shared | | Sound | Separate sound for Yandex Eats orders | --- ## 4. Working with orders ### Order flow ``` Guest places an order in the Yandex Eats app ↓ Order arrives in Cenaly (marked 🔴 Yandex Eats) ↓ Appears on the KDS screen ↓ Kitchen cooks → "Ready" ↓ Yandex Eats dispatches a courier ↓ Courier picks up → delivers to the guest ``` ### Specifics - Orders are marked with a **red label** 🔴 - Yandex Eats manages the courier — you only need to cook - **Confirmation**: 3 minutes to confirm or auto-cancel - Orders with **"Plus"** have delivery priority ### Stop list - An item on the Cenaly stop list → automatically hidden in Yandex Eats - Removing from the stop list → the item appears in 2–5 minutes - Bulk stop: **"Pause Yandex Eats"** button --- ## 5. Pricing ### Separate prices 1. **Menu** → item → **Channel pricing** → **Yandex Eats** 2. Set the price (usually +15–25%) ### Global markup **Settings** → **Integrations** → **Yandex Eats** → **Markup**: +20% > 💡 Yandex Eats commission: 15–35% depending on plan and region. ### Promotions Promotions are created in the vendor.eda.yandex.ru dashboard: - Discount on the first order - Free delivery - Combo deals - Promo codes Promotion data is visible in Cenaly analytics. --- ## 6. Working with reviews Yandex Eats sends reviews via the API: - Reviews are shown in **Marketing** → **Reviews** → filter **"Yandex Eats"** - Replying to a review from Cenaly → is published in Yandex Eats - The restaurant rating on Yandex Eats is displayed in the dashboard --- ## 7. Analytics **Analytics** → filter **"Channel: Yandex Eats"**: - Number of orders, average check - Top-selling items - Prep time (average, p50, p90) - Rating and reviews - Channel comparison: Yandex Eats vs Glovo vs Wolt vs direct --- ## 8. Yandex Eats regions | Country | Cities | |--------|--------| | Russia | Moscow, Saint Petersburg, and 100+ cities | | Kazakhstan | Almaty, Astana, Shymkent | | Belarus | Minsk | | Armenia | Yerevan | --- ## 9. FAQ ### How do I connect Yandex Eats + Glovo at the same time? Each platform is connected independently. Orders from different platforms are color-labeled: 🔴 Yandex Eats, 🟠 Glovo, 🟣 Wolt, 🔵 Direct. ### The Yandex Eats manager is not responding Write to partners@eda.yandex.ru including the Restaurant ID and a request for API integration. Typical response time is 3–5 business days. ### Can I sync only part of the menu? Yes. In each item's settings there is a **"Show on Yandex Eats"** flag. You can exclude expensive or highly perishable items. ### What happens if the internet goes down? Cenaly pauses Yandex Eats orders. When connectivity is restored, it resumes automatically. If the pause is > 15 minutes, Yandex Eats temporarily hides the restaurant in the catalog. --- ## 10. Support - **Yandex Eats:** vendor.eda.yandex.ru → Help - **Cenaly:** support@cenaly.com → subject "Yandex Eats integration" - **API documentation:** yandex.ru/dev/eda --- # WhatsApp Integration — orders in one tap Accept orders through WhatsApp — the way it's done across Latin America ("Pedir por WhatsApp"), the Middle East, India and Southeast Asia. A guest builds a cart in your QR menu, taps the green button — and the order opens as a ready-made message in a WhatsApp chat with your restaurant. --- ## 1. Overview **WhatsApp is the primary ordering channel** in many countries: in Brazil, Mexico, Argentina and Colombia it's used by over 90% of smartphone owners, and for most small restaurants the chat itself is the "order management system". The Cenaly integration uses the official **WhatsApp click-to-chat** mechanism (`wa.me` links): - **Fully serverless** — the order is composed right on the guest's device and opens in the WhatsApp app. No middleman servers, bots or webhooks. - **No WhatsApp Business API required** — a regular WhatsApp account or the free WhatsApp Business app on the restaurant's phone is enough. - **0% commission** — unlike delivery aggregators (15–30%). - **The order is mirrored in Cenaly** — it's also recorded in the admin panel's Orders section tagged with the WhatsApp channel, so history and analytics are preserved. > 💡 There is a second, independent scenario: connect a **WhatsApp Business (Cloud API)** number as an inbound channel of the guest chat — then conversations with guests land in the shared inbox ("Team chat" → "Guests" section). It isn't needed for the order button; you enable it in the **"My site"** hub → **Chat** → the **"🔌 Channels"** block (you'll need the Phone Number ID and an access token from your Meta account). The channel is available on AWS brands (cenaly.com, cenaly.com…); on cenaly.ru there is no inbound receiver yet, so the connect block isn't shown. ### What the guest sees 1. The guest scans the QR code and opens the menu. 2. Adds dishes to the cart, picks delivery or pickup, enters name, phone and address. 3. Taps the green **"Order via WhatsApp"** button. 4. WhatsApp opens with the order text already filled in — all that's left is to hit "Send". 5. The restaurant receives the order as a regular message and replies right in the chat: confirmation, timing, payment. ### Message example ``` 🍽 Cantina La Plaza — Order #1042 ▪ 2× Tacos al pastor — 180 ₾ · Size: large · + Guacamole ▪ 1× Lemonade — 40 ₾ *Total: 220 ₾* 📦 Delivery 📍 Address: 12 Rustaveli st., apt. 5 👤 Name: Maria 📞 Phone: +995 555 123 456 💵 Payment: cash ``` The text is generated in the language the guest was browsing the menu in. --- ## 2. Requirements - ✅ A Cenaly account with a configured location - ✅ A phone number with WhatsApp (regular or WhatsApp Business) - ✅ Ordering enabled in the menu (cart not disabled) Nothing else: no API keys, no Meta verification, no separate server. --- ## 3. Two-minute setup 1. Open the **Admin Panel** → **Locations** → pick a location. 2. Find the **"Delivery & Pickup"** section. 3. Enable the **"Accept orders via WhatsApp"** checkbox. 4. Enter the **WhatsApp number** in international format, e.g. `+995 555 123 456`. - If left empty, the WhatsApp number from the location's contacts section is used. 5. Changes save automatically — the button appears in the client menu once the profile syncs. > 💡 Also enable "Delivery enabled" and/or "Pickup enabled" so the guest can choose how to receive the order. With both off, the order is placed as a dine-in order. --- ## 4. Handling orders | Step | Action | |------|--------| | 1 | The order arrives as a WhatsApp message | | 2 | Confirm it with a reply (prep time, total) | | 3 | In parallel the order shows up in **Admin → Orders** with the "WhatsApp" channel | | 4 | Update the order status in the admin panel as usual — the guest sees it on the order page | **Tips:** - Use **WhatsApp Business**: quick replies, catalog, labels for orders. - Pin a reply template: "Got it! Cooking now, ready in ~30 minutes". - A separate WhatsApp number can be set per location. --- ## 5. FAQ **Do I need the WhatsApp Business API?** No. The integration uses official click-to-chat links (`wa.me`) which work with any WhatsApp account: the order button needs no API. It is only needed for the second scenario — if you want to run guest conversations inside the panel (the WhatsApp channel of the guest chat, see "Overview"). **What if the guest doesn't have WhatsApp installed?** The `wa.me` link opens WhatsApp Web in the browser. The regular "Place order" button also remains available. **Is the order recorded even if the guest never taps "Send" in WhatsApp?** Yes, the order is recorded in the admin panel the moment the button is tapped. Even if the WhatsApp message never arrives, the order details are visible in the Orders section. **Can I use different numbers for delivery and pickup?** Currently one number per location. For different scenarios, create separate locations. **Does it work with group chats?** No, click-to-chat opens a direct chat with the specified number. --- ## Related articles - [Orders — receiving and processing](orders) - [Integrations — overview](integrations) - [Telegram Mini App](telegram) - [QR menu](qr-menu) --- # Connecting advertising platforms Cenaly.com lets you link ad accounts to each location. The **"Connected Platforms"** block lives in the **location card, in the "Marketing" section**: open **Locations**, click the location you need and scroll its card down to "Marketing". > **Can't see the block?** Check the **form density** switch in the header of the location card. > "Connected Platforms" belongs to the **"Full"** level only (which is the default); on "Standard" > and "Minimal" the block is hidden. Hidden fields are not deleted — the data is kept. Linking is an "address book" of ad accounts: it records which advertising account a location works with, so managers don't have to look the ID up again and so advertising activity can be matched against the venue's performance. > **Important:** In the field for each advertising platform, you must enter the **advertising account identifier** > (Account ID / Customer ID / Client ID), **not** a link to the personal account. > The system uses this ID to determine which specific account the location belongs to. > Because the field holds an ID, there is no button that opens the ad account from the location > card — while the field is empty, the only link next to it is the platform's sign-up page. > **Not all five platforms are on screen at once.** You see the ones whose ID is already filled in, > plus suggestion buttons for the platforms relevant to the location's country (for most countries > that is Google Ads and Meta Ads). The rest — "Yandex Direct", "VK Ads", "myTarget" outside their > markets — are hidden behind the **"+ N more platforms…"** link at the bottom of the block: click > it to add the field you need. --- ## Google Ads — Customer ID **Format:** `XXX-XXX-XXXX` (for example, `123-456-7890`) ### Where to find the Customer ID 1. Sign in to [Google Ads](https://ads.google.com) 2. In the top-right corner, next to the account name, the **Customer ID** is shown in the `XXX-XXX-XXXX` format 3. If you have multiple accounts, click the account icon and select the one you need 4. Copy the ID (digits with hyphens, no spaces) and paste it into the **Google Ads** field in the Cenaly location settings ### Manager account (MCC) If you use a Manager Account (MCC), each child account has its own Customer ID. Select the required client account in the left menu — the ID will appear at the top of the page. --- ## Meta Ads — Ad Account ID **Format:** `act_XXXXXXXXXX` or a numeric ID (for example, `act_123456789012`) ### Where to find the Ad Account ID 1. Open [Meta Business Suite](https://business.facebook.com) or [Ads Manager](https://www.facebook.com/adsmanager) 2. In the left menu, select **Ad Accounts** 3. Click the required account — the URL will include a parameter like `?act=XXXXXXXXXX` 4. Or go to **Business Settings → Ad Accounts** — the numeric identifier is shown there 5. Enter the ID in the `act_XXXXXXXXXX` format in the **Meta Ads** field in Cenaly ### Personal vs business account - **Personal ad account**: the ID is visible in the Ads Manager URL - **Business ad account**: configured in Business Manager → Business Settings → Ad Accounts --- ## Yandex Direct — Client login **Format:** Yandex account login (for example, `myrestaurant`) or a numeric Client ID ### Where to find the Client ID / login 1. Sign in to [Yandex Direct](https://direct.yandex.ru) 2. In the top-right corner, your account login is displayed (for example, `myrestaurant@yandex.ru`) 3. Use the **login without @yandex.ru** (only `myrestaurant`) or go to **Profile settings** to view the numeric Client ID 4. If you are an agency, in the left menu (**Clients**) select the required client and copy their login or ID 5. Paste the value into the **Yandex Direct** field in the Cenaly location settings ### Agency access When switching to a client in an agency account, the URL looks like `direct.yandex.ru/...?ulogin=clientlogin`. Use `clientlogin` as the identifier. --- ## VK Ads — Ad account ID **Format:** numeric identifier (for example, `1234567`) ### Where to find the account ID 1. Sign in to [VK Ads](https://ads.vk.com) 2. In the top-right corner, next to your name, the **account number** is displayed 3. The ID is also visible in the URL: `ads.vk.com/...?account_id=XXXXXXX` 4. Copy the numeric ID and paste it into the **VK Ads** field in Cenaly ### Multiple accounts If you have multiple ad accounts (for example, via an agency), select the required one in the dropdown at the top of the page. Each account ID is unique. --- ## myTarget — Client ID **Format:** numeric identifier (for example, `9876543`) ### Where to find the Client ID 1. Sign in to [myTarget](https://target.my.com) 2. Go to **Profile** (user icon → Profile) 3. In the **Account** section, the **Client ID** is shown — the numeric identifier of the ad account 4. Or the ID is visible in the URL: `target.my.com/agency/clients/...` 5. Copy the ID and paste it into the **myTarget** field in the Cenaly location settings ### Agency account If you work through an agency account, go to the **Clients** section and copy the ID of the required client account. --- ## Why this is needed | What linking an account provides | Description | |---|---| | Teamwork | Managers can see which ad account the location is using | | Analytics | Matching advertising activity with restaurant performance metrics | | Time savings | No need to look up the ID every time you set up campaigns | There is no jump into the ad account itself from the location card: the field stores an account identifier, not a link. --- ## Related articles - [Analytics and tracking pixels](/en/docs/analytics) — Google Analytics, Meta Pixel, Yandex Metrica - [Integrations](/en/docs/integrations) — POS, delivery platforms, messengers, API --- # Telegram Mini App — Step-by-Step Guide ## What is it? **Telegram Mini App** allows your customers to open the restaurant's digital menu directly inside Telegram — without installing apps or switching to a browser. The menu looks like a native part of Telegram: it adapts to the user's theme, supports the Back button and gestures. ### Benefits - 📱 **Inside Telegram** — customers don't need to switch to a browser - 🎨 **Native look** — colors, fonts and theme adapt to Telegram - 🔗 **Deep Links** — direct link to a specific restaurant's menu - 🌍 **Auto language** — language is taken from the user's Telegram settings - 🍪 **No cookies** — cookie banner is not shown inside Telegram --- ## Quick Start ### Step 1 — Create a bot Open [@BotFather](https://t.me/BotFather) in Telegram and send: ``` /newbot ``` 1. Enter the **bot name** (e.g., `Cenaly Menu Bot`) 2. Enter the **username** (e.g., `MeniMenuBot`) — must end with `Bot` 3. Save the received **Bot Token** (format: `123456789:ABCdefGHI...`) > 💡 If the bot is already created, proceed to Step 2. #### Why do you need a Bot Token? The Bot Token is a secret key for programmatic bot management via the [Telegram Bot API](https://core.telegram.org/bots/api). For basic Mini App setup (steps 2–4) it is **not required** — everything is done through BotFather. But you will need it if you want to: - **Send messages to customers** — order status notifications, promotions, welcome messages - **Add inline buttons** to bot messages (e.g., a "📋 Open menu" button — see section below) - **Create a Telegram bot for receiving orders** — the bot can receive and process orders - **Set up a Webhook** — receive events from Telegram (button presses, user commands) - **Integrate with CRM or POS system** — automatic order processing through the bot > 🔒 Don't publish the Bot Token — anyone who has the token can control your bot. If the token is compromised, revoke it with the `/revoke` command in BotFather. --- ### Step 2 — Create the Mini App Send BotFather the command: ``` /newapp ``` 1. **Select the bot** from the list 2. **Title** — application name (e.g., `Cenaly`) 3. **Description** — description (e.g., `Digital restaurant menu`) 4. **Photo** — upload a 640×640 px image (app icon) 5. **GIF** — animation (optional). To skip, send `/empty` 6. **Web App URL** — specify the address of your client application: ``` https://cenaly.com ``` 7. **Short Name** — short name for the link (e.g., `menu`) After this you will have a working link like: ``` https://t.me/YourBot/menu ``` --- ### Step 3 — Add a "Menu" button to the bot chat Send BotFather: ``` /setmenubutton ``` 1. Select the bot 2. Send the URL: ``` https://cenaly.com ``` 3. Enter the button text (e.g., `Open Menu` or `📋 Menu`) Now when opening a chat with the bot, a button will appear at the bottom of the screen that opens your application. --- ### Step 4 — Allow the domain Send BotFather: ``` /setdomain ``` Select the bot and specify the domain: ``` cenaly.com ``` This will allow Telegram Web App to work on your domain and all its subdomains (e.g., `locationid.cenaly.com`). --- ## Deep Links — links to a specific restaurant Telegram supports the `startapp` parameter, which is passed to the application when opened. Use it for links to a specific restaurant: | Link | What opens | |---|---| | `t.me/YourBot/menu` | Home page | | `t.me/YourBot/menu?startapp=LOCATION_ID` | Menu of a specific restaurant | | `t.me/YourBot/menu?startapp=LOCATION_ID__ru` | Menu in Russian | | `t.me/YourBot/menu?startapp=LOCATION_ID__en` | Menu in English | ### Examples If your restaurant's `LOCATION_ID` is `lnc2w74z`: ``` https://t.me/YourBot/menu?startapp=lnc2w74z https://t.me/YourBot/menu?startapp=lnc2w74z__ru https://t.me/YourBot/menu?startapp=lnc2w74z__en ``` > 📌 `LOCATION_ID` is the identifier of your location in cenaly.com. You can find it in the admin panel or in the URL like `https://LOCATION_ID.cenaly.com`. --- ## Inline buttons from the bot If your bot sends messages to customers, you can add an inline button that will open the menu: ### Option 1 — Web App button (opens immediately) ```json { "inline_keyboard": [[{ "text": "📋 Open menu", "web_app": { "url": "https://LOCATION_ID.cenaly.com/en" } }]] } ``` ### Option 2 — Deep Link button ```json { "inline_keyboard": [[{ "text": "📋 Open menu", "url": "https://t.me/YourBot/menu?startapp=LOCATION_ID__en" }]] } ``` --- ## What works automatically After connecting, the following features are automatically enabled inside Telegram: | Feature | Description | |---|---| | 🎨 **Theme** | App colors adapt to the Telegram theme (light/dark) | | ◀️ **Back button** | Native Telegram button appears when opening a product card | | 📏 **Viewport** | The application stretches to full screen | | 🔒 **Close protection** | Vertical swipe won't accidentally close the app | | 🌍 **Auto language** | Language is determined from the Telegram profile, unless set explicitly | | 🍪 **Cookies** | Cookie banner is not displayed inside Telegram | --- ## QR codes for restaurants Existing QR codes with URLs like `https://lnc2w74z.cenaly.com` will continue to work as usual — through the browser. For additional Telegram integration, you can place a second QR code on tables with a bot link: ``` https://t.me/YourBot/menu?startapp=lnc2w74z ``` --- ## Verification 1. Open the link `https://t.me/YourBot/menu` on your phone 2. Click **Start** (if opening the bot for the first time) 3. Click the **📋 Menu** button in the bottom panel of the chat 4. Make sure the app opened and loaded the menu 5. Try opening the deep link: `https://t.me/YourBot/menu?startapp=LOCATION_ID` ### Common problems | Problem | Solution | |---|---| | App doesn't open | Check that the domain `cenaly.com` is allowed via `/setdomain` | | White screen | Make sure the Web App URL is set to `https://cenaly.com` (HTTPS is required) | | `startapp` doesn't work | Check the format: `LOCATION_ID` (no spaces or special characters). Language separator is double underscore `__` | | Theme not applied | Telegram Mini App SDK must be connected (update the client application) | --- ## Useful links - [Telegram Mini Apps documentation](https://core.telegram.org/bots/webapps) - [BotFather](https://t.me/BotFather) - [Telegram Bot API — Web App buttons](https://core.telegram.org/bots/api#inlinekeyboardbutton) --- # Guest API for AI agents A public cenaly.com API that lets **AI assistants and agents act on behalf of a guest**: read a restaurant's menu, compose and place an order, reserve a table. No authentication — these are the same operations a guest performs on the menu website. > For the business owner there is the MCP of your own phone system, with a key: call log, click-to-call, forwarding, call rules — see [Telephony → API & MCP](/en/docs/telephony). ## Addressing a restaurant A restaurant is addressed by its **location code** — the uppercase segment of its menu URL. If the menu opens at `cenaly.com/MYCAFE`, the code is `MYCAFE`. The same code is embedded in table QR codes. ## Quick start (REST) ```bash # What the API can do curl https://api.cenaly.com/llm/v1 # Restaurant menu in English curl "https://api.cenaly.com/llm/v1/locations/MYCAFE/menu?lang=en" # Place a pickup order curl -X POST https://api.cenaly.com/llm/v1/locations/MYCAFE/orders \ -H 'Content-Type: application/json' \ -d '{ "items": [{"itemId": "abc123", "quantity": 2}], "orderType": "pickup", "customer": {"name": "Guest", "phone": "+995555123456"}, "language": "en" }' # → {"accepted": true, "orderId": "…", "total": 24, "statusUrl": "…"} # Order status (orderId is the secret access token) curl https://api.cenaly.com/llm/v1/locations/MYCAFE/orders/{orderId} ``` Full specification: [OpenAPI 3.1](https://api.cenaly.com/llm/v1/openapi.json). ### Endpoints | Method | Path | Purpose | |---|---|---| | GET | `/llm/v1/locations/{DOMAIN}/menu?lang=xx` | Menu: categories, items, prices, variants and addons, currency, fulfilment options | | GET | `/llm/v1/locations/{DOMAIN}/items/{itemId}` | A single item with its options | | POST | `/llm/v1/locations/{DOMAIN}/orders` | Place an order (the server validates items and computes totals) | | GET | `/llm/v1/locations/{DOMAIN}/orders/{orderId}` | Order status, number, lines | | GET | `/llm/v1/locations/{DOMAIN}/reservations/availability?start=&durationMinutes=` | Free/busy tables on the floor plan | | POST | `/llm/v1/locations/{DOMAIN}/reservations` | Reservation request (pending until the restaurant confirms) | | GET / DELETE | `/llm/v1/locations/{DOMAIN}/reservations/{id}` | Reservation status / cancellation | ## Connecting over MCP Server: `https://api.cenaly.com/llm/mcp` — Model Context Protocol, streamable HTTP, stateless, no auth. Configuration for Claude Desktop / Claude Code and compatible clients: ```json { "mcpServers": { "meni-guest": { "type": "http", "url": "https://api.cenaly.com/llm/mcp" } } } ``` Tools: `get_menu`, `get_item`, `create_order`, `get_order_status`, `check_table_availability`, `create_reservation`, `get_reservation_status`, `cancel_reservation`. Typical flows: - **Ordering**: `get_menu` → `create_order` → `get_order_status` (the 4-digit order number appears within seconds). - **Table reservation**: `check_table_availability` (tables from the floor plan, free/busy for the chosen window) → `create_reservation` with `tableId` → `get_reservation_status` (the restaurant confirms the request) → `cancel_reservation` if needed. ## Rules and guarantees - **Orders are validated against the live menu**: an unknown item, variant or addon yields a 400 with a list of problems; prices and totals are computed server-side — an agent cannot "set" a price. - Pickup and delivery orders require the guest's name and phone; delivery also requires an address. - `orderId` / `reservationId` are **secret tokens**: they grant status access and cancellation. Do not publish them. - Orders and reservations reach the restaurant in real time — admin panel, kitchen display, notifications — exactly like orders from the website. - Guest reservations stay `pending` until the restaurant confirms them in the admin panel. - **Alcohol cannot be ordered through the agent channel in Russia.** Remote sale of alcoholic products is prohibited by law (171-FZ art. 16 p. 2 sub. 14), so for locations whose country is Russia an order containing an alcoholic item fails validation: the 400 response names the item and explains that it can only be ordered from a waiter in the venue. Re-compose the order without alcohol. ## Machine-readable discovery - `https://cenaly.com/llms.txt` — a short API map for LLMs; - `https://cenaly.com/.well-known/mcp.json` — MCP servers manifest; - `GET https://api.cenaly.com/llm/v1` — discovery document with examples. --- # App Store The **App Store** is a catalog of system modules and extensions you can turn on as needed: some are free and included in your plan, others are billed separately. External-service integrations live here too. Open: **Admin Panel → App Store** (`admin.cenaly.com`). --- ## How the catalog works At the top there are two scope levels: - **Account** — extensions that act across the whole account (independent of a specific location); - **Per-location** — integrations with their own connection status **in each location** separately; with many locations there's search and a switcher. Inside are the familiar **"All apps"** and **"Connected"** tabs, search and a category filter. Tile cards show the apps; a separate card leads to [Integrations](/en/docs/integrations), which gathers connections to external services. --- ## An app card A card shows: - **free** (included in the plan) or a **monthly/yearly** price; - a **"Needs plan …"** badge — if the extension requires a higher plan, with an upgrade button; - status: **connected**, **not connected** (for per-location) or **coming soon**; - device counters where relevant (e.g. the number of monitors, POS devices, KDS stations). Clicking opens a detail modal with a description, pricing and a "configured per location" note (for per-location extensions). Actions: **connect**, **configure**, **disable**. --- ## Paying for extensions Paid extensions are billed separately from your main plan (monthly or yearly). If an app needs a higher plan, the system tells you and offers to move to a suitable one. --- ## Related sections - [Integrations](/en/docs/integrations) — connections to external services - [Subscription](/en/docs/subscription) — the plan on which extensions are available - [Multi-location](/en/docs/multi-location) — managing per-location connections --- ## FAQ ### How is "Account" different from "Per-location"? Account extensions act across the whole account at once. Per-location integrations are connected and have a status in each location separately. ### Are all extensions paid? No. Some are included in the plan (a "Free" badge), some are billed separately — the price is shown on the card. ### What does the "Needs plan …" badge mean? The extension is available on a higher plan. Click the upgrade button to move to a suitable one. --- # rs.ge — Incoming Electronic Waybills > **This integration has not been launched yet.** The section is visible in the admin panel, but its backend is not deployed: connecting, the IP check, loading waybills and confirming them do not work for any account today, and nothing is sent to the tax office from the app. Waybills and letters from rs.ge are handled **in your eservices.rs.ge tax account** for now — see the steps right below. If you need the rs.ge integration, write to support — we plan by demand. The **"Tax (rs.ge)"** section is an integration with Georgia's Revenue Service, **for the Georgian market only**. After launch it will let you see incoming **electronic waybills** (ზედნადები) from suppliers and confirm or reject them right in the admin panel. --- ## What to do now if a waybill or a letter arrives from rs.ge Who: the owner or the accountant of a Georgian organisation with access to the tax account. You need the eservices.rs.ge login and password (an LLC receives it by SMS at registration; the owner gives the accountant access to the account). 1. Open the tax account **eservices.rs.ge** and sign in. 2. **Supplier waybill:** find it among incoming waybills and check the contents (goods, quantity, amount) against the actual delivery. 3. Confirm or reject the waybill **in the tax account**. The action affects tax records and cannot be undone — if in doubt, ask your accountant first. 4. Record the goods receipt in [Inventory](/en/docs/inventory) — the app does not create it from the waybill. 5. **Letter or notice from the tax office:** read and answer it in the same account. The app does not receive rs.ge letters; data for the answer (turnover, bank statements, calculations) is in the "Accounting" section. How to check: the waybill status changed in the rs.ge account; the goods appear in stock after your receipt. What the app does **not** do today: it does not receive rs.ge waybills or letters, does not confirm waybills, does not file returns and does not pay taxes. Returns are prepared in "Accounting", and you file them in the tax account yourself. --- ## Where the section is and who will have it Open: **Admin Panel → "Tax (rs.ge)"**. The menu item appears if at least one of your locations is in Georgia (the country comes from your locations, not from the domain) and your plan includes "Inventory". Today the page shows "The rs.ge integration has not been launched yet" instead of the onboarding. Brands hosted in Yandex Cloud (for example `cenaly.ru`) do not have the section at all; a direct visit says the Georgian tax service is not deployed in that cloud. --- ## How connecting will work (after launch) The steps below will only work once the integration is launched; do not spend time on them now. There will be a four-step onboarding: 1. **Sign in to rs.ge** — with the owner account used to register the legal entity. 2. **Create a service user** (სერვის მომხმარებელი) in the rs.ge account. Write down its username (`su`) and password (`sp`). 3. **Allow our IP** — rs.ge accepts requests only from allowlisted addresses. The **"Check connection / Find our IP"** button shows our server IP; add it to the service user's allowlist. 4. **Connect** — the username (`su`), password (`sp`) and the organisation's tax ID. If connecting fails, the app shows the reason given by the tax office (wrong IP, wrong password, etc.) and reminds you of our IP. Once connected, the header shows the taxpayer's name and tax ID from the tax office, the connection date, the last sync time and a **disconnect** button with confirmation. --- ## How the waybill list will work (after launch) - **Date range** — the last 30 days by default; - a table: **number**, **supplier** (name and tax ID), **date**, **amount**, **status**; - expand a waybill to see its **line items** — name, quantity, unit, price, amount; - **confirm** or **reject** — with a warning before the action, since it affects tax records. --- ## Related sections - [Inventory](/en/docs/inventory) — goods receipts and stock tracking - [Fiscalization](/en/docs/fiscal) — fiscal requirements by country - [Counterparties](/en/docs/counterparties) — supplier and customer records --- ## FAQ ### Who is this section for? Organisations in Georgia only — the integration works with Georgia's Revenue Service (rs.ge). The menu item appears for accounts with a location in Georgia on a plan with "Inventory", and only on brands hosted in the AWS cloud. ### Can I connect right now? No: the backend of the integration is not deployed, so the IP check, connecting, listing waybills and confirming them do not go through. Handle waybills and letters in the eservices.rs.ge account — see "What to do now". ### A waybill arrived — where do I confirm it? In the eservices.rs.ge tax account. It cannot be done in the app today; record the goods receipt in "Inventory" afterwards. ### Will the app file my return with rs.ge? No. "Accounting" prepares the calculation and, where the form is supported, a file; you or your accountant file it in the tax account. Marking a return as sent in the app is your own record, not a confirmation from the tax office. ### What will I need to connect after launch? The rs.ge service user's username and password, the tax ID, and our IP on the rs.ge allowlist (the IP-check step shows the address). ### Will a stock receipt appear after confirming? No: confirming is an action in rs.ge, and the goods receipt is recorded separately in [Inventory](/en/docs/inventory). An automatic receipt from a waybill is planned but has no committed date. --- # Evotor — POS Terminal Integration This integration connects your **cenaly/cenaly.com** account with **Evotor** smart terminals — a popular POS brand in Russia. Connect it as an extension in the **App Store** (`admin.cenaly.com/app-store`) — the "Evotor" card. The integration works for both business models: a retail store (goods accounting via Evotor's Cloud API) and a cafe/bar (order intake via the resto "My Restaurant" API). --- ## Connecting **Before you start:** you need the **Premium** plan or higher (the integration is part of the "Inventory" feature) and a location **in Russia** — with any other plan or country the "Evotor" card is not shown in the catalog, and if it is open you will see an upgrade prompt instead of the connection form. 1. Open the **App Store**, find the **"Evotor"** card and click **"Configure"** — settings open in a modal right on the catalog page; the location is picked in the header of that window. 2. Click **"Connect"** — the system generates a **linking code**. The code is single-use and valid for **30 minutes** ("Expires" is shown next to it); if you miss the window, click "Connect" again. 3. Install the **"cenaly"** app from Evotor.Market on your terminal and enter the linking code into the installation form. 4. Once confirmed, the terminal is linked to your location. The store (register) is bound manually: copy the **store UUID** from your Evotor account (Cloud API → Stores), paste it into the "Store UUID" field and click **"Link store"**. --- ## Catalog and stock Once connected, catalog sync works both ways: - products and categories from Evotor flow into your cenaly catalog; - changes made in cenaly are reflected back to Evotor; - stock levels sync periodically, so both systems see the same item quantities: sales, **customer returns**, receipts, write-offs, stock counts and revaluations from the terminal arrive in cenaly as inventory documents. The settings choose the **stock master** — Evotor (sales from the register, the default) or cenaly (web menu and site) — so the two systems do not fight over the same quantity; - the same settings hold the **default VAT rate** — no VAT, 0%, 10%, 10/110, 20% (the default) or 20/120 — applied to items that carry no rate of their own. --- ## Order intake Orders placed online through cenaly (the menu site, delivery) are pushed to the Evotor terminal to be rung up — this direction is switched on by the **"Send cenaly orders to the terminal"** setting and requires Evotor's own app on the terminal itself: **"Мой ресторан"** (My Restaurant — cafe/bar) or **"Мобильный кассир"** (Mobile Cashier — retail), plus the matching token. The other direction always works and needs none of that: sales made directly on the terminal show up in cenaly as orders, customer returns included. This gives you a single sales history regardless of where the order was placed. --- ## Cash shifts and staff - **Cash shifts** opened and closed on the Evotor terminal (including cash drops and pickups) are mirrored into the same [Cash Shift](/en/docs/cash-shift) section used by cenaly's built-in POS — a single shift history regardless of which register hardware was used. - **Employees** set up in Evotor sync into [Staff & Shifts](/en/docs/staff). --- ## Related sections - [Inventory](/en/docs/inventory) — items and stock levels Evotor syncs with - [Cash Shift](/en/docs/cash-shift) — a unified shift history from both the built-in POS and Evotor - [Staff & Shifts](/en/docs/staff) — staff synced in from Evotor - [App Store](/en/docs/app-store) — connecting the integration --- ## FAQ ### Do I need to install anything on the terminal besides the "cenaly" app? It depends on the direction. To receive data **from** the terminal — catalog, stock, sales, returns, shifts, staff — nothing beyond the "cenaly" app from Evotor.Market: that part is a server-to-server exchange. But to push cenaly orders **to** the terminal you need Evotor's own app — **"Мой ресторан"** (My Restaurant) for a cafe or bar, **"Мобильный кассир"** (Mobile Cashier) for retail; without it the terminal has nothing to receive the order with. ### Is there a button to sync employees? No separate button: Evotor employees are pulled in by a background sweep every 6 hours (stock is reconciled hourly, order statuses every 15 minutes). Positions are mapped coarsely: an Evotor administrator becomes a manager, everyone else becomes a waiter. ### Does the integration work for both retail and cafe at the same time? Yes, the integration supports both scenarios — goods accounting for a retail store and order intake for a cafe/bar — depending on your business type. ### What happens if a product from Evotor belongs to an unknown category? That product lands in a general "uncategorized" bucket in cenaly — sort it into the right categories manually. ### How does the venue set up a paid subscription in Evotor.Market? The "cenaly" app's subscription is set up directly in Evotor.Market during installation — same as for any other app from the marketplace. --- # Yandex Products — exporting products to Yandex search **Yandex Products** (dashboard [merchants.yandex.ru](https://merchants.yandex.ru)) is a **free** Yandex service that displays your store's products directly in search: in organic snippets, in the **"Products"** tab, in **Images**, in the **"Popular Products"** and **"Store Prices"** product blocks, as well as in the responses of the **Alice** voice assistant. In addition, the dashboard provides visibility analytics showing how your products are displayed in search. Important: this is **not a marketplace**. No orders are placed within Yandex Products — when shoppers see your product in search results, they click through **to your store's website** and complete the order there. Do not confuse this service with **Yandex Market** ([partner.market.yandex.ru](https://partner.market.yandex.ru), where sales and logistics take place) or **Yandex Eats**. It connects on our platform as an extension in the **App Store** (`admin.cenaly.com/app-store`) — the **"Yandex Products"** card. Once enabled, the platform automatically generates a **YML feed** of your location's catalog and updates it whenever product cards are edited, so all you have to do is paste the link to this feed into your Yandex dashboard. The card is only displayed for accounts with locations **in Russia** and is unlocked on plans that include aggregator and marketplace integrations. --- ## What You'll Need - A **Yandex ID** account (to log in to the Yandex Products cabinet). - A **published storefront website** for your location on our platform — your customer-facing store website (your brand subdomain or custom domain; see ["Appearance" and domains](/en/docs/website-builder) settings). This is where Yandex snippets will lead — see the location card for the exact storefront URL. - A filled **catalog**: items must have names, prices, categories, and ideally photos and descriptions — without them, products rank significantly worse in search results. - A business focused on **retail in the Russian Federation** (the service is designed for retail merchandise stores). --- ## Step 1. Platform Connection and Feed Link 1. Open the **App Store** (`admin.cenaly.com/app-store`): integration cards are located in the general grid of the **"Per account"** tab along with the other extensions. 2. Find the **"Yandex Products"** card — easiest via search by name. 3. Click **"Configure"**: settings will open in a **modal window** right on top of the showcase without navigating away from the page. 4. In the window header, select the **location** for which you are connecting the export. 5. Click **"Connect"** — API keys are not required; the platform fetches the feed on its own. Then save the sync settings: what to export, which inventory to consider the stock source, stock buffer, and channel markup. 6. After connecting, the platform will generate a public **YML feed** for this location and display the **"YML Feed URL"** block in the card, complete with a link and a copy button 📋 (clicking it shows "Copied"). Link format: `https://cdn.cenaly.com/feeds/yandexgoods/{account-id}/{location-id}.yml` 7. Copy the link **using the button in the card rather than assembling it manually** — you will need this link in Step 3. > **The feed address on the Russian environment is currently being verified.** For the `cenaly.ru` brand, the feed file is stored in Russian storage, while the card and product links inside the feed might show the address of the neighboring environment (`cdn.cenaly.com`, `{store}.cenaly.com`). Before adding the feed to your Yandex account, **open the copied link in a browser** and make sure the file is served; if it does not open, contact support and do not substitute the address manually. The feed is generated from the location's catalog and regenerated **upon connection and when a product card changes** — when an item is created or edited (name, price, stock in the card). The feed includes: item names, current prices (and old/strikethrough prices for discounts), currency, category tree, photos, descriptions, SKUs, barcodes, and links to product pages on the location's website. Prices account for channel pricing rules (channel markup), stock accounts for the inventory buffer; the feed currency is **rubles**, and selecting another in the connection interface is currently not possible. > You do not need to export the file manually. However, note that stock deduction through a **sale** and item deletion do not update the feed by themselves yet — they are reflected in it during the next edit of a product card. --- ## Step 2. Registering the Website in the Yandex Merchant Portal 1. Log in to the **[merchants.yandex.ru](https://merchants.yandex.ru)** portal using your **Yandex ID**. 2. **Add your store's website** (the domain where the location's storefront is published). 3. **Verify website ownership**. Yandex offers several methods: a meta tag on the home page, an HTML file in the site root, or a **DNS record**. **How to verify ownership on our platform:** - **Custom domain** (you manage its DNS) — use the **"DNS record"** method: add the record shown in the Yandex portal at your registrar/DNS provider. This is the most reliable approach because it does not depend on page markup. - **Platform subdomain** (branded domains like `{store}.`) — currently, the platform **does not allow inserting a custom verification meta tag or HTML file** onto the customer-facing website, and you do not control the subdomain's DNS. In this case, **contact support** — we will assist with domain ownership verification for your location. > Check the current list of verification methods directly in the Yandex portal — the interface may change. --- ## Step 3. Adding the feed 1. In your dashboard, open **Products → Data Sources → Feeds**. 2. Click **"Add"** and select **"Specify file URL"**. 3. Fill in: the source **name**, **sales regions**, and the **feed URL** copied in step 1. 4. Click **"Add"**. Yandex will queue the feed for review. It may take **up to 5 business days**. You can check the status on the **"Feeds"** tab. **What our feed provides** (mandatory Yandex requirements are fully met): - **YML** format (`yml_catalog` → `shop` → `offers`), **UTF-8** encoding; - mandatory offer fields (`offer`): `name`, `url`, `price`, `currencyId`, `categoryId`; - recommended fields included — `picture` (multiple photos), `description` (in CDATA), `vendor`, `vendorCode`, `barcode`, `oldprice` for discounts; - the feed is regenerated when item cards are edited, so it typically does not expire (Yandex rejects feeds older than **10 days**); - up to **1,000 feeds** per website — a limit set by Yandex itself. **What Yandex additionally recommends that we do not export yet:** custom item characteristics (`param`), weight and dimensions, delivery terms at the offer level. Their absence does not prevent passing the review, but it reduces the completeness of the item card in search results. --- ## Verification - On the **"Feeds"** tab, the source status should change to successful (verification passed). - After indexing, products start appearing in Yandex search — in organic snippets, in the **"Products"** tab, in **Images**, and in product blocks. This does **not happen instantly** after the feed is approved. - **Visibility analytics** are available in the dashboard — showing how your products are displayed. **What improves product display** (recommended by Yandex): - **Schema.org structured data** on product pages — our platform's storefront already provides this markup. - An installed **Yandex Metrica counter** on the website. - A **"Buy in 1 click"** button, as well as **delivery and payment** details. - Completed **photos and descriptions** for products. --- ## Related Sections - [Catalog and Products](/en/docs/product-features) — feed data source - [Storefront and Domains](/en/docs/website-builder) — which website the customer will see from search - [App Store](/en/docs/app-store) — where the integration is connected - [Statistics](/en/docs/statistics) — storefront traffic and sales --- ## Frequently Asked Questions ### Is this the same as Yandex Market? No. Yandex Products displays your products in Yandex search for free, but sales and checkout take place **on your website**. Yandex Market is a standalone marketplace where ordering and logistics happen within Market itself. ### Do I need to pay for Yandex Products? No, the Yandex service itself is free. There is also no separate purchase for the extension — it is unlocked on the plan that includes aggregator and marketplace integrations. ### Do I need to manually upload or update the feed file? No. The platform generates the YML feed automatically and regenerates it whenever a product card is edited, so it never expires (Yandex rejects feeds older than 10 days). If an item is discontinued or inventory changed via sale only, open and save the card — this will refresh the export. ### The feed has been "under review" for several days — is that normal? Yes, feed verification takes **up to 5 business days**. You can check the status on the "Feeds" tab in your dashboard. ### Why was my feed rejected? A common reason is a **mismatch between the feed data and the website** (for example, the price in the feed does not match the price on the product page). Make sure your catalog is up to date and your storefront is published and accessible; once fixed, the feed will be resubmitted for review automatically. ### How do I verify site ownership if I am using a platform subdomain? On a platform subdomain, you do not manage DNS, and the platform currently does not support inserting arbitrary verification meta tags — **contact support**, and we will help verify ownership. If you have your **own domain**, use the verification method via a **DNS record** in your Yandex dashboard. ### Why do some of my products have low visibility? Products **without photos and descriptions** rank lower in search results. Fill out product cards with images and text — this directly affects visibility. --- # Google Product Feed — your store's products in Google Merchant Center The **"Google Merchant Center"** extension (that is exactly how the card is labelled in the App Store) exports your store's catalog to **Google Merchant Center** ([merchants.google.com](https://merchants.google.com)) — Google's product hub. From there your products appear in: - **Shopping campaigns** (Google Ads product ads with photo, price and name right in the results); - **free product listings** — placements in the **"Shopping"** tab and Google Search at no cost per click; - **Google Images** and search product blocks. This is **not a marketplace**: there are no orders inside Google. When a shopper sees a product, they click through **to your store's storefront website** and place the order there. Merchant Center is a product-data showcase, not a sales channel. The extension works on a **feed model without API keys**: after connecting, the platform generates a public product feed in the **Google Product Feed** format and refreshes it whenever product cards change. All you have to do is point Merchant Center to the feed URL once. The card is available on a **plan with marketing tools** (advertising and SEO) and is hidden if no location of the account is in a Google market: the extension is unavailable in Russia, Cuba, Iran, North Korea and Syria. --- ## Step 1. Connecting in Cenaly and getting the feed URL 1. Open the **App Store** (`admin.cenaly.com/app-store`): integration cards sit in the single grid of the **"Account"** tab together with the other extensions. 2. Find the **"Google Merchant Center"** card — searching by name is the quickest way. 3. Click **"Configure"**: the settings open in a **modal window** right on top of the storefront, without taking you off the page. 4. Pick the **location** you are enabling the export for in the window header. 5. Click **"Connect"** — no API credentials are needed, the feed model has no keys. 6. After connecting, the card shows **feed links in two formats** — **XML** and **CSV**; each row has a 📋 copy button ("Copied" appears after the click). 7. Copy the URL you need. URL shape: `https://cdn.cenaly.com/feeds/googlefeed/{account-id}/{location-id}.xml` (and `.csv` for the CSV version). > The label of the links block and the hint under it are currently shared by all product feeds and mention Yandex Goods — that is an interface inaccuracy: the links themselves point to your Google feed. The feed is built from the location's catalog (retail mode) and is regenerated **on connect and when a product card changes** — when a product is created or edited (title, price, stock in the card). A stock decrement caused by a sale and the deletion of a product do not reach the feed on their own yet — they land there with the next card edit; the regular background catalog/stock reconciliation is not enabled yet. Variations of one product are exported as separate items sharing an `item_group_id`. Prices account for discounts (`sale_price`) and channel price rules; stock accounts for the buffer. > There is nothing to regenerate manually: editing a product card refreshes the export by itself. --- ## Step 2. Adding the feed in Merchant Center 1. Sign in to **[Google Merchant Center](https://merchants.google.com)** (you need a Google account and a verified store website). 2. Go to the **data sources** section — **"Products" → "Data sources"**. 3. Click **"Add data source"** and choose adding products **on a schedule from a file** (scheduled fetch). 4. Specify the **country of sale** and **language**, and name the source. 5. In the **file URL** field paste the feed link from step 1 (**XML** recommended). 6. Set the **fetch schedule** (frequency and time) and save. Google will download the feed from the URL and submit the products for review. Initial review usually takes a few hours — up to **3 business days**. > The exact Merchant Center menu labels may differ — look for the data sources section and the option to fetch a file from a URL on a schedule. --- ## Which format to choose: XML or CSV Both formats contain the same Google Product Feed fields. **XML** (RSS 2.0 with the `g:` namespace) is the recommended choice: it validates more strictly and handles multiple images and variations more reliably. **CSV** is convenient if you want to open the feed in a spreadsheet and check the contents manually. For Merchant Center choose **XML**. Key feed fields: | Field | Contents | |------|----------| | `id` | Unique product identifier | | `title` | Product name | | `description` | Description | | `link` | Link to the product page in the store's web catalog | | `image_link` | Main photo | | `additional_image_link` | Additional photos | | `availability` | `in_stock` / `out_of_stock` | | `price` | Price | | `sale_price` | Discounted price | | `brand` | Brand | | `gtin` | Barcode (GTIN/EAN) | | `mpn` | SKU | | `condition` | Condition (`new`) | | `item_group_id` | Variation group for one product | | `product_type` | Product category | --- ## How Google fetches the feed Google **downloads** the feed itself on a schedule (scheduled fetch) from the URL you provided — nothing needs to be pushed. The recommended frequency is **once a day**; for stores with frequent price and stock changes you can fetch more often. The platform regenerates the feed when a product card is edited, so every fetch sees the data as it was last saved in the catalog. --- ## Requirements and common problems - **Working product links.** The `link` field must lead to a working product page — the store must have the **web catalog** enabled (the customer-facing storefront of the location). The platform fills in the storefront address itself: the location's own domain is used as is, and a bare platform subdomain is expanded to the full address (`demo` → `demo.cenaly.com`). - **Photo required.** A product without an image (`image_link`) is rejected. Add photos to all products. - **Description and title.** Empty or too-short descriptions lower quality; add meaningful text. - **Currency and country.** Merchant Center requires the feed currency to match the country of sale. There is currently no currency selector in the connection settings: the feed is exported in **USD**. If your Merchant Center account sells in another currency, this is being fixed too — until then the platform may reject the items. - **Moderation.** Google checks that the feed data matches the product page (price, availability). Discrepancies cause rejection — keep the catalog and storefront in sync; after fixes Google will pick up updates on the next fetch. - **GTIN/brand.** For many categories Google requires valid `gtin` and `brand` — fill in barcodes and brands. --- ## Related sections - [Catalog and Products](/en/docs/product-features) — feed data source - [Storefront and Domains](/en/docs/website-builder) — where feed links point to - [App Store](/en/docs/app-store) — where the integration is connected - [Google Ads](/en/docs/google-ads) — launching Shopping campaigns off this feed --- ## Frequently Asked Questions ### Is it paid? The extension is paid (a plan with marketing tools) and is configured per location. The Google Merchant Center account itself is free; you pay for clicks in Shopping campaigns via Google Ads, and free listings cost nothing. ### Do I need to export anything manually? No. The platform generates the feed itself and regenerates it when a product card is edited, and Google fetches the file on schedule. If a product stopped selling or the stock changed only through a sale, open and save the card — that refreshes the export. ### XML or CSV? For Merchant Center we recommend XML — it validates more strictly. CSV is handy for manual content checks. ### Products were rejected — why? Most often: no photo, unreachable product links (web catalog not enabled), feed price vs. page mismatch. Product links and the feed currency are currently being checked — until they are fixed, the platform may reject items for a location without its own domain or for a store that does not sell in USD (see "Requirements and common problems"). Everything else is fixed in the catalog and on the storefront — Google will pull the data on the next fetch. ### How are product variants (size/color) exported? Each variant is a separate item with a shared `item_group_id`, so Google groups them into one product with a variant selector. --- # Microsoft Product Feed — products in Microsoft Merchant Center The **"Microsoft Merchant Center"** extension (that is exactly how the card is labelled in the App Store) exports your store's catalog to **Microsoft Merchant Center** (part of **Microsoft Advertising**, [ads.microsoft.com](https://ads.microsoft.com)). From there products appear in: - **Bing Shopping product ads** (Product Ads in Bing search and across Microsoft partner surfaces); - Microsoft **free product listings**; - the product showcase in Bing search. Bing and the Microsoft ecosystem remain a notable traffic source, especially on desktop and in some countries, with lower competition for product placements than Google. As with Google, this is **not a marketplace** — the shopper clicks through to your **store's storefront website** and orders there. The extension works on a **feed model without API keys**: the platform generates a public product feed in the **Google Product Feed** format (Microsoft uses the same field schema) and refreshes it whenever product cards change. You just point Merchant Center to the feed URL once. The card is available on a **plan with marketing tools** (advertising and SEO) and is hidden if no location of the account is in a Microsoft Advertising market: the extension is unavailable in Russia, Belarus, Cuba, Iran, North Korea and Syria. --- ## Step 1. Connecting in Cenaly and getting the feed URL 1. Open the **App Store** (`admin.cenaly.com/app-store`): integration cards sit in the single grid of the **"Account"** tab together with the other extensions. 2. Find the **"Microsoft Merchant Center"** card — searching by name is the quickest way. 3. Click **"Configure"**: the settings open in a **modal window** right on top of the storefront, without taking you off the page. 4. Pick the **location** you are enabling the export for in the window header. 5. Click **"Connect"** — no API credentials are needed, the feed model has no keys. 6. The card then shows **feed links in XML and CSV**; each row has a copy button ("Copied" appears after the click). URL shape: `https://cdn.cenaly.com/feeds/microsoftfeed/{account-id}/{location-id}.xml` (and `.csv`). > The label of the links block and the hint under it are currently shared by all product feeds and mention Yandex Goods — that is an interface inaccuracy: the links themselves point to your Microsoft feed. The feed is built from the location's catalog (retail mode) and is regenerated **on connect and when a product card changes** — when a product is created or edited (title, price, stock in the card). A stock decrement caused by a sale and the deletion of a product do not reach the feed on their own yet — they land there with the next card edit. Variations are exported as separate items with a shared `item_group_id`; prices account for discounts and channel price rules, stock for the buffer. > There is no need to regenerate the feed manually: editing a product card refreshes the export by itself. --- ## Step 2. Adding the feed in Microsoft Merchant Center 1. Sign in to **Microsoft Advertising** ([ads.microsoft.com](https://ads.microsoft.com)) and open **Merchant Center** (**Tools → Merchant Center**). 2. Create a **store**, if you don't have one, and **verify ownership** of the storefront domain. 3. Inside the store go to **feeds/catalogs** (**Feeds / Catalogs**) and add a new feed. 4. Choose the **download by URL** method (**Download from URL**). 5. Paste the feed link from step 1 (**XML** recommended), set the **country and language**. 6. Set an **automatic download schedule** and save. Microsoft will download the feed and submit the products for review. Review usually takes up to **a few business days**. > Microsoft Advertising menu labels change periodically — look for Merchant Center → feeds/catalogs and the option to download a file by URL. --- ## Which format to choose: XML or CSV Microsoft Merchant Center accepts both. **XML** is preferable: it validates more strictly and handles variations and multiple images more reliably. **CSV** is useful for a manual content check in a spreadsheet. Key feed fields: | Field | Contents | |------|----------| | `id` | Unique product identifier | | `title` | Name | | `description` | Description | | `link` | Link to the product page in the web catalog | | `image_link` | Main photo | | `additional_image_link` | Additional photos | | `availability` | `in_stock` / `out_of_stock` | | `price` | Price | | `sale_price` | Discounted price | | `brand` | Brand | | `gtin` | Barcode | | `mpn` | SKU | | `condition` | Condition (`new`) | | `item_group_id` | Variation group | | `product_type` | Category | --- ## How Microsoft fetches the feed Microsoft **downloads** the feed itself on a schedule from the URL. The recommended frequency is **once a day**. The platform regenerates the feed when a product card is edited, so every download sees the data as it was last saved in the catalog. Nothing needs to be pushed manually. --- ## Requirements and common problems - **Working product links.** `link` must lead to a working product page — enable the **web catalog** (the location's storefront), otherwise products are rejected. The platform fills in the storefront address itself: the location's own domain is used as is, and a bare platform subdomain is expanded to the full address (`demo` → `demo.cenaly.com`). - **Photo required.** Without `image_link` a product is rejected. - **Description and title.** Fill in meaningful text — it affects approval and display quality. - **Currency and country.** Must match the store settings in Merchant Center. There is currently no currency selector in the connection settings: the feed is exported in **USD**. If the Merchant Center store runs in another currency, this is being fixed too — until then the platform may reject the items. - **Domain verification.** Microsoft requires verifying ownership of the storefront, otherwise the feed is not accepted. - **Moderation.** Feed-vs-page consistency is checked; discrepancies cause rejection. Keep the catalog and storefront in sync. --- ## Related sections - [Catalog and Products](/en/docs/product-features) — feed data source - [Storefront and Domains](/en/docs/website-builder) — where feed links point to - [App Store](/en/docs/app-store) — where the integration is connected - [Google Product Feed](/en/docs/google-feed) — the same export for Google --- ## Frequently Asked Questions ### How is this different from the Google feed? The field schema is the same (Google Product Feed), but the feed goes to the Microsoft ecosystem — Bing Shopping and Microsoft Advertising. There is lower competition for product placements and a separate audience. ### Is it paid? The extension is paid and is connected per location. The Microsoft Advertising account is free; you pay for clicks on product ads via Microsoft Advertising. ### Do I need to export the feed manually? No. The platform regenerates the feed when a product card is edited, Microsoft fetches it on schedule. If a product stopped selling or the stock changed only through a sale, open and save the card — that refreshes the export. ### Products were rejected — why? Usually: no photo, domain not verified, feed price/availability vs. page mismatch. Product links and the feed currency are currently being checked — until they are fixed, the platform may reject items for a location without its own domain or for a store not in USD (see "Requirements and common problems"). ### Can I use the same catalog for Google and Microsoft? Yes. Connect both extensions to the location and point each cabinet to its feed URL. --- # Meta Product Feed — catalog for Facebook and Instagram Shops The **"Meta Catalog"** extension (that is exactly how the card is labelled in the App Store) exports your store's catalog to **Meta Commerce Manager** ([business.facebook.com/commerce](https://business.facebook.com/commerce)) — Meta's catalog hub. This catalog powers: - **Facebook Shop and Instagram Shop** — product showcases in your profiles; - **shopping tags** in Instagram/Facebook posts and Stories; - **dynamic ads and Advantage+ Shopping** — product ads that Meta automatically matches to the audience; - **catalog retargeting** (showing viewed products). Checkout usually leads to your **store's storefront website** (except for Meta in-app checkout scenarios, which are not available in all countries). The extension works on a **feed model without API keys**: the platform generates a public product feed in the **Google Product Feed** format (Meta accepts this schema) and refreshes it whenever product cards change. You just point Commerce Manager to the feed URL once. The card is available on a **plan with marketing tools** (advertising and SEO) and is hidden if no location of the account is in a Meta market: the extension is unavailable in Russia, China, Cuba, Iran, North Korea and Syria. --- ## Step 1. Connecting in Cenaly and getting the feed URL 1. Open the **App Store** (`admin.cenaly.com/app-store`): integration cards sit in the single grid of the **"Account"** tab together with the other extensions. 2. Find the **"Meta Catalog"** card — searching by name is the quickest way. 3. Click **"Configure"**: the settings open in a **modal window** right on top of the storefront, without taking you off the page. 4. Pick the **location** you are enabling the export for in the window header. 5. Click **"Connect"** — no API credentials are needed, the feed model has no keys. 6. The card then shows **feed links in XML and CSV**; each row has a copy button ("Copied" appears after the click). URL shape: `https://cdn.cenaly.com/feeds/metafeed/{account-id}/{location-id}.xml` (and `.csv`). > The label of the links block and the hint under it are currently shared by all product feeds and mention Yandex Goods — that is an interface inaccuracy: the links themselves point to your Meta feed. The feed is built from the location's catalog (retail mode) and is regenerated **on connect and when a product card changes** — when a product is created or edited (title, price, stock in the card). A stock decrement caused by a sale and the deletion of a product do not reach the feed on their own yet — they land there with the next card edit. Variations are exported as separate items with a shared `item_group_id`. --- ## Step 2. Adding the feed in Commerce Manager 1. Open **[Commerce Manager](https://business.facebook.com/commerce)** in your Meta Business account. 2. Create a catalog of type **"Products" (Ecommerce)** if you don't have one. 3. Inside the catalog go to **"Data sources"** and choose adding products via a **Data feed**. 4. Choose the **"Scheduled feed"** method — specify a **file URL**. 5. Paste the feed link from step 1 (**XML** recommended), set the catalog **currency**. 6. Configure the **update frequency** (daily/hourly) and save. Meta will load the feed and process the products. Initial processing usually takes from a few minutes to a few hours; then the products go through **a review against Meta's commerce policies**. > Commerce Manager labels change — look for catalog → data sources → a scheduled feed by URL. --- ## Which format to choose: XML or CSV Meta accepts both. **XML** is preferable for stores with variations and multiple photos. **CSV** is handy for a manual check. Key feed fields: | Field | Contents | |------|----------| | `id` | Unique product identifier | | `title` | Name | | `description` | Description | | `link` | Link to the product page in the web catalog | | `image_link` | Main photo | | `additional_image_link` | Additional photos | | `availability` | `in_stock` / `out_of_stock` | | `price` | Price | | `sale_price` | Discounted price | | `brand` | Brand | | `gtin` | Barcode | | `mpn` | SKU | | `condition` | Condition (`new`) | | `item_group_id` | Variation group | | `product_type` | Category | --- ## How Meta fetches the feed Meta **downloads** the feed itself on a schedule from the URL. The recommended frequency is **once a day**; for active stores you can fetch more often. The platform regenerates the feed when a product card is edited, so Meta gets the data as it was last saved in the catalog. There is no need to push the feed manually. --- ## Requirements and common problems - **Working product links.** `link` must lead to a working product page — enable the **web catalog** (the location's storefront). The platform fills in the storefront address itself: the location's own domain is used as is, and a bare platform subdomain is expanded to the full address (`demo` → `demo.cenaly.com`). - **Photo required.** Without `image_link` a product won't pass. Meta also has image-quality requirements. - **Meta commerce policies.** The catalog is moderated — prohibited product categories are rejected and the account may go to review. - **Currency.** The feed currency must match the catalog currency in Commerce Manager. There is currently no currency selector in the connection settings: the feed is exported in **USD**. If the Meta catalog runs in another currency, this is being fixed too — until then the platform may reject the items. - **Business verification.** For Shops and ads Meta may require business and domain verification. - **Description and title.** Fill in text — empty cards pass moderation and sell worse. --- ## Related sections - [Catalog and Products](/en/docs/product-features) — feed data source - [Storefront and Domains](/en/docs/website-builder) — where feed links point to - [App Store](/en/docs/app-store) — where the integration is connected - [Facebook Ads](/en/docs/fb-ads) — ads you can feed this catalog to --- ## Frequently Asked Questions ### Do orders happen inside Facebook/Instagram? Usually no — the shopper clicks through to your **store's storefront website** and orders there. Meta's built-in checkout is not available in all countries. ### Is it paid? The extension is paid and is connected per location. The Meta catalog and Shops are free; you pay for ads in the Meta ads manager. ### Do I need to export the feed manually? No. The platform regenerates the feed when a product card is edited, Meta fetches it on schedule. If a product stopped selling or the stock changed only through a sale, open and save the card — that refreshes the export. ### Products were rejected — why? Usually: no photo or low-quality image, the product falls under Meta commerce policy restrictions, business/domain verification not done. Product links and the feed currency are currently being checked — until they are fixed, Meta may reject items for a location without its own domain or for a catalog not in USD (see "Requirements and common problems"). ### How are product variants exported? Each variant is a separate item with a shared `item_group_id`, so Meta groups them into one product with a variant selector. --- # TikTok Product Feed — Catalog for Video Shopping Ads The **"TikTok Catalog"** extension (as the card is named in the App Store) exports your store catalog to **TikTok Catalog Manager** (the **Business Center / Ads Manager** section, [ads.tiktok.com](https://ads.tiktok.com)). TikTok's **catalog-based advertising** runs on top of this catalog: - **Video Shopping Ads** — video ads with attached products (product cards overlaid on the video); - **dynamic product ads** — TikTok selects and displays relevant products from the catalog tailored to the audience; - **retargeting** based on viewed products. Checkout usually leads to **your store's storefront website**. The catalog is a product data source for TikTok advertising formats, not a standalone sales channel. The extension operates on a **feed model without API keys**: the platform generates a public product feed in the **Google Product Feed** format (TikTok accepts this schema) and updates it whenever product cards change. You only need to provide the feed link in Catalog Manager once. The card is available on the **pricing plan with marketing tools** (advertising and SEO) and is hidden if none of the account's locations are in a TikTok for Business market: the extension is unavailable in Russia, India, Afghanistan, Cuba, Iran, North Korea, and Syria. --- ## Step 1. Connecting in Cenaly and Feed Link 1. Open the **App Store** (`admin.cenaly.com/app-store`): integration cards are located in the general grid of the **"Per account"** tab alongside other extensions. 2. Find the **"TikTok Catalog"** card — the fastest way is by searching by name. 3. Click **"Configure"**: settings will open in a **modal window** directly over the showcase without taking you away from the page. 4. In the window header, select the **location** for which you are connecting the export. 5. Click **"Connect"** — no need to enter API credentials; the feed model does not use keys. 6. The card will display **feed links in XML and CSV formats**, with a copy button 📋 for each row (shows "Copied" after clicking). URL format: `https://cdn.cenaly.com/feeds/tiktokfeed/{account-id}/{location-id}.xml` (and `.csv`). > The label of the link block and the tooltip beneath them are currently shared across all product feeds and mention Yandex Products — this is an interface inaccuracy: the links themselves lead specifically to your TikTok feed. The feed is assembled from the location catalog (retail mode) and regenerated **upon connection and whenever a product card is modified** — when a product is created or edited (name, price, stock in the card). Stock deductions from sales and product deletions do not trigger a feed update on their own for now — they will be included during the next card edit. Variations are exported as separate items with a shared `item_group_id`; prices account for discounts (`sale_price`) and channel pricing rules, while stock levels account for the inventory buffer. --- ## Step 2. Adding the Feed to TikTok Catalog Manager 1. Log in to **TikTok Ads Manager / Business Center** ([ads.tiktok.com](https://ads.tiktok.com)). 2. Open **Catalog Manager** (**Assets → Catalogs → Catalog Manager**). 3. Create a **catalog** (specify region and currency) if you haven't created one yet. 4. Inside the catalog, add products via **Data source → Scheduled feed** (URL upload). 5. Paste the feed link from Step 1 (**XML** is recommended). 6. Set the **update frequency** and save. TikTok will download the feed and process the items; then the catalog undergoes **review**. Once successfully uploaded, the products can be used in Video Shopping campaigns. > TikTok interface items change periodically — look for Catalog Manager → catalog → data source with scheduled upload via URL. --- ## Which Format to Choose: XML or CSV TikTok accepts both. **XML** is preferred for variations and multiple images; **CSV** is convenient for manually checking the content. Key feed fields: | Field | Contents | |-------|----------| | `id` | Unique product identifier | | `title` | Title | | `description` | Description | | `link` | Link to the product page in the web catalog | | `image_link` | Main photo | | `additional_image_link` | Additional photos | | `availability` | `in_stock` / `out_of_stock` | | `price` | Price | | `sale_price` | Sale price | | `brand` | Brand | | `gtin` | Barcode | | `mpn` | SKU / Part number | | `condition` | Condition (`new`) | | `item_group_id` | Variation group | | `product_type` | Your product category — full path "Section > Subsection > Category" | | `google_product_category` | Category from Google taxonomy (from the product card, otherwise — default value for the location) | --- ## How TikTok Fetches the Feed TikTok **downloads the feed automatically** on a schedule from the specified URL. The recommended frequency is **once a day**. The platform regenerates the feed whenever a product item card is edited, so each scheduled download retrieves the data exactly as it was last saved in the catalog. There is no need to submit the feed manually. --- ## Requirements and Common Issues - **Working item links.** `link` must lead to an accessible item page — enable the **web catalog** (the location's showcase website). Item links in the feed are currently being verified: they are constructed from the location's showcase URL and are correct if the location has a **custom domain** set (a full address with a dot). Until this is resolved, TikTok may reject items for locations on a platform subdomain — verify the address in the downloaded feed before scheduling. - **Photo is required.** Without `image_link`, the item is rejected; TikTok enforces image quality requirements. - **Currency and region.** The feed currency and catalog region must match your TikTok account settings. There is currently no currency selection in the integration interface: the feed is exported in **USD**. If the TikTok catalog uses a different currency, this is also being checked — until resolved, the platform may reject items. - **Moderation.** The catalog and product ads are subject to TikTok review; prohibited categories are rejected. - **Description and title.** Fill in the texts — this affects both approval and video ad conversions. - **Data consistency.** Price and availability in the feed must match the item page, otherwise ads are rejected. --- ## Related sections - [Catalog and products](/en/docs/product-features) — data source for the feed - [Storefront website and domains](/en/docs/website-builder) — where links from the feed lead - [App Store](/en/docs/app-store) — where the integration is connected - [Meta Product Feed](/en/docs/meta-feed) — a similar catalog for Facebook/Instagram --- ## Frequently Asked Questions ### Are orders placed within TikTok? Usually no — the customer goes to **your store's storefront website** and places the order there. TikTok Shop with in-app checkout is not available in all countries and is configured separately. ### Does it cost extra? There is no separate purchase for the extension: it is included in a pricing plan with marketing tools and connected per location. Catalog Manager is free; you pay for ad impressions directly in TikTok Ads Manager. ### Do I need to export the feed manually? No. The platform regenerates the feed whenever an item card is edited, and TikTok downloads it on a schedule. If an item is no longer sold or stock changed only via a sale, open and save the card — this will update the export. ### Why were items rejected? Common reasons: missing or low-quality photo, prohibited category, or mismatch in price/availability between the feed and the page. Item links and feed currency are currently being verified — until resolved, TikTok may reject items for locations without their own custom domain or for catalogs not in USD (see "Requirements and Common Issues"). ### How are item variants exported? Each variant is exported as a separate item with a shared `item_group_id` so that TikTok groups them into a single product. --- # Pinterest Product Feed — Products in Pinterest Catalogs The **"Pinterest Catalogs"** extension (as the card is named in the App Store) exports your store's catalog to **Pinterest Catalogs** (a section of **Pinterest Business**, [business.pinterest.com](https://business.pinterest.com)). Based on the catalog, Pinterest creates: - **product pins** — pins with up-to-date pricing, availability, and a direct link to the product; - a product showcase in the **Shop section** of your profile; - **Shopping ads** and dynamic catalog retargeting. Pinterest is a platform with high purchasing intent in categories such as home goods, decor, apparel, jewelry, cosmetics, and gifts. Checkout directs customers to **your store's storefront website**. The extension operates on a **feed model without API keys**: the platform generates a public product feed in **Google Product Feed** format (Pinterest accepts this schema) and updates it whenever product cards change. You only need to enter the feed URL in Pinterest Catalogs once. > **The extension is not available everywhere.** Unlike other product feeds, Pinterest has a **restricted list of markets**: the card is only displayed if at least one location of your account is located in a country where Pinterest supports advertising accounts — directly or through sales partners (59 countries, including the US, UK, EU countries, Canada, Australia, Brazil, Mexico, Japan, Turkey, Poland, Georgia, Kazakhstan). If your locations are outside this list, the card will not appear in the App Store — searching for it will yield no results. In addition, a general prerequisite applies: a **plan with marketing tools** (advertising and SEO). --- ## Step 1. Connecting in Cenaly and Feed URL 1. Open the **App Store** (`admin.cenaly.com/app-store`): integration cards are located in the main grid of the **"Per account"** tab along with the rest of the extensions. 2. Find the **"Pinterest Catalogs"** card — searching by name is the fastest way. 3. Click **"Configure"**: settings will open in a **modal window** right over the showcase without navigating away from the page. 4. In the window header, select the **location** for which you are connecting the export. 5. Click **"Connect"** — there is no need to enter API credentials; the feed model has no keys. 6. The card will display **feed URLs in XML and CSV formats**, with a copy button 📋 next to each line (shows "Copied" after clicking). URL format: `https://cdn.cenaly.com/feeds/pinterestfeed/{account-id}/{location-id}.xml` (and `.csv`). > The title of the link block and the hint below are currently shared across all product feeds and mention Yandex Products — this is an interface inaccuracy: the links themselves point specifically to your Pinterest feed. The feed is assembled from the location's catalog (retail mode) and regenerated **upon connection and whenever a product card is modified** — when a product is created or edited (name, price, stock in the card). Deducting stock via sales and deleting a product do not update the feed on their own yet — these changes are reflected upon the next card edit. Variations are exported as separate items with a shared `item_group_id`; prices take discounts (`sale_price`) and channel pricing rules into account, while stock levels consider the inventory buffer. --- ## Step 2. Adding the Feed to Pinterest Catalogs 1. Log in to **Pinterest Business** ([business.pinterest.com](https://business.pinterest.com)) and **claim the domain** of your storefront website (Pinterest requires domain claiming for catalogs). 2. Open **"Catalogs"** in the business tools menu (**Ads → Catalogs**). 3. Add a **data source** — feed via URL link. 4. Specify the **file URL** — paste the feed link from step 1 (**XML** is recommended), select the **country and language/currency**. 5. Save — Pinterest will start periodically fetching the feed. Pinterest will process the feed and create Product Pins; then the catalog undergoes a **review process**. Once approved, the items become available for advertising and the Shop section. > Menu item names in Pinterest Business may change — look for the "Catalogs" section and adding a data source via URL. --- ## Which format to choose: XML or CSV Pinterest accepts both. **XML** is preferred for variations and multiple images; **CSV** is convenient for manual inspection of content. Key feed fields: | Field | Contents | |------|--------------| | `id` | Unique product identifier | | `title` | Title | | `description` | Description | | `link` | Link to the product page in the web catalog | | `image_link` | Main photo | | `additional_image_link` | Additional photos | | `availability` | `in_stock` / `out_of_stock` | | `price` | Price | | `sale_price` | Sale price | | `brand` | Brand | | `gtin` | Barcode | | `mpn` | SKU / Part number | | `condition` | Condition (`new`) | | `item_group_id` | Variation group | | `product_type` | Your product category — full path "Section > Subsection > Category" | | `google_product_category` | Category from Google taxonomy (from the product card, otherwise — default value for the location) | --- ## How Pinterest Fetches the Feed Pinterest **downloads the feed itself** on a schedule from the specified URL (typically daily). The platform regenerates the feed whenever a product card is edited, so the next fetch retrieves the data in the state it was last saved in the catalog. You do not need to submit the feed manually; the recommended update frequency is **once a day**. --- ## Requirements and Common Issues - **Domain confirmation (claim).** Pinterest requires you to claim ownership of the storefront website domain; otherwise, the catalog will not be accepted. - **Working product links.** The `link` must lead to a functioning product page — enable the **web catalog** (location storefront website). Product links in the feed are currently being checked: they are constructed from the location storefront address and are valid if the location has a **custom domain** configured (a full address with a dot). Until this is resolved, Pinterest may reject items for locations on a platform subdomain — verify the address in the downloaded feed before adding the data source. - **Photos are required.** Without `image_link`, the item is rejected; Pinterest prefers high-quality vertical images. - **Currency and country.** Must match the Pinterest account settings. There is currently no currency selection option in the integration interface: the feed is exported in **USD**. If the Pinterest catalog is maintained in another currency, this is also being checked — until resolved, the platform may reject items. - **Moderation.** The catalog undergoes review; prohibited categories are rejected. - **Description and title.** Fill in the text fields — this affects approval and Pin reach. --- ## Related Sections - [Catalog and products](/en/docs/product-features) — data source for the feed - [Storefront website and domains](/en/docs/website-builder) — where feed links point to - [App Store](/en/docs/app-store) — where the integration is connected - [Meta Product Feed](/en/docs/meta-feed) — similar catalog for social networks --- ## Frequently Asked Questions ### Are orders processed inside Pinterest? No — the customer follows a Product Pin to **your store's storefront website** and places the order there. ### Is there a fee? There is no separate purchase for the extension: it is unlocked on subscription plans with marketing tools and connected per location. The catalog and Product Pins in Pinterest are free; you only pay for advertising in Pinterest Ads. ### Do I need to export the feed manually? No. The platform regenerates the feed whenever an item card is edited, and Pinterest fetches it on a schedule. If an item is discontinued or its stock quantity changed only through a sale, open and save the card — this will update the export. ### The catalog is not accepted — why? Most often, the domain is not claimed, photos are missing, or the catalog fails category verification. Product links and feed currency are currently being validated — until resolved, Pinterest may reject items for a location without a custom domain or for a catalog not in USD (see "Requirements and Common Issues"). ### I can't find the "Pinterest Catalogs" card in the App Store Most likely, none of your locations are in a country from the Pinterest market list — in that case, the extension is hidden completely (see the callout at the beginning of the article). Check the location's country in its card; the second reason is a plan without marketing tools. ### How are product variants exported? Each variant is a separate item with a shared `item_group_id`. --- # Criteo Product Feed — Catalog for Retargeting and Performance Advertising The **"Criteo"** extension (as the card is named in the App Store) exports your store catalog to **Criteo** ([criteo.com](https://www.criteo.com), **Management Center** dashboard) — a major advertising network focusing on **dynamic retargeting** and **product performance advertising**. Based on the feed, Criteo: - displays **banners featuring specific products** from your store to visitors who browsed the catalog but did not make a purchase (retargeting); - runs pay-for-performance **performance campaigns** across its entire network of websites, apps, and partners; - automatically selects the most relevant products for each user. Checkout takes place on your **store's storefront website**. The feed serves as the product data source (prices, availability, photos, links) for Criteo ad creatives. Usually, along with the feed, a **Criteo tag/pixel** is installed on the website to track behavioral data — provided by your Criteo account manager. The extension operates on a **feed model without API keys**: the platform generates a public product feed in the **Google Product Feed** format (Criteo supports this schema) and updates it whenever product details change. You provide the feed URL in your Criteo settings. The card is available on the **plan with marketing tools** (advertising and SEO) and is hidden if none of the account's locations are in a Criteo market: the extension is unavailable in Russia, Belarus, Cuba, Iran, North Korea, and Syria. --- ## Step 1. Connection in Cenaly and feed link 1. Open the **App Store** (`admin.cenaly.com/app-store`): integration cards are located in the main grid of the **"Per account"** tab alongside other extensions. 2. Find the **"Criteo"** card — the fastest way is searching by name. 3. Click **"Configure"**: settings will open in a **modal window** directly over the showcase without navigating away from the page. 4. In the window header, select the **location** for which you are enabling the export. 5. Click **"Connect"** — there is no need to enter API credentials; the feed model does not use keys. 6. The card will display **feed links in XML and CSV formats**, each line having a copy button 📋 (clicking it displays "Copied"). URL format: `https://cdn.cenaly.com/feeds/criteofeed/{account-id}/{location-id}.xml` (and `.csv`). > The link block label and the tooltip below them are currently shared across all product feeds and mention Yandex Products — this is an interface inaccuracy: the links themselves lead specifically to your Criteo feed. The feed is compiled from the location catalog (retail mode) and regenerated **upon connection and when a product card is modified** — when a product is created or edited (name, price, stock in the card). Stock deductions from sales and product deletions do not update the feed on their own yet — they get included during the next card edit. Variations are exported as separate items with a shared `item_group_id`; prices account for discounts (`sale_price`) and channel pricing rules, while stock levels account for inventory buffers. --- ## Step 2. Submitting the Feed to Criteo Unlike self-service dashboards, working with Criteo often goes **through a dedicated manager or partner**, but the feed URL is added the same way — in the catalog feed management section: 1. In the **Criteo Management Center** dashboard, open the **catalog/feed** section (**Catalog / Feed settings**). 2. Add a new **data source by URL** (feed by URL). 3. Paste the feed link from Step 1 (**XML** is recommended), specify the catalog **currency and country**. 4. Set up an **automatic fetch schedule** and save. If a Criteo manager sets up the feed — **send them the copied link to the XML feed** and the parameters (currency, country). 5. Make sure the **Criteo tag** (provided by Criteo) is installed on the storefront website — it is required for retargeting. Criteo will load the feed and match items with the tag data; then the catalog undergoes **verification/integration** on Criteo's side. > The Criteo interface and connection process depend on the account type — refer to the catalog feed settings section and the upload by URL option; when working with a manager, simply share the feed link with them. --- ## Which Format to Choose: XML or CSV Criteo accepts both. **XML** is preferred for variations and multiple images; **CSV** is convenient for manual inspection. Check with your Criteo manager for the preferred format for your account — if in doubt, use **XML**. Key feed fields: | Field | Content | |-------|---------| | `id` | Unique item identifier | | `title` | Name | | `description` | Description | | `link` | Link to the item page in the web catalog | | `image_link` | Main photo | | `additional_image_link` | Additional photos | | `availability` | `in_stock` / `out_of_stock` | | `price` | Price | | `sale_price` | Discounted price | | `brand` | Brand | | `gtin` | Barcode | | `mpn` | SKU / Part number | | `condition` | Condition (`new`) | | `item_group_id` | Variation group | | `product_type` | Your item category — full path "Section > Subsection > Category" | | `google_product_category` | Category from Google taxonomy (from the item card, otherwise — default value for the location) | --- ## How Criteo Fetches the Feed Criteo **automatically downloads** the feed on a schedule from the specified URL. Up-to-date pricing and availability are crucial for retargeting, so the recommended frequency is **at least once a day**, and more often for stores with frequent changes. The platform regenerates the feed whenever an item card is edited, so each subsequent download captures the data as it was last saved in the catalog. --- ## Requirements and Common Issues - **Working item links.** The `link` must lead to an accessible item page — enable the **web catalog** (the location's storefront website), otherwise creatives will lead nowhere. Item links in the feed are currently being verified: they are generated from the location's storefront URL and are valid if the location has a **custom domain** configured (full address with a dot). Until this is resolved, Criteo may reject items for locations on a platform subdomain — check the URL in the downloaded feed before sharing the link with your manager. - **Photo is mandatory.** Without `image_link`, the item will not be displayed in the banner. - **Criteo tag on the website.** Without the tag installed, retargeting will not collect an audience — coordinate the installation with your Criteo manager. - **Currency and country.** Must match your Criteo account settings. There is currently no currency selection in the integration interface: the feed is exported in **USD**. If your Criteo account is maintained in a different currency, this is also being verified — until resolved, the platform may reject items. - **Data consistency.** Price and availability in the feed must match the item page — discrepancies degrade campaign quality. - **Description and title.** Fill in the text fields — item matching relevance depends on them. --- ## Related Sections - [Catalog and Products](/en/docs/product-features) — data source for the feed - [Storefront Website and Domains](/en/docs/website-builder) — where links from the feed lead - [App Store](/en/docs/app-store) — where the integration is connected - [Google Product Feed](/en/docs/google-feed) — similar export for Google --- ## Frequently Asked Questions ### How does Criteo differ from Google/Meta? Criteo specializes in **dynamic retargeting** and performance advertising across its network of websites and apps — displaying previously viewed items via retargeting banners. The feed schema is the same (Google Product Feed). ### Is it paid? There is no separate purchase for the extension: it is unlocked on plans with marketing tools and connected per location. You pay for advertising directly in Criteo according to your model (typically pay-per-result / per click). ### Is a website tag required? Yes, Criteo retargeting requires its tag/pixel on the storefront website. The feed provides item data, while the tag tracks user behavior. ### Do I need to export the feed manually? No. The platform regenerates the feed whenever an item card is edited, and Criteo downloads it on a schedule. If an item is discontinued or its stock level changed only via sales, open and save the card — this will refresh the export. ### Why aren't items showing up? Common reasons: missing photo, Criteo tag not installed, or data discrepancies between the feed and the item page. Item links and feed currency are currently being verified — until resolved, Criteo may reject items for locations without a custom domain or for accounts not in USD (see "Requirements and Common Issues"). --- # 1C:Accounting — Integration This integration connects **1C:Accounting Enterprise** (edition 3.0) to your cenaly/cenaly.com account over the standard 1C:Enterprise **OData** protocol — no manual file export/import required. Connect it as an extension in the **App Store** (`admin.cenaly.com/app-store`) — the "1C" card. --- ## Connecting **Before you start:** you need the **Premium** plan or higher (the integration is part of the "Inventory" feature) and a location in one of the countries where 1C is used — Russia, Belarus, Kazakhstan, Uzbekistan, Kyrgyzstan, Armenia, Azerbaijan, Georgia, Moldova, Tajikistan, Turkmenistan, Ukraine. Elsewhere the "1C" card is not shown in the catalog, and with a lower plan you get an upgrade prompt instead of the connection form. **Cloud 1C** (e.g., 1C:Fresh) is supported — a direct HTTPS connection: 1. Open the **App Store**, find the **"1C"** card and click **"Configure"** — the card opens in a modal right on the catalog page, and the location is picked in the header of that window. 2. The first field of the form is **"Connection mode"**: choose **"Cloud 1C (1C:Fresh)"** (the second option, "Local 1C (via Hardware Bridge)", is still disabled — see below). Then fill in the **OData base URL**, the infobase user and the password. 3. Click **"Test connection"** — the system reads your base description (`$metadata`), reports how many entity sets it found there, and warns if nomenclature or counterparties are missing under their standard names. 4. Once verified, run syncs with the **"Sync now"** button — manually, whenever needed. > A local 1C base behind your network perimeter (via Cenaly Hardware Bridge) is under development and not yet available. Direct connection to a cloud base already works today. --- ## What gets synced - **Nomenclature** (`Catalog_Номенклатура`) → flows into your product catalog under [Inventory](/en/docs/inventory). - **Counterparties** (`Catalog_Контрагенты`) → flow into your supplier directory. Each record gets a stable ID tied to its 1C record — re-running the sync updates existing products and suppliers instead of creating duplicates. --- ## Known limitations The integration is a direct pull from 1C into cenaly (one-way at this stage): - **Unit of measure** isn't carried over automatically — new products are created with a default "pcs" unit; adjust manually if needed. - **Product category** isn't mapped automatically from the 1C nomenclature group — sort new products into cenaly categories manually. - **Barcode** is picked up only if your base publishes it right in the nomenclature card (in a standard 1C configuration barcodes often live in a separate subordinate register) — otherwise the **"Артикул"** (SKU) field is used, so an SKU may end up in the barcode field. Check barcodes after the first sync. - For counterparties the name, full name and **tax ID** are carried over. **Bank details are not** — in 1C they live in a separate bank-accounts directory, which is out of scope at this stage; fill them into the supplier card manually. - The connected card already shows the **"Sales document"** (retail sales report or goods & services sale) and **"Stock master"** (cenaly or the 1C stock register) settings — they belong to the future **document push into 1C** and do not affect today's import. When the push arrives, documents will always be created **unposted** for the accountant to review and post. --- ## Related sections - [Inventory](/en/docs/inventory) — the product catalog nomenclature from 1C flows into - [App Store](/en/docs/app-store) — connecting the integration - [Evotor](/en/docs/evotor) — a similar integration for Evotor POS terminals --- ## FAQ ### Do I need a separate 1C license for the integration? The integration uses the standard OData interface built into 1C:Enterprise 8.3 — no separate license is required for the integration itself, just access to your base. ### Does sync happen automatically? At this stage, sync is triggered manually with the "Sync now" button — an automatic schedule isn't wired up yet. ### Does data flow both ways? Currently only from 1C into cenaly (nomenclature and counterparties). Pushing invoices and sales reports back into 1C is under development. ### What if my 1C runs locally, not in the cloud? Direct cloud connection works today. Connecting a local base via the Cenaly Hardware Bridge is under development — check with support for the current status. --- # Dish Flyer Designer The **flyer designer** turns any item on your menu into a finished promotional material: a leaflet, a menu insert, a sticker, a table tent, a poster or a postcard. No graphic editor and no designer needed — the layout comes together in a couple of minutes, and the result can be **printed, saved as PDF, downloaded as an image or shared as a link**. There are two ways to open it: - from the dish card in the **Menu** section — with the create-flyer button; - from the **print hub** (**Marketing → 🖼️ Print**), where all print materials live: printing the whole menu and materials for individual items. Items that already have a design are marked with a "Designed" badge. --- ## Layouts and formats There are **37 ready-made layouts**, grouped by purpose: | Group | Examples | |-------|----------| | **Classic dish cards** | Classic Hero, Polaroid, Editorial, Minimalist, Tasting Card, Rustic Frame | | **Menu inserts** | dish of the day, wine list, desserts, kids menu | | **Stickers and labels** | round sticker, square label, jar label, takeaway seal | | **Tabletop** | table tent, tri-fold tent, coaster, shelf wobbler | | **Walls and windows** | wall poster, window cling, social-media square | | **Promo and loyalty** | postcard, door hanger, gift voucher, loyalty card, business card, bookmark | | **Themed styles** | Chalkboard, Neon Retro, Vintage Stamp, Asian Ink, Mediterranean, French Bistro, Luxury Gold, Summer Fresh, Georgian feast, street food | Every layout sets its own paper format, palette and font pair — and all of it can be changed. **Paper formats (18):** A3 (poster), A4, A5, A6, US Letter, square 200×200, table tent 100×210, tri-fold tent 105×148, business card 89×51, bookmark / menu strip 60×210, door hanger 102×229, round sticker ⌀80, square label 70×70, coaster 95×95, shelf wobbler 70×100, DL postcard 148×100, voucher / loyalty card 85×55. Orientation — portrait or landscape. --- ## How the editor works ### Layout Pick a template. It is a starting point: colors, fonts, format and content can all be changed afterwards. ### Style Palette (quick sets or your own colors), font pair, text size, photo focus, and safe-margin guides (5 mm, on screen only). The same tab holds the **photo card**: it shows the shot that will actually land on the sheet and names its source (dish photo, cutout without background, or your own picture). **"Replace"** takes an image from the account gallery, **"Remove"/"Bring back"** hides the photo from the sheet, and **"Back to the dish photo"** drops your override. Replacing never touches the dish card — the file goes into this design's assets. ### Content - **Title** — the dish name by default; keep it short and appetizing. - **Description** — the text under the title. - **Price, badge, logo, allergens, QR code** — each can be switched on or off separately. The QR code points to the dish page in your digital menu. ### Elements Click any element right on the sheet (photo, title, description, price, badge, logo, QR, tags) — a panel opens with offset, scale, rotation, opacity, color, font, alignment, layer and show/hide. Elements can also be dragged with the mouse, and a list with "eyes" is available on the Style tab. ### Images Custom image layers on top of the layout: upload a file or **generate one from a description with AI** (generation is not available on every brand — see the "AI assistant" section). Each layer has position, size, shape (rectangle / rounded / circle), rotation, opacity and layer order. ### My designs A design you like can be saved as a preset and applied to any other dish — the style stays yours, while the name, description and QR code come from the new item. --- ## AI assistant **Exception — the Russian contour.** On brands running in the Russian cloud (`cenaly.ru`) the flyer's AI features are not available yet: design suggestion, AI copywriter, decorative background, background removal, chat edits and image-layer generation. On such a build the panels and buttons are simply not shown — the layout is assembled by hand. Everything else (layouts, formats, style, elements, printing, PDF, link) works the same on every brand. - **AI design** — from the name, description, price and category it picks a template, palette, fonts and a headline in one click. - **AI copywriter** — three description options to choose from: short, sensory, poetic. - **AI background** — from your description it draws a subtle decorative pattern (no text, no plates) that becomes a semi-transparent background. - **Photo background removal** — AI cuts the dish out of its background; the result is cached in the dish card, so switching it on again is instant. - **Chat edits** — tell the assistant in plain words ("make the background dark green and the price gold", "hide the QR code and enlarge the title") and it applies the changes in one step — with undo available. All AI features are optional: layout, style and copy can be set manually. --- ## Printing and export | Button | What it does | |--------|--------------| | **Print / Save PDF** | Opens the print dialog: send it to a printer or choose "Save as PDF". Only the sheet itself is printed, without the interface | | **PNG** | Downloads the flyer as a high-resolution image — for social media and messengers | | **Share** | Builds a PDF at the exact size of the chosen format, uploads it under a secret link and hands the link to you: the recipient opens the file without an account (on a phone — through the system share sheet) | **Several copies per sheet.** For small formats (business card, sticker, bookmark, table tent) the "Print" block offers the **"N copies per A4 sheet"** mode — the system calculates how many copies fit and prints a grid with dashed cutting guides. One A4 sheet — a whole batch of stickers or cards. Before printing, the designer warns you if the photo is still loading in high resolution, the QR code is enabled without a link, or the badge text is empty. The design is saved automatically in the dish card — come back and continue where you left off; `Ctrl/⌘ + Z` undoes, `Ctrl/⌘ + Shift + Z` redoes. --- ## Related sections - [Print Menu](/en/docs/print-menu) — the PDF builder for the whole menu - [QR Menu](/en/docs/qr-menu) — the dishes and photos a flyer is built from - [Facebook post composer](/en/docs/fb-posts) — where a finished flyer comes in handy - [Digital Signage](/en/docs/signage) — showing promos on a TV screen --- ## FAQ ### Where do the photo and the dish name come from? From the dish card in your menu — the flyer fills them in automatically, and you can edit the title and description if you want. ### Can I make a flyer without AI? Yes. All AI features are optional: pick a layout, set the style and text manually, then print or save a PDF. ### In which format is the result saved? PDF — for printing and print shops, PNG — for social media and messengers, and a public link — to send the artwork to a client or a colleague without attachments. ### How do I print many small cards? Turn on the "N copies per A4 sheet" mode — the sheet will hold as many copies as fit, with cutting guides. ### Can I apply the same design to other dishes? Yes, save it to "My designs" and apply it to any other item — its own texts and QR code will be filled in. --- # Facebook Post Composer The **Facebook Posts** section is a post composer for your venue's Page. You prepare a post (text + photo), save a draft or publish it straight to your Facebook Page — without switching to Facebook itself. Open: **Admin Panel → Facebook Posts** (`admin.cenaly.com`). > ⚠️ **The section is currently unavailable.** Connecting to Facebook, publishing, statistics and boosting all call a server-side part that used to run on the admin panel's previous hosting platform; since that platform was retired the calls no longer arrive and the section shows an error. The integration is being moved to a new backend — until then, publish posts in Facebook itself. Everything below describes how the feature works and what it will return to after the move. --- ## Connecting Click **"Connect Facebook"** and authorize, then pick the **Page** you'll post to (if you have several). You can change the Page any time. --- ## Creating a post ### Ready-made templates Start from a template for the occasion: - **Announcement / new item** — introduce a new dish; - **Promo** — a discount or special offer; - **Event** — an evening, concert or holiday; - **Story / article** — a story about your venue; - **Custom** — from a blank slate. ### Editor - **Post text** — what your followers will see. - **Image** — pick a **photo from your menu** or provide your own image URL. - **Link** — e.g. to your menu or a reservation page. - **Preview** — how the post will look coming from your Page. ### AI help The AI can **generate the post text** — for example, around a specific dish or from your short brief. --- ## Drafts, publishing and scheduling - **Save draft** — set it aside and come back later. - **Publish** — the post goes to your Facebook Page. - **Schedule** — set a date and time for the post to publish automatically. The **"My Posts"** list shows what's a draft and what's already published; a post can be **edited**, **deleted** or **opened in Facebook**. --- ## Boosting a post into an ad Any post can be **"Promoted"** — turned into a Meta ad. You set the ad account, daily budget, duration and target countries. The ad is created **paused** so you can review it before launch. --- ## Related sections - [WhatsApp Ads](/en/docs/whatsapp-ads) — Click-to-WhatsApp via Meta - [Dish Flyer Designer](/en/docs/dish-flyer) — ready-made images for posts - [Facebook and Meta](/en/docs/integration-advertising) — ad accounts and analytics --- ## FAQ ### Do I need to set anything up in Facebook? Only connect the account and pick a Page — everything else happens in the admin panel. ### Where do the images come from? From your menu photos ("photo from menu") or from your own image URL. ### Does the post publish immediately? Your choice: save a draft, publish now, or schedule it for a future time. --- # Facebook Ads — Advertising Management Dashboard The **Facebook Ads** section is a dedicated dashboard for managing and analyzing **all** of a location's Facebook/Instagram ad boosts. Open **Admin Panel → 📣 Advertising → Facebook Ads** (`admin.cenaly.com/fb-ads`). > ⚠️ **The section is currently unavailable and is being migrated.** The dashboard data came through the server routes of the old admin hosting; after the frontend moved to static delivery they stopped answering. The integration is being moved to the platform's server functions — until then the dashboard will show no data. While the migration is in progress, use Meta Ads Manager; the screens described below are what the section will look like afterwards. **When the section is visible.** It is gated by the same switch as [Facebook Posts](/en/docs/fb-posts): turning off the **"Facebook Ads"** card in the App Store removes **both** sidebar items at once. The card is also hidden if no location of the account is in a Meta market — the extension is unavailable in Russia, China, Cuba, Iran, North Korea and Syria. > This section **does not create** new campaigns — boosting a post remains in [Facebook Posts](/en/docs/fb-posts), which links directly here. Facebook Ads is the control center for campaigns that already exist: overview, comparison, bulk actions and deep analytics. --- ## KPIs and trends At the top of the dashboard are tiles with key metrics (spend, clicks, impressions, CTR, CPC, etc.) and trend charts for the selected period. Data is computed across **all** active and completed campaigns of the location at once, grouped by currency if you have multiple ad accounts in different currencies. **Period-over-period comparison** is available — deltas on each tile are color-coded based on what the metric means (rising CPC/CPM is bad, rising CTR/clicks is good, spend/frequency is neutral). --- ## Campaign comparison table Below is a table of all campaigns with sorting, filtering, search, and a per-campaign daily breakdown: - **Manage directly from the table** — activate or pause a single campaign or several at once (bulk action), with a confirmation step whenever a budget change touches real spend. - **Budget editing** is available only for paused campaigns — to avoid accidentally increasing active spend. - **CSV export** — separate exports for overall metrics, daily series, and breakdowns. - **Direct links** to Meta Ads Manager for each campaign. --- ## Audience and placement breakdowns A dedicated **"Audience & Placements"** section shows performance by: - age/gender; - platform and placement position (Facebook/Instagram feed, Stories, etc.); - region. Breakdowns are loaded on demand (lazy-loaded) and never auto-refresh — not even when the "Auto-refresh" checkbox is on for the overall metrics. --- ## Delivery diagnostics and recommendations The dashboard flags campaigns with delivery issues (disapproved, has issues, ad account disabled, pending review) — visible right away, without opening Ads Manager. The **recommendations** block compares campaigns against each other (best CTR / worst CPC at a sufficient volume of impressions), flags active campaigns with no impressions for several days in a row, and watches budget pacing. --- ## Related sections - [Facebook Posts](/en/docs/fb-posts) — the post builder and boost launcher - [Google Ads](/en/docs/google-ads) — search and display campaigns on Google - [Yandex.Direct](/en/docs/yandex-ads) — advertising for the RU/CIS market --- ## FAQ ### Can I launch a new ad campaign here? No, creating and launching a post boost happens in [Facebook Posts](/en/docs/fb-posts). Facebook Ads is a dashboard for managing and analyzing campaigns that are already running. ### Are budget changes applied immediately? Budget can only be edited on a paused campaign — this protects against accidentally increasing active spend. ### Does the data update in real time? No, by default only via the "Refresh" button. Next to the period selector there is an **"Auto-refresh"** checkbox: switch it on and the overall metrics will be pulled every 60 seconds — but only while there is an **active** campaign and the browser tab is open on this screen. The choice is remembered in the browser. Audience and placement breakdowns never auto-refresh — they load only on demand. ### Do I need a separate Facebook ad account? Yes, the dashboard requires the Facebook integration to be connected (see [Facebook Posts](/en/docs/fb-posts)) — without it, the section shows a prompt to connect. The sidebar item itself appears only while the "Facebook Ads" card is enabled in the App Store: the same card controls the "Facebook Posts" section. --- # Google Business Profile — Advertising and Autopilot This section manages your **Google Business** profile (what guests see on Google Maps and Search) right from the admin panel, without switching to a separate Google console. Connect it as an extension in the **App Store** (`admin.cenaly.com/app-store`) — the "Google Business" card; its **"Configure"** button opens the connection panel right there, without leaving the storefront. > ⚠️ **Google Business Profile does not work in Russia** — Google suspended the service there in 2022. That is why the card is hidden from accounts and locations whose country is **RU**: if you cannot find it in the App Store, this is the reason. --- ## Info, hours, photos and menu The management modal's tabs give you: - **Basic profile information**; - **Special and extra hours** — e.g. holiday hours or separate delivery hours; - **Profile photos**; - **Menu sync** (Food Menu) — dishes from your digital menu are pushed into the Google Business profile's menu section. --- ## Posts with call-to-action buttons Publish posts to your profile right from the admin panel — with a **call-to-action button** (order, call, learn more, etc.) and automatic **UTM tagging**, so you can tell Google Business post traffic apart from organic traffic in analytics. --- ## Attributes and Place Actions - **Profile attributes** — flag venue features (outdoor seating, delivery, wheelchair accessibility, etc.) that Google surfaces on the profile card. - **Place Actions** — deep links to specific actions (order, book a table, view menu) that Google highlights right on the profile card next to the directions button. --- ## Reviews: AI-drafted reply In the reviews tab, you can reply to a guest review using an **AI-generated draft** — the draft can be edited before publishing. --- ## Autopilot Autopilot handles routine posting for you, but **by default it only suggests** posts for your approval — nothing is published without your consent until you explicitly turn on auto-publish for a specific post type: - **New dish with a photo** — when a new dish appears in your menu, autopilot suggests a post with its photo. - **Happy-hour / promo** — when a discount schedule is activated (see [Scheduling & Happy Hour](/en/docs/scheduled-menus)), a promo post is suggested. - **Auto menu sync** — the profile's Food Menu section is updated automatically as your digital menu changes. Suggested posts wait in a queue — you **approve** or **dismiss** each one. Even with auto-publish enabled, a cap applies — no more than one auto-post per day per location, so the profile never looks spammy. --- ## Related sections - [Reviews & Reputation](/en/docs/reviews) — the unified guest-rating hub, including Google reviews - [Facebook Posts](/en/docs/fb-posts) — a similar post builder for Facebook/Instagram - [Scheduling & Happy Hour](/en/docs/scheduled-menus) — the promos autopilot reacts to - [App Store](/en/docs/app-store) — connecting the extension --- ## FAQ ### Will autopilot publish something without my permission? No, by default autopilot only suggests posts for approval. Automatic publishing is a separate opt-in you must enable deliberately for each post type. ### How many posts a day can autopilot publish? No more than one auto-post per day per location — even with auto-publish enabled. ### Can I edit the AI-drafted reply? Yes, the draft is a starting point; you can edit it or write your own reply before publishing. ### Do I need a separate Google account for this section? Yes, a connected Google Business profile is required — the extension is connected in the App Store. --- # Google Ads — Advertise Your Restaurant on One Screen The **Google Ads** section lets you run ads for your venue in Google Search and monitor their performance without juggling a dozen tabs in the ads manager. Connect your Google Ads account once, then create campaigns and read reports right inside the admin panel. Open: **Admin Panel → 📣 Advertising → Google Ads** (`admin.cenaly.com/google-ads`). > ⚠️ **The section is currently unavailable and is being migrated.** Account connection and campaign management were built on the server routes of the old admin hosting; after the frontend moved to static delivery they stopped answering. The functionality is being moved to the platform's server functions — until then "Sign in with Google", the campaign list and the analytics in this section will not work. While the migration is in progress, run campaigns in `ads.google.com` itself; the screens described below are what the section will look like afterwards. > This is not the same as [Advertising & Marketing](/en/docs/integration-advertising), where you just enter a Customer ID for analytics. Here you actually **create and launch** campaigns. **When the section is available.** It is unlocked by a **plan with marketing tools** (advertising and SEO) — otherwise the "Google Ads" card in the App Store offers a plan upgrade. There is also a country restriction: the card is hidden if no location of the account is in a Google Ads market — the extension is unavailable in Russia, Cuba, Iran, North Korea and Syria. --- ## Connecting an account In the **"Google Ads account"** card, click **"Sign in with Google"** and grant access. After authorization, pick the ads account from the list (if you have several — e.g. your own and a client's). Manager accounts are marked with a separate badge. The connection is made **per location** — switch locations in the dropdown at the top of the page. If you don't have an ads account yet, create one at `ads.google.com`, then come back and click "Refresh". --- ## Campaigns tab The tab shows every campaign in the selected account — both those created in Cenaly and those created directly in Google. Each shows metrics for the last 30 days: | Column | What it shows | |--------|----------------| | Status | Active · Paused · Removed | | Budget/day | Daily spend limit | | Impressions | How many times the ad was shown | | Clicks | How many times it was clicked | | CTR | Share of clicks per impressions | | Avg. CPC | Average cost per click | | Cost | Spent during the period | | Conv. | Conversions | Straight from the list you can **pause**, **re-enable** or **remove** a campaign. The **"Open Google Ads"** button takes you to the full manager for fine-tuning. --- ## Creating a campaign Click **"New campaign"** and fill in the form: - **Name** — e.g. "Lunch menu — Tbilisi". - **Daily budget** — how much you're willing to spend per day. - **Duration** — how many days to run it. - **Countries** — ISO codes, comma-separated (e.g. `GE, AM`). - **Landing page URL** — where the ad leads, usually your menu page. - **Keywords** — one per line (e.g. "restaurant tbilisi", "khinkali delivery"). - **Headlines** — at least 3, up to 30 characters each. Google mixes them into the best-performing combination. - **Descriptions** — at least 2, up to 90 characters each. The campaign is created **paused** — no money is spent until you enable it. Review the ads in the list and activate when ready. --- ## Analytics tab A performance summary for 7, 30 or 90 days — across all campaigns or a selected one: - KPI tiles: impressions, clicks, cost, conversions, CTR, average CPC. - A **daily dynamics** chart (clicks / impressions / cost, your choice). - A breakdown **by campaign** so you can see what works best. The open tab is stored in the page address (`?tab=campaigns` or `?tab=analytics`), so you can share a link to a specific tab with a colleague, and it survives a page refresh and the browser's "back" button. --- ## Related sections - [Advertising & Marketing](/en/docs/integration-advertising) — connecting ad accounts for analytics - [Yandex Ads](/en/docs/yandex-ads) — a similar ad builder for the CIS market - [WhatsApp Ads](/en/docs/whatsapp-ads) — Click-to-WhatsApp via Meta - [Analytics](/en/docs/analytics) — internal sales reports --- ## FAQ ### Will money be charged as soon as I create a campaign? No. A campaign is always created paused. Until you click "Enable", there are no impressions and no spend. ### Whose account is charged? The balance of your Google Ads account, not your Cenaly balance. You set the payment method in Google Ads itself. ### Can I run ads for multiple locations? Yes. Each location is linked to its own Google Ads account — switch locations at the top of the page. ### Do I have to write the ads myself? Yes, you provide the headlines and descriptions — Google automatically combines them to find the most effective variant. --- # Yandex Ads — Advertising Without an Agency The **Yandex Ads** section is a simple wizard for launching ads in Yandex.Direct. It's built for an everyday venue owner: no need to understand bids, negative keywords or ad-account settings — you answer a few plain questions and the system configures the rest. Open: **Admin Panel → 📣 Advertising → Yandex Ads** (`admin.cenaly.com/yandex-ads`). > ⚠️ **The section is currently unavailable and is being migrated.** Signing in with Yandex ID, the campaign wizard and the AI ad-text generation ran through the server routes of the old admin hosting; after the frontend moved to static delivery they stopped answering. The integration is being moved to the platform's server functions — until then the wizard cannot create a campaign. While the migration is in progress, run campaigns in Yandex.Direct itself; the screens described below are what the section will look like afterwards. **Where the section is available.** The "Yandex Ads" card is unlocked by a **plan with marketing tools** (advertising and SEO) and is shown only to accounts whose locations are in one of these countries: **Russia, Belarus, Kazakhstan, Uzbekistan, Kyrgyzstan, Armenia, Azerbaijan, Georgia, Moldova, Tajikistan, Turkmenistan and Turkey**. It is a closed list — outside it the card does not appear in the App Store. --- ## Connecting Click **"Sign in with Yandex ID"** and grant access to Yandex.Direct — you authorize once. The connection is made for the selected location. --- ## The 5-step wizard ### Step 1. Goal Choose what you want from the ad: - **More orders from the menu** — the ad leads people straight to your menu so they can order. - **More people nearby learn about you** — show your restaurant to people who live and work close by. ### Step 2. Where to show it The ad is shown to people near your venue's address. Set a **radius** around the restaurant — people within that distance will see it. If no address is set in the location settings, the ad temporarily shows across your whole city. ### Step 3. Budget Set **how much to spend per day**. You can change it any time or stop the ad completely. Pick a duration: run indefinitely or limit by a number of days. Spend is charged to your Yandex.Direct account balance, not your Cenaly balance. ### Step 4. The ad The system prepares the ad text **from your menu** — a headline and body. Edit anything by hand, or click **"Generate again"** for another variant. A preview is shown alongside. ### Step 5. Review & launch The final screen brings it all together: goal, radius, budget, duration and where the ad leads. Click **"Launch"** — the campaign goes to Yandex moderation. After launch the ad is reviewed for a while, then starts running. --- ## Campaign dashboard The dashboard shows all your campaigns with clear statuses: **in moderation**, **ready**, **active**, **paused**, **rejected** (with a reason) or **archived**. For each you see: - spend today and over the last 7 days; - impressions and clicks, with a plain-language hint ("out of every 100 impressions, N people clicked through"); - actions: pause / resume / edit budget / archive. --- ## Related sections - [Google Ads](/en/docs/google-ads) — campaigns and analytics for Google - [Telegram Ads](/en/docs/telegram-ads) — creative and honest attribution for Telegram - [WhatsApp Ads](/en/docs/whatsapp-ads) — Click-to-WhatsApp via Meta - [QR Menu](/en/docs/qr-menu) — the menu page the ad leads to --- ## FAQ ### Do I need to understand Yandex.Direct settings? No. The wizard asks plain questions and configures the campaign for you. Advanced parameters are intentionally hidden to keep things simple. ### Who pays for impressions? Spend is charged to your Yandex.Direct account balance. Cenaly does not charge for impressions. ### Can I change the budget after launch? Yes, the daily budget can be changed right in the campaign dashboard at any time, where you can also pause the campaign. ### Where does the ad text come from? An AI prepares it from your menu. You can edit the text or regenerate it. --- # WhatsApp Ads — Guests Message You Instantly The **WhatsApp Ads** section launches Meta (Facebook/Instagram) **Click-to-WhatsApp** ads: a guest taps the ad and lands straight in a WhatsApp chat with your venue — to ask about the menu, book a table or place an order in the conversation. Open: **Admin Panel → 📣 Advertising → WhatsApp Ads** (`admin.cenaly.com/whatsapp-ads`). > ⚠️ **The section is currently unavailable and is being migrated.** Connecting, the campaign wizard and the AI ad-text generation ran through the server routes of the old admin hosting; after the frontend moved to static delivery they stopped answering. The integration is being moved to the platform's server functions — until then the wizard cannot create a campaign. While the migration is in progress, launch Click-to-WhatsApp ads in Meta Ads Manager; the screens described below are what the section will look like afterwards. **When the section is available.** It is unlocked by a **plan with marketing tools** (advertising and SEO), and the card is hidden if no location of the account is in a Meta market — the extension is unavailable in Russia, China, Cuba, Iran, North Korea and Syria. --- ## Connecting Ads run through Meta Ads, so first connect **Facebook** ("Connect Facebook" button), then set your **WhatsApp Business number**: pick it from the connected ones or enter it manually. You also select a Meta ad account. Set it up once and you're ready to launch campaigns. --- ## The 5-step wizard ### Step 1. Goal - **More conversations** — guests message you on WhatsApp. - **More orders from the menu** — emphasis on clicks into the menu. ### Step 2. Where to show it Set a **radius** around the venue's address — people nearby will see the ad. Without an address it shows across the city. ### Step 3. Budget Set a daily budget and duration (indefinite or N days). Money is charged to your Meta ad account balance, not your Cenaly balance. ### Step 4. Ad and welcome message The system prepares the ad text **from your menu** — the headline and body can be edited or regenerated. Separately you set a **welcome message** — the first thing the guest sees when the chat opens. The preview shows both the ad and how the start of the conversation will look. ### Step 5. Review & launch The summary: goal, radius, budget, duration and WhatsApp number. Click **"Launch"**. --- ## Campaign dashboard The headline metric here is **conversations** (how many guests started a chat) and **cost per conversation**. For each campaign you see: - impressions, clicks, conversations; - statuses: in moderation / ready / active / paused / rejected / archived; - a summary tile of spend and conversations; - actions: pause / resume / edit budget / edit welcome message / archive; - a **daily** breakdown — spend and conversations for the last 30 days (there are no impressions in the daily breakdown). --- ## Related sections - [Ordering via WhatsApp](/en/docs/integration-whatsapp) — a wa.me button in the menu itself - [Google Ads](/en/docs/google-ads) · [Yandex Ads](/en/docs/yandex-ads) · [Telegram Ads](/en/docs/telegram-ads) - [Facebook and Meta](/en/docs/integration-advertising) — ad accounts --- ## FAQ ### What do I need to launch? A connected Facebook account, a WhatsApp Business number and a Meta ad account. All of this is set up on the connection screen. ### Where does the guest land after clicking? Straight into a WhatsApp chat with your venue — with the welcome message you set in step 4. ### Whose account is charged? Your Meta ad account balance. Cenaly does not charge for impressions. ### How is this different from the WhatsApp button in the menu? The [wa.me button in the menu](/en/docs/integration-whatsapp) works for people who already opened your menu. WhatsApp Ads bring new guests from the Facebook and Instagram feed. --- # Telegram Ads — Honest, With a Real Result Let's be upfront about the key fact: **Telegram has no ad account a small café can open** — the official Telegram Ads platform starts in the millions of euros. So the **Telegram Ads** section works differently and honestly: 1. We help you **prepare the ad** — text and a photo, ready to post. 2. We give you a **tracking link** and instructions on **how to actually run it**: yourself, through an agency, or straight with a channel owner. 3. We count the **real result** — how many people clicked and how many of them actually ordered. Open: **Admin Panel → Telegram Ads** (`admin.cenaly.com`). > A campaign's status is your **self-report** ("I launched it"), not an API status. The platform doesn't launch anything automatically and doesn't charge money. --- ## The ad wizard **Screen 0 — how it works.** An honest explainer (see above), with a "Create a campaign" button. **Step 1. Goal** — more orders from the menu, or awareness. This only sets the tone of the text. **Step 2. Audience** — this is **not targeting**, but a short brief for the AI: your city and who your guests are. It helps write more fitting copy. **Step 3. Format** — a channel post and/or a sponsored message. Some formats require a connected Telegram shop. **Step 4. Budget** — the amount you **plan** to spend. It's used only to compute cost per click and per order; the platform never sees or charges this money. **Step 5. Creative** — the AI prepares the ad (text, and for image formats, copy to go with a picture). Edit or regenerate it, then create a draft. **Step 6. Link & launch** — you get a **tracking link** (and QR) to your menu/mini app, plus instructions on "how to actually run it": yourself, through an agency, or officially. Once you've posted the ad, click **"Mark as launched"**. --- ## Campaign dashboard Since there's no API, all the value is in **honest attribution via the tracking link**. For each campaign and period (7/30/90 days) you see: - **Clicks** and unique visitors; - **Orders** and **revenue** that came through the link; - cost per click and per order, and **ROAS** (return on ad spend); - statuses: draft / launched / paused / completed / archived; - budget — labelled "entered by you; the platform doesn't see the money"; - a daily breakdown (clicks and orders). Clicks, orders and revenue are real because they're counted from your tracking link and orders in the system. --- ## Related sections - [Telegram Mini App](/en/docs/telegram) — your menu as an app in Telegram - [Google Ads](/en/docs/google-ads) · [Yandex Ads](/en/docs/yandex-ads) · [WhatsApp Ads](/en/docs/whatsapp-ads) - [QR Menu](/en/docs/qr-menu) — where the tracking link leads --- ## FAQ ### Does Cenaly run the Telegram ad itself? No. The system prepares the ad and a tracking link, but you place the ad (yourself, via an agency, or with a channel owner). This is done honestly, because Telegram has no accessible ad API. ### Then where do the clicks and orders on the dashboard come from? From your tracking link: every click and every order placed through it lands in the statistics. That's why the numbers are real. ### Why enter a budget if no money is charged? So the system can compute cost per click, cost per order and return on ad spend (ROAS). You make the actual payment wherever you place the ad. --- # Email campaigns Campaigns are emails to your subscribers: a seasonal menu, a promotion, reopening after a refurbishment, a weekend promo code. The subscriber list is collected by the storefront itself and stored in your account. Where: **Website → “Configure site” → Store Studio → the “Campaigns” tab** (`admin.cenaly.com`). --- ## Building the email A campaign has an internal name (only you see it), a **subject** and a **preheader** — the short line email clients show next to the subject. The email itself is built from blocks, top to bottom: | Block | What it is for | |---|---| | **Heading** | A large accent line | | **Text** | A paragraph; `**bold**` and `[label](https://…)` links are supported | | **Image** | With alt text and, optionally, a link | | **Button** | A call to action — “See the menu”, “Order now” | | **Promo code** | A code with a note | | **Divider** | A line between parts | An incomplete block is flagged and left out of the email. The email is **multi-language**: language tabs sit at the top of the editor, each subscriber receives their own language, and the first tab acts as the fallback for the rest. --- ## The AI draft Instead of a blank page you can describe the task in one line — “tell them about the new autumn menu and invite them to try the seasonal soup” — and the AI assembles a draft: subject, block copy and button. You edit it from there. --- ## Choosing the audience The audience is defined by filters: - **subscriber languages** (empty means all; subscribers with an unknown language do not pass a language filter); - **sign-up source**: the storefront form or [popups and forms](/en/docs/campaigns); - **purchases**: any / purchased / never purchased / lapsed (with a threshold in days); - **minimum number of orders**. The recipient count is calculated live, before sending. Unsubscribers are always excluded. If the audience is empty or exceeds the single-send limit, you are warned before pressing “Send”. Purchases are counted from completed orders of this location; guests who ordered without an email are not counted. --- ## Preview and test send - **Preview** shows exactly the email a subscriber will receive; tracking is disabled there, so previewing does not skew statistics. - **Test email** can be sent to any address of yours (up to 5 per hour) and does not affect campaign statistics either. Sending is **irreversible**: the confirmation shows the exact recipient count, and a campaign cannot be recalled once started. A sent email can no longer be edited — create a new campaign for a repeat. --- ## What you see after sending In the campaign list and card: recipients, **opens**, **clicks** and **unsubscribes**. Opens and clicks arrive gradually as people read the email — the card refreshes itself. --- ## Where subscribers come from - the subscription form on the storefront; - [popups and forms](/en/docs/campaigns) with email capture; - guests who left an email at checkout and agreed to receive campaigns. The subscriber base opens from a link in the same tab. Every email carries an unsubscribe link, and an unsubscriber never receives another campaign. --- ## Related topics - [Engagement campaigns](/en/docs/campaigns) — collecting emails on the storefront - [Returning guests](/en/docs/customers) — guest recognition and order history - [Loyalty](/en/docs/loyalty) — bonuses and promo codes - [Commerce](/en/docs/commerce) — coupons you can put into an email --- ## FAQ **Do I need my own mail server?** No, sending goes through our infrastructure. **Can I email only people who have not ordered in a while?** Yes — the “lapsed” filter with a threshold in days. It applies to former customers only. **What happens with unsubscribers?** They are excluded from every audience automatically; there is nothing to track manually. --- # Online Store: Storefront and Selling Cenaly isn't only a restaurant menu — it's also a full **online store**: a product catalog with variants, a storefront with filters and search, a product page, a cart and checkout, pickup/delivery, and payment collection. This page is an overview of the whole path from turning on the retail vertical to making a sale; follow the links in the text for details on each step. --- ## Turning on the "Store" vertical The location's business type is switched in the location's general settings, or right inside the site's web settings (**Websites** section → "Site settings"). As soon as the type is set to **"Store" (retail)**, the storefront switches into online-store mode: - instead of a restaurant conversational menu, you get product pages at `/product/name`, category pages and a catalog; - at the register (POS), instead of table/floor binding you get barcode scanning and weighed-goods sales; - in the SEO prerender served to search engines and AI agents, you get product cards instead of dish cards, and Product/Offer structured data instead of restaurant menu markup (details — [SEO & storefront promotion](/en/docs/seo)). --- ## Catalog The catalog is the set of products and categories the storefront is built from. - **Categories** — the structure a product "lives" in (not to be confused with [collections](/en/docs/collections) — marketing storefront groups). - **Products and variants** — a product can have several variants (SKUs) along axes like "Color"/"Size"/"Material": every combination is its own inventory row with its own price, barcode and stock. - **Sibling color swatches** — if the same product ships in several materials/colors as separate product cards, the storefront shows them as small color-swatch dots right in the category list: clicking a swatch swaps the card's photo, title and price to that colorway — no need to open the product page to see another color. - **Product features (characteristics)** — size, color, material, volume, brand and any other attribute; details — [Product features](/en/docs/product-features). - **Multi-photo gallery** — a product can have a gallery of several photos and videos (not just one cover image), with a caption on each frame; one photo can be set as the "hover photo" — on the storefront it cross-fades in when a shopper hovers the card in the catalog. > The same catalog also powers register sales: the POS barcode scanner finds a product by its code and adds it to the ticket instantly, and weighed goods are weighed on a connected scale and sold by actual weight — see [Hardware & bridge](/en/docs/hardware-bridge). The fastest way to fill the catalog is [AI catalog import](/en/docs/catalog-import): upload a price list (Excel/Word/PDF/photo), the AI recognizes products and prices and shows a plan for you to review. --- ## Storefront: filters and search On catalog and collection pages, shoppers can: - **Filter by characteristics** — a facet panel (sidebar on desktop, a bottom sheet on mobile) is built automatically from the characteristics of products in the category: color, size, material and any others, plus price and stock. Checked values within one characteristic combine with OR, different characteristics combine with AND (standard faceting logic). - **Search by text** — the search box matches title, description and characteristics. - **Search by meaning (semantic search)** — for larger catalogs, search understands the meaning of a query, not just exact words: "something warm for winter" will find jackets and sweaters even if those words aren't in the title. It runs on a vector index of products that includes the full picture of a product — characteristics, brand, SKU, barcode, attached documents. - **Ask the AI shopping assistant** — a built-in chat answers questions about products in the shopper's language: suggests a product from a description, compares options, tells stock and characteristics. The same assistant can find a product by barcode, even one that isn't shown anywhere on the storefront. --- ## Product page (PDP) The product page shows: - **Gallery** — all photos and videos of the product, with captions and zoom; - **Characteristics** — a "property → value" table (size, material, weight, etc.); - **Editorial blocks** — additional "photo + heading + text" content sections in several layouts (full-width, image left/right, overlay on the photo) — great for brand story, materials, care instructions; - **Related products**, **"frequently bought together"** and **"recently viewed"** — cross-sell blocks below the description; - **Wishlist** — a heart icon to save the item, available in the customer's account; - **"Notify me when available"** — if a product is out of stock, a shopper leaves their contact and gets notified when it's back in stock. --- ## Cart and checkout - **Cart** can be built from any catalog/product page and supports several variants of the same product as separate lines. - **Promo codes and coupons** are validated and applied server-side — the discount amount can't be tampered with on the shopper's side. - **Cart prices don't fall behind the catalog** — a cart survives a page reload together with the price captured when the item was added, so on the next menu load the prices of plain lines are recalculated against the fresh catalog. If a mismatch still reaches checkout, the server won't start the payment and sends the shopper back to the cart with the new total. - **Tax** is calculated per **tax group** of the product (set right in the product card) and by the tax table rules of your location — the rate can also depend on the sales channel (dine-in, takeaway, delivery). See [Commerce](/en/docs/commerce). - **Payment won't start if the item is already out of stock** — before creating a payment session the server checks the cart against warehouse balances and shows the shopper exactly which lines came up short. The check runs before gift cards are charged and before the payment gateway is called, so such a refusal costs nothing. Exceptions: dishes with a recipe (their components are deducted, not the dish itself), items without stock tracking, and pre-order mode. - **Multi-currency pricing** — the storefront can display prices in the shopper's currency (converted) while the location itself keeps its books in one currency. - **Customer accounts** — a separate sign-in for shoppers (not shared with venue staff): order history, saved addresses, wishlist. Coupons, automatic discounts and shipping cost rules are configured in a dedicated section — [Commerce](/en/docs/commerce). --- ## Order rules and customers The settings that decide what a shopper may put in the cart and who may buy from you at all. - **Product personalisation** — input fields on the product page: engraving, a message on a cake, a made-to-measure size. Values travel with the order and are visible in the kitchen, at the POS, on the KDS and on the receipt. - **Order quantity** — minimum, step and maximum per product. Steppers, hints and checkout respect the rules on the storefront, and the server validates them again. - **Unit system** — metric or imperial: weight and dimensions are entered in pounds, ounces and inches while being stored in a single canonical unit. Handy for the US. - **Customer groups and sign-up moderation** — a new customer can land “under review”: until approved, the storefront shows a gate instead of checkout. Groups decide who sees what. - **Blocklist and anti-fraud** — banning orders by phone/email and limiting the number of orders per period. A rejected order shows the guest a clear message, and the order list shows the reason. Contacts can be added to the blocklist straight from an order. - **Storefront maintenance mode** — pause order taking: a localised notice in every language, a “closed” badge in the dashboard and a server-side block on checkout. - **Owner-editable storefront labels** — rename standard strings (“Add to cart”, “Checkout” and others) to match your tone of voice. --- ## Fulfillment | Method | What it is | Details | |---|---|---| | **Pickup** | The shopper picks up the order themselves, at a chosen time | [Orders](/en/docs/orders) | | **Own delivery** | Your own couriers: courier screen, route map, live GPS tracking, proof-of-delivery photo | [Own delivery](/en/docs/delivery) | | **Aggregators** | Delivery by Wolt/Glovo without your own couriers | [Wolt](/en/docs/integration-wolt), [Glovo](/en/docs/integration-glovo) | | **Russian carriers** | Comparing rates across several carriers at checkout | see below | ### CDEK and Russian delivery aggregators For stores in Russia, checkout can show a **rate comparison across several carriers at once** — CDEK, Yandex Delivery, Russian Post, 5Post — letting the shopper pick the cheapest or fastest option. For carriers with a pickup-point network, checkout shows a **map of nearby pickup points** — the shopper picks a convenient one right during checkout, without leaving to a third-party site. Rates and pickup-point addresses sync automatically; the resulting shipping cost flows into the order and onto the receipt. Going fully live with a given carrier needs your own carrier contract (CDEK — by contract and tax ID; some carriers — by phone number) — rate quotes and pickup points are available right away, while creating shipments and printing labels require a live carrier account. --- ## Payment The store accepts payment the same way a restaurant menu does: **online by card/wallet** through a connected payment provider (the set of providers depends on the location's country), **cash/card on delivery** to the courier, and **pay at the register** for pickup/in-person sales. Details, provider list and setup — see [Payments](/en/docs/payments). --- ## Storefront readiness for AI agents The store's catalog is "readable" not just by people but by AI agents (voice assistants, search and shopping agents): - an `llms.txt` page on your domain — a machine-readable site map for AI; - product and catalog pages are served to bots in an enriched form: breadcrumbs, brand, availability, a characteristics table, variants with prices, structured data (Product/Offer markup, and for products with several variants — grouped markup covering all variants); - a product search tool is available to external AI agents through the public **Guest API / MCP** — the same protocol voice assistants use to place a restaurant order. Details — [Guest API for AI Agents](/en/docs/llm-api). --- ## Related sections - [Collections](/en/docs/collections) — storefront groups like "New arrivals", "Best sellers" and rule-based automatic collections - [Product features](/en/docs/product-features) — catalog attributes and the AI characteristics wizard - [Returns & RMA](/en/docs/returns) — how a shopper returns a product and how it's processed - [AI catalog import](/en/docs/catalog-import) — quickly filling the catalog from a price list - [Website builder](/en/docs/website-builder) — storefront styling: templates, colors, card layout - [SEO & storefront promotion](/en/docs/seo) — product feeds, structured data, redirects - [Articles & Pages (CMS)](/en/docs/cms) — storefront content beyond the catalog --- ## FAQ ### Can I run a restaurant and a store on the same account? Business type is set per location, so a chain with several venues can have some locations running as restaurants and others as stores, each with its own storefront mode. ### Does semantic search work on any catalog? Regular text search and filters work on any catalog. Semantic (meaning-based) search kicks in for larger catalogs — for smaller stores, text search and facets are usually enough. ### Does the storefront show the exact stock count? The storefront shows an availability status ("in stock" / "out of stock"), not the exact unit count on hand — exact stock levels are only visible in the admin panel. ### Are color swatches variants of one product or separate products? Technically they're separate product cards (each with its own slug, photos, and possibly its own price), but on the storefront they're visually combined into one card via swatches — the shopper switches color right in the list without losing browsing context. --- # SEO & Storefront Promotion Most of a store's SEO works **automatically**, with no manual setup: the platform prepares pages for search crawlers on its own, marks up products with structured data, and maintains a sitemap and product feeds. This page covers what happens by itself, and what's worth configuring further: product feeds into ad channels, redirects when URLs move, and connecting Search Console. --- ## What works automatically On every catalog, price or stock change, the platform regenerates crawler- and AI-agent-facing pages for your storefront — separate from what a live shopper sees (they get the regular fast web app). - **Meta tags and titles** — title/description for the homepage, category, collection and every product, truncated by character (not byte), so multi-byte languages — Georgian, Arabic, Chinese — are never cut mid-character. - **Canonical URLs** — every page has one "primary" address; duplicates (e.g. an old and a new product URL) correctly point to the current one, so link equity isn't lost. - **hreflang** — if the storefront has several languages enabled, search engines get the language-version links tied together. - **sitemap.xml** — the site map updates automatically and includes products, categories, collections and articles; product entries carry a **last-modified date** (`lastmod`): on a catalog update it is taken from the actual product data, so search engines see what really changed instead of re-crawling everything (after a change to the location's settings the map is rebuilt as a whole and those dates are reset to the current time). Products with photos also get an **image sitemap** entry — direct image links for Google Images indexing. - **robots.txt** — generated and kept up to date automatically, no manual file editing. - **Structured data (JSON-LD)**: - on the homepage — `Store`/`Organization` plus site-search markup (Google can show a site search box right in results); - on a product page — `Product`/`Offer` with price, availability, barcode (GTIN), SKU, brand, condition, shipping and return terms; - for a product with several variants (color/size) — **`ProductGroup`** covering all variants at once: their SKU, barcode, price, weight — Google understands it's one product with option choices, not several separate listings; - breadcrumbs (`BreadcrumbList`) on every page. - **Bot- and AI-agent-facing prerender** — the homepage, catalog, collection page, collections list and product page are served to search crawlers and AI crawlers as a fully rendered HTML page with complete content (not an empty JS shell) — this covers both regular search bots and AI shopping-assistant crawlers. - **Custom domain** is reflected everywhere above: if the storefront has its own domain connected, canonical URLs, sitemap, robots.txt and llms.txt automatically point to your domain rather than the platform subdomain — see [Custom domain](/en/docs/custom-domain). None of this needs to be triggered manually — it refreshes on its own whenever the catalog or location profile changes. --- ## Product feeds for ad channels Beyond SEO markup for organic search, the platform can export the catalog as separate **product feeds** — for ad accounts and marketplaces that need a file in their own format (XML/CSV). These connect as extensions in the [App Store](/en/docs/app-store), per location: | Channel | Section | |---|---| | Google Merchant Center (Shopping, free listings) | [Google Product Feed](/en/docs/google-feed) | | Meta (Facebook/Instagram Shops) | [Meta Product Feed](/en/docs/meta-feed) | | TikTok (Video Shopping Ads) | [TikTok Product Feed](/en/docs/tiktok-feed) | | Pinterest (product pins) | [Pinterest Product Feed](/en/docs/pinterest-feed) | | Microsoft / Bing Shopping | [Microsoft Product Feed](/en/docs/microsoft-feed) | | Criteo (retargeting) | [Criteo Product Feed](/en/docs/criteo-feed) | | Yandex (search, Goods, Alice) | [Yandex Goods](/en/docs/yandex-goods) | All feeds are built from the same catalog and update automatically as products, prices and stock change — nothing needs to be regenerated by hand. --- ## Storefront readiness for AI agents Separate from classic SEO, the platform prepares the storefront for being "read" increasingly not by people but by AI agents — voice assistants, shopping bots, AI search systems: - every domain has an **`llms.txt`** page — a short machine-readable site map made specifically for language models: what the store is, what products and categories exist, where to find the API; - product and catalog pages served to an AI crawler carry an expanded description — characteristics, variants, availability, shipping and return terms — things normally hidden behind interactive UI elements and invisible to a plain crawler; - external AI agents can programmatically search products and place orders through the public Guest API/MCP — details in [Guest API for AI Agents](/en/docs/llm-api). --- ## Redirect manager and 404 log When a store's URL structure changes (migrating from another platform, changing category/product URLs), old links start returning 404s — you lose search-engine and social traffic and link equity. The **Site Studio → Storefront → "SEO & Feed"** section handles this without a developer: - **Redirects** — a table of "from → to" rules: exact match, prefix match, or regex match; response code **301** (permanent), **302** (temporary) or **410** (permanently gone); rules can be toggled on/off and annotated. - **CSV import** — if you're migrating from WordPress/WooCommerce and already set up redirects with the Redirection plugin, you can **import the ready-made list as a single file** instead of recreating rules by hand. - **404 log** — the platform tracks which addresses receive "dead" hits over the last 30 days (how many times, when last seen). Every log row has a **"Create redirect"** button that opens a new rule form with the address already filled in. - A redirect applies **to both search crawlers and live visitors**: a bot gets an honest HTTP status (301/302/410) at the page-serving level — what matters for preserving rankings and link equity when URLs move; a person following an old link lands on the new address instead of a "Page not found". > ℹ️ **The redirect manager and bot prerendering work on the `cenaly.com` and `cenaly.com` domains.** On the Russian contour (`cenaly.ru`) redirect rules are saved but do not yet reach the storefront or search crawlers, and crawlers are not served ready-made pages — work on the Russian side continues. Markup, `sitemap.xml`, `robots.txt` and hreflang are generated identically on every contour. --- ## Google Search Console and search analytics Connecting [Google Search Console](https://search.google.com/search-console) to your domain gives you, inside [Statistics](/en/docs/statistics), a breakdown of **organic search queries**: which keywords people find you by in Google, how many clicks and impressions they get, and your average ranking position. Regular traffic analytics (Google Analytics) doesn't provide this at all — search phrases are only visible through Search Console. Organic-traffic rows in "Statistics" expand into a query table right there — no separate screen needed. > Connecting Search Console (verifying domain ownership) is a one-time step for the account; after that, data flows in for all your locations on that domain. --- ## Custom domain and SEO The public site lives on a platform subdomain by default (`your-store.cenaly.com`). SEO addresses (canonical URLs, sitemap, product feeds, llms.txt) automatically rebuild around your **custom domain** once it's connected — that's the address worth using in ads, on signage, and the one search engines will see. Full setup instructions — [Custom domain](/en/docs/custom-domain). --- ## Related sections - [Online Store: Storefront and Selling](/en/docs/shop) — overview of the retail vertical - [Google Product Feed](/en/docs/google-feed) — the product feed for Google Merchant Center - [Custom domain](/en/docs/custom-domain) — connecting your own domain - [Statistics](/en/docs/statistics) — site traffic and organic queries - [Website builder](/en/docs/website-builder) — storefront styling - [Guest API for AI Agents](/en/docs/llm-api) — how AI agents see your storefront --- ## FAQ ### Do I need to configure anything manually for SEO to work? Baseline SEO (meta tags, canonical, hreflang, sitemap, robots.txt, product structured data, bot prerender) works out of the box, no setup. The only things worth connecting manually are the ones that need an external account: product feeds (Google Merchant Center, etc.) and Google Search Console. ### How does a search engine find out about a new product? When a product is added, edited or removed, the platform regenerates that location's SEO pages and sitemap on its own — usually within seconds to minutes. From there, indexing speed depends on the search engine itself. ### Do redirects apply right after saving? Yes, a rule takes effect immediately for both bots and live visitors — no separate publish step is needed. ### Can I bring over redirects from WordPress? Yes — if you used the Redirection plugin (or another CSV export in its format), you can import the rule list as a single file in the "SEO & Feed" section. ### What about Yandex and .ru domains? Product export to Yandex exists ([Yandex Goods](/en/docs/yandex-goods)). Markup, the sitemap, `robots.txt` and hreflang are generated the same way across every platform domain, including Russian brands. However, **serving ready-made pages to crawlers (prerendering) and the redirect manager currently work on the `cenaly.com` and `cenaly.com` domains**: on the Russian contour (`cenaly.ru`) redirect rules are stored in your account but do not yet reach the storefront or the crawler, and a search bot is served the regular web app. The "Statistics" organic-query breakdown is built on Google Search Console — for domains promoted through Yandex, that specific query breakdown isn't available yet; a Yandex.Webmaster-based equivalent is in progress. --- # Articles & Pages (CMS) Beyond the catalog and menu, the storefront has its own **mini-CMS** — a section for text content: news articles (a blog) and freeform static pages ("About us", "Shipping & payment", "How to care for your product", etc.). It plays the same role as blog/pages in Shopify or WooCommerce — content for SEO, shopper trust and a venue's news feed, not tied to any specific product or dish. Open: **Admin Panel → Websites** → open a location → **"Pages"** tab. --- ## The editor The "Pages" section is a list of every article and page for the location, with search, sorting and each entry's status. Every entry has a type: - **Article** — appears in the site's blog feed, listed by date; - **Page** — a freeform static page at its own address (e.g. "Shipping", "About us"). The editor is a full rich-text editor with a toolbar: headings, bold/italic/underline/strikethrough/highlight, lists (including checklists), tables, quotes, code and code blocks, dividers, text alignment, link/image/video insertion (including YouTube), image width presets, a text color palette, an HTML source view, and fullscreen mode. The article list supports search, sorting, and unsaved-changes detection (guarding against accidentally losing edits); saving is via a button or a keyboard shortcut. ### AI editing assistant The editor has an AI-assistant button with ready-made actions: **improve style**, **fix errors**, **shorten**, **expand**, **continue writing**. The assistant rewrites the selected text or the whole article in the same language it's written in. --- ## AI-written articles The **"✨ AI Article"** button starts writing an article in the background — no waiting; the whole process runs on a schedule on the server, and you can navigate away from the page. ### The brief wizard You describe the assignment: - the article's **topic**; - **depth** — from a short single-pass piece to multi-stage writing with an outline, draft, critique and proofread; - **must-mention products** — up to 10 catalog products the AI weaves links to into the text; - **cross-linking** with your other published articles (on by default); - a **series of articles** — you can queue several topics at once in a single action; - **grounding in your knowledge base** — if your [venue's knowledge base](/en/docs/knowledge-base) is filled in, the AI pulls relevant facts and **fact-checks the text against them** after writing (e.g. your real return window or shipping terms, rather than something the model would otherwise make up); - **web research** — when needed, the AI looks up current information online (in the article's language plus English), so it isn't limited to the model's outdated built-in knowledge; - **auto-publish** — the finished article can be published right away instead of going into review. ### Queue and progress The **"🗂 Queue"** section shows every running job and its status. For each job you can see: - the current stage (outline → sections → polish → etc., depending on the chosen depth); - the intermediate output of every completed stage — you can see exactly what the AI wrote at each step, even before the whole article is done; - a **"Cancel"** button for an active job; - for finished articles — a **"Review & publish"** button that opens the draft directly in the regular editor. A finished article always arrives as a **draft** in the same article list — you can always review and edit it by hand before publishing, even with auto-publish turned on. --- ## Publishing, SEO and translations - **Draft / published** — until an article is published it isn't visible on the site, but it's viewable and editable in the admin panel. - **SEO fields** — every article/page can have an SEO title, SEO description, keywords and an FAQ (questions and answers). AI-written articles fill these in on their own, including **FAQ structured data** for search engines when the article has a Q&A block. - **Footer navigation** — an article or page can be added to the site's footer navigation. - **Auto-translation** — the article body (not just the title) is translated automatically into every language enabled on the storefront; there's no per-article "translate / don't translate" toggle — translation always follows the site's language list. - **Internal links** — links to products and to your other articles inside the text stay within your site (and work correctly with a custom domain connected too). --- ## Where articles and pages appear on the site - **`/blog`** — the feed of published articles, listed by date; - **`/p/page-address`** — a specific static page at its own address (slug); - an individual article opens at its own address within the blog feed; - optionally — a link in the site's **footer** (toggled per entry); - **`/help`** — articles assigned to the “Help” group are collected into the [Help Center](/en/docs/help-center). --- ## Comments on articles Guests can comment on blog articles. Comments are **pre-moderated**: they appear on the site only after you approve them. The setting and the moderation queue live next to the article list: - an **“Allow comments”** toggle and an “ask for the author's email” option; - a queue filtered by status: **pending**, **published**, **rejected**; - per-comment actions: publish, reject, return to the queue, delete permanently. --- ## Legal pages The mandatory legal pages of a site — privacy policy, terms, returns, cookies and delivery — do not have to be written by hand: a wizard next to the article list generates them. See [Legal documents](/en/docs/legal-docs). --- ## Related sections - [Online Store: Storefront and Selling](/en/docs/shop) — products you can link to from articles - [SEO & Storefront Promotion](/en/docs/seo) — how articles land in the sitemap and structured data - [Website builder](/en/docs/website-builder) — the overall site styling the CMS is embedded in - [Knowledge Base](/en/docs/knowledge-base) — the source of facts for AI writing and fact-checking --- ## FAQ ### Do I have to use AI to write articles? No. You can write and edit articles and pages entirely by hand in the editor — AI writing just speeds things up and suits a steady content flow. ### What does a shopper see while the AI is still writing an article? Nothing — the article only appears in the list as a draft once the job finishes (or, with auto-publish, once it publishes); in-progress stages aren't shown on the site. ### Can I turn off translation for one specific article? No, translation applies to all articles and follows the site's enabled languages — there's no per-article opt-out. ### Can the AI get facts about my business wrong? If your venue's knowledge base is filled in, the finished article is additionally **fact-checked against it** — contradictions with a knowledge-base fact are corrected automatically, and disputed points the model can't resolve on its own are flagged in the text for your attention. Without a knowledge base, the AI writes from general topic knowledge — such articles are worth reviewing before publishing. ### Can the AI generate an article cover image on its own? Not yet — you still need to upload a cover image for an article (or page) yourself in the editor. --- # Pickup Point **Pickup Point** is a dedicated business type on the platform for courier-service franchisees, independent pickup networks, and locations that accept and hand out parcels for cash on delivery. Pick it when creating a location: business type **"Pickup Point"** 📦 — onboarding for this type skips menu and kitchen questions and goes straight to setting up carriers and the cell layout. The operational section is **Admin Panel → Parcels** (`admin.cenaly.com/parcels`), with six tabs: **Intake · Storage · Handover · Returns · Carriers · Settlements**. --- ## Parcel arrival and intake A parcel enters the system one of three ways: - **Carrier registry import** — upload a CSV/XLSX of waybills from the courier service, with ready-made column mapping for common registry formats; - **Scan intake** — a barcode/tracking number is scanned on the spot, and the system creates an unannounced parcel on its own if it wasn't already in a registry; - **The built-in Cenaly pickup network** — if the location is published in the pickup network, an order from any shop on the platform with "deliver to pickup point" shipping automatically becomes an announced parcel, with no file or scan needed. On the **"Intake"** tab, scanned parcels are matched against expected ones: a match is highlighted, and an unmatched parcel opens a small form (carrier, cash-on-delivery amount, recipient phone). Closing an intake session produces a **discrepancy report**, and cell-code labels are printed for the parcels. --- ## Storage cells The cell layout is set up once on the **"Carriers"** tab → cells: rack → shelf → slot (for example, code `A-2-05`). During intake, a cell is **assigned automatically** — the first free one in order; occupancy is visible on the **"Storage"** tab alongside the active-parcel list: cell, tracking number, carrier, cash-on-delivery amount, storage deadline (highlighted red when under 24 hours left). Search works by tracking number or the last digits of the recipient's phone. The same tab starts a **stocktake**: a full scan of the cells shows what was found, what is missing and what is lying there unexpectedly. Missing parcels are marked as lost in one of two ways: one at a time with the button on the row, or all at once with the **"Mark all missing as lost (N)"** button above the list — a single confirmation for the whole stocktake. Their cells are freed and every parcel keeps a history entry saying the change came from a stocktake. Only the operator changes statuses: the system never reclassifies anything on its own. Parcels that cannot be changed (already handed over or returned) are skipped, and their number is shown in the result. --- ## Handover to the recipient and cash on delivery The **"Handover"** tab: 1. The recipient is found by tracking number, the last digits of their phone, or a pickup code — the screen shows all of their parcels at the location at once, if there's more than one. 2. **Verification** — per the rule set for that carrier: a confirmation code, an SMS code, an ID check, or none. 3. The parcel is **scanned out of its cell** — a check that the right parcel is being handed over. 4. If the parcel has **cash on delivery (COD)**, payment is taken right there: cash with change calculated, card via the register's payment terminal, or a split between methods. 5. An **agent receipt** is printed (tags 1222/1225/1226 — the supplier on the receipt is the online store that shipped the item, not the pickup point) if the register supports agent fields; if it doesn't, handover can still go ahead with fiscalization done on a separate device at the point — the operation isn't blocked. 6. A handover notification goes to the recipient; partial refusal (accepting only part of the contents) isn't supported in the current version — refusal applies to the whole parcel only. Cash-on-delivery money is **not the location's revenue** — it's transit money belonging to the sender (the online store), minus the pickup point's commission. In the [shift X/Z report](/en/docs/cash-shift), cash on delivery is counted as a separate line and never mixed with the location's sales, while cash that physically landed in the register is still included in the expected cash balance. --- ## Returns and expired storage Each carrier has a storage period; once it passes, a parcel automatically moves to **"pending return"** status, and a reminder goes to the recipient ahead of time (a couple of days before and on the deadline itself). The **"Returns"** tab builds a handover registry for all parcels awaiting return to a given carrier, with the registry printable and an actual-handover checkbox. Customer returns (an online store's reverse logistics) are accepted with the same scan flow. --- ## Carrier settlements The **"Settlements"** tab computes, for a chosen period and per carrier: parcels handed over, cash on delivery collected (cash and card separately), the pickup point's commission (per parcel and/or a percentage of COD), and the final amount owed to the carrier. The report exports to CSV. --- ## Public tracking page A recipient can check their parcel's status without logging in — by tracking number and the last digits of their phone: status, storage deadline, and the location's address. The same principle as [delivery tracking](/en/docs/delivery) elsewhere on the platform. --- ## Related sections - [POS and shifts](/en/docs/cash-shift) — the X/Z report where cash on delivery is kept separate from revenue - [Delivery](/en/docs/delivery) — courier delivery and shipment status in other verticals - [Hardware (bridge)](/en/docs/hardware-bridge) — the fiscal printer and payment terminal at the handover register --- ## FAQ ### Does this work with Wildberries, Ozon, or Yandex Market pickup points? No. Those platforms run closed partner networks with their own software and their own fiscalization of payment on receipt — our register isn't part of those transactions. The platform doesn't replace their app; it runs shift and task tracking for the location alongside it. ### Is an API integration with the courier service required? No — in the current version, parcels from third-party carriers are entered by registry import or scan intake; there's no live API connection to a courier service's internal systems (other than the built-in Cenaly pickup network). ### What if the register doesn't support an agent receipt? Cash-on-delivery handover can still go ahead — payment is accepted, and fiscalization in that case is done on the location's separate register; the operation isn't blocked. ### Can I hand over part of a parcel's contents and return the rest? No, in the current version a parcel is handed over or returned as a whole only — partial refusal (trying on, buying part of the contents) isn't supported. --- # Venue Website Builder Every location has a public **menu website** on its own subdomain (`your-domain.cenaly.com`). The **Websites** section lets you manage its address, publication status and — most importantly — its **appearance**, quickly and visually, with no coding. Open: **Admin Panel → Websites** (under "Marketing", `admin.cenaly.com`). > This is where you set the site's **look**. The menu content itself — categories, dishes, photos — is covered in [QR Menu](/en/docs/qr-menu). Managing a network of locations is in [Multi-location](/en/docs/multi-location). --- ## Sites overview The main screen shows cards for all your locations. For each you see: - the public address (`domain.cenaly.com`) and status: **published** or **disabled**; - a mini preview of the appearance (accent color, background, font, corner style); - buttons: **customize visually**, **configure website**, **Articles**, **Designer on site**, **open**, **copy link** and **QR codes**; retail locations also get an entry into the **Store Studio**. If you have more than ten sites, the cards switch to a compact list with search and pagination on their own. A new site is not created here: it appears together with a new location — that is what the ⚙ gear in the section header points at, and the same place holds the public site languages (taken from the account-wide language pool). --- ## Template gallery The visual editor includes a **gallery of ready-made styles** — over a dozen thought-out looks (classic, dark, minimalist, themed). Each template sets coordinated colors, fonts and card layout. Pick a style and it applies instantly to your real menu in the live preview; from there you can fine-tune any detail. Next to the gallery there is a second button — **✨ AI designer**: describe the look you want in words and the appearance is assembled for you. The same pair of buttons is also present in the full website settings. --- ## Visual editor The **"Customize visually"** button opens a WYSIWYG editor with a live preview (phone / desktop): - **Appearance** — accent color, background, font, corner style (sharp / rounded / pill), welcome text, plus per-element text colors for individual elements. - **Menu layout** — how dish cards are arranged: list, compact, 1 / 2 / 3 columns, wide card, poster. - **Logo and cover** — a square logo and a cover image. - **Publication** — a "site is published" toggle; when off, the public menu page is disabled. Changes are shown immediately; you can **save**, **discard** or **reset appearance** to defaults. If you have unsaved edits, the system warns you before leaving. --- ## Full website settings The **"Configure website"** button opens the extended WEB settings panel for the location (the same one as the "WEB Menu" tab under "Locations"), but right on this page — without navigating away. It contains: - the site's **address and publication**; - **images** — cover, logo, background and the site icon (favicon); - **appearance and card layout** — the same templates, ✨ AI designer and layout picker as in the visual editor; - **maintenance mode** — a placeholder for guests plus a server-side block on placing orders; - **proactive messages** — pop-ups and bars for site visitors (available to all verticals). --- ## Designer on site The **"Designer on site"** button opens **your live website** with a floating AI-designer chat: authorization is handed over from the admin panel, so there is nothing to sign into separately. You describe in words what you want changed, and the edits are applied to the displayed site **instantly and for you only** — it is a draft of your session, while visitors keep seeing the published look. You can browse the site freely meanwhile (menu, catalog, blog, cards) without losing the conversation or the draft. The **"Apply"** button publishes the current draft for all visitors through the normal publishing path, and leaving the mode brings back the published look. For the **home sections and the storefront chrome of a store**, the designer on site is already the main editor: the older studio editors show a banner saying that full editing now lives in the designer on site and that the studio remains for compatibility. --- ## Site icon (favicon) The **favicon** is the small icon a browser shows in the tab, in bookmarks, in history and next to your site in search results. It lives next to the logo and cover: **Configure website → images block → "Site icon" tab**. Three modes: - **Platform icon** — the default, nothing to do; - **Venue logo** — reuses the square logo from the neighbouring tab (when one is uploaded); - **Custom image** — upload a separate square image (1:1, at least 128×128; PNG with a transparent background works best). Right below the choice there is a mini preview of a browser tab with your icon and page title. After an upload the icon appears on the live site within a minute — the required sizes are generated automatically. --- ## Domain and QR codes By default the site lives on the `domain.cenaly.com` subdomain. Connecting your **own domain** is a separate option (see [Subscription](/en/docs/subscription), the "Own site" add-on); for a detailed step-by-step guide, see [Custom Domain](/en/docs/custom-domain). Printing and handing out **QR codes** for this site is in [QR Codes & Devices](/en/docs/device-codes). --- ## Related sections - [QR Menu](/en/docs/qr-menu) — menu content (categories, dishes, photos) - [Custom Domain](/en/docs/custom-domain) — how to connect your own domain to the site - [Multi-location](/en/docs/multi-location) — managing a chain and brand - [QR Codes & Devices](/en/docs/device-codes) — printing table QR codes - [Subscription](/en/docs/subscription) — the "Own site" add-on for a custom domain --- ## FAQ ### Will a template overwrite my settings? A template sets a coordinated starting point (colors, fonts, layout), but after applying it you're free to edit any detail in the visual editor. ### What shows in the preview if the menu isn't published yet? Sample demo dishes — so you can see the styling before publishing. ### Can I hide the site temporarily? Yes, turn off the publication toggle — the public menu page becomes unavailable while your settings are kept. --- # Custom Domain By default, a location's menu site lives on the platform's subdomain (`your-domain.cenaly.com`). If your venue already has its own domain (say, `restaurant.com`), you can connect it — the site will then open at an address like `menu.restaurant.com`. > This page covers connecting a domain. For styling the site itself — templates, colors, layout — see [Website Builder](/en/docs/website-builder). For plans and add-ons, see [Subscription](/en/docs/subscription). --- ## What you get - Your public menu site opens on **your own domain** instead of the platform subdomain. - A **free HTTPS certificate**: the platform issues and automatically renews it for you — nothing to buy, download, or install. In the Russian contour (`cenaly.ru`) the certificate is issued by Yandex Certificate Manager (Let's Encrypt) with DNS validation, so there the `_acme-challenge` record is required **for a subdomain too**. - Page addresses (SEO, canonical links) point to your domain — that's the address search engines will see, and the one worth using in ads and on signage. --- ## What you need beforehand - A domain you already own (registered with any registrar). - Access to that domain's **DNS management panel** — usually with the registrar or wherever the domain's DNS is hosted. - A plan with the custom domain option available. How many domains are included per plan: | Plan | Domains included | |--------------|-------------------| | Free | 0 | | Mini Cafe | 1 | | Cafe | 5 | | Restaurant | unlimited | Beyond what's included in your plan, you can add a domain as a paid **"Own site"** add-on — $10/month or $100/year per domain. Domains paid for with this add-on do not consume the plan's included limit, and after the payment period ends there is a **7-day grace window** during which the domain still counts as paid and stays online. See [Subscription](/en/docs/subscription) for details. --- ## Subdomain or root domain? **Both work**: a subdomain (`menu.yourdomain.com`, `shop.yourdomain.com`) and the root domain itself (`yourdomain.com`, no subdomain at all). The only difference is how many DNS records you create: | What you connect | Records | Which ones | |---|---|---| | Subdomain `menu.yourdomain.com` | one | `CNAME` → the platform address | | Root domain `yourdomain.com` | two | `ALIAS`/`ANAME` → the platform address **and** a `TXT` on `_cf-challenge.yourdomain.com` | Why a root domain needs two: - The DNS standard **doesn't allow a plain CNAME** at the root of a domain, so it takes an **ALIAS / ANAME / CNAME-flattening** record instead. AWS Route 53, Cloudflare, DNSimple, Gandi and many others support it — though not every provider does. - Such a record hands out IP addresses directly and hides the name the platform normally uses to confirm the domain points at it. That's why a root domain also needs a **TXT record on `_cf-challenge.yourdomain.com`** — it proves the domain is yours. The admin shows both records ready to copy. **If your provider supports neither ALIAS nor ANAME** — 1. either move the domain's DNS to a provider that does (Cloudflare, for example, is free and only requires switching name servers, not transferring the domain itself); 2. or connect a subdomain and set up a **redirect** at your registrar from the root domain to it (e.g. `yourdomain.com → menu.yourdomain.com`). Everything below is written for the subdomain as the simplest case; a root domain works the same way, just with two records — see [“Root domain: two records”](#root-domain-two-records). --- ## Step-by-step instructions 1. Open **Locations** → pick the location → the **"WEB Menu"** tab. The same block is also available from the **Websites** section (the "Marketing" group): a site card opens the full web settings right on the page. 2. Find the **"Custom Domain"** block. 3. Enter the **full domain name** you want to use: a subdomain like `menu.restaurant.com`, or the root domain `restaurant.com` itself. 4. Click **"Connect"**. 5. The system will show the records to add to your domain's DNS (one for a subdomain, two for a root domain), each with: - **Host** (record name) — usually matches the domain you entered, or the part before your domain; - **Value** (what it points to) — a technical target issued by the platform. 6. Go to your domain's DNS management panel (at your registrar or hosting provider). 7. Create the records shown: one **CNAME** for a subdomain, or an **ALIAS/ANAME** plus a **TXT** for a root domain (see "Root domain: two records"). TTL can be left at the default, or set to 300–3600 seconds. 8. Go back to the admin panel — the connection status updates on its own once the system sees your DNS record: the page polls the status every 10 seconds, and in parallel your browser checks DNS every 30 seconds and prints a live hint right under the field ("Record found ✓" or "Record points to …, expected …") even before the server confirms. You can also click **"Check now"** to speed things up. --- ## Filling in the CNAME record at popular providers The most common confusion is in the "Name" field: some providers want the **full** subdomain, others want **only the left-hand part** (without your domain). Use this table as a guide: | Provider | "Name" / Host field | Notes | |---|---|---| | **Cloudflare** | just `menu` (no domain) | You must **turn off the orange cloud** (proxy) on this record — it needs to be **DNS only** (grey cloud), otherwise the certificate and site won't work | | **AWS Route 53** | full name `menu.yourdomain.com` | Record type — CNAME | | **GoDaddy / Namecheap** | Host = `menu` | Type = CNAME, Value/Points to — as shown in the admin panel | | **Other registrars (reg.ru, generic cPanel, etc.)** | usually just `menu` | A trailing dot on the value is often added automatically — match whatever the admin panel shows you | General rules regardless of provider: - For a **subdomain**, don't create an A record and don't enter any IP address — only a **CNAME** with the value shown by the admin panel. (A root domain works differently — see the next section.) - If there's an old **A or AAAA record** already on the same name (`menu`), delete it — it will conflict with the new CNAME record. - Usually only one record can point to a given name — remove old records for the same subdomain before adding the new one. --- ## Root domain: two records If you're connecting the root domain itself (`yourdomain.com`, no subdomain), the admin panel shows **two** records after you click **"Connect"** — create both, in any order: | # | Type | Name (Host) | Value | Why | |---|---|---|---|---| | 1 | `ALIAS` / `ANAME` (in Route 53 — an **A** record with Alias switched on) | `yourdomain.com` (or `@`) | the platform address from the admin panel | this is what brings visitors to your site | | 2 | `TXT` | `_cf-challenge.yourdomain.com` (or `_cf-challenge`) | the same platform address | proves the domain is yours — **without it the domain never activates** | Provider specifics: - **AWS Route 53** — record type **A**, **Alias = Yes**, alias target = the address from the admin panel, routing policy Simple. Plus a separate TXT record named `_cf-challenge.yourdomain.com`. - **Cloudflare** — create an ordinary `CNAME` on the name `@`: Cloudflare turns it into a valid answer itself (CNAME flattening). The cloud on that record must be **grey (DNS only)**. Add the `_cf-challenge` TXT record as usual. - **Providers with ANAME** (DNSimple, Gandi and others) — type `ANAME`/`ALIAS`, value = the address from the admin panel. - If your provider only offers "redirect/parking" instead of ALIAS, that won't work: it has to be a real ALIAS/ANAME record or CNAME flattening. As with a subdomain, the HTTPS certificate is issued automatically, and `www.yourdomain.com` can be connected separately as an ordinary subdomain (a single CNAME). --- ## How long it takes and what happens Connecting usually takes **5–15 minutes** after the DNS record is created and has propagated (the certificate itself is typically issued in under a minute once the system sees your CNAME record — most of the time goes to DNS propagation and final activation). The admin panel shows a four-step progress: 1. **Domain registered** — the system accepted your connection request. 2. **DNS record found** — the system saw your record at your provider (all required records, if there are two). 3. **Certificate issued** — an HTTPS certificate for the domain was issued automatically (in the AWS contour by AWS, in the Russian one by Yandex Certificate Manager on top of Let's Encrypt). 4. **Site active** — the domain is fully connected, and the site opens at the new address. You don't need to keep the admin tab open — checking and activation continue in the background; when you come back, you'll simply see the updated status. Click **"Check now"** if you want to speed up the check. The certificate is **issued and renewed automatically** — no action, payment, or file download is ever required from you, now or later. --- ## If something isn't working ### The record isn't visible to the system DNS changes don't propagate instantly — usually it's fast, but caching at some providers can take **up to an hour**. Check whether the record is visible with: ``` nslookup -type=CNAME menu.yourdomain.com ``` For a root domain, both records are checked: ``` nslookup -type=A yourdomain.com nslookup -type=TXT _cf-challenge.yourdomain.com ``` or any online DNS lookup tool. If the record shows up there but the admin panel still says "not found," wait a bit longer and click "Check now." ### The record points to the wrong place The admin panel will tell you this explicitly. Open your DNS settings and compare the record's value with what's shown in the "Custom Domain" block — most likely there's a typo in the Value, or the record was created with the wrong type. ### Cloudflare proxy is enabled If the domain is on Cloudflare and the cloud icon next to the record is **orange** — turn it off (make it grey, **DNS only** mode). While the proxy is on, certificate issuance and domain verification won't complete. ### A root domain stays stuck in "waiting" Make sure the **TXT record on `_cf-challenge.yourdomain.com`** exists — without it the platform can't confirm you own the domain, and activation never completes, even when the ALIAS/ANAME record is already correct. The TXT value must exactly match the platform address shown in the admin panel. ### The domain is already connected to another account Each domain/subdomain can only be connected to one platform account at a time. If you're sure the domain is yours but the system says it's taken, contact support. ### "The site opens, but it's the wrong menu" Check that the domain is connected to the **correct location** — with multiple locations, it's easy to mix up which one a domain is attached to. --- ## Disconnecting a domain The same "Custom Domain" block has a **"Disconnect"** button. After disconnecting: - the site becomes available again at the standard platform subdomain address; - you can (but don't have to right away) remove the records you created at your registrar (the CNAME, or the ALIAS/ANAME and TXT) — they no longer affect anything. --- ## Frequently asked questions ### Can I connect more than one domain? Yes, one domain per location. How many you can have connected at once depends on your plan (see the table above) and add-ons. ### Do I need separate hosting for the domain? No. The site is fully hosted on the platform's infrastructure — you only need to point the domain's DNS at it. ### Does connecting a domain affect email on that domain? No. We only add the records shown in the admin panel; your **MX records** (email) aren't touched and keep working exactly as before — that holds for a root domain too, where an ALIAS/ANAME record and MX records coexist happily. ### Does it work with `www`? Yes — `www.yourdomain.com` is itself a subdomain (a third-level name in DNS terms), so it connects exactly the same way as any other subdomain. ### Can I connect the root domain and `www` at the same time? One domain per location. The usual approach: connect the root `yourdomain.com` and set up a redirect from `www.yourdomain.com` to it at your DNS provider (or the other way round). ### What if I made a mistake with the subdomain when connecting? Disconnect the current domain and reconnect with the right name — your plan's domain limit isn't wasted if the record never went live. --- ## Related sections - [Website Builder](/en/docs/website-builder) — styling the menu site: templates, colors, fonts - [Subscription](/en/docs/subscription) — plans, domain limits and the "Own site" add-on - [QR Codes & Devices](/en/docs/device-codes) — printing QR codes for the connected site --- # AI Catalog Import **AI import** removes the manual typing: upload a ready price list — in Excel, Word, PDF or even a photo — and the AI recognizes the names, prices and categories and proposes a plan that you just review and apply. Open: **Admin Panel → Catalog → Import** (`admin.cenaly.com`), or from the import section in the menu/catalog. --- ## What you can upload - **Excel** spreadsheets (`.xlsx`, `.xls`); - **Word** documents (`.docx`); - **PDF** price lists and menus; - **Photos** of a price list or menu pages; - **CSV/TXT** — if the columns are recognized, a fast path without AI is used. --- ## How the import works 1. **Upload.** Drag in a file or photo. For tabular CSVs with clear columns, the system offers a fast path with column mapping. 2. **Recognition (AI).** For documents and photos the file goes to the AI (Gemini): it reads the content and extracts items, prices and descriptions. A ticker of recognized items shows the progress. 3. **Change plan.** The AI presents a ready plan — a list of items with name, price and category. Each row can be **edited** before applying. 4. **Apply.** Click import — the items are added to your catalog/menu. --- ## Good to know - The plan is a draft: you control exactly what enters the catalog and edit any rows before applying. - Re-uploading is handy for updating prices and stock — you can import only the fields you need. - Photo recognition quality depends on how readable the shot is: the clearer the price list, the more accurate the plan. --- ## Related sections - [QR Menu](/en/docs/qr-menu) — the menu structure the imported items land in - [Product features](/en/docs/product-features) — catalog product attributes - [Inventory](/en/docs/inventory) — stock and supply tracking --- ## FAQ ### Does the import change the catalog right away? No. First you see a change plan and can edit it; the catalog only changes after you apply the import. ### What if the AI got a price or name wrong? Fix the row right in the plan before applying — your edits are kept on import. ### Do I have to use AI? No. For CSVs with clear columns there's a fast path with manual mapping, no AI. --- # Product Features **Features** are attributes of catalog products: size, color, material, volume, brand and any other properties. They help shoppers pick the right variant and help you structure the catalog and build filters and collections around them. Open: **Admin Panel → Product Features** (`admin.cenaly.com/features`). > This section belongs to the retail vertical. --- ## Creating a feature Click **"Add feature"** and set: - **Name** — e.g. "Color", "Size", "Material". - **Field type**: - **Text** — a free-form text value; - **Number** — a numeric value, optionally with a **unit** (ml, g, cm); - **Select** — pick one value from a defined list; - **Multi-select** — pick several values. For select types you add **option values** (e.g. for "Color" — red, blue, black), and an option can be given an image. Features are then filled in on each product card, on the **"Features"** tab. The **"Manage characteristics"** link there opens the feature dictionary **as a modal right inside the card** — no need to leave for the section and lose unsaved edits. (The link navigates to the section only when the dictionary is unavailable to the employee by role.) --- ## AI feature wizard The **"AI Assistant"** button opens the **"AI Analysis — Suggested Features"** dialog, which analyzes your catalog and **suggests useful features** you don't have yet — each with a note on why it's helpful. Check the ones you want (or select all) and add them in one click. It's a fast way not to miss important properties for your product type. --- ## Related sections - [Product collections](/en/docs/collections) — storefront groups; rules are easy to build on features - [AI catalog import](/en/docs/catalog-import) — load the catalog from a file or photo - [Website builder](/en/docs/website-builder) — how products look on the storefront --- ## FAQ ### How is a feature different from a product variant? A feature describes a property (color, size); concrete product variants, filters and storefront collections are then built from those. ### Do I have to use the AI wizard? No. You can create all features by hand; the AI wizard just suggests what's worth adding. ### Can I show a value with a unit? Yes, for the number type you set a unit (ml, g, cm), and it's displayed together with the value. --- # Product Collections **Collections** are storefront groups of products for your online store: "New arrivals", "Best sellers", "On sale", seasonal sets. They help you present the catalog nicely and guide shoppers to the right products. Open: **Admin Panel → Collections** (`admin.cenaly.com`). > This section belongs to the retail vertical and appears in the menu for that business type. It has no effect on a restaurant menu. **Where else.** In store mode you can manage collections right inside the **Catalog** section without leaving for a separate page: a second row of chips with collections appears under the categories, with an axis filter next to it. Clicking a chip opens the collection's contents, a pick mode lets you add products by clicking their cards, and the pencil in the action bar opens **the same full editor** as a modal. The selected collection lives in the address (`?collection=`), so the link can be sent to a colleague. In the product card itself, membership in manual collections is toggled with pills (automatic collections are not in the pills — their contents are driven by rules). --- ## Collection types - **Manual** — you pick which products belong to the collection yourself. - **Automatic (rule-based)** — products enter the collection by conditions you set (e.g. by tag, category or another attribute). The list updates itself as the catalog changes. Each collection card shows its type, the number of products (or rules), and its status — published or hidden. --- ## Creating a collection Click **"New collection"** and fill in the editor: - **Title** — the heading shoppers will see; - **Handle** — the part of the URL like `/collection/handle`; - **Products** (for a manual collection) or **rules** (for an automatic one); - **“Show available items only”** — show in the collection just what is orderable right now: items in the 86 list and paused ones are hidden. The checkbox is evaluated on the storefront at render time, so it takes effect instantly without waiting for the storefront snapshot to be republished — a key setting for “Best sellers” and seasonal collections; - **SEO fields** — title, meta description and a social image (OG image, with a “Take from photo” button that reuses the collection cover); - **Publication** — you can temporarily hide the collection from the storefront. The order of collections is set by sorting — that's how you control what appears higher on the storefront. --- ## Related sections - [Product features](/en/docs/product-features) — attributes that make good rule conditions - [AI catalog import](/en/docs/catalog-import) — quickly fill the catalog with products - [Website builder](/en/docs/website-builder) — styling the online store front --- ## FAQ ### How is a collection different from a category? A category is the catalog structure (where a product "lives"). A collection is a marketing storefront group — a product can belong to several collections at once. ### What does an automatic collection do? It gathers products by rules and updates when the catalog changes — no need to add new arrivals by hand. ### Can I hide a collection without deleting it? Yes, unpublish it — the collection disappears from the storefront but stays in the list. --- # Returns & RMA **RMA (Return Merchandise Authorization)** is a separate document tracking the lifecycle of a product return, independent of the order's own status. This section applies to the **retail vertical** — an online product storefront. A guest requests a return from their account, and the venue processes it in the admin panel through a strict status graph — from the initial request all the way to the actual refund. > ⚠️ **The section is available in the AWS contour only** — on `cenaly.com`, `cenaly.com` and other brands of that contour. On the Russian contour `cenaly.ru` RMA does not work yet: there is no "Returns" item in the admin sidebar and no "Request a return" button in the guest's order history. Refunds there are handled outside the platform (or at the register — see [POS Receipts & Refunds](/en/docs/receipts)). --- ## How it works for the guest On the customer account page, under the **"Orders"** tab, a delivered/paid order shows a **"Request a return"** button. The guest picks: - which line items to return and in what quantity; - a reason for the return (optional); - the condition of the item (optional). After submitting, the request enters the **"Requested"** (`requested`) status, and a return-status badge appears in the guest's order history — so the guest can track progress without contacting the venue directly. --- ## How the venue processes a return Open **Admin Panel → Returns** (`admin.cenaly.com/returns`). The list shows all RMA requests for the current location, filterable by status. Clicking a request opens a detail drawer with: - the order the return belongs to and its order number; - line items, quantity, the guest's stated reason and item condition; - the full status transition history (who changed what, and when); - available actions — only the transitions allowed by the status graph (see below). A typical flow: **approve** the request → wait for the guest to ship the item back (**"In transit"**) → mark **"Received"** (with an option to restock inventory) → process the **refund** → close the request. A request can also be **rejected** at any stage before the refund — including after the item has been received, if an inspection shows the return doesn't meet your conditions. --- ## The RMA status graph | Status | Meaning | |---|---| | `requested` | Request created by the guest, awaiting a decision from the venue | | `approved` | Return approved, waiting for the item to come back | | `rejected` | Return rejected | | `in_transit` | Item is on its way back to the venue | | `received` | Item received (optionally restocking inventory) | | `refunded` | Money refunded to the guest | | `closed` | Request closed | Transitions strictly follow the graph — you can't, for example, close a request without first receiving the item. This guarantees no return falls through the cracks between stages. > ⚠️ The `refunded` status in the admin panel records the **fact** that money was refunded on the RMA document. It does not replace the actual operation on the payment gateway — the guest is refunded through the same payment method the order was paid with (see [Payments](/en/docs/payments)); contact your payment provider if you need a refund on a specific transaction. --- ## Returns in the orders list In the [Orders](/en/docs/orders) section, orders with an active RMA show a return-status badge — no need to open a separate section to see that a return is in progress for an order. --- ## Your own list of reasons The list of return and cancellation reasons is yours to edit: **Settings → Orders → “Return and cancellation reasons”**. - every reason has a label and a **stable code** — statistics are counted by that code, so it should not be changed after the first requests come in; - a reason can be shown in different places: when returning goods, when cancelling an order, when refunding money; - you set the order, archive the ones you no longer need, and restore the default set with one button. The guest picks a reason in the return form, the cashier picks one at the POS. The **“Why customers return”** report shows the distribution by reason code — the raw material for decisions about a product, a supplier or a product description. --- ## Related sections - [Orders](/en/docs/orders) — order statuses and where the return badge appears - [POS Receipts & Refunds](/en/docs/receipts) — returns and exchanges at the register for in-person sales - [Payments](/en/docs/payments) — guest payment methods and refunds - [Collections](/en/docs/collections) — managing the storefront catalog --- ## FAQ ### Does returns only work for the online store? The RMA section applies to the trade verticals — retail (`retail`) and online store (`ecommerce`); no extra setup is needed for them. There is one contour limit though: the section only works on AWS brands, and is absent on `cenaly.ru`. For in-person sales at the register, use a separate mechanism — see [POS Receipts & Refunds](/en/docs/receipts). ### Can a guest cancel their own return request? No, status is managed by the venue through the Returns section — the guest only creates the request and sees its current status. ### Does the refund happen automatically? Moving a request to the "Refund" status records the fact of the refund on the document, but the actual charge/refund on the payment gateway is performed separately, according to your payment provider. ### Can I restock a returned item? Yes, the "Received" step has a restock option — the item goes back into inventory. --- # Market — Multiple Venues in One Menu **Market** is a place where venues combine their menus. One venue can **include another's menu in its own site** (for example, a food court or aggregator gathering several kitchens on one page), while the menu owner controls who may show it and on what terms. Open: **Admin Panel → Market** (`admin.cenaly.com`). The section is on by default; it can be switched off entirely with the **"Supplier marketplace"** card in the [App store](/en/docs/app-store). The page has three tabs — two by your role in the connection, plus partner search. --- ## "Connections" tab (you are the provider) Here you respond to requests from other venues that want to **include your menu** on their site. For each connection you see: - the host venue and the distance to it (flagged if it's **outside your delivery zone**); - a **mini map with two points** — you and the host; - the **requested and accepted commission** (a percentage); - the status: pending / active / frozen / rejected. Actions: **accept**, **decline**, **freeze / unfreeze**, **remove**, and accept or decline changed commission terms if the host proposed them. > **Only the side that froze a connection can unfreeze it.** If the host froze it, the provider cannot lift the freeze, and vice versa. A freeze applied by the system is lifted automatically once its reason is gone. --- ## "My Menu" tab (you are the host) Here you **include other venues** in your own menu. With the **"Include a venue"** button, enter the provider's domain and a proposed commission percentage — a request is sent to that venue. Once connected, for each included venue you can: - set a **section title** (how it appears in your menu); - change the **order** (up/down); - adjust the **commission**. If the venue is outside your delivery zone, the connection is still created: the system warns about the distance once, right in the reply to the connection request. The "you and the partner" mini map lives on the card in the "Connections" tab. --- ## Commission, zones and currency - **Commission** — the percentage the host and provider agree on; terms can be changed, and the other side confirms them. - **Delivery zone** — the system warns you if the partner is far away. - **Currency** — connecting venues with different currencies is not allowed. The **⚙** icon in the window header opens the settings a connection depends on, even though they live in other sections: the **location card** (coordinates — for distance and the map, currency, city, logo and venue type, delivery radius) and the **menu** (the catalog goes to the partner in full — embedding has no subsets). --- ## Related sections - [Own delivery](/en/docs/delivery) — courier routes and statuses - [Multi-location](/en/docs/multi-location) — managing your own chain - [Website builder](/en/docs/website-builder) — where the combined menu is shown --- ## FAQ ### Is this ordering products from suppliers? The three tabs of this window are about combining **venue menus** (a food-court/aggregator model), not purchasing goods. Buying from other Cenaly venues does exist, though, and it is switched on in the same settings block: **App store → "By location" → the venue card → the "Marketplace" block → "Supplier shop"**. That is a separate B2B opt-in: you set the categories (food, beverages, packaging, equipment, household, services), the city, the minimum order amount, payment terms and the delivery schedule — and your catalog becomes visible to colleagues. The other way round, [Inventory](/en/docs/inventory) can pull such a supplier's price list straight into its own catalog. ### Who sets the commission? The host proposes a percentage on connection, and the provider accepts it; terms can be revised, with the other side confirming the change. ### Can I temporarily hide a partner menu? Yes, either side can **freeze** a connection — provider or host; the host can also reorder or remove an included venue. Only the one who froze it can unfreeze: the other side gets a refusal. A freeze applied by the system cannot be lifted by hand. --- # Commerce: coupons, shipping and affiliates The **Commerce** section gathers everything that changes the cart total: discounts, shipping cost and partner rewards. The settings apply at storefront checkout — both for an online store and for a restaurant menu with delivery. Where: **Admin panel → Finance → “Commerce”** (`admin.cenaly.com`). --- ## Coupons and automatic discounts A **coupon** is a code the guest enters at checkout. An **automatic discount** is the same coupon with the “apply automatically” box ticked: no code required, the discount is calculated on its own. Four types: | Type | What it does | |---|---| | **Percentage discount** | 10% off the cart, for example | | **Fixed amount** | A fixed sum in the venue's currency | | **Free shipping** | Zeroes the shipping cost | | **BOGO — buy X, get Y** | “2+1”, for example: without a product list the cheapest items become free | Scope: the whole cart, specific products or [collections](/en/docs/collections). Per-coupon limits: minimum order value, maximum discount, total and per-customer usage limits, validity dates, stackability with other coupons. Promo codes created on the “Location” page are shown here read-only, so that two entities never fight over the same code. They also have a **validity window** (“from” and “to”): the location's table shows a validity column and a filter “Active / Not started yet / Expired / All”, and at checkout the date window is judged by the same rule as for the coupons of this section. --- ## Customer conditions A coupon can target a customer segment: - **new customers only** — no completed orders yet; - **returning customers only**; - **by lifetime spend** — above a given total of completed orders; - **win-back** — customers whose last order is older than N days. Customers are identified by phone number: without a phone at checkout, a coupon with customer conditions will not apply. --- ## Shipping methods The list of methods the guest chooses at checkout. Cost is calculated by the method's rules: | Method | How it is calculated | |---|---| | **Pickup** | Free | | **Flat rate** | One price for any order | | **Free over threshold** | Above the threshold it is free, below it the nested method's price applies | | **Local delivery (radius)** | By distance from the origin point, in kilometres | | **By zone** | Price per country/region (ISO codes); an empty country list means “everywhere” | | **CDEK** | Carrier rates; the method itself is configured in the CDEK integration panel | If there are no methods, checkout falls back to the previous flat delivery fee from the location settings — enabling the section breaks nothing. ### Delivery zones on the map — right here Above the list of methods sits the **Delivery zones on the map** block: polygons of your own courier delivery, each with its own fee, minimum order and ETA. **Set up zones** (or the **🗺️ Delivery zones on the map** entry in the "+ Add method" list) opens the very same editor as the [Own delivery](/en/docs/delivery) section — right here, without leaving the page: you have one set of zones, wherever you edit them. The block comes first for a reason — that is how checkout counts: if you have a zone and the guest's address falls inside it, the **zone** sets the delivery price, not the methods below. Addresses outside every zone are served by the methods in the list (carrier, pickup point, flat rate). Do not confuse it with the **By zone** method in the table above: that one is about countries and regions by ISO code, not about a polygon on the map. A method also works beyond the zones and radius of your [own delivery](/en/docs/delivery): if at least one method quotes the guest's address, there is no "Address outside the delivery zone" refusal — the guest picks the method and pays its price. --- ## Affiliate program A partner brings customers via a **referral link** shaped like `?ref=CODE` and earns commission on realised orders. Per-partner settings: - **commission** — percentage of the order or fixed per order, in a chosen currency (orders in another currency are not accrued); - **attribution window** — how many days after the click an order still counts (30 by default); - **first orders only** — pay for new customers only; - **payout threshold**; - **status**: active, paused, archived; - a link to a customer account — the one the partner signs in with to open their own dashboard on the storefront; - an optional reference to a [client record](/en/docs/counterparties). **The commission is calculated by the server**, not the browser: it is accrued when an order is realised and **reversed if the order is cancelled**. Every movement is visible in the partner's ledger: accruals, reversals, payouts and the current balance. --- ## Device registrations A separate tab lists devices customers registered on the storefront: serial number, product, contact, warranty. Useful for electronics and anything with warranty service. --- ## Related topics - [Online store](/en/docs/shop) — cart, checkout and storefront - [Loyalty](/en/docs/loyalty) — bonuses and programs for regulars - [Collections](/en/docs/collections) — what to attach discounts to - [Own delivery](/en/docs/delivery) — couriers and order logistics - [Finance](/en/docs/finance) — how discounts and shipping show up in reports --- ## FAQ **Can I run a discount without a promo code?** Yes, tick “apply automatically” and the guest gets it by themselves. **Do coupons stack?** Only if the coupon is marked as stackable. **What if a guest cancels an order that came from a referral link?** The accrued commission is reversed automatically and shown as a separate ledger entry. **Is the partner's commission calculated on the discounted total?** Yes, on the order as actually realised. --- # Clients (CRM) The **Clients** section is the CRM of your online store: individual buyers and organisations in one record, with legal details, documents and a relationship history. You need it wherever a sale does not end with a receipt: B2B orders, invoices and contracts, deferred payment and settlements. Where: **Venue → “Clients”** (`admin.cenaly.com`). The section belongs to the retail vertical. Do not confuse it with [Returning guests](/en/docs/customers): that is a phone directory and guest recognition, this is a full contractor record. --- ## The client record The record type is **individual** or **company**; the set of legal details depends on the type and country. Tax number formats are validated, including checksums, and entering an existing number offers to “open the existing record” instead of creating a duplicate. The record holds: - the name (first, last and middle name for an individual) or the legal name and registered address; - country and country-specific details, the signing officer; - **bank accounts**: bank, account/IBAN, BIC/SWIFT; - **contact persons**: name, role, phone, email, Telegram, WhatsApp; you can mark the primary contact and the one documents are sent to; - date of birth, marketing consent, notes, tags, status. A contact can also be added from a single line: type a phone, email, `@telegram` or a `wa.me` link and the type is detected automatically. --- ## The client's orders The **Orders** tab shows “Orders”, “Lifetime spend” and “Last order” tiles plus the list of orders with date, number, amount and status. Orders appear here automatically as the client buys from your store. A document can be created straight from an order row. --- ## Documents, contracts and settlements - **Documents** — invoices, acts and anything else for this client; - **Contracts** — contract records; - **Settlements** — money movements and outstanding balance. Templates and AI-assisted document filling live in [Documents](/en/docs/documents). A draft produced by the AI request parser (**🤖 Parse request**) also lands in **Documents**, and its “check before issuing” task in **Activity** — never in **Orders**, which only lists this client's purchases from your store. --- ## Activities and tasks The **Activity** tab is the history of working with the client: notes, calls and tasks with due dates. Overdue tasks are highlighted, and all open tasks across all clients are gathered in a separate “Tasks” list — a manager's working list for the day. That list only holds open tasks, so a row you tick disappears from it; a notification with an **Undo** button appears at the bottom of the screen — it clears the tick and brings the task back. You do not have to pick the due date in the calendar: write it inside the task text — “call back tomorrow”, “invoice by 25.12”, “on Friday”, “in 3 days”, “December 25” — and a **Set due date** button appears next to the field. It fills an empty field on click and never overwrites a date you picked yourself. --- ## List, search and bulk actions Search covers name, tax number, phone and email. Filters: type (individuals/companies), status (active, blocked, archived) and tags. Select several records to **archive** them or **add a tag** to all of them at once. An archived record is preserved (documents may reference it) but disappears from the active list. --- ## Import, export and duplicates - **Import** — one client per line: `type;name;country;tax number;phone;email`. The report shows how many were created, how many already existed and where an error occurred. - **CSV export** — the whole list. - **Merging duplicates**: the current record survives, the selected one is archived and its contacts and identities are moved over. Only records of the same type can be merged. --- ## Related topics - [Returning guests](/en/docs/customers) — guest recognition and order history by phone - [Documents](/en/docs/documents) — contract and act templates, AI filling - [Commerce](/en/docs/commerce) — the affiliate program links to a client record - [Orders](/en/docs/orders) — the shared order list - [Finance](/en/docs/finance) — money and reports --- ## FAQ **How is this different from “Returning guests”?** “Returning guests” is a quick phone directory and a repeat-visit badge. “Clients” is a record with legal details, documents and settlements — for B2B and paperwork-heavy sales. **Will a client record be created automatically after an order?** Orders are linked to client records; the records themselves you create manually, by import or from an order. **Can I block a buyer?** A record has a “Blocked” status, and to stop orders on the storefront there is a blocklist in the order settings — see [Online store](/en/docs/shop). --- # My Website: widgets on your own site The **My Website** section is for those who **already have a site**. There's nothing to migrate to our storefront: you paste one line of code into your existing site, and after that you switch the products you need on with toggles in the admin panel. Where to find it: **Admin panel → Marketing → "My Website"** (`admin.cenaly.com`). It works on any platform where you can paste a ` ``` Paste it once — into `` or right before ``. You won't need to touch the site's code again: **which widgets run is set by toggles in the admin panel**, not by tags on the page. Turn a widget on, and it appears on the site within a few minutes; turn it off, and it disappears. If you previously pasted individual widget tags by hand, they'll keep working: the single loader sees them and won't start the same widget a second time. --- ## Installation on Popular Platforms In the "Installation Code" window there is a tab for each platform — with the same steps as below. Every platform here has **its own anchor**, so you can send the link to whoever edits the site instead of retelling the steps: `#html`, `#google-tag-manager`, `#wordpress`, `#tilda`, `#wix`, `#shopify`, `#webflow`, `#squarespace` — for example, `/en/docs/site-widgets#tilda`. What is true on every platform, so we don't repeat it in each block: - the tag goes in **once for the whole site** — into the shared template, not into a single page; - on website builders (Tilda, Wix, Webflow, Squarespace) the change stays in the editor until the site is **published again**; - check the **live** site, not the editor preview; - if a cache or a CDN sits in front of the site, purge it: both the visitor and our check may be served a stored copy of the page without the tag; - what the installation check will not see anyway — [a separate breakdown below](#what-the-installation-check-does-not-see). ### HTML Any site whose template you can edit: hand-written, a landing page, a static site generator. 1. Copy the code line: **Marketing → "My website"**. 2. Paste it into `` or before `` of the site's **shared template**. 3. No shared template (pages are separate files) — paste it into every page. 4. Upload the change, open the site and press "Check installation". ### Google Tag Manager The way to go when you have no access to the template but GTM is already on the site. 1. **Tags → New →** type **"Custom HTML"**. 2. Paste the code line, trigger — **"All Pages"**, save. 3. Press **"Publish"**: until the container version is published, the live site has no tag. ⚠️ A tag raised from GTM will **never** be detected by our "Check installation" — that is not a bug but a consequence of the method: [“What the installation check does not see”](#what-the-installation-check-does-not-see). Open the site and look with your own eyes. ### WordPress 1. The WordPress dashboard (`your-site/wp-admin`); **administrator** rights are required. 2. The reliable way: **Plugins → Add** → any plugin that inserts code into the header/footer → paste the line into its **Header** field → save. 3. Without a plugin: **Appearance → Theme File Editor** → `header.php` (before the closing ``) or `footer.php` (before ``) → "Update File". 4. Open the site and press "Check installation". ⚠️ Edits to the **parent** theme's files are lost when the theme is updated — the WordPress documentation warns about this too. A code-insertion plugin or a child theme survives updates. If a caching plugin is installed (W3 Total Cache, WP Rocket and the like), purge the cache, otherwise the check will see an old copy of the page. 💡 You don't need a separate widget plugin: one tag brings all widgets in. The **Cenaly Consent** plugin is a different story — it installs the cookie-banner tag only (see [Cookies and consent](/en/docs/cookie-consent)). ### Tilda 1. In the project list open **"Site Settings"** of the right site (project settings, not page settings). 2. Section **"More"** (in some accounts it is labelled "Code Injection") → the field **"HTML code for the head section"**. 3. Paste the line and save. 4. **Republish all pages** of the project — otherwise the code stays in the editor only. 5. Open the live site and press "Check installation". 💡 If you need the tag on a single page only, the same field exists in "Page Settings" → "Additional"; then republish that page. ### Wix 1. The site must be **published** and the domain **connected**: that is Wix's own condition for custom code. 2. **Settings** → **Development & integrations** → **Custom Code**. 3. **"+ Add Custom Code"** → paste the line, give the snippet a clear name. 4. Apply to **All pages**, load once, placement — **Head**. Save. 5. Press **Publish**, open the live site and press "Check installation". ⚠️ Wix code snippets are tied to the domain: assign another domain to the site and the snippets are deleted — the tag has to be pasted again. ### Shopify 1. Shopify admin → **Online Store → Themes**. 2. On the theme "…" → **Duplicate**: the copy is your way back. 3. There as well: "…" → **Edit code**. 4. On the left, the **Layout** folder → the **`theme.liquid`** file → paste the line before the closing `` (or before ``) → **Save**. 5. Open the storefront and press "Check installation". ⚠️ The edit belongs to the **theme**, not to the shop: switch or re-create the theme and you must paste the tag into the new one, otherwise the widgets disappear with the old theme. Shopify checkout pages are closed to arbitrary theme scripts — the widgets are meant for the storefront. ### Webflow 1. **Site settings** of the project → the **Custom code** tab. 2. The **Head code** field → paste the line and save. Only the script itself goes there: no `html`, `head` or `body` wrapper tags. 3. Press **Publish** — custom code does not run in the editor or in preview. 4. Open the published site and press "Check installation". ⚠️ Custom code fields in Webflow site settings are available on a paid Site plan. If you need a widget on one page only, a page has its own code fields in its settings. ### Squarespace 1. Site panel → **Website → Website Tools → Code Injection**. 2. The **Header** field (it goes into the `` of every page) → paste the line → **Save**. 3. Open the live site and press "Check installation". ⚠️ The Code Injection panel is available on the Core, Plus and Advanced plans and on some legacy Squarespace plans. A page Code Block is not a replacement: it puts the code inside one page, while widgets are needed across the whole site. The steps are checked against the platforms' official help. If a platform renames a menu item, trust its help centre rather than us — and tell us, we'll fix it. --- ## Twelve widgets Every widget is a separate card with a toggle and a settings gear. The data the widgets collect ends up in the usual sections of the admin panel — there is no need to set up a separate "inbox for the site". | Widget | What the visitor sees | Where the data goes | Documentation | |---|---|---|---| | 🍪 **Cookies and consent** | A consent banner with categories and a settings screen | Consent log, cookie declaration | [Cookies and consent](/en/docs/cookie-consent) | | 💬 **Chat: AI assistant and operators** | A chat bubble on the page | The "Guests" section of "Team chat" — together with WhatsApp, Telegram, email, Messenger/Instagram | [Chat with guests](/en/docs/chat) | | 💡 **Popups and forms** | Promos, exit offers, email capture, timers | Campaigns and their statistics | [Popups on your own site](/en/docs/engage) | | 📅 **Table reservation** | The "Book a table" button | The "Tables" section — reservations and the floor plan | [Table reservations](/en/docs/reservations) | | 🗓️ **Online booking** | The "Book now" button: service → specialist → time | The "Appointments" section | [Appointment book](/en/docs/appointments) | | 🛒 **Online order** | The "Order" button, a cart and checkout on top of your own site | The "Orders" section | [Online ordering on your own site](/en/docs/order-widget) | | 📚 **Support center** | A "?" button with published help articles | Articles go to "Articles and pages" (the "Help" group), help analytics — to the "Knowledge base" | [Support center](/en/docs/help-center) | | ⚖️ **Legal documents** | Links to, or the text of, your privacy policy, terms and the like | Pages on our hosting; re-publishing updates the site by itself; configured right in the widget panel, without a wizard | [Legal documents](/en/docs/legal-docs) | | 📞 **Call from the site** | The "Call" button — a conversation straight from the browser, with no number to dial | The "Calls" section: recording and analysis just like an ordinary call | [Call from the site](/en/docs/webcall) | | ☎️ **Callback** | A "Call me back" form with a choice of a convenient time | The callback queue: the system dials the manager and the guest by itself; requests go to "Requests" and to the "Callbacks" tab of the "Customers" section | [Callback](/en/docs/callback) | | ➕ **Multibutton** | A single floating button holding every contact channel at once | Wherever the chosen channel leads; in the admin panel — click statistics by channel | [Multibutton](/en/docs/multibutton) | | 📈 **Live storefront** | Badges with the number of orders, reservations and appointments over a period, and the average rating | Shows anonymized aggregates of your own events and reviews | [Live storefront](/en/docs/proof) | The load order is not accidental: **the cookie banner loads first among our widgets**. The single asynchronous loader reads the settings first and cannot get ahead of analytics that the site has already started. If you need blocking before the trackers start, install the separate `consent/v1.js` tag first in ``, without `async` and `defer`, as described in the [article on consent](/en/docs/cookie-consent). The **multibutton** comes after the aggregated widgets, and the **"Live storefront"** comes last: its badges take into account the buttons in the same corner. The cookie banner on `cenaly.ru` has limitations: the consent log and CSV are not collected yet, the cookie scanner is unavailable, and the declaration is maintained manually. When the config is unavailable, the current version lifts the tracker block; after installation, check the banner and the page's actual requests. The full terms are in [Cookies and consent](/en/docs/cookie-consent). **The support center** shows published articles, which you need to prepare in the "Articles and pages" section or publish from the knowledge base. The button does not create articles by itself. In help analytics, page events inside this panel belong to the "site" source; the "widget" source denotes the help tab in the chat. **Legal documents** must first be published on our hosting. The widget shows the published versions as links, in a window, or as text on the page; re-publishing them in the admin panel updates them. This is not automatic tracking of changes in legislation. **The multibutton** is not just a list of links: it has an inviting bubble ("Got a question?"), display conditions (on which pages, after how many seconds, on phones only or everywhere), a prepared first message for messengers, and its own click statistics by channel. **The "Live storefront"** shows social proof based on your own data — orders, reservations and appointments — and does it honestly: there are no names or phone numbers in the badge, the events are aggregated, and stale ones stop being shown according to the venue's calendar (a venue that was closed yesterday does not "sell" yesterday's orders). The **"Popups and forms"** card has a **"✨ Create from template"** button next to the toggle and the gear: it opens the same widget settings window, but straight to a gallery of ready-made scenarios — and saves nothing until you press "Done". The **"Legal documents"** panel no longer sends you into a five-step wizard: the country, the set of documents, the questions about your business, your legal details and the language all sit on a single screen, autofill and preview are collapsed, and at the bottom there is a "Documents to publish: N" counter. An option that contradicts the answers you have already given is locked, with an explanation of exactly why. Open hub windows live **in the page address**: a widget's gear writes `?widget=`, and the installation code window writes `?panel=install`. That means a link to a particular widget's settings can be sent to a colleague, and it survives F5 and the "back" button. A toggle alone is not enough for every widget — some also need content: - **Online booking** appears on the site once the menu has at least one item of the "Service" type and booking is enabled (the same switch as for table reservations); - **The support center** turns on with the toggle right away, but without published articles it opens an empty help page — the widget settings show how many articles are published. **Reservation limitations.** Right now the table reservation widget converts the chosen date and time in the guest's browser time zone. For a visitor from a different zone the time in the log may differ from the venue's expected time — check it when confirming. A message that the request has been sent also does not always mean that the server has already confirmed the reservation. If online booking reports a delay in confirmation, check the appointment book first: a repeat attempt may create a duplicate. **Verifying that it is off.** After turning a widget off, check the site and reopen the settings once the data has refreshed. In the current version the toggle may go dark locally while the previous "on" state is kept on the server. If you need to stop a single widget urgently, remove its separate tag or contact support; removing the shared tag stops the whole set it was connecting at once. Above the buttons of every card there are **mini-statistics for 7 days**: impressions, opens and a third number that depends on the widget (requests, orders, reservations, appointments, conversations, dialogues, clicks). "—" means there is no data at all yet, "0" means telemetry is there but there were no events; "More →" leads to the "Site widgets" dashboard. The **online order** settings window has one more button for an external site — **"🔔 Notify when back in stock"**: you pick a product and a variant from your own catalog, mark up the button on the page of the sold-out product, and the guest leaves an email, confirms it via a link and receives a single message when the product is back in stock. We do not read someone else's catalog and do not take stock levels from someone else's page — the product is linked manually. More on this in the article [Online ordering on your own site](/en/docs/order-widget). --- ## Forms that already exist on your site The **"📝 Forms that already exist on your site"** block under the grid of cards is for the case of "the request form is already on the site, and nobody is going to change it". We neither replace it nor delay it: the form is submitted to your backend just as before, and a copy of the request lands in the admin panel. **A rule** is a CSS selector for the form, the addresses of the "name / phone / email" fields (the value can be either simply a field name, for example `phone`, or a selector, `input[name="tel"]`), optional page masks and a toggle. There can be up to 10 rules per location, one rule per form. A rule without a form selector, or without a phone or an email, cannot be enabled — there is nothing for it to collect. Every row has a **"Check"** button: the server reads the page and reports whether the form was found, which of the rule's fields it contains and what field names it has at all. **What exactly is sent.** Exactly three fields — name, phone, email — plus the page address without parameters and anchor. Input before "Submit" is pressed is not read, we add no validation or delays of our own, and a form that has failed the browser's own validation creates no request. The server suppresses a repeat of the same form with the same contact within 10 minutes; with simultaneous submissions or a failure to write the marker a duplicate is possible. The forms of our own widgets are not listened to. Interception sends a copy of the request without waiting for the server's reply. If the network drops or the browser blocks the request, the copy may not arrive: there is currently no delivery queue for when the connection is restored. A repeat with the same contact on the same page is likewise suppressed until the page is reloaded. A "sent" mark means an interception attempt, while the actual arrival should be checked in the inbox. **Where to look.** The **"Requests"** section and the "Requests" tab of the contact center — as the group "Forms on the site: ". Every such request carries an honest note: we see the "Submit" press, not the fate of the data on your backend. ⚠️ The "Check" button parses HTML without a browser: it will not see a form that JavaScript draws — whereas interception in the guest's browser will. The panel says so directly. --- ## Action links and QR codes The **“🔗 Action links and QR”** block under the card grid builds a link that opens **one specific action** on your site: `https://your-site/#cenaly=book` — the reservation form, `#cenaly=appointment:` — booking straight into a service, `#cenaly=order:` — the product card, plus chat, callback, the help centre, a document (`legal:`) and the multi-button fan. Such a link is usually printed as a QR code: on a table, on a receipt, on packaging, in offline ads. How to build one: choose the action, optionally a specific object (a service or an item from the published menu, a published document) and “where you place it” — this sets the UTM tags for **your** analytics (`utm_source=qr&utm_medium=&utm_campaign=`; we do not read them). The output is a link with a “Copy” button and a QR code downloadable as PNG and SVG. The link's base is your site address; if none is set, our storefront. Every widget card has a short **“🔗 Link”** button with the action preselected. Why a `#` hash rather than a `?` parameter: third-party CMSs, cache plugins and CDNs strip unknown parameters and change the canonical address, while a hash is never sent to the server by the browser — it is guaranteed to reach our code. It is executed by the **unified tag**: it reads the hash once on load, removes it from the address and opens the widget once it has come up. Standalone widget tags do not read the hash. The block warns **before you print a batch**: the action's widget is off, or no install code was found on the site at the last check. The link does not switch on what is off and does not substitute a missing document — in that case it simply does nothing: on a third-party site that beats an error. The same link also works on our storefront of the business, including the help centre, documents and the multi-button — the sticker is printed once, and the site may change. --- ## The online booking widget in detail Settings live in the **"Online Booking" card → gear icon**: button color, its text, the screen corner, and the language. Right below the settings there's a ready-made code line just for this widget, in case you're installing only this one. **Language.** The default is **auto**: the widget speaks the language of the page it sits on and knows **45 languages**. Only the dictionary that's actually needed gets loaded, so this doesn't affect your site's speed. You can also pin one language in the list — for example, if the site is bilingual but you want bookings taken in just one language. **Links to a specific service or specialist.** You can add attributes to the widget tag so the guest lands right on the step you need: | Attribute | What it does | |---|---| | `data-service="service id"` | the service is pre-selected — a "Book" button next to the service's description on your site. The id is shown next to the item in the "Menu" section | | `data-master="specialist id"` | the specialist is pre-selected — for a page about a specific specialist; the specialist's id is the same as the employee's id | | `data-open="true"` | the booking panel opens on its own, with no click on the button — for a dedicated "Book now" page | A stale id (the service was renamed, the specialist left) doesn't break the widget: it quietly shows the usual choice starting from the first step. **Fewer steps to a booking:** - a single service or a single suitable specialist — the extra screen isn't shown; - the **"⚡ Nearest: today 17:30"** chip books in one tap, and the calendar opens on its own on the first day with free time; - the name, phone, and email are remembered on the guest's device: on a repeat booking the fields are already filled in, and the "Not you?" link clears them; - on a phone the panel opens full screen, and the booking button doesn't hide under the keyboard; - the widget can be used from the keyboard and reads correctly with a screen reader. **Email.** The email field is optional; if the guest leaves an address, they get a letter with the visit details and a "Manage booking" link that lets them move or cancel the visit themselves. Details — in [Appointment book](/en/docs/appointments). **What the widget brought in.** In the appointment book, the **"🌐 Website widget"** button shows the funnel for 7, 30, or 90 days: how many times the button was seen, how many guests opened the panel, reached the contact step, and booked, and how many bookings were lost to a slot taken meanwhile. Bookings that came from the site carry a "From website" badge. --- ## Installation check The **"Check installation"** button opens your site and reads the page's source HTML. Possible answers: - **"Widget code found on the site"** — the single tag is in place; - **"Only individual widget tags found"** — old individual snippets are working, there's no single tag; - **"The code on the site belongs to a different location"** — the tag carries someone else's `data-domain` (a common mistake with several venues); - **"No widget code on this page"** — no tag is visible. ⚠️ The check reads the **source** HTML of one page. If the tag is inserted in the browser by Google Tag Manager or another script, the check won't see it — that's not an error. What else stays outside the method is collected below in [“What the installation check does not see”](#what-the-installation-check-does-not-see). **Once a week the same check re-runs on its own** — for locations that have a site address, at least one widget enabled and whose previous check found the tag. A tag dies silently — the site moved to a new theme, a contractor shipped a layout without the snippet, a cache plugin threw out the “extra” script — and before, the only way to notice was that the leads had stopped. Now the transition “tag was there → tag is gone” arrives as a card in the **team chat** (no more than once a week per location) and as a red third step in the “Your site” block. A site that did not open (timeout, server error) is not counted as broken — we will check again next week; a tag inserted through Google Tag Manager is never seen by the check, so there will be no false alarm for it either. The same analysis is available **publicly, without signing in** — the [Site check](/en/tools/site-check) page: paste an address and it reads the page HTML and shows analytics and ad pixels by name, whether a consent banner is installed (ours, another vendor’s, or none), and whether our tag with its enabled widgets is visible. Handy for checking a site **before** connecting it, and for handing a link to a developer or a client. Below the widget cards, the section has two more blocks: **"Storefront on your own code (Headless)"** — data, an API, and webhooks for when your own developer builds the site and doesn't need our widgets — and **"Advanced: a separate tag per widget"** with ready-made individual tags. So an individual tag isn't only something you "carry over from the past" — you can also take one right here. ### What the installation check does not see The method is simple and honest: **one request for the source HTML of one address**, with no browser. We read what the server returned and look for ` ``` The single tag reads the nonce of **its own** tag and passes it to every widget bundle it inserts — so they pass the `script-src` check. Requests, styles and embedded pages also need the permissions from the table below. The separate "Notify when back in stock" form has a limitation described below. ⚠️ A permanent value, the same in every response, is not a nonce: anyone who manages to inject code into the page will copy it into their own script. Generate it for every response, on the server. ### Option 2 — `'strict-dynamic'` ``` Content-Security-Policy: script-src 'nonce-r4nd0m...' 'strict-dynamic' ``` With `'strict-dynamic'`, the trust placed in our tag extends to the scripts it inserts, including the lazy parts of "Smart popups". This is an example of a directive for scripts: if `default-src`, `connect-src`, `style-src` or `frame-src` are restricted, add the corresponding permissions from the table below. ### Option 3 — a list of hosts If a nonce is not available to you (this happens on website builders), allow our hosts explicitly: ``` Content-Security-Policy: script-src https://cdn.; connect-src https://cdn. https://api. wss://ws. https://o.; img-src https://cdn. https://i.; frame-src https://cdn. https://your-location.; style-src 'unsafe-inline' ``` A ready-made snippet with the hosts of your brand and your location already substituted is available in the admin panel: **Marketing → My site**, the **"A site with Content-Security-Policy?"** block under the installation code — the "Copy" button is there as well, along with a note on which widget needs each host. What is needed and by whom: | Directive | Who needs it | |---|---| | `script-src` | All widgets: bundles from our CDN | | `connect-src` | All of them: requests, reservations, appointments, orders, telemetry; for the chat — the websocket and the signal bucket | | `img-src` | The order: photos of products and dishes | | `frame-src` | The order, the support center and legal documents: they open your storefront in an `