Installation & Activation

Flavor – Restaurant Menu is a WordPress plugin. Install it like any other plugin — no build tools or FTP required.

Install from WordPress.org

1

Go to Plugins → Add New

In your WordPress admin dashboard, navigate to Plugins → Add New Plugin.

2

Search for "Flavor Menu"

Type Flavor Menu in the search field and press Enter.

3

Install & Activate

Click Install Now, then Activate. The plugin menu appears under Menü in your admin sidebar.

📷
Screenshot: WordPress plugin search — "Flavor Menu" result with Install button

Install via ZIP (Pro)

After purchasing Pro, download the .zip file from your Freemius account. Then:

  1. Go to Plugins → Add New → Upload Plugin
  2. Choose the downloaded flavor-restaurant-menu-premium.zip
  3. Click Install Now → Activate
💡
Pro upgrade If you already have the Free version installed, simply install the Pro ZIP on top — your data and settings are preserved.

Quick Start Guide

Create your first restaurant menu in under 5 minutes.

1

Create a category

Go to Menu → Categories and add your first category (e.g. "Starters", "Main Courses").

2

Add your first dish

Go to Menu → Dishes and click Add dish. Enter the name, description, price and category.

3

Add the shortcode to a page

Create or edit a WordPress page and add [flavor_menu]. The menu appears automatically.

4

Preview & customize

Visit the page on the frontend. Adjust layout, theme and columns via shortcode parameters.

📷
Screenshot: Add New Dish screen — title, description, price, category fields visible

Free vs. Pro

Flavor is available in a free version on WordPress.org and a Pro version with all features unlocked.

FeatureFreePro
DishesUnlimitedUnlimited
Categories
Card Grid layout
6 additional layouts
Theme: Elegant Dark
Themes: Light, Earth, Custom
40 Google Fonts
Multiple prices per dish
Badges
Allergens & Nutrition
Guest Ratings
Multiple Locations
QR Code Table Stand
CSV Import / Export
Gutenberg / Elementor / WPBakery

Dishes & Categories

Adding a Dish

Open a dish under Menu → Dishes. Every dish has the following fields:

FieldDescription
TitleThe dish name, displayed prominently in all layouts.
DescriptionLong description text (post content). Used in Card Grid, Horizontal and Featured layouts.
SubtitleShort tagline shown below the title (e.g. "with truffle oil").
Price(s)One or more prices with optional labels (e.g. Small / Large).
CategoryAssign to one or more menu categories.
Sort OrderInteger — dishes are sorted ascending. Lower number = appears first.
Featured ImageDish photo — used in card layouts.
BadgeOptional badge (e.g. "Popular", "New", "Vegan"). Pro only.
LocationAssign to one or more restaurant locations. Pro only.
AllergensTick applicable EU allergens. Pro only.
NutritionCalories, fat, carbs, protein per 100g. Pro only.
📷
Screenshot: Full dish edit screen showing all meta fields

Categories

Go to Menu → Categories to manage categories. Categories are hierarchical — you can create parent categories (e.g. "Food") and subcategories (e.g. "Starters", "Main Courses").

💡
Subcategories are displayed as subtle sub-headings within their parent section in all list layouts. In Card Grid, clicking a subcategory in the subnav smoothly scrolls to it.

Category Sort Order

The same screen has a Sort categories section underneath — drag the rows there to reorder them. The order set here controls the display sequence in all layouts.

📷
Screenshot: Category Sort admin page with drag-and-drop handles

Shortcode Reference

The [flavor_menu] shortcode renders the menu on any page or post. All parameters are optional.

[flavor_menu
  title=""
  description=""
  category=""
  location=""
  layout="card-grid"
  style="dark"
  columns="3"
  image_ratio="4-3"
  show_filter="yes"
  sticky_filter="no"
  hide_all_btn=""
  default_category=""
  show_badges="yes"
  currency="€"
  currency_position="auto"
  limit="150"
  el_class=""
]

All Parameters

ParameterDescriptionDefault
titleMenu heading displayed above the filter bar.empty
descriptionSubtitle text below the heading.empty
categorySlug of a category to show only that category (and its children).all
locationSlug(s) of location(s), comma-separated. Filters dishes by location. Proall
layoutOne of: card-grid, price-list, table, horizontal, featured, compact, sectioned. Pro except card-grid.card-grid
styleTheme: dark, light, earth, custom-1, custom-2, custom-3. Pro except dark.dark
columnsNumber of columns: 2, 3 or 4. Applies to card-grid and horizontal layouts. Pro3
image_ratioImage aspect ratio: 4-3, 1-1 or 16-9. Pro4-3
show_filterShow category filter buttons: yes or no.yes
sticky_filterKeep the category filter bar pinned to the top while scrolling: yes or no. Applies to Card Grid and Horizontal layouts.no
hide_all_btnHide the "All" filter button: yes or no.no
default_categorySlug of the category pre-selected when the page loads.all
show_badgesShow badges on dishes: yes or no. Proyes
currencyCurrency symbol shown with each price (e.g. , $, £, CHF).
currency_positionWhich side of the amount the symbol sits on: auto, after or before. See Currency symbol & position below.auto
limitMaximum number of dishes to load. Max 999.150
el_classExtra CSS class added to the wrapper for custom styling.empty

Examples

[flavor_menu layout="price-list" style="light" title="Our Menu"]
[flavor_menu layout="card-grid" columns="2" category="drinks" currency="$"]
[flavor_menu layout="sectioned" style="earth" location="berlin" limit="50"]

Currency Symbol & Position

Set your currency with the currency parameter — any text works (, $, £, CHF, kr, …). By default, Flavor places the symbol on the side that matches it: symbols that belong in front of the amount ($, £, ¥, ) are shown before the price, and everything else after it.

currencyResult
32.00 €
$$32.00
££32.00
CHFCHF 32.00

Need a different placement? Use currency_position to override the automatic choice:

currency_positionEffect
auto (default)Chosen automatically from the symbol, as shown above.
afterAlways after the amount — e.g. 32.00 $.
beforeAlways before the amount — e.g. €32.00.
[flavor_menu currency="$" currency_position="before"]

In the Gutenberg, Elementor and WPBakery builders the same setting is available as a Currency Position dropdown next to the currency field.


All 7 Layouts

Flavor offers 7 distinct layouts to match any restaurant style. Card Grid is available in the Free version — all others require Pro.

Card Grid Free
Photo cards in a responsive grid with category filter and subcategory scroll.
Price List Pro
Classic restaurant list — name, dot leaders, price. Clean and text-focused.
Table Pro
Structured table format with allergen chips and inline popovers.
Horizontal Card Pro
Landscape photo left, content right. Ideal for featured dishes.
Featured Pro
Hero dish prominently displayed above a smaller card grid.
Compact List Pro
Dense text-only list. Ideal for large menus or drinks cards.
Sectioned List Pro
Categories as prominent section headers, dishes listed below each.

Card Grid Free

The default layout. Dishes displayed as photo cards in a 2–4 column grid. Includes a category filter bar and subcategory scroll navigation.

  • Category filter buttons at the top
  • Subcategory scroll navigation (subnav)
  • Allergen abbreviations shown as circled badges on the front of each card (bottom-left)
  • Nutritional values revealed via a 180° card flip on click
  • Guest ratings displayed as stars below the price
📷
Screenshot: Card Grid layout — 3 columns, dark theme, with filter bar
[flavor_menu layout="card-grid" columns="3"]

Price List Pro

A classic restaurant menu list. Each row shows dish name, dot leaders and price in a single line. Descriptions appear below the name.

  • Dot leaders between name and price
  • Allergen ⓘ button after dish name → floating popup
  • Multiple prices stacked below the name
📷
Screenshot: Price List layout — light theme
[flavor_menu layout="price-list" style="light"]

Table Pro

A structured table format. Ideal for menus with many dishes across categories. Allergens are shown as abbreviation chips with inline popovers.

📷
Screenshot: Table layout — with allergen chips visible
[flavor_menu layout="table"]

Horizontal Card Pro

Each dish is displayed as a wide card with the photo on the left and content on the right. Allergens trigger a 180° flip showing allergen info and nutrition values.

📷
Screenshot: Horizontal Card layout — earth theme, 2 columns
[flavor_menu layout="horizontal" columns="2"]

Compact List Pro

A dense, text-only list ideal for large menus or drinks cards. Prices appear as chips. Clicking a row opens the allergen popup.

📷
Screenshot: Compact List layout — drinks menu example
[flavor_menu layout="compact"]

Sectioned List Pro

Categories appear as large decorative headings. Dishes are listed beneath each category heading. Ideal for print-style menus.

📷
Screenshot: Sectioned List layout — with ornamental category dividers
[flavor_menu layout="sectioned" style="earth"]

Themes & Colors

Flavor ships with 3 built-in themes and 3 fully customizable custom theme slots.

ThemeShortcode valueAvailability
Elegant DarkdarkFree & Pro
Clean LightlightPro
Warm EarthearthPro
Custom 1custom-1Pro
Custom 2custom-2Pro
Custom 3custom-3Pro

Custom Themes

Go to Design → Themes to configure up to 3 custom color themes. Each theme has 7 color pickers:

  • Card Background — surface color of dish cards
  • Border Color — subtle separators and outlines
  • Accent Color — prices, badges, highlights
  • Heading Color — dish names and category titles
  • Text Color — descriptions and body text
  • Muted Text — subtitles and secondary info
  • Dot Line Color — price list dot leaders
📷
Screenshot: Custom Themes admin page — color pickers and live preview
💡
The live preview updates in real time as you pick colors. The Preview Background color only affects the admin preview — it is not output on the frontend.

Typography & Fonts Pro

Go to Design → Typography to set a heading font and a body font for your menu. Choose from 40 curated Google Fonts across 3 groups.

Font Groups

  • Serif — elegant, classic restaurant feel (e.g. Playfair Display, Cormorant Garamond)
  • Sans-Serif — modern, clean (e.g. DM Sans, Inter)
  • Display — decorative, unique (e.g. Josefin Sans, Abril Fatface)

Local Font Caching (GDPR)

Flavor can download font files to your server so no request is made to Google's CDN. Go to Design → Typography → Local Font Cache and click Download Fonts Locally.

  • Font files are saved to wp-content/uploads/flavor-fonts/
  • Once cached, zero requests leave your domain
  • You can clear the cache at any time to revert to Google CDN
💡
Disable Google Fonts entirely — tick "Disable Google Fonts" to use system font fallbacks only. No font requests are made at all.
📷
Screenshot: Typography admin page — font dropdowns, local cache status, download button

Allergens & Nutrition Pro

Flavor supports all 14 EU mandatory allergens (Regulation 1169/2011) and optional nutritional values per dish.

Setting Up Allergens

In the dish edit screen, scroll to the Allergens & Nutrition meta box. Tick any applicable allergens:

📷
Screenshot: Allergen meta box — 14 checkboxes with EU allergen names

The 14 EU Allergens

Gluten · Crustaceans · Eggs · Fish · Peanuts · Soybeans · Milk · Nuts · Celery · Mustard · Sesame · Sulphites · Lupin · Molluscs

Nutritional Values

Below the allergen checkboxes, enter optional values per 100g: Calories (kcal), Fat (g), Carbohydrates (g), Protein (g).

How Allergens Display per Layout

LayoutDisplay method
Card GridCircled allergen abbreviations on the card front (bottom-left); if nutrition is set, an ⓘ badge appears and clicking the card flips to the nutrition table
Horizontal CardCard flip → two-column layout (allergens left, nutrition right)
FeaturedClick hero or mini card → flip
Price Listⓘ button after dish name → centered floating popup
Compact Listⓘ button after description → click row to open popup
Sectioned Listⓘ button after dish name → centered floating popup
TableAbbreviation chips below dish name → click chip → inline popover
ℹ️
An allergen legend is automatically generated below the menu, showing only the allergens actually present in the displayed dishes.

Guest Ratings Pro

Allow guests to rate dishes from 1 to 5 stars directly in the Card Grid layout.

Enable Ratings

Go to Add-ons → Guest ratings and toggle ratings on. The star widget appears on every dish card.

📷
Screenshot: Guest Ratings admin page — enable toggle and rating overview table

How it Works

  • Guests click a star (1–5) on any dish card
  • Rating is saved per IP address — one vote per dish per visitor
  • Average rating and vote count are displayed below the price
  • Clicking stars on a flippable card does not trigger the nutrition flip
⚠️
Card Grid only — Guest Ratings are currently displayed in the Card Grid layout. Other layouts do not show the star widget.

Badges Pro

Badges are small colored labels (e.g. "Popular", "New", "Vegan") that appear on dish cards and in list layouts.

Create a Badge

Go to Add-ons → Badges. Enter a badge name, choose a background color and an optional emoji. Save.

📷
Screenshot: Badges admin page — badge list with color swatches and emoji

Assign a Badge to a Dish

In the dish edit screen, select a badge from the Badge dropdown in the meta box. Each dish can have one badge.

💡
Hide all badges via the shortcode parameter show_badges="no".

Multiple Locations Pro

If you run multiple restaurant branches, assign dishes to specific locations and show a location-specific menu per page.

Setup

1

Create locations

Go to Locations and add a location for each branch (e.g. "berlin", "munich").

2

Assign dishes

In each dish's edit screen, tick the applicable location(s) in the Locations meta box.

3

Use the shortcode

Add location="berlin" to your shortcode. Only dishes assigned to that location are shown.

[flavor_menu location="berlin" layout="price-list"]
ℹ️
Dishes with no location assigned appear on all location menus. Use this for dishes available everywhere.

Locations and reservations

A single location is cosmetic: with only one branch every view still runs as if there were none, so nothing changes for existing bookings. The second location is the moment branches become real — from then on every view has a concrete branch selected, and guests choose one when they book.

Because of that, creating the second location asks a question first: your existing reservations do not belong to a branch yet, and left that way they would disappear from the timeline and the room. Flavor tells you how many there are — split into upcoming and past — and lets you assign them to the branch that took them (usually the one you already had) or to the new one. The room you drew before goes to the branch that carried the business, so seated guests keep their tables.

⚠️
Deleting a branch asks too. Reservations live in Flavor's own table, so they are not silently cut loose: you choose whether to move them to another branch or delete them for good, and you are told how many are still upcoming — those guests are expecting a table at that address and will not hear otherwise from here. Moving clears the table assignment, since those tables belong to the floor plan being deleted.

QR Code & Table Stand Pro

Generate a print-ready table stand card with a QR code linking to your menu page — directly from the WordPress admin.

Steps

1

Go to Tools → QR / Table Stand

Enter the URL of your menu page (the page with the [flavor_menu] shortcode).

2

Customize the design

Choose a style (Minimal / Elegant / Branded), paper size (A5 / A6), colors, logo and background image.

3

Save as PDF

Click Save as PDF. The design is rendered at high resolution (~267 DPI for A6) and opens in a new browser tab ready to print.

📷
Screenshot: Table Stand admin page — live preview with QR code, style options, Save as PDF button

CSV Import / Export Pro

Go to Tools → CSV Import / Export to bulk-import dishes from a CSV file or export your entire menu.

CSV Column Format

ColumnRequiredDescription
titleDish name
descriptionLong description text
subtitleShort tagline
categoryCategory name or path using > for subcategories (e.g. Food > Starters)
sort_orderInteger sort order
price_1First price value
price_1_labelLabel for first price (e.g. "Small")
price_2Second price value
price_2_labelLabel for second price
price_3Third price value
price_3_labelLabel for third price
badgeBadge slug
locationLocation slug(s), comma-separated
allergensAllergen slugs, comma-separated (e.g. gluten,milk)
caloriesCalories per 100g
fatFat in grams per 100g
carbsCarbohydrates in grams per 100g
proteinProtein in grams per 100g

Import Behavior

  • Update existing — a dish with the same title is updated, not duplicated
  • Auto-create categories — categories that don't exist are created automatically
  • Preview — the first 5 rows are shown before the actual import runs
  • Result report — each row shows ✓ Created / ↻ Updated / ✗ Error
  • Encoding — UTF-8 (with or without BOM)
  • Separator — comma , or semicolon ; (configurable)
  • Max file size — 2 MB
📷
Screenshot: CSV Import page — file upload, preview table, result report

SEO & Schema Markup Pro

With Flavor Pro, every menu automatically outputs Schema.org structured data as JSON-LD. This helps search engines and AI assistants understand your menu — your dishes, categories, prices and nutritional values — without any configuration.

What gets generated

The plugin mirrors your rendered menu as a MenuMenuSectionMenuItem graph, embedded in a <script type="application/ld+json"> tag inside the menu. It includes:

  • Categories & subcategories as nested MenuSection entries
  • Each dish as a MenuItem with its name, description and image
  • Prices as Offer entries — one per price variant, with the variant label and an ISO 4217 currency code (€ → EUR, $ → USD, …)
  • Nutrition as NutritionInformation (calories, fat, carbs, protein) when entered

Example output

{
  "@context": "https://schema.org",
  "@type": "Menu",
  "name": "Our Menu",
  "hasMenuSection": [
    {
      "@type": "MenuSection",
      "name": "Starters",
      "hasMenuItem": [
        {
          "@type": "MenuItem",
          "name": "Bruschetta",
          "description": "Toasted sourdough, vine tomato, basil",
          "offers": { "@type": "Offer", "price": "8.50", "priceCurrency": "EUR" },
          "nutrition": {
            "@type": "NutritionInformation",
            "calories": "320 kcal",
            "proteinContent": "9 g"
          }
        }
      ]
    }
  ]
}
💡
No setup required — the markup is added automatically in every layout. Just publish your menu page and the structured data is in the HTML.

Verify it

Paste your published menu URL into Google's Rich Results Test or the Schema.org Validator to confirm the menu data is detected.

ℹ️
Prices are normalized to plain decimals for schema (e.g. 12,90 € becomes 12.90). If your currency symbol can't be mapped to an ISO 4217 code, the price is still included without a currency.

Table Reservations Free Pro

Let guests request a table online. Each booking is a request that you approve or decline — there is no automatic confirmation, so you stay in control. Capacity-based booking is free; the visual room, per-location settings, seating and analytics are Pro.

Add the reservation form to any page with the shortcode, or use the native Reservation Form element under the Flavor Restaurant category in Gutenberg, Elementor or WPBakery.

[flavor_reservation]

Everything on the operator side lives in the Flavor admin panel under Reservations, split into four screens:

ScreenWhat it is for
ServiceOne day at a time: approve requests, seat guests, take walk-ins. Three views of the same day — List, Timeline and Room.
Set up room ProMaster data: draw the room, check seats against capacity. You build here, you work on Service.
Analytics ProCovers, no-show rate and busiest times over the last 7 / 30 / 90 days.
SettingsHow guests may book: capacity, hours, closed days, contact and privacy.
CapabilityFreePro
Capacity-based booking requests
Email approval (approve / decline, no login)
Opening hours, slots, closed days
Day list + GDPR auto-deletion
Edit a booking (move, resize, correct)
Search by name, phone or email
Turn time staggered by party size
Per-location capacity & hours
Visual room + guest-first seating
Timeline (one lane per table)
Walk-ins (seat guests on the spot)
Analytics

Setup & Settings

Open Reservations → Settings. The settings are grouped into three cards.

Bookable

The rules a guest's booking has to satisfy.

SettingDescription
Slot intervalSpacing between bookable times (15 / 30 / 60 min).
Minimum lead timeEarliest a guest can book, in hours from now.
Maximum advanceFurthest a guest can book, in days ahead.
Party size capLarger groups are asked to call instead of booking online.

Capacity & hours

SettingDescription
Total capacity (seats)Maximum guests seated at the same time. A guide for the availability read-out, never a hard limit — you can always overbook deliberately.
Turn timeHow long a table is held per booking. Drives overlap, the timeline and the seating suggestions.
Longer for larger partiesTurn time covers parties up to a given size; every further group of that size adds extra minutes. Leave the minutes at 0 to hold every table for the same time. See below.
Opening hoursPer weekday open/close; the bookable slots are derived from these. A closing time at or before the opening time means service runs past midnight (e.g. 18:00–02:00) and is handled as one business day.
Closed daysBlock-out dates, added as chips with a date picker.

Turn time by party size

A party of eight does not leave as quickly as a two-top, and treating them alike skews availability, the timeline and the seating suggestions. With a base of 120 minutes covering up to 4 guests and 30 extra minutes per further group of four, you get:

1–4 guests: 120 min · 5–8: 150 min · 9–12: 180 min

The ladder is printed under the fields so you can see what you just described. The extra minutes default to 0, which behaves exactly like a single flat turn time — nothing changes until you opt in.

ℹ️
This changes how long a table is held, not which times are bookable. The bookable grid still ends one base turn time before closing, so a large party may still take the last slot.

Contact & privacy

SettingDescription
Contact phoneShown after a guest submits and in the confirmation email, so they can call if they don't hear back.
Notification e-mailWhere new requests are sent. Empty = the site admin address.
Auto-delete after (days)Past reservations are deleted automatically after this many days (GDPR). 0 = keep. Always account-wide, never per location.

Several locations Pro

With more than one location, Settings shows a pill per location. Each location holds its own full settings — capacity, turn time, opening hours and closed days. There is no shared "global default" that branches inherit from, so changing one branch never moves another.

Each location can also have its own notification e-mail, set on the same screen. A request is routed to the location address first, then the account address, then the site admin.

The same applies to the room: every location draws its own — see Room & Seating.

Shortcode parameters

ParameterDescriptionDefault
titleHeading above the form.Reserve a table
introShort text under the heading.
stylelight or dark.light
locationPro Lock the form to one location slug (e.g. a per-branch page).
el_classExtra CSS class on the wrapper.

Booking Flow

For the guest

1

Fill in the form

Date, time, party size, name and email are required; phone and note are optional. Times are limited to your opening hours; oversized parties are asked to call.

2

Get an instant on-page confirmation

The guest sees "request received" with your phone number, and gets a confirmation email — even if they mistype their address, the phone fallback catches it.

3

Receive the decision

Once you approve, the guest gets a confirmation email with a calendar (.ics) file and a one-click cancellation link.

For you (the operator)

Everything below happens on Reservations → Service. A context bar at the top fixes what you are looking at — which day, which location — and stays put while you switch between List, Timeline and Room. It also shows the day's covers and the peak against your capacity.

1

Approve from your inbox

Every request emails you the details plus an availability hint. Two buttons — Confirm / Decline — work without logging in (secure per-reservation links, safe against email prefetch).

2

Or clear the approval strip

A strip above the day's list collects everything waiting for you: open requests of any date (an overdue request still needs an answer) and, on Pro, today's confirmed guests who have no table yet. Each request shows what approving it would do to the room — "→ 38/50" — so a party of eight is never waved through blind.

3

Work the day's list

Each row is one line — time, guest, party, status, table — with a single primary action and a "⋯" menu for the rest (Decline, Arrived, No-show, Cancel, Edit, E-mail guest, Delete). Click the row to open contact details, note and timestamps.

4

Change a booking when a guest calls

"⋯" → Edit opens the booking in a dialog: time, party size, name, phone, email, note, and the location. The status is untouched — approving, declining and cancelling stay with the row actions. Tick the box and the guest is sent the new details with a fresh calendar entry; their cancellation link keeps working even when you move the booking to another day.

5

Find a booking

The search box takes a name, phone number or email and looks across every date, so "I booked for Saturday, Müller" does not mean guessing the day. Phone numbers match regardless of spaces, dashes or slashes. Cancelled bookings show up too — usually they are exactly the one being asked about.

6

Add phone bookings yourself

+ Add reservation opens a dialog for a booking you took by phone. It is saved as confirmed straight away; email is optional, and you choose whether to send a confirmation. A live availability hint shows the load as you type.

7

Seat them & take walk-ins Pro

Give each confirmed guest a table with one click, or seat a walk-in on the spot — see Room & Seating.

Two nudges that keep the numbers honest

  • Overdue arrivals. A confirmed booking whose time passed more than 20 minutes ago without anyone marking the guest as arrived is flagged Overdue. The timeline has a "now" line; the list did not, so a 19:00 booking still untouched at 19:25 looked exactly like one at 22:00.
  • "Did they turn up?" Confirmed bookings from days already over that were never closed out are collected in the approval strip, with Arrived and No-show next to them. Nothing is decided for you: marking them automatically would count absent guests as present, and the no-show rate in Analytics would measure button-pressing rather than reality.

Which emails go out

Every message is sent by your own site — there is no external service in between.

WhenWho gets itWhat is in it
A guest submits a requestThe guest"Request received", with your phone number so they can call if they hear nothing back.
A guest submits a requestYouThe booking, how full that slot already is, and Confirm / Decline buttons that work without logging in.
You approveThe guestConfirmation with a calendar file (.ics) and a one-click cancellation link.
You declineThe guestA short note that the booking could not be taken, with your phone number.
You edit a booking and tick the boxThe guestThe new details under their own subject line, with a fresh .ics. The old cancellation link keeps working.
The booking is cancelledThe guestConfirmation that it is cancelled.
The guest cancels via their linkYouA heads-up, so a table freeing up does not go unnoticed. Cancelling from the list yourself does not email you — you already know.

Your copy goes to the notification address in Settings → Contact & privacy; with several branches, a location's own address wins, and the site admin address is the fallback. Adding a booking yourself is the one case you control per booking: the confirmation is only sent if you leave the box ticked and gave an address.

ℹ️
There is deliberately no reminder email. WordPress only runs scheduled jobs when someone visits the site, so on a quiet day a "day before" reminder would arrive late or not at all — worse than none. The calendar file in the confirmation does the job instead, and it carries the cancellation link with it.
ℹ️
Status flow: requested → confirmed | rejected → (cancelled | arrived | no_show). The guest is emailed on every operator decision.

Room & Seating Pro

Draw your room once, then seat guests on it during service. The two are separate on purpose: you build the room on Reservations → Set up room, and you run service on Reservations → Service.

⚠️
Every location draws its own room. There is no shared plan a branch falls back to — a new location starts with an empty room, which is what you want when the branches are genuinely different places.

Set up the room

1

Add tables

Round, rectangular, square or bar-seat shapes. A table's size follows its seat count.

2

Arrange the room

Drag to move, rotate a table or resize a zone with the handle. Group tables into named zones (Indoor, Terrace, Bar). Then Save floor plan.

3

Check the seats against your capacity

The same screen lists every table with its seat count and compares the total to the capacity in Settings — an easy way to catch a room that no longer matches what you accept online.

Three views of the same day

On Service, the day and location stay fixed while you switch view:

  • List — the scannable day, one line per booking.
  • Timeline — one lane per table across the service, from opening to closing (past midnight included), with a "now" marker. Good for spotting a gap you could still sell. A booking whose table has since been removed from the plan shows up under Unassigned rather than disappearing.
  • Room — the live plan. Scrub the time slider (it starts at the current time) and tables colour live: green free, amber reserved, red seated. Chairs are drawn around each table, one per seat.

Seat guests — two ways

  • Guest first. Each confirmed booking has a Seat button. A dialog suggests the best-fit free table, already selected, so it is usually one click. Tables that are too small or already taken are shown but cannot be picked; the time comes from the booking.
  • Table first. In the Room view, unseated guests wait in a "to seat" queue: pick one and click a highlighted table, or drag them onto it. Click a seated table to see who is there or to free it.

How long a table stays blocked follows the booking's own turn time, so a large party holds its table longer than a two-top if you staggered it in Settings.

Walk-ins

Seat someone who just walked in — no prior booking:

  • + Walk-in in the context bar — enter party size (name optional), pick a free table, done.
  • Or, in the Room view, click a free table and seat the walk-in right there.

Walk-ins carry a Walk-in label and count towards capacity like any seated guest.

ℹ️
Confirming a booking and seating it are separate steps — confirm quickly from your phone, assign a table later. Overbooking is never blocked; the availability read-out is a guide, not a limit.

Analytics Pro

Reservations → Analytics summarises the last 7, 30 or 90 days. With several locations you can look at one branch or at all of them together.

  • KPIs — covers (guests), confirmed bookings, no-show rate, average party size.
  • Covers over time — guests per day across the range.
  • Busiest times — covers by hour of day, so you can staff the peaks.
  • Status breakdown — the split across requested / confirmed / arrived / no-show / cancelled / rejected.
💡
The no-show rate is only as good as your record-keeping — it counts bookings you actually marked as no-shows. The "Did they turn up?" prompt on the Service screen exists to keep that number meaningful.

Page Builders

Flavor integrates natively with Gutenberg, Elementor and WPBakery. All page builders use the same renderer — the output is always identical.

In every builder, Flavor's elements are grouped under a dedicated Flavor Restaurant category. You'll find the Menu Card element there — plus the Reservation Form element if you use table reservations.

Gutenberg Block

Open the block inserter and look under the Flavor Restaurant category to add the menu block. It provides dropdowns for all shortcode options — no shortcode knowledge needed.

  • Layout, Theme, Columns, Image Ratio — all configurable in the sidebar panel
  • Category and Location dropdowns are populated from your existing data
  • Preview renders server-side in the editor
📷
Screenshot: Gutenberg editor with the Menu Card block selected and sidebar panel open

Elementor Widget

In the Elementor editor, open the Flavor Restaurant category in the widget panel — or search for "Menu Card" — and drag it onto the canvas.

  • All options available in the Elementor Content tab
  • Live preview in the Elementor canvas
  • Works with Elementor Free and Elementor Pro
📷
Screenshot: Elementor editor with the Menu Card widget and content panel

WPBakery

In the WPBakery editor, click Add Element and open the Flavor Restaurant category — or search for "Menu Card".

  • All shortcode parameters available as form fields
  • Works in both Classic and Grid modes
📷
Screenshot: WPBakery element picker with the Menu Card element under the Flavor Restaurant category

FAQ

Do I need a page builder?

No. Flavor works with the standard WordPress shortcode [flavor_menu] — paste it into any page or post. Page builder integrations (Gutenberg, Elementor, WPBakery) are available but not required.

Will my data be lost when I update the plugin?

No. All dishes, categories, images and settings are stored in the WordPress database. Plugin updates only replace code files — your content remains untouched.

Does it work with my theme?

Yes. Flavor uses fully encapsulated CSS scoped to its own wrapper class .flavor-menu. It does not interfere with your theme's styles.

Can I show different menus for different locations?

Yes. Create locations under Locations, assign dishes to them, then use the location="slug" shortcode parameter on each page. See the Locations section for full details.

How do I control which dish appears first?

Set the Sort Order field on each dish. Dishes are sorted ascending — a dish with Sort Order 1 appears before one with 10. In the Featured layout, the dish with the lowest sort order becomes the hero.

Can I use multiple menus on one page?

Yes. Place multiple [flavor_menu] shortcodes on a single page — each with different category, layout or location parameters. Each instance is fully independent.

Is the menu responsive?

Yes. All 7 layouts are fully responsive and tested on mobile, tablet and desktop. The column count is automatically reduced on small screens.

How do I translate the plugin?

Flavor uses the WordPress standard translation system (Text Domain: flavor-restaurant-menu). Use a plugin like Loco Translate or WPML to translate admin strings and frontend labels.

The menu doesn't show — what should I check?

  • Is the plugin activated? Go to Plugins and verify.
  • Have you added at least one dish and assigned it to a category?
  • Is the shortcode [flavor_menu] on the page (not just in a widget)?
  • Check the limit parameter — the default is 150, up to a maximum of 999. Increase it if you have more dishes than that.