Run your nutrition clients' weekly meal plans from one console

See who is due, build a week of dinners on demand, swap anything you do not like, then send the recipe and grocery links yourself.

App
InstacartAirtableGmailOperationsContent GenerationEmail Automation
PromptCreate

Build me a console I open through the week to run my nutrition clients' weekly meal plans, instead of rebuilding every plan by hand each Sunday. This is my working surface, not an unattended automation. Plans get built on demand when I click a button, and nothing reaches a client until I have read the plan and pressed Send myself. Design every screen around that: the app should always make it obvious what is a draft I still owe a decision on versus what has actually gone out.

The main view is a client roster read with Airtable List Records against my clients table. Each row shows the client's name, their dietary restrictions, their allergies, household size, delivery postal code, and the date their last plan went out. Pin anyone due this week to the top of the roster, where due means their last plan went out seven or more days ago or they have never had one. Put a clear badge on any client I have not sent anything to in over 10 days so the ones slipping through the cracks are impossible to miss. Restrictions and allergies belong on the row itself, not hidden behind a click, because they are the thing I scan for.

Opening a client gives me their detail view: their profile fields at the top, then their plan history underneath, read with Airtable List Records against a plan history table filtered to that client. Each past plan shows the date it was sent, the dinners it contained, and the recipe and grocery links that went with it. Above the history sits a Build this week's plan button that kicks off a background agent for that one client.

The agent's first step is Instacart Get Nearby Retailers for that client's delivery postal code, before it plans anything. The plan needs to name the stores that actually deliver to them, and there is no point building a plan a client cannot order. If no retailers come back, stop right there: do not select dinners, do not create any pages. Write a short note back to that client's row with Airtable Update Record explaining that no delivery coverage was found, surface that note on their card in the roster, and skip them. Note that this lookup covers US five digit ZIP codes and Canadian postal codes only, so check the format first and treat an unusable postal code the same way, as a skip with a note rather than a failed run.

With coverage confirmed, the agent selects the week's dinners. Dietary restrictions and allergies are hard filters, never preferences: an ingredient that touches an allergy or a restriction must not appear in a dinner or anywhere in the grocery list, and working around it with a trace amount is not acceptable. Read the client's plan history and exclude every dinner they received in the last two weeks so the rotation genuinely moves on. Scale ingredient quantities to their household size, and deliberately overlap ingredients across the week's dinners so the client buys fewer distinct items and wastes less food.

For each selected dinner, call Instacart Create Recipe Page to produce a shoppable recipe page with its ingredients and cooking instructions. Recipe ingredients go in the measurements field. Then call Instacart Create Shopping List Page exactly once for the whole plan, rolling every ingredient from every dinner into one deduplicated list where repeated ingredients are merged into a single line item at the combined quantity. The point of that single list is that my client checks out once instead of five separate times, so never generate a shopping list per recipe. Shopping list line items use line_item_measurements, not measurements, so do not reuse the recipe payload shape here.

Instacart only accepts a limited set of measurement units: each, lb, oz, g, kg, ml, L, cup, tbsp, tsp, and gallon. Anything else is rejected with a 4xx error, so normalize every quantity into the nearest supported unit before creating any page. Where a client's restriction field maps onto a supported health filter such as VEGAN, GLUTEN_FREE, ORGANIC, or KOSHER, pass it through onto the generated pages. Set expires_in generously, around 365 days, so links still work if a client comes back to an older plan. Both create calls return a products_link_url, which is the shareable page: store those URLs on the plan record and reuse them rather than regenerating a page every time a screen loads.

The agent finishes by writing the plan back with Airtable Update Record: the dinners chosen, the individual recipe links, the single grocery link, and the retailers that deliver to that client, all saved in a draft state that is explicitly not sent. The app then shows me that draft for review, so the agent's whole job ends at a proposal sitting in my queue.

My review screen lays out the drafted plan: every dinner with its ingredients and its recipe link, the one combined grocery link called out as the way to order the whole week at once, and the stores that deliver to that client. Every meal has a Swap control. Swapping asks the agent for a replacement dinner under the same restriction, allergy, and no repeats in two weeks rules, creates a recipe page for the new dinner, and then rebuilds the combined shopping list from scratch, because changing a dinner changes the deduplicated ingredient rollup. Save the revised draft back with Airtable Update Record. I may swap several meals before I am happy, so this has to work repeatedly on the same plan.

When the plan is right, a Send button emails the client with Gmail Send a Message: the week's dinners, each recipe link, the single grocery link highlighted as the fastest way to order everything at once, and the stores that deliver to them, written in a warm coaching voice rather than a system notification. Immediately after the send succeeds, call Airtable Update Record to stamp the sent date and the dinners used onto the client's row and the plan record, and refresh the roster so the change shows up right away: that client drops out of the due this week group and their attention badge clears without me reloading the app.

A few operational details. Airtable allows about five requests per second per base and batches of up to 10 records, so page through the roster rather than firing a request per client. Never let one client's problem take down the screen: a failed build, a missing postal code, or an empty retailer list should show as a note on that client and leave the rest of the roster working. Do not send a plan twice, and make an already sent plan visibly read only in the history so I cannot confuse it with a live draft.

What does this prompt do?

  • Opens on a client roster read from your Airtable base showing each person's dietary restrictions, allergies, household size, delivery postal code, and when their last plan went out, with anyone due this week pinned to the top and a badge on clients you have not sent anything to in over 10 days.
  • Opening a client shows their full plan history plus a Build this week's plan button that kicks off a background assistant, so you make plans when you sit down to work rather than on somebody else's schedule.
  • The assistant picks dinners that respect that client's restrictions and skips anything they received in the last two weeks, builds a shoppable page for each dinner, and rolls every ingredient into one combined grocery list so your client checks out once instead of five times.
  • Nothing reaches a client until you say so: review the drafted plan in the app, swap any meal you do not like, then hit Send to email their recipe links and single grocery link, which stamps the sent date back so the roster updates on the spot.

What do I need to use this?

  • An Airtable base with a client table holding name, email, dietary restrictions, allergies, household size, delivery postal code, and the date their last plan was sent
  • A second Airtable table for plan history, so the app can show what each client has already received and avoid repeating it
  • An Instacart developer account for building the shoppable recipe pages and grocery lists
  • A Gmail account you send client email from
  • Clients with US or Canadian postal codes, since grocery delivery and the store lookup cover those two countries

How can I customize it?

  • Change what counts as due this week and how many days without contact earns the attention badge, if you coach on a fortnightly rhythm rather than a weekly one.
  • Set how many dinners make up a plan and how far back the repeat check looks before a meal is allowed to come around again.
  • Adjust the email wording and add your own coaching note or branding, and send yourself a copy of the first few before they go to clients.

FAQs

Will this email my clients without me seeing the plan first?
No. Building a plan only ever creates a draft inside the app. You review it, swap anything you do not like, and nothing reaches the client until you press Send yourself.
Do my clients need an Instacart account?
Only when they are ready to check out. The recipe pages and the grocery list open in any browser, so a client can read the plan or print the list without signing up for anything.
How does it stop clients getting the same dinners over and over?
It reads that client's plan history before choosing anything and rules out every meal they received in the last two weeks, so the rotation moves on by itself.
What happens if no shops deliver to a client's area?
That client gets skipped with a note on their card rather than a plan they cannot actually order. The app checks which shops deliver to their postal code before it builds anything.
Can I swap out a meal I do not like?
Yes. Swapping a dinner picks a replacement under the same restrictions and rebuilds the combined grocery list, so your client still gets one link that covers the whole week.
Why one grocery list instead of a list per recipe?
So your client checks out once. Ingredients shared across the week's dinners get merged into a single line at the combined quantity instead of appearing five separate times.

Related templates

Replace the dispatch whiteboard with a live production board

See every install this week day by day, with the crew, the homeowner, whether materials were ordered, and the latest jobsite photos.

JobNimbus
CompanyCam
Gmail
App
Turn last week's cafe sales into this week's grocery order

See exactly which ingredients next week needs based on what you actually sold, adjust anything by hand, then build a one-click grocery cart.

Instacart
Square
Google Sheets
App
Instagram UGC rights tracker and repost approval board

See every customer photo that tags your brand, ask for permission in one click, and repost only once a yes is on the record.

Instagram
Airtable
Slack Bot
App
Job search command center with a self-filling pipeline board

Search live job postings, save the good ones to a pipeline board, and see what each role really pays before you apply.

JobsPipe
General Input Database
Google Docs
+1
App
Shoppable link console for your WordPress recipe archive

See every published recipe, whether it has a live Instacart shopping link, and how many days before that link dies, then renew a whole batch in one pass.

Instacart
WordPress
App
A verification desk for every document your team scans

See every scan next to the details pulled out of it, correct anything wrong, and let only verified numbers reach your ledger sheet.

JigsawStack
Airtable
Google Sheets
App

Stop rebuilding every client's meal plan by hand on Sunday.

Open one console, see who is due, build a week of dinners in a click, and send it only once you are happy with it.