Item photos — upload straight from your phone
You can now upload item photos straight from your phone. Large images are resized automatically, so uploads no longer fail for being too big — no need to shrink them first.
Product updates
New features, improvements and fixes, as we ship them.
You can now upload item photos straight from your phone. Large images are resized automatically, so uploads no longer fail for being too big — no need to shrink them first.
If your storefront runs in more than one language, every text field on a Carousel slide now translates per language: Title, Subtitle, and Button Text. Switch language using the top-bar selector, fill in the text for that language on a slide, and save. Visitors automatically see whichever language they're browsing in, and any untranslated field falls back to your default language so slides always render.
What stays shared across languages. Images (desktop and mobile), the button URL, text position, colours, overlay, transition effect, schedules, and the slide order — change them once and they apply everywhere. Only customer-facing text is per-language.
No setup needed — open any existing slide and the fields are already wired up.
Length counters now show on the Title, Subtitle, and Button Text fields too, matching the rest of the admin.
If your storefront runs in more than one language, the announcement bar's Message and Link Text (used by Button Link and Text Link actions) now translate per language. Switch language using the top-bar selector, fill the fields for that language, save. Visitors automatically see whichever language they're browsing in, and any untranslated field falls back to your default language so the bar never breaks.
What stays shared across languages. The link URL, action type (Countdown / Coupon / Button / Text Link), schedule, colours, and coupon selection are shared — change them once and they apply everywhere. (The coupon's own name and discount text translate inside the Coupons module.)
Link Text now caps at 60 characters (was 100). 60 fits long-form German/French CTAs without letting merchants ship a wall of text on a button. Existing entries longer than 60 keep displaying fine on the storefront but will need trimming the next time you save them.
No setup needed — open any existing announcement and the fields are wired up.
When you remove a language from your storefront, WhatsMenu now copies any text that only existed in that language across to your remaining default — your category names, item names, descriptions, summaries, and company info stay intact.
Before: if you'd added a second language but only typed translations for some fields, deleting your original language could leave the storefront showing empty names or descriptions on the other side.
Now:
Nothing to enable. Applies to every storefront from this update onwards.
If you run your storefront in more than one language, your Custom Item Fields — the merchant-defined extra fields per item (size, vehicle make, service type, special instructions) — now translate alongside everything else customers see.
In the Fields Editor. Open any item, click Open Fields Editor, and you'll see a row of language tabs above the field list — one per menu language you've enabled. Click a tab to switch which language slot every input reads from and writes into. Type the translated label, placeholder, and select-option values; switch back to confirm. Your previous-language values are preserved when you switch tabs.
Single-language stores see the editor exactly as before — no language tabs appear.
AI auto-translate covers them too. When you tick AI auto-translate to other menu languages on item save, the AI now fans the custom-field titles, placeholders, and select options out into every enabled menu language alongside the item's name, summary, description, variant group names, and add-on names. Same credit cost as the other translatable fields. Hand-edited translations are preserved unless you also tick Force translate all.
Existing fields keep working. Whatever language you'd typed your custom fields in before now lives in that language's slot — customers in other languages see your original text until you (or AI auto-translate) fill in their language. No customer-facing breakage; the storefront resolves to whichever language is configured.
What's not in scope (yet). Order-level custom fields configured under Settings > Checkout > Custom Fields stay single-language for now — that surface uses a separate editor and ships in its own slice. The per-item custom fields covered here are the ones on the Custom Fields card on each item's edit page.
Every AI feature in the panel — AI Enhance on items, Draft with AI on orders, the three AI Insight advisors (Catalog, Timing, Restock Forecast) — now renders output as the AI generates it. Tokens appear as they're written rather than landing all at once after a 5-25 second wait.
The total wait time is the same as before; what changed is what you see during the wait. Same trick the big consumer chat tools use — output looks like it's being typed for you in real time, so you can start reading and judging the result well before generation finishes.
Three small bonuses that come with the change:
What you don't need to do: nothing. The change applies automatically. Same credit cost per generation. Cache hits (re-saving without changing the source) are still free and now arrive instantly as one chunk.
One thing that hasn't changed: the AI auto-translate background pass on item save still runs silently after your save — no UI to stream into. Refresh the item page a few seconds later to see translations.
Two new AI tools sit on every item's edit page next to the image upload field: Generate image with AI (creates a fresh image from your item's name and description) and Enhance photo with AI (cleans up the photo you already uploaded — background removal, lighting fix, sharper focus).
When to use which:
How it works:
Click the button → a preview modal opens with your current photo on the left (if any) and an empty slot on the right. Click Generate or Enhance → the AI processes for a few seconds → the result appears in the right slot. Like it? Click Use this image to save. Want a different angle? Click Try again — each attempt is a fresh AI run.
The preview-then-commit flow means an attempt you don't like never lands on your storefront. You see the result first, then decide.
What it costs:
5 credits per attempt. Each click on Generate or Enhance charges your credit balance, whether or not you save the result. The platform pays OpenAI / Photoroom for every generation; the credit covers that cost. The modal shows a running count: "Attempt 3 — 15 credits spent so far."
If you'd rather not spend platform credits, you can plug in your own OpenAI API key and (for enhancement) your own Photoroom API key in Settings → Apps → AI Kit. With either key on file, the calls route through your account, your provider bills you directly, and platform credits aren't deducted. See the BYOK update for details.
The customer-facing badge — and why it matters:
Items whose photo was created by Generate (not photographed) show a small "AI-generated" label in the corner of the item card on your storefront. This badge:
Items enhanced from a real photo show NO badge. Enhancement just cleans up your phone snap — the product depicted is still your real item, so no disclosure is needed.
The badge appears on the catalog grid and on the item detail page. It's small, sits in the top-right corner of the image, and includes a tooltip on hover ("This image was generated by AI from the item description, not photographed.").
Tips for better results:
What's NOT supported yet:
You can now plug in your own OpenAI API key so AI calls from your company route through your own OpenAI account directly. Your tokens get billed to OpenAI; platform credits aren't deducted for those calls.
Where to set it. Open Settings → Apps → AI Kit (or https://whatsmenu.page/getapp/aikit). A new Bring Your Own Key (BYOK) section sits at the top of the form. Paste your OpenAI key (the one that starts with sk-, created at platform.openai.com/api-keys), click Save Settings.
The key is encrypted at rest and the panel never displays it back to you — the field always renders blank after saving.
To replace your key. Paste the new value and save. It overwrites the previous one.
To remove your key. Tick Remove my stored OpenAI key on next save and click Save Settings. Platform credits resume on the next AI call. (Leaving the field blank without ticking the remove box keeps your current key — no accidental wipe.)
Cached results stay free. When another merchant on the platform has already run the same prompt, your call returns from cache instantly — same as before. Neither your OpenAI account nor platform credits are charged for cache hits. Only fresh generations bill your OpenAI account.
If your key gets rejected by OpenAI (wrong, expired, revoked) the AI feature you triggered surfaces a clear error pointing you back to AI Kit settings to update the key. There's no silent fallback to platform credits — your bill stays predictable.
Covered AI features. Every AI Kit surface that uses chat completions — AI Enhance, photo-to-description, Reply Assist, AI Insight advisors (Catalog, Timing, Restock), AI auto-translate. All of them honour your BYOK key automatically when one is on file.
If you picked Landscape or Portrait under Settings > Apps > Item image, your storefront catalog now shows item cards in that shape — instead of cropping every photo back to a square.
The shape applies to the whole storefront — every card uses the same aspect so the grid stays tidy. Items uploaded under an earlier setting are cropped (not stretched) into the new shape, so your catalog still looks uniform without re-uploading anything.
No setup needed. If you haven't picked an image size yet, your storefront keeps its current square layout.
A new Draft with AI button sits inside the WhatsApp Customer card on every order. Click it, and the AI writes a short, ready-to-send message right into the same textarea you'd use for a saved template — no copy/paste, no tab switching. You still pick when to send and what to send.
Reply Assist reads the order in front of you and picks the right tone:
You don't pick the scenario — the AI does it from the order data. Each draft costs 1 credit. Read the draft in the textarea, edit if you want, then click Send Whatsapp message as usual.
This is meaningfully different from the "AI" customer messaging you'll see on most other platforms. Most of them are mail-merge in disguise — pick a canned template, fill in {customer_name}, send. Reply Assist generates a new message every time, tuned to your specific order:
The AI is strictly forbidden from inventing things it doesn't know: it won't claim an item is in stock when stock tracking says it isn't, won't quote prices the system didn't give it, won't promise specific delivery times. If you spot it making any of those up, that's a bug — let us know.
Nothing leaves your account until you send it. Reply Assist is a writing helper, not a chatbot. No autonomous sends, no inbox watching, no bulk broadcasts.
The button shows up automatically inside the WhatsApp Customer card for Owners, Staff, and Managers. Drivers don't see it — dispatching is their concern, customer messaging isn't. The WhatsApp Customer card must be turned on (Settings → Apps → SendStatus) — without it, there's no send button to go with the draft.
If your credits run low, an inline Top Up button appears instead of a draft. If your platform isn't set up for AI yet, your administrator can enable it in settings.
With Reply Assist, all three of this season's AI advisors are now live: Catalog Advisor, Timing Advisor, Restock Forecast, and Reply Assist. They're independent — use whichever one matches the question you have.
Upload an item photo, click one button, get a draft name, summary, and description in your panel language. Useful when you have a folder of product shots but no copy yet — or when "good chair, $30" is all the spreadsheet import left you with.
Where to find it. Open any item edit page. Once a main image is uploaded, Generate from image sits in the top-right corner of the Basic Information card — right next to the name, summary, and description fields it fills in. Click it.
What you'll see. A modal opens with your photo on the left and three suggested fields on the right — Name, Summary, Description. Click Insert into all three fields to fill the form. Nothing saves until you press the item's own Save button, so you can edit any of the three suggestions first.
Re-roll if it's off. Click Generate again for a fresh draft from the same photo. Each generation is 3 credits; the first cached response on the same photo is free if you re-open the modal later.
It only describes what it can see. The AI looks at ingredients, materials, finish, colours, distinguishing features — and writes catalog copy from that. It doesn't invent prices, brand names, or specs that aren't visible. Clear product-on-clean-background photos give noticeably better results than dim or cluttered ones.
Industry-aware framing. The AI pays attention to the right visual cues for your business:
Hidden when it wouldn't help. The button doesn't appear on service-industry stores (haircuts, lessons, repairs, consulting), where a photo of a storefront or staff portrait wouldn't produce useful catalog copy. Set your Business industry under Settings → General to a product industry and the button shows up.
Works alongside auto-translate. Generate first in the language you're editing in, then turn on AI auto-translate to other menu languages when you save. The same content fans out to every other configured menu language for the price of one auto-translate run.
If you run your storefront in more than one language, you've probably spent more evenings than you want re-translating items. Auto-translate is the fix: tick a checkbox on an item, save, and AI Kit fills in the name, summary, and description in every other language you've enabled — automatically, in the background.
Per-save action, not a persistent setting. The checkbox always starts unticked when you open an item. Tick it for this save if you want translations to fan out — every subsequent save where you leave it unticked is just a normal save with zero AI calls and zero credit spend. No surprise translations, no accidental re-overwrites.
Translates the whole item, not just the description. When you tick it, the AI fans these fields out to every other menu language:
So the storefront stays fully consistent in every language — not just the long-form description but every label the customer sees on the item modal.
Two modes, on the same form. Tick the main checkbox and a sub-option appears: Force translate all (overwrite manual edits).
The contract is honest about cost. Each translated field is 1 credit. Three menu languages (e.g. English / Bahasa Malaysia / Chinese), one full item save with all three fields needing two non-source translations each — that's 6 credits. But here's where it earns its keep: re-saving the same item without changing the source content costs zero, because the same source text already gave us the same translation, cached. Edits that don't touch the translatable fields = free.
Nothing slows down your save. The translation work happens after your save response is sent back, so the editor still feels instant. Refresh the item page a few seconds later to see the newly-filled languages.
This is different from the AI Enhance button sitting on the same form. AI Enhance rewrites your draft in one language (the panel language). Auto-translate copies your exact content into every other language. Both can run on the same item — write English with AI Enhance, then save with Auto-translate ticked, and Bahasa Malaysia + Chinese fill in to match.
Heads up if your menu is single-language. The checkbox doesn't appear unless your store has more than one enabled menu language. Add another language under Settings → General → Menu Languages first, and the checkbox shows up on every item edit page.
Three new AI-powered reports under Reports → AI Insights. Each one takes your existing sales data and tells you, in plain words, what's worth your attention this week:
Each advisor shows the raw numbers immediately when you open the page. To get the AI-written narrative — three short paragraphs explaining what stands out and what to do — click Generate weekly digest. That part costs 3 credits per generation; re-reads of the same week are free.
The reports adapt to your business. Set your industry under Settings → General → Business profile so the advice fits how your business actually works — whether you sell food, run a salon, manage a workshop, or anything else.
If the Generate button isn't there, the page tells you why: you might be a brand-new merchant without enough order history yet, or the restock forecast might be waiting for you to turn on stock tracking. Once those gates clear, the button appears.
No customer details ever leave your account. The AI only sees aggregated counts and item names — no phone numbers, no addresses, no personal data.
We rebuilt the way your storefront serves products to a customer's browser. On a typical mobile network, pages now appear roughly twice as fast as before:
The effect is most visible on storefronts with many items and on slower mobile connections. Customers spend less time staring at a blank screen and more time on your menu.
No setup needed — the speedup applies to every storefront automatically.
Cashiers can now record an order without taking payment immediately, then collect payment when the customer is ready. Works for dine-in, takeaway, and delivery.
Two ways to finalize an order:
The cart now has two buttons:
Where saved orders live:
Saved orders show up in the Orders list with a Saved badge. When the customer is ready to pay, tap the Pay button on that row — the payment screen opens preloaded with the order. Once paid, the row flips to Paid.
Common flows this unlocks:
Cancelling a saved order:
Tap the trash icon next to a Saved row to cancel. The kitchen is notified so they stop preparing it. (You can't cancel a paid order from this list — that's a refund flow, separate.)
Reprinting a paid receipt:
Paid orders now stay on the orders list for the rest of the day with a Reprint button — useful if the customer asks for another copy of the receipt.
What's required:
If your Force Customer Information setting is on, the same fields that gate Pay now also gate Save & continue:
No setup needed beyond that.
A small round of POS hardening based on real-world feedback:
No setup needed.
After last week's Tables-as-an-app launch, Reservations gets two changes that complete the multi-industry picture: it works without any resource at all, and the "Seated" status — a restaurant idiom that didn't fit anywhere else — gets renamed everywhere.
Simple booking mode (no Tables required):
If your business doesn't assign customers to a physical spot — consultants, coaches, lawyers, online therapists, freelancers, anyone whose "resource" is just their own time — you can now leave Settings → Apps → Tables off and Reservations adapts:
If you do have tables, chairs, rooms, vehicles or whatever you call them, enable Tables and the existing flow works exactly the same as before — picker included.
Date and time editable on confirm:
The confirm modal now shows the requested date and time as editable fields, pre-filled with what the customer asked for. You can adjust before confirming — "we're full at 7 p.m. but can fit you at 7:30" — and the customer notification reflects the new time. Works in both simple mode and tables mode.
"Seated" → "In session":
The status that means the customer is here, being served used to read as "Seated". That made sense for restaurants but read as odd for salons (a stylist's chair isn't really "seating"), clinics (a patient isn't "seated" — they're in consultation), and impossible for online consultations where there's no seat at all.
The new universal label is In session — natural for restaurants (a seated diner is in their dining session), salons (client in session), clinics (in consultation), coaches and online consultations (call in session). Translated across every supported language: pt "Em sessão", es "En sesión", fr "En session", de "In Sitzung", zh "进行中", ar "في جلسة", and the rest.
What changes:
Internally the database value stays as seated — only what you see changes — so historical reports, exports and any external integrations that read the status field continue to work unchanged.
Restaurants don't need to do anything:
The new wording reads naturally for restaurants too. Tables stays enabled, the picker still shows, the workflow is identical — only the word on the third tab and the action button changes.
A small polish pass on Reservations that finishes off the multi-industry shake-out: the customer booking form drops two fields that were always restaurant-y, the time picker snaps to 15-minute intervals, and booking duration is now something only you control.
Time picker snaps to 15-minute intervals
Customers no longer pick "7:23 PM" by mistake. The time field on the booking widget (both the embedded chat-bubble widget and the Spreader/Kaleo/Cosmika storefront modal) now offers 7:00, 7:15, 7:30, 7:45 only. Mobile shows a snap wheel; desktop steps in 15-minute increments. Restaurants book on quarter-hours, salon appointments come in 30/45/60 blocks, clinic slots are 15/30 — 15-minute snap fits everyone without a per-merchant setting.
"Number of Guests" → "Party size", and hidden in simple mode
The party-size field used to read "Number of Guests" / "Guests" — restaurant-flavoured wording that didn't fit salons, clinics or 1:1 consultations. Two changes:
In Tables mode, the field still shows on the customer form (because party size genuinely matters for table-capacity matching) and is required.
Booking duration is merchant-only now
Previously the customer picked their booking duration from a 1-to-4-hour dropdown on the storefront modal. That made sense for restaurants (long lunch vs quick coffee) but was meaningless for salons, clinics and consultations where the duration is fixed by the service type. We've removed the field from the customer form universally.
Instead:
This is more accurate scheduling for everyone: the customer doesn't have to guess, and you're never overcommitted because someone picked "1 hour" for a 4-hour family dinner.
A note on WhatsApp confirmation templates
The notification class itself (the bit WhatsMenu controls) is industry-neutral — it just passes data fields to your campaign template. If you've configured a custom WhatsApp campaign in WhatsBox that says "Your table is confirmed for X guests" and your business doesn't have tables, you'll want to update the template to match. The data fields available include customer_name, reservation_date, reservation_time, number_of_guests, special_requests, company_name, etc. — use whatever fits your wording.
No action needed for restaurants
Set Tables on, leave Default duration at whatever fits (1.5–2 hours is common for dinner), and the customer form looks the same as before with cleaner time-picker behaviour. Everything else is identical to what shipped on 2026-05-13.
The reservation chat-bubble widget you embed on your own website was rewritten end-to-end. The biggest day-to-day win: customer phone numbers now save in international format automatically, so your WhatsApp and SMS notifications actually reach them.
Phone numbers always save in a format that works:
0123 456 789 on a Malaysian merchant's site now saves as +60123456789 — directly usable for WhatsApp / SMS.+44 7700 900123 for a UK number) and it's preserved.Cleaner form panel:
Better error handling on submit:
Spam protection:
Reservation history listing:
/reservations/reservation page (linked from the panel as Reservation history) had a heavy bold-everywhere look. Toned down to match the rest of the panel — single emphasis on the customer name, lighter secondary lines, action buttons right-aligned to match Staff and Contacts.No setup needed — open Settings > Apps > Reservation Widget to see the new design in action, and your existing embed code on your website continues to work without changes.
When a customer submits a reservation through your storefront or embedded widget, the panel now reacts in real time — no refresh needed.
What changed:
What didn't change:
The existing Twilio SMS and WhatsApp via WhatsBox notifications still fire when the Notify me when a new reservation is submitted setting is on. They are now an extra channel rather than the only way to find out.
No setup needed — these alerts are on by default for every merchant. If you don't want the doorbell sound, your browser tab controls work as expected.
We're open!
Come on in
Ready when you are
Upgrade when you grow. No rebuild, no commission. Need a hand? We're one message away.
Same city, stronger together ♡