Changelog
Current release: 1.15.9 ()
All notable changes to Pro Nutrition Planner are documented here.
Version 1.15.9
Added
- Plan Builder – Save to My Recipes: Each meal card now has a Save Recipe button in the footer. Save the current meal (title, notes, ingredients, and scaled amounts) to your private recipe catalogue without leaving the plan builder. A confirmation prompt appears before adding; unnamed meals ask for a recipe name first.
Version 1.15.8
Fixed
- PDF export on Safari (macOS): Meal plan and grocery shopping list exports now use Safari-specific print handling so saved or downloaded PDFs are no longer blank. Chrome and other browsers are unchanged and keep the existing full-page export layout.
Version 1.15.7
Fixed
- Login sessions: Sign-in works reliably on production hosting again; session handling no longer depends on the server’s default PHP session folder when that location is not writable.
Version 1.15.6
Changed
- Meal plans per client (paid): Paid coaches can now keep up to eight active meal plans per client—still unlimited in practice when you clear the decks and start fresh.
Version 1.15.5
Fixed
- Billing status stays in sync with Stripe: Your plan tier and subscription status in the app and admin panel now match Stripe more reliably after upgrades, downgrades, or payment issues.
- Recovered payments: When a previously failed subscription payment is successfully paid, your account status updates to active without remaining stuck on past due.
Version 1.15.4
Fixed
- Plan changes use current list prices only: Coaches who upgrade or downgrade through Cancel, downgrade, or update payment (Stripe Customer Portal) now only see the current plan prices ($34 / $79 / $119 / $149), not legacy grandfathered prices. If Stripe still applies a legacy price after a plan change, the app automatically moves the subscription to the matching current price for that tier.
- Checkout and in-app plan changes: New subscriptions and plan-change requests only accept current catalog price IDs; legacy price IDs are rejected.
- Unchanged grandfathered subscriptions: Coaches who stay on the same plan without changing tier keep their existing Stripe price until they change plan or cancel.
Added
- Repair script for legacy plan changes: `app/cron/repair-legacy-subscription-prices.php` can move affected customers from legacy to current prices (e.g. `--customer=cus_xxx`).
Version 1.15.3
Fixed
- Forgot password emails: Requesting a password reset now sends an email with a secure link (using the same mail setup as the contact form). A new Set New Password page completes the reset flow.
Version 1.15.2
Added
- Change password: Logged-in coaches and admins can update their password from the profile menu (Change Password). Your current password is verified before the new one is saved; you remain signed in after a successful update.
Version 1.15.1
Fixed
- Cancelled subscriptions downgrade correctly: When a Stripe subscription is cancelled or removed, your organisation now moves back to the free trial tier with the correct client limit. Paid plan fields are cleared while your Stripe customer record is kept so you can resubscribe later.
- Cancel at period end: If you cancel but keep access until the end of the billing period, paid features stay active until that date; after the period ends (or when Stripe confirms full cancellation), access downgrades to free automatically.
- Billing webhooks and sync: Subscription updated and deleted events from Stripe are handled consistently so the database cannot stay on a paid tier after Stripe shows the subscription as cancelled.
- Missed webhooks: Opening Billing or signing in can refresh subscription state from Stripe. A daily reconcile job also downgrades accounts whose stored subscription no longer exists or is cancelled in Stripe.
- Admin organisations list: Tier and status now reflect free vs paid accurately after cancellation, including a note when a plan is set to cancel at period end.
Version 1.15.0
Added
- Secure meal plan download links: On finished export preview pages (Meal Plan, Grocery List, and Full Plan & Grocery List), coaches can use Generate Link to create a unique, time-limited URL for the client PDF. The link is copied to the clipboard automatically (with a manual-copy fallback). Clients can open the link without logging in and download the plan.
- Protected PDF storage: Generated files are stored outside the public web root with token-based filenames. Downloads are served only through a controlled route that validates the token, expiry, and file integrity.
- Server-side PDF export: Download links use Dompdf to produce real PDF files (Composer dependency). Coaches still use Download PDF on the preview page for browser print/save as before — that flow is unchanged.
Changed
- Export preview toolbar: Finished plan previews now show Download PDF, Generate Link / Copy Link, and Close. The meal plan editor and plan builder export entry points are unchanged.
Fixed
- Dompdf layout: Download-link PDFs use compact portrait styling so combined meal plan + grocery exports stay close to the browser print layout (macro summary in one row, readable tables, footer contact details fully visible inside page margins). Invalid or blank exports are blocked before a link is saved.
Version 1.14.0
Added
- Plan Builder – Combined export: The header Export dropdown replaces separate export buttons. Choose Full Plan & Grocery List (meal plan then grocery list in one printable document, with a page break between sections), Meal Plan, or Grocery Shopping List. Grocery and combined exports still ask how many days (1–14) to multiply quantities by.
- Coach – Resources: New Resources tab in the top navigation for logged-in coaches. Downloadable materials are listed as cards so more guides and ebooks can be added over time without restructuring the app.
- Meal Catalogue Ebook: First paid resource — Meal Catalogue Ebook (PNP recipe book for coaches). Coaches can use it with clients for meal inspiration, preference discovery, and improving adherence. The card shows cover art, optional PDF sample preview, list price $19 with $29 shown struck through, and an Owned badge after purchase.
- Secure purchase and download: One-time Stripe Checkout for the ebook (including promotion codes on checkout). Purchases are recorded per coach; the full PDF is served only through a protected download — files are not exposed via a public URL.
- Post-purchase flow: After payment, a success page confirms the purchase and links straight to download; returning to Resources shows Download instead of Purchase.
Version 1.13.3
Added
- Nutrition preferences (coach): Optional setting Include fibre calories in calorie totals (user menu → Nutrition preferences). When off (default), food energy uses protein × 4 + carbs × 4 + fat × 9 only so calorie totals align with classic macro targets. When on, fibre × 2 is added. Helper copy explains the behaviour in neutral, educational wording.
- Meal plan snapshot: Each meal plan stores `include_fibre_calories` at creation and on duplicate, so existing plans keep the same calorie rule if a coach changes the organisation preference later.
Changed
- Fibre in calories (hybrid): The platform default is again excluding fibre from derived calorie totals; coaches who want fibre-inclusive energy opt in via Nutrition preferences. PDF exports, plan builder, scaling, smart substitutions, ingredient search, recipes, client calculator manual mode, and related APIs follow the plan snapshot or organisation setting consistently.
Version 1.13.2
Changed
- Calories and fibre (platform-wide): Food energy from macros now includes dietary fibre at 2 kcal per gram everywhere it is derived in the app—meal plan lines, totals, PDF exports, plan accuracy from saved totals, ingredient search and admin/coach ingredient lists, meal scaling and smart substitutions, and the manual macro calorie view—so numbers follow one rule end to end. Existing meal lines still use your stored macro grams; calorie figures move to the fibre-inclusive sum when you load or save a plan (nothing is double-counted).
- Static scripts (cache busting): theme.js and utils.js are now requested with a file-based version query so browsers pick up behaviour changes after a deploy without relying on a hard refresh.
Fixed
- My Recipes – search vs added row: The ingredient dropdown could show fibre-inclusive calories from the server while the row still used an older three-macro calorie helper from a cached utils.js. Recipe rows now always apply the same fibre-inclusive rule locally when totals refresh, so the line you add matches what you picked in search.
Version 1.13.1
Changed
- Client Profile – Sodium target range: In the Calorie & Macro Calculator, the sodium upper limit has been increased from 3000 to 6000 mg/day for both standard calculator inputs and manual macro override inputs.
Version 1.13.0
Added
- Coach – My ingredients: Add your own ingredients one at a time, scoped to your organisation (they never land in the global admin catalogue). Protein, carbs, fat, and fibre are required; other micronutrients are optional. Your items appear in Plan Builder and My Recipes alongside the main catalogue, with the same validation when saving plans and recipes.
- Coach navigation: The top bar uses My Recipes and My ingredients so private recipes and custom ingredients are easier to find.
Changed
- Billing – adding custom content: Coaches on a free trial (tier zero) can still open My Recipes and My ingredients, but adding a new recipe or custom ingredient prompts an upgrade to a paid plan; paid tiers can create freely. List and edit access for existing content follows your existing rules.
- My Recipes – ingredient entry (create and edit): Building a recipe now follows the same amount rules as the Plan Builder—grams or millilitres for gram-based portions, or servings for everything else—with live per-line and recipe totals for calories and main macros as you work. Create and edit share the same experience.
- My Recipes – search results: Ingredient search pulls from the same API as the Plan Builder; each result shows macros and calories on a separate line under the name so nothing overlaps the title.
- Global vs coach data: The admin ingredient catalogue and bulk imports only affect global ingredients; coach-owned rows stay in your organisation and out of those admin tools.
Fixed
- Plan Builder – Apply Recipe: Searching for a recipe no longer fails as soon as you start typing (native PDO could not reuse the same named parameter twice in one query).
- Edit recipe: Opening a recipe for editing no longer triggers a SQL error on MariaDB when loading ingredient rows (qualified column references for `ingredients` are quoted correctly).
Version 1.12.0
Added
- Smarter billing and plan changes: Plan upgrades and changes now update your existing subscription whenever possible, so you get a smoother upgrade or downgrade path and clearer protection against being charged twice for overlapping plans.
- More reliable subscription matching: Behind the scenes, the app does a better job of knowing which subscription belongs to your organisation, including when your billing account has unusual history. This keeps your plan level and billing state aligned with what you expect.
- Scheduled downgrades: When you move to a lower tier, your higher plan stays active until the end of your current billing period, then the change applies automatically—so you are not cut off early.
- Support tooling for rare edge cases: In exceptional situations where duplicate subscriptions exist, there is a safe, deliberate way for support to tidy them up—without automatic surprises for everyday accounts.
- Clearer published prices: New coaches and anyone who changes plan see the current list prices. Coaches who joined on earlier prices stay on those until they choose to change—prices stay consistent on the marketing site and on your Billing page.
- Broader billing compatibility: Payment success notifications are handled reliably whether your billing provider sends them under a newer or older event name.
Changed
- One place for price rules: List prices and “grandfathered” earlier prices are managed in one central place, so what you see in the product matches what billing uses.
- Updated price display: The website and in-app Billing now show $34 / $79 / $119 / $149 AUD per month for the paid tiers (Solo through Enterprise), matching the current published list.
- Account and billing stay in sync: When you have a downgrade scheduled, your session and screens can reflect that more accurately.
- Faster application of scheduled downgrades: If a downgrade is due, it can be applied when you sign in or open Billing—not only on a nightly schedule—so your plan updates sooner when the timing is right.
Fixed
- Plan changes without duplicate subscriptions: Improved the flow when changing plan so you are not left with two active paid subscriptions for the same account.
- Safer handling of subscription events: When billing systems send overlapping or repeated updates, the app favours syncing your account state safely instead of taking aggressive automatic cancellation steps.
- Correct plan for every price point: Coaches still on earlier price points continue to see the right plan tier and client limits until they upgrade or downgrade.
Version 1.11.0
Added
- Plan Builder – Smart Substitutions (paid): Swap meal ingredients for better fits with one action. Free plans see a clear upgrade path; paid plans get full access from each ingredient row (manual entries and recipe-based rows).
- Smarter swap suggestions: The app ranks alternative ingredients for you and can preview a swap before you commit, so you spend less time hunting for replacements.
- Substitution experience: A dedicated panel shows your original ingredient, up to eight ranked options with simple quality cues, and one-click Swap when you are ready.
Changed
- Better matching for swaps: Suggestions weigh macros and calories together with sensible amounts and portion types, so you see fewer unrealistic replacements.
- More helpful ordering: Results favour ingredients in a similar category and with overlapping tags (for example gluten-free), with sensible fallbacks when those hints are not available.
- Clearer amounts in suggestions: Swap previews show amounts with everyday units (for example grams, millilitres, serves) while still filling your plan fields correctly.
- Easier to scan match quality: Colour bands on match scores make it quicker to spot strong options at a glance.
Fixed
- More dependable substitutions: Improved compatibility across hosting setups so suggestions load reliably when you need them.
- Plan table layout: Adding the substitute action no longer throws off column alignment in the meal table.
- Amounts after swapping: Swapped rows now fill amount fields correctly so nothing looks blank after you apply a swap.
Version 1.10.0
Added
- Coach Dashboard – Plan accuracy (paid): See how tight your saved meal plans are against targets, track your average over time, streaks, and simple achievements—so you get feedback on quality without extra busywork.
- Automatic scoring on save: Each time you save a plan, scores refresh from what is actually in the plan, and your dashboard stats stay up to date without duplicate badges.
- Dashboard widget: Paid coaches get a compact accuracy summary on the home dashboard; free plans see a friendly prompt to upgrade.
Changed
- Dashboard layout: Accuracy is shown as three easy-to-read cards that match the rest of the dashboard in light and dark mode.
- Clearer metrics: Average accuracy (across your plans) is separated from last plan accuracy, and the trend line reflects how your average moves over time.
Fixed
- Dark mode: Achievement chips read clearly in dark theme instead of looking washed out.
- Widget polish: Tidied spacing and overlap so the accuracy ring and text are easier to read.
Version 1.9.0
Added
- Client Profile – Manual macro targets: In Calorie & Macro Calculator, you can optionally enter Protein, Carbs, Fat, Fibre, and Sodium directly for a client when you want full control. Totals update live and save with the client.
- Seamless support for manual mode: Turning manual mode on is optional; the calculator stays the default for everyone who prefers the guided flow.
Changed
- Calculator stays familiar: Manual entry is opt-in and keeps the rest of the client context (demographics, energy needs) so you only override what you choose.
Fixed
- Client details layout: Long email addresses wrap neatly in the client details panel instead of spilling past the card.
Version 1.8.0
Added
- Plan Builder – Plan notes before export: Use Add Notes (between Save and Export Meal Plan) to add up to three titled blocks above the first meal—ideal for coach notes or client guidance. Each block has a heading, body, and optional delete, with styling that matches your plan. Notes save with the plan, copy when you duplicate a plan, and appear before meals on the Export Meal Plan PDF.
- Grocery export – choose the number of days: Export Grocery Shopping List asks how many days (1–14) you want; the PDF scales quantities accordingly (seven days by default). The filename reflects your choice.
Changed
- Reorder meals without moving notes: Move up/down only swaps meal blocks, so plan-level notes stay anchored above your meals.
- Notes look consistent: Plan note fields follow the same typography and light/dark styling as meal names and per-meal notes for a cohesive look.
Version 1.7.0
Added
- Clients – Add multiple clients at once: From the Clients list (when your plan allows), use Add multiple clients to open a dedicated screen. Add rows up to your remaining client slots, fill calculator-style fields in one pass, use inline help where you need it, and submit once. Either every client is created together or you see clear errors so you can fix them—no half-finished batches. Works comfortably on mobile with a sticky action bar.
Version 1.6.0
Added
- Light and dark mode: Coaches and admins can switch theme from the top navigation; your choice is remembered for next time across the app and admin areas.
- Stronger theming foundation: Under the hood, theming is organised for easier future polish while you get a consistent look today.
Changed
- Less flash on load: Your saved theme applies earlier so you see the right colours sooner when opening pages.
- Meal Builder in dark mode: Inputs feel less like a spreadsheet—softer surfaces, clearer hover and focus, and a calmer editing experience.
- Clearer calorie goal prompt: The meal calorie goal field now invites “Enter Calorie Goal” so new coaches know what to type first.
- Version in the footer: The footer shows the current product version and links to this changelog.
Fixed
- Apply Recipe clarity: Applying a recipe now replaces the meal’s ingredients with the recipe’s list instead of stacking on top, so comparisons stay tidy. Related scale/undo edge cases for that meal are reset when you replace with a recipe.
Version 1.5.0
Added
- Ingredients – More micronutrients: Calcium, magnesium, iron, and zinc are now part of the ingredient model. New values default to zero; you can fill them in over time through import or editing.
- Plan Builder – Plan totals: Under Sodium in Plan Totals, open More micronutrients to see plan-wide Potassium, Calcium, Magnesium, Iron, and Zinc in milligrams, styled like the rest of the sidebar. Totals refresh as you build.
Changed
- Bulk ingredient import: The CSV template and import flow include the new micronutrient columns so large libraries stay complete.
- Single ingredient edit: Add and edit forms include the four new mineral fields.
- Command-line import: Optional columns for the new minerals (defaults to zero if omitted).
- Search, recipes, and scaling: Typeahead, recipe application, and scaling carry the new fields through so totals stay accurate as you work.
Version 1.4.0
Changed
- Plan Builder – Reorder ingredients: Drag using the handle in the lock column for clearer control. While dragging, a light ghost row follows the pointer and the drop row highlights so you know exactly where the ingredient will land.
Version 1.3.0
Added
- Recipe notes: Catalogue and custom recipes can store method and instructions. When you apply a recipe in the Plan Builder, those notes flow into Notes for this meal, alongside ingredients.
- One-time backfill for teams with existing catalogues: A dedicated import path helps bring historical recipe notes in from a spreadsheet where needed.
- Bulk meal import: The meals CSV template includes a Notes column so you can capture guidance per meal during large imports.
- Command-line meal import: Long-format meal CSVs can carry optional notes per meal.
- Admin and coach recipe forms: Notes field on add/edit; saved notes return when you pick the recipe again.
- Plan Builder – Notes look consistent: Meal notes use the same font and colour rhythm as the rest of the builder.
Changed
- Apply Recipe in one step: Choosing a recipe fills the meal name, ingredients, and notes together so the meal reflects the full recipe.
Version 1.2.0
Added
- Export Grocery Shopping List: New action beside meal plan export. Generates a branded PDF with weekly ingredient totals (daily amounts scaled to your chosen week length), with sensible grouping for grams, millilitres, and serve-based foods.
Changed
- Clearer export naming: The former Generate PDF control is now Export Meal Plan so coaches know exactly what it does.
Version 1.1.0
Added
- Sticky macro bar in Plan Builder: A bottom bar shows Calories, Protein, Carbs, and Fat with Target, Current, and Remaining; you can collapse it and your choice is remembered. Colours align with plan totals for quick scanning. Works on narrow screens (stacked layout) and respects safe areas on phones. Labels say Remaining in full.
Changed
- Plan Builder on phones: Ingredient rows become easy-to-read cards instead of a wide table—name, amount, calories, macros, then delete—without sideways scrolling.
- Meal totals on small screens: Macro labels spell out P, C, F, Fi, Na, Cals with simple separators so “meal total” lines stay readable.
- Header logo on mobile: The logo keeps proper proportions and no longer stretches awkwardly.
Fixed
- Mobile ingredient cards: Amount and calories sit in separate columns with short labels so values never run together.
- Mobile meal actions: Scale, Apply Recipe, and Delete wrap cleanly on narrow screens.
Version 1.0.0
Added
- Initial launch