Product updates

What we shipped

Every meaningful change to WhatsMenu, in chronological order. New features, improvements, and the occasional fix worth sharing.

Improvement

Reservations now work without tables — and "Seated" becomes "In session" everywhere

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:

  • The Floor Plan / Tables tab in the panel disappears.
  • The confirm flow skips the resource picker entirely — one click confirms the booking with date/time only.
  • Bookings don't carry a table assignment, no fake "Zoom" or "Slot 1" placeholder needed.

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:

  • The third tab in the Reservations panel: "Seated" → "In session"
  • Status badge on every reservation card and in the legacy reservation list
  • Action button on confirmed reservations: "Seated" → "Start session"
  • Empty-state copy: "Mark a confirmed reservation as in session when the customer arrives or the call begins."
  • Toast messages after confirming a status change

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.

Improvement

Reservations — cleaner booking form, smarter defaults, merchant-controlled duration

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:

  • Renamed everywhere visible to "Party size" (the merchant card now shows "4 people" instead of "4 guests").
  • Hidden on the customer booking form when Tables is off. Almost every simple-mode booking is for one person (consultant, lawyer, coach, single-room therapist, salon stylist) — asking is friction. The booking submits 1 silently. If a merchant wants party size for couples therapy or family clinic visits, they'll be asked when they enable Tables.

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:

  • Set a default in Settings → Apps → Reservations → "Default booking duration" (15 min, 30 min, 45 min, 1 hour, … up to 4 hours). The new default ships at 30 minutes — adjust to whatever your typical booking takes.
  • Override per-booking in the confirm modal. When you confirm a pending reservation, the duration field is right next to date and time — pre-filled with your default, change it for atypical bookings ("this haircut is a colour, 90 min").

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.

Improvement

Reservation Widget — cleaner form, smarter phone numbers, better submit

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:

  • A customer typing 0123 456 789 on a Malaysian merchant's site now saves as +60123456789 — directly usable for WhatsApp / SMS.
  • Customers can also type their own international format (e.g. +44 7700 900123 for a UK number) and it's preserved.
  • If a customer types something we can't recognize, they see a clear message asking them to include the country code, instead of the form silently saving a number you can't reach.
  • Coverage spans ~70 countries (SE Asia, Latin America, EU, Mid-East, Africa, NA, Oceania) and uses your Default country setting to fill in missing country codes.

Cleaner form panel:

  • Dropped the chat-message styling (the green-bubble look with the speech-bubble tail). It implied a back-and-forth conversation that never actually existed — your customers were filling a form, not chatting. The new design is a clean form panel that opens from the same floating bubble, with your logo and brand colors prominent in the header.
  • Field labels are now translated into the customer's language — "Your name" / "Phone number" / "Date" / "Time" / "Guests" / "Special requests" all show in the panel's working language across 19 supported locales.
  • Inputs have proper focus highlights in your brand color, the submit button shows a subtle "Sending…" state while the request is in flight, and the launcher bubble is slightly smaller (52 px) to match Intercom / Crisp / Tawk conventions.

Better error handling on submit:

  • If the date or time you've configured rejects the booking (outside business hours, beyond your max-advance days, etc.), the customer sees the actual reason inline — they fix it and resubmit without reloading.
  • If the network drops mid-submit, they get a clear "Network error, try again" message instead of a hung form.
  • Network failures and validation errors no longer hide the form, so a single mistake doesn't make the customer start over.

Spam protection:

  • Bots scraping the form are silently blocked via a hidden honeypot field — they think their submission worked, you never see fake bookings clutter your panel.
  • Submission rate is capped at 10 per minute per IP, so a misbehaving script can't flood your reservations queue.

Reservation history listing:

  • The /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.
  • The "Seated" status icon is now a small armchair instead of an empty square (the previous icon name didn't exist in our icon set, so it never rendered).

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.

Improvement

Reservations — instant in-panel alert when a new request lands

When a customer submits a reservation through your storefront or embedded widget, the panel now reacts in real time — no refresh needed.

What changed:

  • Doorbell + on-screen toast — if you (or a staff member) have the panel open, you hear a short doorbell sound and see a toast with the customer name and reservation code the moment the request arrives. Same behaviour you already get for new orders.
  • Top-bar bell badge — the new request lands in the bell dropdown in the top navigation, so you see it next time you load any page even if the panel was closed.
  • Mobile vendor app push — if you use the WhatsMenu vendor app on your phone, you get a native push notification with the request details.

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.

Improvement

Reservations — sharper controls, smarter rejections, instant new-booking alerts

We tightened up Reservations so you spend less time chasing bad requests and more time confirming the good ones.

New settings in Settings > Apps > Reservations:

  • Enable customer-facing reservations on your storefront — controls whether visitors see the booking entry. The panel still works for staff phone bookings even when this is off.
  • Maximum days in advance customers can book — leave blank for no limit, or cap at any number of days. The storefront date picker respects the limit automatically.
  • Accept bookings outside business hours — off by default, so a customer cannot book a 3 a.m. slot when you are closed. Turn on for venues that handle private events outside posted hours.
  • Notify me when a new reservation is submitted — pings your registered phone the moment a request lands, so you do not need to keep the panel open to spot it. Uses the same Twilio or WhatsApp channel as confirm/reject.

Smarter automatic rejections:

Three rules now reject obvious garbage before it reaches your panel — past dates, party sizes outside 1–50, and times outside your business hours (unless you allow off-hours). The customer sees a clear message explaining what to fix and can resubmit.

Mode-aware visibility:

  • On a QR Ordering storefront, the customer-facing reservation entry is hidden — your customer is already at the table, so the booking form would be confusing. Staff still take reservations through the panel.
  • On a showcase storefront (Disable Ordering), the Reserve / Book button is promoted as the primary call to action — exactly what salons, clinics, and consulting businesses need.

Reservation Widget date input also honours the max-advance setting now, so an embedded widget on your external site can't accept dates beyond your panel's horizon.

Open Settings > Apps > Reservations to try the new controls.

Improvement

Reservations, Contacts, and Widget editor — visual refresh

We rebuilt three of the daily-driver pages around Reservations with the same look and feel as the rest of your panel — clearer typography, consistent badges, and a more usable preview where it matters.

Reservations panel cards:

  • Status badges now use distinct colors per state — pending (warning), confirmed (primary), seated (success), completed (neutral), late and no-show (danger) — so you can scan a long list and spot what needs attention at a glance.
  • Each booking card was tightened up: customer name leads, contact info groups under labelled icons, and the table assignment shows as a chip next to the party size.
  • Empty tabs ("No pending reservations", etc.) now include a one-line hint about what would normally appear there, instead of just a heading.

Cleaner panel header:

  • The Widget, Contacts, and old "All reservations" buttons collapsed into a single More dropdown next to New reservation, so the toolbar stays tidy on small screens.
  • "All reservations" was renamed to Reservation history to make its role clear — the panel is for today's work, the history page is for lookups, exports, and edits to past records.

Contacts list:

  • Modals, dropdowns, and the Bulk action menu were rebuilt on the current Bootstrap 5 base, so they open and close reliably across browsers.
  • Action buttons (Chat, Reservation, Edit, Delete) collapsed into compact icon buttons with tooltips, freeing up horizontal space for longer names and group tags.
  • Status pill ("Subscribed" / "Not subscribed") and group tags now match the rest of the panel's badge style.

Web Widget creator:

  • Form is split into three labelled sections — Branding, Content, and Appearance — so you can find a setting without scrolling the whole form.
  • The two color pickers sit side by side instead of stacking vertically.
  • The live widget preview and the embed-code snippet moved to a sticky right column, so the preview stays visible while you tweak settings on the left.

No behaviour changes — every existing setting still does exactly what it did before. Open Reservations, Contacts, or Settings > Apps > Reservation Widget to see the new layout.

Improvement

QR Ordering venues — remote customers can now reserve

If you run a QR Ordering storefront, your customer-facing reservation entry no longer disappears for everyone — it now appears for visitors who reach your storefront without scanning a table QR code.

The new rule:

  • A customer who scans a table QR code (URL has ?tid=) is physically at a table — the Reserve button stays hidden because they're already there.
  • A customer who visits your storefront URL directly — from search, a social link, or a saved bookmark — sees the Reserve button and can book a future visit, exactly like on a non-QR venue.

This unblocks QR-mode merchants who also want to take phone-style reservations from remote customers, without forcing them to choose between QR ordering and a public reservation flow.

No setup needed. The behaviour switches automatically based on whether the customer arrived via a table QR code. If you don't want any customer-facing reservations at all, the existing Settings > Apps > Reservations > Enable customer-facing reservations on your storefront toggle still controls that — turn it off and the button is hidden everywhere, just like before.

Improvement

Schedule — orders join the calendar, plus a sidebar promotion

A week after launch, Schedule picks up the next big set of sources: every order, every delivery, every pickup — all on the same calendar as your reservations.

Three new event sources you can toggle on the sidebar:

  • Order Created — every order positioned at the moment the customer placed it. Watch the inflow shape across the day or week.
  • Delivery — orders set for delivery, positioned at their scheduled delivery time. See exactly when drivers should be heading out.
  • Pickup — orders set for pickup or takeaway, positioned at their scheduled pickup time. Spot pickup spikes before they hit the counter.

Each source has its own colour so a busy day stays readable, and you can toggle any combination on or off without leaving the page.

Pre-orders parsed properly. Schedule now understands the full set of timestamp formats your storefront produces — single-time slots like 30_60, day-only pre-orders like 2026-05-08, and the full range form 2026-05-08 07:30am - 10:00am. Pre-orders show a Pre-order tag in the day-detail panel so you can tell them apart from same-day orders at a glance.

A sidebar promotion. Schedule now lives directly under Orders in the main sidebar instead of nested in Apps — one click to your calendar from anywhere in the panel. Enable it once in Settings > Apps > Schedule and the entry appears.

Times in your format. Events render in the time format you set under Settings > Store > General — 12-hour with am/pm or 24-hour, in your store's time zone.

Open Schedule in the sidebar to see the new sources in action. Toggle Order Created off when you only care about what's leaving the store; toggle Delivery and Pickup off when you only care about inflow. The view is yours.

Feature

Schedule — your reservations on a real calendar

Meet Schedule: a calendar page in your sidebar that lays every reservation across a month, week, or day so you can see what's coming without opening separate panels.

Four views in one place:

  • Month — a grid of the whole month with up to three events per day visible.
  • Week — a vertical timeline of seven days side by side with hour markers.
  • Day — a single day's hour-by-hour timeline.
  • List — a compact agenda-style list, especially useful on mobile.

Switch views from the toolbar at the top of the calendar.

Click a day for the full picture. A side panel slides in with every reservation for that date — customer name, party size, time, phone, code, special requests, and a coloured status pill. A button takes you straight to the Reservations panel for that booking.

Colour-coded by status so a busy month is still readable. Yellow for pending, blue for confirmed, green for seated or completed, red for late, grey for cancelled or no-show.

Sidebar source filter. Today only Reservations lives in the calendar. As you turn on more features, additional sources appear automatically — scheduled orders, closed days, and promotion windows are on the way.

Built for every kind of business. A restaurant can spot busy weekends weeks ahead. A salon can check each day's appointment load. A clinic can map tomorrow's consultations. A retail merchant can track scheduled pickups. The calendar adapts to whatever you book.

Mobile-first. The page defaults to the list view on phones because a month grid is hard to read on a small screen. Sidebar collapses on small screens with a tap of the menu icon in the toolbar.

Enable it in Settings > Apps > Schedule. Once on, a Schedule entry appears in your sidebar.

Improvement

Tables is now an app — call them Chairs, Rooms, Desks, Vehicles, or anything else

WhatsMenu has always called the things customers occupy "tables" — because most dine-in venues think about them that way. But a salon assigns chairs, a clinic assigns rooms, a co-working space assigns desks, an auto dealership assigns vehicles. Forcing every business to read "table" in their staff panel and on their customer receipts always felt off.

Two changes shipped together:

1. Tables is now an app you toggle on under Settings → Apps

It joins Floor Plan, Reservations, POS and the rest. Enable it whenever your business assigns customers to a physical spot — restaurants do, but so do salons (chairs), clinics (rooms), co-working hosts (desks), auto dealers (vehicles), and any service business with appointment slots. If your business is pure delivery / pickup / showcase, leave it off and the menu stays clean.

2. You pick what to call them

Inside the Tables app card, you'll find two label fields:

  • Singular — what you call one of them (defaults to "Table"). Set to Chair, Room, Desk, Vehicle, Slot, or anything else.
  • Plural — used in lists and counts (defaults to "Tables"). Set to Chairs, Rooms, Desks, Vehicles, Slots.

Save and the label propagates everywhere the system used to say "Table" or "Tables":

  • The sidebar menu link itself.
  • The Floor Plan editor — "Add Chair", "Round Chair", "Delete this Chair", every confirmation prompt.
  • The Reservations panel — "Select a Chair", "Available Chairs", "Reservations on this Chair", the floor-plan tab, every empty-state message.
  • The POS picker when staff opens a dine-in cart.
  • The customer cart at checkout — "Chair: 5" instead of "Table: 5".
  • The order receipt (printed A4 and 57mm / 80mm thermal).
  • The WhatsApp order confirmation sent to the merchant.
  • The order-status page customers see after placing an order.
  • The analytics dashboard ("Chair Reservations" instead of "Table Reservations").

Sidebar layout cleaned up at the same time

The old "Restaurant" section in the sidebar held three items — Kitchen Display, Status Display, Tables — and only made sense for restaurants. We dropped the section header and moved all three under the existing Apps group, where they sit alphabetically next to Floor Plan, Reservations, and any other modules you've enabled. A salon now sees a clean Apps list with their own labels; a restaurant sees the exact same item set, just labeled "Tables" by default.

Translated across 19 languages

The label override works in every language WhatsMenu supports — Arabic, Chinese (Simplified and Traditional), Dutch, English, French, German, Indonesian, Italian, Japanese, Korean, Malay, Polish, Portuguese, Russian, Spanish, Thai, Turkish, and Vietnamese. The placeholder slots into the localized sentence so a Portuguese salon merchant typing Cadeira sees "Selecione uma Cadeira", a Spanish auto dealer typing Vehículo sees "Vehículos disponibles", and so on.

A small caveat: in languages with grammatical gender (French, Spanish, Portuguese, Italian, German, Russian, Polish), the surrounding sentence keeps the original gender of "table" — so a French salon's "Choisissez une Chaise" reads naturally, but a few phrasings will look slightly off. The label still gets through; minor grammar quirks are the trade-off for one-click flexibility.

Restaurants don't need to do anything special

Enable Tables under Settings → Apps (one click), leave the labels blank, and the system uses the original "Table" / "Tables" wording everywhere — exactly how it worked before.

Why this matters now

Floor Plan, POS, KDS and Reservations cover a lot of business types beyond restaurants — and the next wave of merchants joining WhatsMenu (salons, clinics, co-working hosts, dealerships) shouldn't have to mentally translate "table" every time they look at their dashboard or send a customer a confirmation. This is the smallest change that makes the rest of the platform feel native to whatever they actually do.

Improvement

Stronger checks on item-form file uploads

If you use Custom Item Fields to let customers attach files to an order — design artwork, prescription, contract, photo of a faulty part — those uploads now go through tighter checks before they touch your storage.

What changed:

  • Allowed file types are enforced at upload time, not at checkout. Allowed: images (jpg, jpeg, png, gif, webp), pdf, docx, and txt. Anything else is rejected before the file is saved.
  • A 10 MB per-file size limit keeps a single visitor from filling up shared storage with one oversized upload.
  • A per-visitor rate limit stops a script from looping uploads to fill the disk.
  • Clearer feedback for visitors — when a file is the wrong type, too large, or sent too quickly, the form shows an inline error next to the field so the visitor knows to retry with a smaller or different file.

One small change for new fields. When you add a new File upload field, the default accept list now suggests .gif, .jpg, .png, .pdf, .docx instead of including the older .doc format. Existing fields keep whatever accept list you configured. If a visitor tries to upload a .doc file, they'll be asked to send .docx or .pdf instead — both are widely supported by Word, Google Docs, and Pages.

You don't need to change any setting. The new checks apply automatically to every storefront with Custom Item Fields enabled.

Improvement

Carousels — pick a hero height, with full-screen "Cover" mode

Your Carousels app now has a Carousel height setting — five presets that control how much vertical space the hero slider takes up:

  • Compact (400px) — short hero, more room for content below.
  • Normal (600px) — the previous default; balanced for most storefronts.
  • Tall (800px) — bigger visual impact, great for image-led brands.
  • Hero (75% of screen) — the "peek" style: the hero dominates but a sliver of content below is visible, inviting scrolling.
  • Cover (full screen) — the Apple/Airbnb landing-page look: the hero fills the entire viewport.

New: scroll-down arrow on Hero and Cover. When you pick one of those two heights, a subtle animated down-arrow appears at the bottom of the hero. Clicking it smoothly scrolls visitors past the hero to your content. Great for signalling "there's more below, keep scrolling" on full-bleed landings.

Tip: Cover and Hero look best with Full width frame (set in Template Settings → Appearance → Page frame width). Boxed frame leaves side margins that break the edge-to-edge feel.

Where to change it:

  1. Go to Settings → Apps → Carousels (or the Carousels entry in your sidebar → Settings).
  2. Pick a height.
  3. Save.

Your existing carousels stay the same — the default is Normal, which matches the previous behaviour. No image re-upload needed.

Mobile tip: Compact, Normal, and Tall use the natural size of your mobile carousel images on phones (so narrow screens don't get a weird super-tall hero). Hero and Cover take up the phone's viewport the same way they do on desktop.

Feature

PromoCards — use a YouTube video instead of a static image

PromoCards just got more dynamic: any card can now use a YouTube video in place of its static image. Pop a video on a "Watch the kitchen at work" card, a product demo, a property walkthrough, a service intro — anywhere a moving image tells the story better.

How to use it:

  1. Open a PromoCards group, click into a card.
  2. In the Video section, paste any YouTube link:
    • https://www.youtube.com/watch?v=VIDEO_ID
    • https://youtu.be/VIDEO_ID
    • https://youtube.com/shorts/VIDEO_ID
  3. Save. That's it.

What visitors see: a thumbnail with a red play button. Clicking starts the video. Until they click, the player isn't loaded — keeps the page fast even with multiple video cards.

YouTube Shorts / Reels work too. Paste a youtube.com/shorts/... link and the card automatically switches to a vertical 9:16 frame so the short plays at its native portrait aspect — no letterboxing. Great for quick recipe clips, before/after reveals, or any short-form content you've already filmed for Shorts.

Some details that may matter:

  • Cards with a horizontal video are forced to 16:9 aspect ratio. YouTube videos are 16:9 native; squeezing them into Compact / Vertical / Tall heights would letterbox awkwardly. The Card Height setting still applies to image cards in the same group. (Shorts get 9:16 instead, automatically.)
  • The Desktop Image field becomes optional when a video URL is set. Upload one only if you want a custom poster — skipping it uses YouTube's high-quality thumbnail automatically.
  • Privacy-friendly: WhatsMenu uses YouTube's nocookie domain, so YouTube tracking cookies aren't dropped on your visitors' browsers until they actually press play. No extra setup on your side.
  • Stacked and Beside card styles work best for video. Overlay style still works, but text overlays on a playing video can feel cluttered — try Stacked first.
  • For "click anywhere on the card to do something": if you want a video card that also sends visitors to a URL, fill both the Button Text and Button URL fields. The button stays as a separate element; clicking the video plays it; clicking the button navigates.

Not yet supported (let us know if you need any of these): Vimeo, TikTok, Instagram videos. We'll add them based on demand.

Feature

PromoCards — static banner cards for your storefront

Meet PromoCards: static banner cards that sit in fixed spots around your storefront. Unlike Carousels, which rotate, all your cards are visible at once — ideal for showing multiple promotions, category shortcuts, trust badges, or feature blocks side by side.

Four places cards can live:

  • Page Top — Below the hero/cover at the top of your storefront.
  • Category Top — Between a category's title and its items (per category you pick).
  • Category Bottom — Under a specific category's items.
  • Page Bottom — Above the footer at the bottom of the page.

Eight grid layouts: 1 full-width, 2 equal, 1/3+2/3, 2/3+1/3, 3, 4, 5, or 6 columns. Each layout shows a small visual preview in the picker so you can see what you'll get.

Three card styles:

  • Stacked — image on top, text below (good for product-style cards)
  • Overlay — text sits on the image (good for visual heroes)
  • Beside — image on the left, text on the right (good for text-heavy cards)

Three card heights (Compact 2:1, Normal 16:9, Tall 3:2) and a Mobile Columns override so you can force a specific column count on phones — for example, keep a 4-col layout at 2 columns on mobile.

Other goodies:

  • Leave button text blank and only fill the URL to make the whole card clickable.
  • Schedule a group with start/end dates for time-limited promos.
  • Show/hide based on business hours.
  • Drag-to-reorder groups and cards.
  • Multiple groups can share the same slot — they stack in the order you set.

Enable it in Settings → Apps → PromoCards. Once on, a PromoCards entry appears in your sidebar. Works on Spreader and the default template.

Fix

PromoCards — 1-column cards now respect the height preset, and images keep their full proportions

Two PromoCards quirks fixed in this release.

1-column cards now match the height preset you pick.

Before: choosing a 1-column layout caused cards to ignore your Card Height setting and stretch much taller than expected — a "Compact" 1-column hero could end up 600+ pixels tall on desktop. The other layouts (2-col, 3-col, 4-col, asymmetric) were unaffected.

Now 1-column cards size correctly to the preset:

  • Compact — slim banner (~200px tall)
  • Normal — standard hero (~280px tall)
  • Tall — prominent hero (~360px tall)
  • Vertical — full portrait hero (~480px tall)

If your existing 1-column cards looked too tall, they should now display at the right size automatically. No re-save needed.

Image cropping now follows the live card shape, not the shape at upload time.

Previously, when you uploaded an image to a card, the system pre-cropped it to match the group's current Card Height ratio (e.g. 16:9 for Normal, 3:4 for Vertical). If you later changed Card Height, the existing card images stayed cropped at the old ratio — so a Normal-sized image that you flipped to Vertical would show a wide-short slice of the original.

We've removed the server-side crop entirely. Uploaded images are now stored at their full source proportions (just resized so the long edge stays under 2000px on desktop / 1200px on mobile to keep file sizes sane). The visible crop happens at display time via your browser's native image-fit logic, so:

  • Switching Card Height (Compact ↔ Normal ↔ Tall ↔ Vertical) immediately re-renders existing cards at the new shape — no re-upload.
  • Mixing the same image across groups with different Card Heights now works as expected.
  • For Vertical cards, your portrait sources finally show as portrait instead of being flattened into the previously hard-coded crop.

Note for cards uploaded before this update: their stored images are still in the old pre-cropped shape. They'll display center-cropped through the new logic, which works for most images but won't recover detail that was cut off during the original crop. Re-upload any card image that looks off and the new full-aspect storage takes over.

Improvement

Change order and payment status from the order header

Opening an order, you'll now see Order Status and Payment Status as two compact badges right under the order number at the top of the page — not as separate cards on the right. One click on the badge opens a short list; one more click changes the status. The old "pick from a dropdown, then press Update" flow is gone — the list itself is the update.

Why the change: the right-hand column of the order details page was getting long as more order-related apps installed cards there (delivery, notes, print history, WhatsApp templates…). Status and payment are the two things you change on almost every order, so they belong next to the order number, not buried six cards down.

Loyalty still works the same way. If your loyalty program awards points on a specific step — accepted, closed, or paid — that option now shows a small Assigns points pill next to it in the dropdown, so you can see exactly which click triggers points before you make it. The confirmation prompt before marking as Paid still appears when loyalty points are tied to payment.

Nothing changed about who can edit — only Owner and Staff can change status, same as before.

Improvement

Pick a delivery provider from the order header

If you have more than one third-party courier connected — say, both Lalamove and Detrack — the order details page no longer stacks a full dispatch card for each one. You'll find a compact Delivery dropdown in the header row next to Order Status and Payment Status. Open it, pick the provider you want to use for this order, and only that provider's card appears below.

Why: operators were staring at two tall dispatch panels on every delivery, even when they'd already decided which courier to use. A quick pick-from-dropdown replaces the "scroll past the Lalamove form to find the Detrack button" flow, and keeps the right column lean for the 90% of orders where the choice is obvious.

What stays the same:

  • If you only have one third-party courier connected, the dropdown doesn't appear — that courier's card renders as usual. Nothing to click.
  • On pickup and dine-in orders, the dropdown doesn't appear either — it only shows for delivery orders.
  • Once a booking is live (you've got a tracking ID), the Delivery chip locks to show which courier is handling the order. To switch couriers after that, cancel the existing booking first.

To change your pick before engaging (i.e. before you've quoted Lalamove or created a Detrack job), just open the dropdown and choose a different provider — the cards swap automatically.

Improvement

Action cards on orders collapse by default

Three right-column cards on the order details page — Order Note, Print history, and WhatsApp Customer — now collapse by default with a header summary. Click the header to expand any one when you need to edit or inspect.

What you see now:

  • Order Note — header badge shows how many of your note fields are filled, like 2 / 3. Green if anything's filled, grey if empty. If any note is already filled, the card auto-expands so you see the content without an extra click; if nothing is filled, it stays collapsed.
  • Print history — header shows 5 Printed — or, when something went wrong, also 1 Failed in red. If there's a failure, the card auto-expands so you don't miss it; otherwise it stays collapsed until you click.
  • WhatsApp Customer — simple collapse. Click to expand the composer when you actually want to send a message; stays out of the way otherwise, since most orders don't need a manual WhatsApp.

The same right column that used to stack five or six tall cards now sits mostly compact, with the detail appearing only where you're actually working. Delivery cards are handled separately — you still see the one handling each order's dispatch.

Order Note fields are still saved the same way (edit, press Update). Print history still keeps the most recent 10 attempts per order. WhatsApp Customer still opens WhatsApp Web with your template filled in. Nothing changed about what the cards do — only how much room they take up when you're not using them.

Improvement

Reprint failed auto-prints + cross-order print activity

Two small additions on top of this week's print history feature.

Reprint failed auto-prints. When an auto-print to A4, main thermal, or kitchen thermal fails, the failed row in the order's Print history card now has a Reprint button. One click re-runs the same dispatch through PrintNode using your current printer config — no need to wait for the next auto event or re-accept the order. A new row is added to the history with source "Reprint" so you can see whether the retry succeeded.

Cross-order print activity. New sidebar entry Apps → Print Activity opens a list of your recent attempts across all orders, with filters for status (Printed / Failed), target, and time window (1 to 90 days). Use it to spot systemic failures — "all kitchen prints failing today" jumps out here in a way it can't on per-order cards. Failed rows have the same Reprint button.

Improvement

Print templates — starter designs, visual editor, live preview

Custom print templates just got a much bigger upgrade.

The Print page now opens with three ready-made starter templates you can clone: Branded Invoice (A4), Kitchen Ticket (80mm), and Customer Receipt (57mm). Click Use this template to copy one into your list, then rename and edit.

The plain HTML textbox is gone — replaced by a word-processor-style editor with tables, colors, font sizes, lists, and a Source view for power users. Tables in particular now work the way you'd expect.

A live preview sits next to the editor and re-renders against a real recent order (or sample data) as you type, so you can see what you'll print without actually printing.

A few smaller changes in the same release: a Paper size preset picker (Thermal, A4, A5, Letter, Shipping Label, Custom), hover tooltips on every variable badge, new logo variables (company_logo, company_logo_wide, company_logo_square) so you can put your branding on any template without pasting URLs, a company_email variable for contact blocks, and the unused Template Type field was removed. Staff can still print with any active template — only the account owner can edit designs now.

Existing templates carry over — nothing to redo.

Want these updates working for your business?

Start your storefront today and ride the next release with us.

Create your storefront