MealStack

Meal Plan Builder

Build personalized nutrition plans with real-time nutrient tracking and visual progress.

The meal plan builder is the core of MealStack. Create day-by-day nutrition plans with real-time calorie and macro tracking, visual progress indicators, and smart nutrient gap alerts.

Creating a plan

Start a new plan

Go to Meal Plans and click New Plan. Give it a title — e.g., "Priya's Weight Loss Plan — Week 1".

The plan list supports search (by title or client name), status filtering, and sorting (by recent activity, creation date, title, client name, or start date). Use the ⋯ menu on any plan to clone, archive, or assign a client directly from the list.

Assign a client (optional)

Select a client to link the plan. When linked, the builder pre-fills nutrient targets from the client's profile (based on their goal, weight, and activity level).

You can also create plans without a client — useful for building templates or general-purpose plans. You can assign or change the client later from Plan Settings at any time.

Set duration and targets

Choose the number of days (1–28) and set calorie/macro targets:

TargetExample (weight loss)Example (muscle gain)
Calories1400 kcal2400 kcal
Protein70g150g
Carbs175g280g
Fat45g75g
Fiber25g30g

Client context panel

When a plan is linked to a client, a Client tab appears in the builder sidebar (open by default). This panel gives you constant access to the client's health profile without leaving the builder. A View Profile link at the top opens the full client profile in a new tab for quick edits.

Sections displayed:

  • Profile snapshot — name, age, gender, height, weight, BMI
  • Daily targets — calorie and macro progress bars showing actual vs target for the current day
  • Restrictions — allergies (red), intolerances (amber), dietary preference (blue)
  • Medical conditions — badges for diabetes, PCOS, thyroid, etc.
  • Cuisine preferences — preferred cuisines for culturally appropriate meal planning
  • Food likes & dislikes — green tags for likes, red tags for dislikes
  • Women's health — pregnancy status with trimester indicator and calorie adjustment (+0/+340/+452 kcal), breastfeeding status with baby age and calorie guidance (+400/+500 kcal), menstrual cycle regularity, menopausal status
  • Medications & supplements — current prescriptions and supplements (important for food-drug interactions)
  • Lifestyle — cooking skill, meal prep time, eating out frequency, stress level
  • Typical diet — what the client normally eats for each meal (helps you build plans they'll actually follow)

The women's health section shows trimester-specific calorie adjustments that match the Auto-Calculate formula. Use this as a quick reference when building pregnancy or postpartum plans.

Plan score

The Score tab in the builder sidebar rates your plan across up to 7 metrics. The overall score is the average of all applicable metrics.

MetricWhat it measuresScoring
Calorie AccuracyHow close each day's total is to the calorie target% deviation from target, averaged across days
Macro BalanceProtein, carbs, and fat vs their targetsAverage accuracy across all macros and days
Food VarietyUnique foods relative to total itemsHigher ratio = better score
Meal SpacingTime gaps between meals (needs meal times set)Days with 1.5h+ gaps between all meals
CompletenessHow many days have at least one mealPercentage of days with food items
Fiber AdequacyDaily fiber intake vs targetAverage % of fiber target met across days
Clinical SafetyCondition-aware flags based on clinical guidelinesFlags reduce the score

Clinical safety flags

When the client has medical conditions or special health status, the Clinical Safety metric checks for potential issues:

FlagTriggerReference
Pregnancy calorie floorTarget < 1800 kcal for pregnant clientsACOG minimum
Breastfeeding calorie floorTarget < 1800 kcal for breastfeeding clientsWHO minimum
Diabetes carb limitCarbs > 45% of calories for diabetic clientsADA guidelines
Kidney protein limitProtein > 20% of calories for kidney disease clientsNKF guidelines
Weight loss calorie floorTarget < 1200 kcal for weight loss clientsNutrient deficiency risk

Clinical Safety only appears when the client has relevant health data (pregnancy, medical conditions, or a weight loss goal). Plans without a linked client or without relevant conditions won't show this metric.

Nutrient tracking

The nutrient bar at the top provides real-time visual feedback:

  • Calorie ring — circular progress indicator showing percentage of daily calorie target. Green when 80–110% (on track), amber when slightly off, red when significantly under or over.
  • Calorie bar — stacked progress bar showing per-meal calorie contribution. Each meal gets its own colored segment with a compact legend below (e.g., "Breakfast 420 · Lunch 580 · Dinner 490"). Hover any segment to see the exact kcal. When no meals have items yet, falls back to a simple progress bar.
  • Macro mini-bars — compact progress bars for Protein, Carbs, and Fat showing actual vs target (e.g., "P 58/165g")
ColorMeaningRange
GreenOn track80–110% of target
AmberWatch60–80% or 110–130%
RedOff targetBelow 60% or above 130%

The color coding gives you instant visual feedback. Aim for all green — that means the day is well-balanced within the target range.

Per-item nutrition

Every food and recipe item in the plan shows inline macro pills below its name:

  • P (protein), C (carbs), F (fat), Fb (fiber) — color-coded and shown in grams
  • Only non-zero values are displayed (no clutter from "P 0g")
  • Hover over any item name to see a nutrition hover card with a macro ratio bar, kcal, and all macros in a compact grid

Click any food name to open the Food Detail Sheet (full nutrient breakdown, portions, micronutrients). Click any recipe name to open the Recipe Detail Sheet (nutrition per serving, ingredients list, instructions).

The hover card gives you instant nutrition context without leaving the plan. Use it to quickly compare items — hover one, then hover another to see which has more protein.

Meal timeline

A compact timeline above the meal slots shows your meal spacing visually:

  • Dots represent each meal on a 5AM–11PM track
  • Filled dots = meals with food items, empty dots = empty slots
  • Shows eating window duration and fasting window (e.g., "15.5h eating · 8.5h fasting")

This is especially useful for intermittent fasting plans and ensuring proper meal spacing.

Day view

The default view shows one day at a time with meal slots:

SlotTypical timePurpose
Early Morning6:00 AMPre-breakfast — water, nuts, seeds
Breakfast8:00 AMMain morning meal
Mid-Morning10:30 AMLight snack
Lunch12:30 PMMain afternoon meal
Evening Snack4:00 PMTea-time snack
Dinner7:30 PMMain evening meal
Bedtime9:30 PMOptional — milk, supplements

You can customize meal slots in Settings → Meal Structure. Add slots like "Pre-Workout" or "Post-Workout" for sports nutrition clients, or remove "Bedtime" if not needed.

Adding foods

Click Add food or recipe in any meal slot to open the search panel.

AI-powered suggestions

When there's a significant nutrient gap (>30% below target for any macro), an AI Suggestions section appears in the search panel. Click the "Suggest foods" button to get AI-powered recommendations based on the client's profile, dietary preference, and current nutrient gaps.

Suggestions are cached per meal type — switching between meals and back reuses previous results without another AI call. Click Refresh to get new suggestions.

AI suggestions are on-demand — they only fire when you click the button, not automatically. This keeps AI costs predictable.

Search by English name — Type "brown rice" → results show Brown rice, cooked (USDA) at 123 kcal/100g.

Search by Hindi name — Type "dahi" → results show Curd / Dahi (IFCT) at 60 kcal/100g.

Prefix matching — Type "chick" → immediately shows Chicken, Chickpea, etc. without needing the full word.

Each search result shows:

  • Food name with source badge (IFCT / INDB / USDA)
  • Macro preview (calories, protein, carbs, fat) in consistent colors
  • Hindi name (when available)
  • Category name
  • Calorie density badge — VL (very low, under 60 kcal/100g), L (low), M (medium), H (high, over 400 kcal/100g)

Recipe results appear in a separate section above foods, showing:

  • Recipe name with a violet indicator
  • Calories per serving — so you can compare recipes against individual foods before adding
  • Servings count, cuisine type, and ingredient count
  • "per serving" label for context

The first 15 results load instantly. If more results exist, a "Show more" button appears at the bottom with the total count (e.g., "Show more — 32 remaining"). Click to load the next page.

Can't find a food? A "Create custom food" link appears at the bottom of search results. Click it to open the Quick Food Creator pre-filled with your search query. After creating, the food is automatically added to the meal slot — no need to search again. See Food Database → Quick food creator for details.

The calorie density badge helps with weight management plans. Look for VL and L foods (vegetables, fruits, lean proteins) to build volume-rich, low-calorie meals.

After adding, adjust the quantity and portion size (grams, katori, roti, cup, tablespoon, etc.).

Organizing items

Reorder within a meal

Hover over any food item to reveal a drag handle (⠿) on the left. Drag items up or down to reorder them within the meal — useful for putting the main item first, sides second, and beverages last. An amber line shows above the row where the item will land.

Move between meals or days

Two ways to move an item:

  • Via the ⋯ menu on the item: pick Move to → [meal name] for a quick relocate within the same day.
  • Drag the item onto another meal slot to move it there (the target meal lights up amber with a "Move to" banner, and an amber line marks the drop position). Drag onto a day tab at the top to move the item to that day. The matching meal type carries over when present, otherwise the item lands on the first meal of the target day.

Add foods by dragging from the Food Library

Open the Food Library sidebar tab on the right. Search for any food or recipe, then drag the result onto a meal:

  • Drop on empty space in the meal to append the item at the end.
  • Drop on an existing item to slot the new food at that visual position — surrounding items shift down to make room. An emerald line indicates the drop position; the target meal slot lights up emerald with a "Drop to add" banner.
  • Drops onto alternatives or side dishes inside a group append at the end (the group structure is preserved).

The search row's keyboard flow (↑↓ / ↵ / ⌘↵ / ⇧↵) is faster for bulk adds, but drag-from-library is the right tool when you're exploring or already have the sidebar open.

Clear and remove meals

The ⋯ menu on each meal header offers:

  • Clear all items — empties the meal without removing the slot itself
  • Remove meal — deletes the meal slot entirely (confirms if it has items)

Add a meal slot

Click + Add meal slot below the last meal to add a missing meal type (e.g., Pre-Workout, Post-Workout, Bedtime). The dropdown shows only meal types not already in the current day.

Sports nutrition clients often need Pre-Workout and Post-Workout slots. Add them to specific days without changing your org-wide meal structure defaults.

Nutrient gap alerts

When daily targets are set and a nutrient is significantly off, the builder shows smart alerts at the bottom of the day:

AlertTriggerSuggestion
⚠ Protein lowBelow 50% of target"Add eggs, paneer, dal, or chicken"
⚠ Fiber lowBelow 50% of target"Add vegetables, whole grains, or fruits"
⚠ Fat highAbove 130% of target"Reduce oil, ghee, or fried items"
⚠ Calories highAbove 120% of target"Consider smaller portions or lower-calorie swaps"

These suggestions are India-specific — they recommend foods commonly available and culturally appropriate for Indian clients.

Food safety warnings

The builder automatically flags foods that may be unsafe or inappropriate based on the client's health profile. Warnings appear as colored badges on food items in the meal slots.

Pregnancy safety

When a client is marked as pregnant, the builder warns about:

LevelFoods flagged
CriticalAlcohol, high-mercury fish (shark, swordfish), raw/undercooked foods (sushi, tartare)
WarningCaffeine (coffee, espresso — limit 200mg/day), raw papaya, excess pineapple

Medical condition warnings

When a client has medical conditions in their profile, the builder flags condition-specific foods:

ConditionFoods flaggedLevel
DiabetesSugar, jaggery, honey, sweets, mithai, maida, white bread, soda, juiceWarning
Kidney DiseaseHigh-potassium (banana, potato, spinach, coconut water), high-phosphorus (cola, processed meat)Warning
HypertensionHigh-sodium (pickle, papad, chips, namkeen, instant noodles, soy sauce)Warning
High CholesterolHigh saturated fat (ghee, butter, fried foods, pakora, samosa, red meat)Warning
Thyroid (Hypo)Raw goitrogens (raw cabbage, broccoli, cauliflower, soy) — cooking reduces goitrogensInfo
PCOSHigh-GI/refined foods (same as diabetes list)Info

Medication interactions

When a client has medications listed in their profile, the builder warns about food-drug interactions:

MedicationInteracting foodsLevel
WarfarinVitamin K-rich (spinach, kale, broccoli, green tea)Warning
MetforminAlcoholWarning
StatinsGrapefruitWarning
MAOIsTyramine-rich (aged cheese, soy sauce, kimchi, salami)Critical
LevothyroxineCalcium, iron, soy, coffee (reduce absorption)Info
ACE inhibitorsHigh-potassium (banana, orange, potato, coconut water)Info

All warnings are informational — they help you make informed decisions, not restrict your choices. Use clinical judgment to decide whether a flagged food is appropriate for the specific client.

Day tabs with calorie totals

The day sidebar shows each day's name and total calories, making it easy to spot which days need attention without clicking through each one.

For active plans, the day that corresponds to today's date shows a green "Today" badge — so you always know which day the client is currently on in their portal.

Week view

Switch to week view to see all days side by side. Each day shows:

  • Total calories with a color-coded progress bar
  • Macro breakdown (P/C/F) in consistent colors
  • Food items per meal slot

Click any day to jump back to the day view for editing.

Copying meals and days

This is the biggest time-saver in the builder:

  • Copy a meal — click the ⋯ menu on any meal → "Copy to other days"
  • Duplicate a day — hover over a day tab → ⋯ → "Duplicate Day"

Most clients eat similar breakfasts all week. Build one good breakfast, copy it to all days, then focus your time on varying lunch and dinner.

Food alternatives

For any food in a meal, you can add alternatives — "or" options the client can choose from if the primary item isn't available or preferred. This is the industry-standard approach used by platforms like Nutrium and Foodzilla.

How nutrient totals work

Only the primary food in each alternative group counts toward meal and day totals. The primary is always the first item in the group (topmost). Alternative items show their own calories inline but are excluded from all totals — nutrient bar, day calories, plan score, grocery list, and PDF summaries.

This means adding alternatives never inflates your nutrient numbers. The day stays accurate to what the client will actually eat — whichever option they pick.

Adding alternatives

Open the item menu

Hover over any food item in a meal and click the ⋯ dropdown menu.

Click "Add alternative"

The food search panel opens in alternative mode — the header shows "Add alternative to [meal name]".

Search and select

Find the alternative food and click it. It's added to the same group as the source item, positioned directly below it.

You can also click + Add option in the group footer to add more alternatives to an existing group.

Visual grouping

Items in the same alternative group are wrapped in a dashed border with "or" dividers between them:

  • The primary item (first in the group) shows a green dot (●) next to its name — this is the one counting toward totals
  • Alternative items show dimmed calorie values to indicate they're excluded from totals
  • The group footer has two actions: + Add option (add another alternative) and Ungroup (dissolve the group)

Changing the primary

Drag-and-drop reordering within a group changes which item is primary. The topmost item after reordering becomes the new primary, and nutrient totals update accordingly.

Removing and moving items

  • Removing an item from a 2-item group automatically dissolves the group — the remaining item becomes standalone
  • Moving an item to a different meal detaches it from its group. If the source group is left with only 1 item, that group is dissolved automatically

Alternatives in PDF exports

Day list layout — Alternative items appear indented below the primary with an italic "or" prefix and dimmed calories. A footnote explains: "Items marked 'or' are alternatives. Nutrition totals reflect the primary option only."

Week grid layout — Only primary items are shown (space is limited). Items that have alternatives show an asterisk (*). A footnote explains the convention.

Grocery list — Only primary items are included in the grocery list. Alternative ingredients are excluded to avoid over-purchasing.

Alternatives in the client portal

Clients see the primary food normally. Below it, a small chip shows "X alternatives" — tapping it expands the alternative options with an "or" prefix and a left border accent.

Each alternative has a "Use this" button. When a client taps it, the selected food swaps to the top position and the meal's nutrient totals recalculate instantly to reflect the selected item. The day totals and calorie ring on the home screen update too. Selections persist across page refreshes — the client doesn't need to re-select each time.

Use alternatives for common substitutions: "Brown rice" with alternatives "Quinoa" and "Roti". This gives clients flexibility while keeping your nutrient targets accurate — totals always reflect whichever option the client has selected.

Notes and instructions

Add notes at any level of the plan — per food item, per meal, per day, or for the entire plan. Each note has two fields:

FieldVisible toWhere it appears
Client noteClient + practitionerPDF exports, client portal, meal cards
Internal notePractitioner onlyBuilder UI only (never on PDFs or portal)

Per-food notes

Click the 📝 icon on any food item to add notes. Common uses:

  • "Boil for 10 minutes" (preparation instruction)
  • "Can substitute with paneer" (alternative suggestion)
  • "Use low-fat version" (client-facing tip)
  • "Client mentioned bloating with this food" (internal clinical note)

The note icon is hidden by default and appears on hover. When a note exists, the icon stays visible with a colored dot indicator — green for client notes, amber for internal notes. Hover the icon to preview the note without clicking.

Per-meal notes

Click the 📝 icon in the meal header (next to the kcal total). Use for timing instructions like "Eat within 30 minutes of waking up" or "Post-workout — consume within 45 min."

Per-day notes

Click the 📝 icon at the top of the day view. Use for special day instructions like "Fasting day — only liquids until noon" or "High-carb day (training day)."

Plan-level notes

Open Plan Settings (⚙️) to add plan-level notes:

  • Client Notes — general instructions shown on the PDF and portal (e.g., "Drink 3L water daily")
  • Internal Notes — private notes for your reference (e.g., "Client prefers South Indian cuisine, review in 2 weeks")

Plan actions

The builder header groups actions by purpose.

Status

The status pill next to the plan title is a menu. Click it to move the plan through its lifecycle. Only valid moves are shown, and each opens a short confirm.

FromAvailable moves
DraftActivate, Archive
ActivePause, Complete, Back to draft, Archive
PausedResume, Complete, Back to draft, Archive
CompletedReopen, Archive
ArchivedRestore

A contextual primary button sits beside the pill for the most common move: Activate (draft), Resume (paused), Reopen (completed), or Restore (archived).

  • Activate makes the plan live, publishes the first version, and emails the client.
  • Back to draft clears the dates and removes the plan from the portal.
  • Pause temporarily hides the plan without ending it (see Pausing a plan).

Publish (active plans)

Active plans show a single Publish control in place of a separate button and banner. It holds every publish action and shows the current state at a glance (see Editing an active plan).

Tools

The menu holds utilities: Grocery List, Export PDF, Copy Portal Link, Plan Settings, Save as Template, Clone Plan, and Version History.

Help and tours

A ? button sits in the header between Grocery and Activate/Publish. Click it for a flat list of focused walkthroughs:

  • Quick tour of the planner — the 5-step overview that auto-launches once for new users. Replayable any time.
  • Build your first meal — the core add flow: pick a meal, open the search, pick a food, edit the portion, watch the macros update.
  • Activate and publish — status lifecycle, activating a draft, publishing edits on active plans.
  • Plan score and issues — the six dimensions of plan score and how to act on suggestions.
  • AI features — only shown when AI is connected: AI suggestions in the search row, AI swap on items, fill a meal with AI, and the AI Assistant panel.
  • Tools, templates, PDFs — what lives behind the Tools menu.

Each mini-tour is 3-5 steps. None of them auto-launch — open them when you want a refresher.

View and grocery

A day/week toggle switches the layout. The 🛒 button opens the auto-generated grocery list (on small screens it moves into the Tools menu).

Plan settings

Open Plan Settings from the ⋯ menu (or click the gear icon) to manage all plan metadata in one place.

Client assignment

The top section lets you assign, change, or remove the client linked to this plan.

  • Assign a client — search by name and select. Nutrient targets auto-fill from the client's profile for any empty target fields.
  • Change — switch to a different client. Empty targets are filled from the new client's profile.
  • Remove — unlink the client (the plan keeps its content and targets).

Changes are saved when you click Save Settings — you can cancel to undo.

If you created a plan without a client (e.g., while drafting), you can assign one later without losing any work. The builder header also shows an "Assign a client" shortcut when no client is linked.

Duration

Use the +/− stepper to change the plan duration (1–28 days).

  • Extending adds blank days with the same meal slot structure as existing days.
  • Shrinking removes days from the end. If those days contain food items, a confirmation dialog warns you before deleting.

Schedule

  • Start date — sets when the plan begins. Auto-detects the weekday and relabels days accordingly.
  • End date — auto-calculated from start date + duration.
  • Day labels — choose weekday labels (Mon→Sun) or generic labels (Day 1, Day 2...).

Daily targets

Edit calorie and macro targets. If a client is linked, click Sync from client to pull the latest targets from their profile.

Nutrient visibility

Control which nutrients the client sees in PDFs and the portal. By default, all five nutrients (calories, protein, carbs, fat, fiber) are visible. You can hide specific nutrients per plan — useful for clients where showing certain macros isn't clinically appropriate (e.g., hiding fat for clients with eating disorder history, or hiding all macros for clients who feel overwhelmed by numbers).

Click any nutrient pill to toggle it off. Hidden nutrients are still tracked internally — the practitioner always sees all data in the builder. Only the client-facing outputs (PDF exports and portal) are affected.

LevelWhere to setBehavior
Practice defaultSettings → Export & BrandingApplies to all clients and plans unless overridden
Per-clientClient → Portal tab → Nutrient VisibilityOverrides practice default for this client
Per-planPlan Settings → Client Nutrient VisibilityOverrides client and practice defaults for this plan
Per-exportExport dialog → Visible NutrientsOne-time override for this specific PDF export

The cascade resolves from most specific to least: export override → plan → client → practice → all visible. Setting a level to "inherit" (null) falls through to the next level up.

Notes

  • Client notes — shown on PDF exports and the client portal.
  • Internal notes — visible only to you and your team.

Grocery list

Click the 🛒 button to auto-generate a shopping list from all foods in the plan, grouped by category (grains, vegetables, fruits, dairy, etc.). Quantities are rounded to practical shopping amounts.

Share via copy, WhatsApp, or print.

PDF export

Click ⋯ → Export PDF to generate a branded PDF. Customize what appears:

  • Cover page with practice logo and client name
  • Client summary with health stats
  • Day-by-day meal plan with portions and per-meal nutrients
  • Per-item macros (optional) — show P/C/F below each food item. Enable with the "Show item macros" toggle in the export dialog. Off by default to keep PDFs clean.
  • Daily nutrient totals
  • Nutrient summary across all days
  • Recipes (if included)
  • Grocery list
  • Recommendations (water intake, physical activity, foods to avoid)
  • Custom message
  • Visible nutrients picker — choose which macros appear in the PDF (calories, protein, carbs, fat, fiber)

Display preferences in exports

Your practice's display preferences (configured in Settings → Food Database → Visibility & Filters) automatically apply to PDF exports:

SettingEffect on PDF
Portion display: "Grams first"Shows "225g (1.5 katori)" instead of "1.5 katori (225g)"
Portion display: "Portion only"Shows "1.5 katori" without gram weight
Gram rounding: Nearest 10gRounds all gram values to nearest 10
Recipe portionsShows "1 serving (250g)" when gram weight is available

Per-item macros are hidden by default in PDFs. Enable them when the client needs detailed nutrition transparency — for example, clients tracking macros for bodybuilding or diabetes management. For most clients, meal-level and day-level totals are sufficient.

If the client's portal is enabled, a QR code linking to the portal is automatically added to the cover page. For PDFs without a cover page, the QR code appears at the end of the document.

Configure default export settings in Settings → Export & Branding. You can set your logo, disclaimer text, default section toggles, and default nutrient visibility.

Templates

Save any plan as a reusable template:

Save as template

Open a completed plan → click ⋯ → Save as Template. Add tags like "weight-loss", "vegetarian", "1400-kcal".

Reuse later

When creating a new plan, start from a template. Go to Templates page, find your template, and click Use Template.

Build condition-specific starter templates — "Diabetes 1600 kcal", "PCOS Vegetarian", "Pregnancy Trimester 2" — and reuse them across clients. Customize per client after copying.

Plan statuses

StatusMeaningEditable?Actions available
DraftWork in progress — not shared with clientYesActivate, Archive
ActiveLive and assigned to clientYes (edits are staged until published)Publish update, Publish & email PDF, Complete, Pause, Back to Draft, Clone, Archive
PausedTemporarily hidden from the clientYes (edits are staged until published)Resume, Complete, Back to Draft, Archive
CompletedProgram endedNo (reopen to edit)Reopen → Draft, Clone, Next Cycle, Archive
ArchivedManually archived for referenceNo (restore to edit)Restore → Draft

Confirmation dialogs

All status transitions require explicit confirmation. Each dialog explains what will happen:

ActionWhat the dialog tells you
ActivateDates will be set automatically, activation email sent to client, plan visible in portal
CompletePlan marked as finished, client loses active view, can reopen later
PauseClient won't see the plan while paused, progress is kept, resume any time
ResumeClient sees the plan again, it becomes their active plan
Back to DraftDates cleared, client loses portal access, no email sent
ArchiveHidden from list, client loses access, can restore later

If the plan has no assigned client, the dialog omits client-specific warnings (email, portal) and only mentions the date changes.

One active plan per client

MealStack enforces a single active plan per client. If you try to activate a plan for a client who already has one active, you'll see a dialog offering two choices:

  • Cancel — keep the existing plan active
  • Replace & Activate — the existing plan is automatically marked as "Completed" and the new plan becomes active

This prevents confusion about which plan is current. If you have legacy duplicate active plans (created before this guardrail), the plan list shows an amber ⚠ warning icon with a tooltip: "This client has multiple active plans."

Deactivating a plan (Back to Draft)

If you accidentally activated a plan or need to make significant edits, use Back to Draft from the ⋯ menu. This:

  • Moves the plan back to Draft status
  • Clears the start and end dates (they'll be re-set on next activation)
  • Removes the plan from the client's portal immediately
  • Does not send any email notification to the client

When you Activate a plan, MealStack automatically sets the start and end dates (if not already set) and sends an activation email to the client — "Your meal plan starts today." You can disable this email in Settings → Notifications.

Reopening and restoring plans

  • Completed → Reopen: Moves the plan back to Draft so you can edit it. Start and end dates are cleared — they'll be re-set when you activate again.
  • Archived → Restore: Same as reopen — moves to Draft for editing.

This means no plan is ever a dead end. You can always go back and revise.

Editing an active plan

Active and paused plans stay fully editable, but your edits are staged until you publish them. The client keeps seeing the last published version in their portal, so they never catch a half-finished change mid-week.

How it works

  • When you Activate a plan, MealStack publishes a snapshot of its content. That snapshot is what the client sees.
  • As you edit an active plan, your draft builds up alongside the published version.
  • The header's Publish control shows the state and holds every publish action in one place.

The Publish control

For an active plan, the header shows one split button whose primary segment reflects the state:

PrimaryMeaning
Published (green, with a check)The client is seeing your current content. Nothing to publish, so the button is not clickable.
Publish update (amber)You have unpublished edits. Click to push them to the portal.
Publish now (amber)Legacy active plan not yet using published versions. Publish once to start controlling exactly what the client sees.

The chevron beside it opens a menu:

  • Publish & email PDF: publishes and also emails the plan with a PDF (the delivery dialog).
  • Preview changes: opens a diff of your draft against the last published version before you publish (see Version history).
  • Discard changes: throws away your unpublished edits and reverts the plan to what the client is currently seeing. Your draft is saved as a version first, so a discard is reversible.

You can safely revise an active plan over several sessions. The client only sees the finished result when you publish. To check exactly what will change, use Preview changes first.

Use Publish update for portal-only changes (the client checks the portal). Use Publish & email PDF for changes worth an email, like a new week of meals. Both make your edits live.

Pausing a plan

Use Pause (from the ⋯ menu on an active plan) to temporarily take a plan offline without ending it.

  • The client stops seeing the plan in their portal and gets a "your plan is paused by your dietitian" message instead of a blank screen.
  • Progress, history, and content are all kept.
  • Click Resume to make it live again, or Complete to end it.

Pause is useful during a break (travel, illness, a festival period) when you don't want the client following the plan but also don't want to lose it. Paused plans are not auto-completed when their end date passes.

Approval workflow

Approval controls whether a plan needs a second pair of eyes before it can reach a client. An admin sets the policy under Settings → Approval Workflow:

ModeWho needs approval
No approval neededNobody. Anyone who can edit a plan can publish it.
Approval for restricted roles (default)Members without publish rights (interns, trainees, or any custom role without the capability). Senior staff publish directly.
Approval for everyoneEvery plan needs approval by another team member before it reaches a client, including senior staff.

A practitioner can never approve their own plan, so "Approval for everyone" needs at least two team members with reporting access.

Under the default mode, publishing is gated by the mealPlans.publish capability:

  • Owner, Lead Dietitian, and Dietitian can publish freely (activate, publish updates, and deliver).
  • Interns and trainees (and any custom role without the capability) must get a plan approved before it can reach a client.

For the author (submit for review)

When a gated member opens a plan, the header shows a Submit for review button instead of Activate/Send. After submitting:

  • The plan's reviewers (members with reporting access, which Lead Dietitians and Owners have by default) are notified by email.
  • The header shows the review state: Awaiting review, Approved, or Changes requested (with the reviewer's note on hover).
  • If changes are requested, make them and click Resubmit for review.
  • Once approved, the normal Activate / Publish / Send actions appear.

The gate applies to every path that reaches a client: activation, "replace existing active plan", publish update, and delivery. There's no way around it.

For the reviewer (approve or request changes)

Reviewers can act in two places:

  • From the plan — open the submitted plan and use the inline Approve or Request changes buttons in the header.
  • From the Team dashboard — the Team Oversight pending-review queue lists all plans awaiting review.

A badge on the Team sidebar item shows how many plans are waiting. Review decisions are logged to the client's activity timeline for audit.

Approval is capability-based, not role-name based, so it works with custom roles too. Grant or revoke mealPlans.publish from Settings → Team → [member] → Edit Permissions.

Sending plans to clients

After activating a plan, open the Publish control and choose Publish & email PDF. The delivery dialog offers two channels side by side:

  • Send Email — emails the plan to the client with an optional personal message and PDF attachment
  • WhatsApp — opens WhatsApp with a pre-composed message containing the plan details and portal link (requires the client to have a phone number)

Both options support:

  • A personal message field (optional)
  • PDF attachment toggle (on by default)
  • Portal link inclusion (if the client's portal is enabled)

If the client has only a phone number (no email), you can still deliver via WhatsApp. If they have only an email (no phone), the WhatsApp button won't appear.

You can also copy the portal link directly from the ⋯ menu → Copy Portal Link in the plan builder toolbar.

Without a client assigned, the Publish control still lets you publish to the portal, but Publish & email PDF is hidden (there's no one to email). Click "Assign a client" in the plan header or open Plan Settings to link one.

The activation email is sent automatically when you click Activate. Use Publish & email PDF for follow-up deliveries, for example after making changes to an active plan, or to re-send with a personal note.

Cloning and next cycle

Instead of building every plan from scratch, clone an existing one:

  • Clone Plan — creates an exact copy as a new Draft. Available from the ⋯ menu in the builder, the plan list, or the client's Plans tab.
  • Create Next Cycle — clones a completed plan and shifts the dates forward. If the original plan ended on Friday, the new one starts Saturday. Available on completed plans in the client's Plans tab.

Cloned plans track their lineage — each clone increments the version number (v2, v3, etc.) and links back to the source plan via parentPlanId.

Version numbers appear next to the plan title in the client's Plans tab, making it easy to see the iteration history at a glance.

Version history

Every plan keeps an immutable history of its content. Open Version History from the ⋯ menu.

Snapshots are captured automatically when you:

  • Activate a plan (the first published version)
  • Publish update or Publish & email PDF (each becomes a published version)
  • Restore or Discard (your current content is saved first, so both are reversible)

The history sheet

  • A status timeline at the top shows lifecycle events (created, activated, paused, completed, delivered) with the date and who did it.
  • Content versions are listed newest first. The version the client is currently seeing is marked Live now. When you have unpublished edits, a Current draft row appears at the top with Preview and Discard.
  • Auto-saved snapshots (taken before a restore or discard) are hidden behind a Show auto-saves toggle to cut noise.

For each version you can:

  • View: a read-only preview of that version's days, meals, and items.
  • Compare: a diff of that version against your current draft.
  • Restore: replace the current content with that version (disabled for the live version).

Comparing versions

Compare (on any version) and Preview changes (on the Publish control, draft vs last published) open the same diff view. It shows, per day and meal:

  • Items added, removed, and changed, with the before and after portion.
  • Changes to plan settings (targets, client notes, visible nutrients).
  • A nutrition impact summary: the net change in calories and macros for the day.

Use Preview changes before publishing to confirm exactly what the client will see, including how the day's calories and macros shift.

Restoring a version on an active plan changes your draft only. The client keeps seeing the published version until you publish the restored content.

Plan expiry

When an active plan passes its end date, MealStack shows visual indicators:

  • Builder header — "Xd remaining" (amber when ≤3 days, red when overdue)
  • Plan list — expiry badge next to the status
  • Plan settings — status section with countdown
  • Expired banner — a red banner appears in the builder with two actions: Complete or Next Cycle

Don't let plans sit in "active" after they expire. Either mark them as completed or create the next cycle — this keeps your plan list clean and gives clients clear expectations.

On this page