Online ordering on your own site
The Online ordering widget adds order taking to the site you already have. Nothing has to be migrated or re-laid-out: the widget reads your site's pages, places “Add to cart” buttons on them and runs the cart and checkout on top of your markup.
What you need to get started#
- An owner or manager with access to the selected location's settings; access to your website to install the code.
- A published storefront and menu for orders via a link or in “Storefront” mode. For buttons over your own catalogue, prepare pages with item names and prices.
- Order intake, delivery or pickup, and a suitable payment method enabled. Pickup with payment on collection is enough for a trial run.
- “Orders” open for the employee who will accept the order; a configured kitchen display if your kitchen uses one.
Where to configure it#
Open Marketing → “My website” → “Online ordering”. “My website” is at /embed, and the online ordering hub is at /embed/order. Select the location: its settings are grouped into six expandable sections.
| Section | What to check before launch |
|---|---|
| “Widget on your website” | Mode, site scan, button placement and your own prices |
| “Order intake” | Whether new orders are allowed |
| “Delivery & pickup” | Fulfilment methods, zones, fees, minimum order and time selection |
| “Payments” | Payment on collection or delivery, and online payment connection |
| “Checkout” | Guest email, scheduled pre-orders and checkout offers |
| “Fiscal receipts” | Where receipts for online orders are issued |
The chips under “Setup at a glance” show, for example, “Orders accepted” or “Ordering disabled”, available fulfilment methods and “Online payment not connected”. Click a chip to expand its section. For installation code, see My website.
A link for social networks and messengers#
- Open Marketing → “Websites” and find the location.
- Click “Copy link” next to its public address.
- Add the link to your VKontakte, Instagram or Telegram profile, or send it to a guest in a message.
The guest opens that location's storefront and can build an order if ordering is enabled. You do not need to install widget code on the social network page. There is no separate VKontakte widget. For a store inside Telegram, see Telegram.
Four modes#
| Mode | What the visitor sees | When to choose it |
|---|---|---|
| Storefront | An “Order” button; clicking it opens your storefront with the menu and cart over the page | Business-card site, landing page or blog — no products on the pages |
| Overlay | Our “Add to cart” buttons right inside your markup — on the product page and in the catalogue — with a cart in the corner of the screen | The site already has a product catalogue but no ordering (or an awkward one) |
| Replace buttons | The same, plus the site's native “buy” buttons and cart are hidden | You want every order to go only through us |
| Full takeover | The site looks untouched: the buttons stay native, but pressing one sends the item to our cart, going to the site's cart opens ours, and the counters and totals show our numbers | The storefront is already well designed — you don't want to change how it looks, but the orders and prices must be ours |
Scanning the site#
Every mode except “Storefront” works from a site map: where on your pages the product title, price, image, native buy button and native cart are.
The map is built by the scanner: enter the address and press “Scan site” — usually 1–3 minutes. Inside:
- Platform presets — a ready-made set of selectors exists for eight platforms: WooCommerce, Shopify, Magento, PrestaShop, Bitrix, InSales, Tilda, OpenCart. The scanner also recognises Ecwid, Squarespace and Wix by fingerprint, but there is no preset for them — the map is built by AI parsing;
- AI parsing of the markup — for custom-built sites and unusual themes;
- Verification of every selector found against real pages; the data is cross-checked with the product's microdata. An unverified selector never enters the map — fewer buttons beat a button in the wrong place.
The result shows: the detected platform, the number of pages scanned, a sample recognised product, and separately the product page and the catalogue cards. The map is applied with a button and saved together with the widget settings. The site changed — just rescan.
Placement and appearance#
Configured on mock-ups with a live preview — a typical product page and a catalogue:
- Product page button: under the price, next to the site's native button, floating at the bottom of the screen, or off (the main scenario for “full takeover” — there is no button of ours, the guest presses the native one);
- Catalogue card button: over the card, under the card, or off;
- Cart button: any of the four corners of the screen;
- Colour of the buttons and label (“Add to cart”, “Order”, your own) — the label can be set separately for every language of your site.
Your own prices#
A separate toggle: the widget recalculates your site's price into its own and shows it to the guest — on the product page, in the catalogue and in the cart.
- A base rule for all products: a percentage, a currency surcharge, “not lower / not higher” limits and rounding (to a whole number, a …9 tail, .99 cents, round tens …0, multiples of 10/50/100).
- Per-product overrides by page address, title or SKU: its own price, its own rule, a different name in the cart, or “withdrawn from sale” — then no button is placed.
- Display options: the old price struck through next to the new one, a caption such as “sale price”, your own currency label, extra places with prices (a sticky bar, a “similar products” block). Redrawing prices right inside the site's markup can be switched off: the guest sees the site's price, and yours goes into the cart.
- The dashboard has a “before → after” preview on a sample price from your site.
⚠️ The override is visual: your site's back end knows nothing about the new price. That is why your own prices make sense together with order interception — otherwise a guest who presses a surviving native button will check out at the old price, bypassing you. In “Full takeover” mode your own prices are on by default, and the admin warns if you enable them without interception.
How a guest places an order#
This walkthrough covers the location's storefront, including when opened in “Storefront” mode. In other modes, the cart over an external website may look different.
- Add dishes to the cart and click “Checkout”. Under “How would you like to receive your order?”, choose “Delivery” or “Pickup”. Only enabled options appear; if just one is available, there is no selector.
- Set the time below the fulfilment method: “As soon as possible” for delivery or “ASAP” for pickup, or choose “Schedule”. Time selection appears only when “Allow delivery time selection” or “Allow pickup time selection” is enabled in “Delivery & pickup”. Configured pre-order slots replace free time selection.
- Fill in “Your name” and “Phone number”. For delivery, enter the “Delivery address”, click “📍 Use my current location” or “🗺 Pick point on map”. Move the map marker and click “Confirm address”. If your profile already has addresses, select one under “Saved addresses”. Put the floor, apartment, entrance and intercom details in “Notes for courier” — there are no separate fields for them.
- Under “Payment method”, choose an available option: “Cash”, “Card on delivery” or “Online”. Online payment appears when a supported provider is connected; the guest continues on its secure payment page. Real-money online payments are not yet available on cenaly.ru.
- For a discount code, open “Have a promo code?”, enter it and click “Apply”. Check the total. Signing in is optional for ordering; redeeming loyalty points requires signing in and online payment. If an email field is shown, enter an address to receive order emails.
- Submit using “Place order” and, if you chose online payment, complete it with the provider. Wait for “✓ Order placed”. If you see “No connection — your order will be sent automatically”, the order is still waiting to be sent: keep the page open until the connection returns.
- Follow the stages on the order page: sent, accepted, preparing, ready; for delivery, on the way and delivered. Status updates automatically. A courier map appears when location data is available for the delivery; if the connection is lost, the last known position is marked as stale. Live courier map tracking is not yet available on cenaly.ru.
A trial order before launch#
There is no separate test-order mode. This check creates a regular order, so tell your staff not to prepare or hand it out.
- Open “Orders” for the location before starting. Allow sound in the browser and enable new-order alerts: orders already present when the list first opens do not trigger a sound.
- Add a dish on your storefront, choose “Pickup” and “Cash” or “Card on delivery”, then place the order. Wait for confirmation and note its number.
- Find the card by number in “Orders”; check the items, total and sound alert. Accept the order and check that it appears on the configured kitchen display. By default, guest orders reach the kitchen after acceptance; the location can allow them through before acceptance.
- Open “Cancel order”, select “Test/training” or enter your own reason for the check. Do not mark the trial order as paid or complete its handover.
The cancelled order stays in the cancelled list. There is no standard action to remove a trial order from all history and statistics; cancellation excludes it from revenue but keeps a record of the cancellation.
Check online payment separately in the connected provider's test mode. That does not make the order itself a test order. See Payments.
What the guest receives#
If the guest provides an email address, messages are sent automatically in the order's language; if no template exists in that language, English is used.
| Event | When the email is sent |
|---|---|
| Order placed | After the guest submits the order |
| Accepted by the venue | When an employee accepts a waiting order |
| Order ready | For pickup, when the order is ready to collect |
| Courier on the way | When the courier picks up the delivery or the order is marked as on the way |
| Order delivered | After delivery is recorded |
| Order cancelled | After a submitted order is cancelled |
| Refund | After a full or partial payment refund is recorded |
The dashboard does not yet offer settings for these messages' channel, text or timing. Enable the guest email field in “Checkout”; this controls contact collection, not notification templates. Order SMS notifications are not being sent yet.
Table and appointment reminders belong to separate workflows: Reservations and Appointments. Set up review requests separately under Marketing → “Websites” → “Mailings” → “Automations” → “How was everything?”.
What happens after an order#
The guest adds items to the cart and checks out: contact details, fulfilment method, a delivery address if needed, and notes. The order arrives in the dashboard's “Orders” section alongside orders from the storefront, the POS and aggregators: the same statuses, notifications, and configured printing and hand-off to the kitchen. There is no separate “widget inbox”. Every order line comes with a link to the page of your site it was added from — the operator sees exactly what was ordered.
The “Notify when back in stock” button#
A second, separate tag of the same widget — for a sold-out product page on your site. The guest presses the button, leaves an email, confirms it via the link in the message and receives one email when the item is back in stock; the confirmation message has “decline” next to “confirm”. Notifications are sent by the same mechanism as the “notify me” subscription on our storefront — no second one is created.
How to connect it: in the online ordering settings window open the “🔔 Notify when back in stock” card, pick the product and, if any, the variant from your published catalogue — the generator assembles the code. Place a button with the attribute data-cenaly-stock="<product>" on the product page (a ready example is in the same card) and insert the stock/v1.js tag once. The launcher weighs under a kilobyte and does exactly one thing — waits for the click; the subscription form, dictionaries and sending arrive as a separate file only after the guest acts.
What matters:
- The product is linked by hand. We do not match a third-party catalogue and do not read stock levels from a third-party page: “back in stock” means availability in your catalogue with us, the same thing our storefront sees. A product that is not in the location's published catalogue is not accepted by the button.
- The subscription is confirmed by email (double opt-in): until the link is clicked, no back-in-stock messages are sent.
- A subscription does not reserve the item. The notification is sent when availability returns in our catalogue. Currently, an email address is counted once per product: subscribing again for another variant of that product does not replace the selected variant.
- With a strict nonce-only CSP, the form will not open without allowing the CDN scripts or a suitable
'strict-dynamic'policy. See My website. - It is not the unified tag. The “My Website” unified loader does not start the “Notify when back in stock” button — it has its own tag and its own markup on the page, because it stands only where you put it.
Limitations#
- The scanner reads server-side HTML. If the catalogue is drawn entirely by JavaScript, product pages may not be found — then the “Storefront” mode works.
- Items in the cart are taken from your site's pages, not from the dashboard catalogue: the widget reads the title and price from the page itself (and recalculates them by your price rule if needed). You don't have to move the catalogue to us for that — but such orders don't deduct stock in the dashboard either.
- The widget cart supports payment on collection or delivery, or online payment if a supported provider is configured for the location. After the order is created, the guest continues on the provider's payment page; the widget does not collect card details. If payment could not be prepared, it can be retried for the existing order.
- In “Replace buttons” mode the native buttons are hidden visually; if the site has another path to checkout (for example, a direct link to the site's cart), you need to remove it yourself — or switch to “Full takeover”, which takes such transitions over.
- One widget belongs to one location. There is no city or location selector for a chain within it; use each location's own link and code.
- Phone verification by code is not available. Checkout does not ask for cutlery quantity or a “change from” amount; there are no separate entrance, floor or apartment fields — use the courier notes.
- There is no test-order mode. Cancellation keeps the order in history; guests cannot cancel a submitted order themselves from the storefront. “Cancel my order” in the chat only sends a message to an employee.
- The dashboard has no settings for the channel, text or timing of automatic order messages. Order SMS notifications are not being sent yet.
- Real-money online payments are not yet available on cenaly.ru. A provider test-shop check does not mean live payments are available; use payment on collection or delivery for launch.
Troubleshooting#
| Symptom | Possible cause | What to do |
|---|---|---|
| The order did not appear in “Orders” | Ordering is disabled, the location is paused or the address is outside the delivery zone | Check “Order intake”, storefront maintenance mode and “Delivery & pickup”. Read the guest's message: the order is not accepted until it has been sent successfully |
| An order was placed on the external site but is missing from the dashboard | The guest used the site's native button or cart | Check interception: “Replace buttons” hides native buttons; “Full takeover” also intercepts cart navigation |
| There is no time selector | Scheduling is not allowed for the chosen fulfilment method | In “Delivery & pickup”, enable “Allow delivery time selection” or “Allow pickup time selection” |
| The guest did not receive an email | No address was provided, it contains a typo or the message went to spam | Check the address and spam folder. In “Checkout”, check whether email collection is enabled; without an address, no emails arrive |
| There are no “Add to cart” buttons | Code is missing or belongs to another location | In “My website”, click “Check installation”; check the location and all template pages. Also inspect the website itself if the code is inserted through Google Tag Manager |
| Buttons have not appeared after setup | Cache or an unapplied site map | Wait up to 5 minutes and reload with the cache cleared; scan the site and apply the map |
| The scanner finds no items | The catalogue is rendered entirely by JavaScript | Use “Storefront” mode: the scanner reads server-side HTML |
| There is no widget button on a product | It is disabled in placement settings | Check placement; in full takeover, the guest can use the site's native button |
| The cart button disappeared | A different screen corner or the multi-button is enabled | Check the corner; if the multi-button fan includes “Order”, the separate button is hidden intentionally |
| Buttons moved after a site update | The markup changed | Click “Rescan”: placement settings are kept |
| Page prices do not change | Price redrawing is disabled or an override applies | Check your price rules, display setting and per-item override; page and cart prices may differ |
| The order used the old price | The site's native checkout can still be reached | Use your prices together with order interception: the visual override does not change your site's back end |
FAQ#
Do I have to move my catalogue to you? No. The widget works with the products right on your site's pages — it reads titles and prices from there. A catalogue in the dashboard is needed if you want inventory, per-item analytics and our storefront: you can move it by importing from the site address or from a file — see AI catalogue import and Online store.
What if the site changes? Press “Rescan” — the map is rebuilt and your placement settings are kept.
Will the widget break my layout? Buttons are inserted into the places found in your own markup and their appearance is configurable; the cart and checkout open on top of the page and do not touch your layout.
How do I share an ordering link on VKontakte? In “Websites”, copy the location's link and add it to your profile or a post. Guests will open its storefront; there is no separate VKontakte widget.
How do I place a trial order? Place a regular pickup order with payment on collection, check the order card and kitchen, then cancel it with a reason. It stays in the cancelled order history.
Why did the guest not receive an SMS? Order SMS notifications are not being sent yet. Status is visible on the order page; emails are sent when an email address is provided.
Can one widget cover several locations? No: a widget is linked to one location. For a chain, publish separate links to the locations' storefronts.
Related topics#
- My Website — install code and the other widgets
- Orders — what happens to the order next
- Online store — if you need a full storefront
- Payments — providers and online payment checks
- Telegram — a store in the messenger
- Reservations and Appointments — separate reminders