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.

App
InstacartWordPressMarketingOperationsContent GenerationData Sync
PromptCreate

Build me an app that shows the shoppable-link health of my entire WordPress recipe archive on one screen. I run a recipe site and I use Instacart shoppable recipe pages, but those links expire (30 days by default, 365 at most), so links I generated months ago are quietly dead on my highest-traffic posts. I need a working surface for coverage and renewal, not a scheduled job.

Main view: a table of every published recipe post, loaded with WordPress List Posts (page through everything published, not just the first page). Columns: post title linking to the live post, publish date, last modified date, the current Instacart link, the link's expiry date, a days-remaining countdown, and a status badge that is one of Live, Expiring, Expired, or No link. Status is derived from the stored expiry date and the warning threshold from settings. Sort by days remaining ascending by default so the most urgent recipes are on top, and let me sort by title, publish date, and status too. Include a search box on title.

Store one record per recipe post in the app's own storage so the countdown survives between sessions: post id, title, post URL, the generated Instacart link URL, the expiry date, the expiry window that was used, when it was last generated, and the outcome of the last generation attempt including any error text. Nothing about the countdown should depend on re-reading the post body.

A Refresh archive button re-reads posts from WordPress List Posts, adds new recipes, and updates titles and modified dates. During that scan, look inside each post body for an existing instacart.com link so recipes that already got a link (by hand or before the app existed) are picked up rather than shown as missing. If a link is found but the app has no expiry date for it, mark the expiry as unknown and treat it as needing renewal rather than guessing.

Filters across the top: No link yet, Expiring in the next 14 days, Already expired, and All. The 14 comes from the warning threshold in settings, so the filter label should follow that setting. Above the filters, show a top-line count of live vs expiring vs missing across the whole archive, and make each count clickable so it applies the matching filter.

Every row has a checkbox and a Generate button, plus a Generate selected action in a bulk bar when one or more rows are ticked. Both start the same background agent, once per selected recipe, and the row shows the agent's live state (queued, running, done, failed) with the error message inline on failure. The table should update as each agent finishes so I can watch a batch drain.

The embedded background agent, for one recipe post, does this: read the full post body with WordPress Retrieve a Post; extract the ingredient list with quantities and units, normalizing to the units Instacart accepts (each, lb, oz, g, kg, ml, L, cup, tbsp, tsp, gallon) and falling back to each when a unit is not convertible; pull the recipe title, hero image URL, and the instruction steps if the post has them; then call Instacart Create Recipe Page with those ingredients as line items with their measurements and with the expiry window set to the row override if there is one, otherwise the default from settings. Take the returned link URL, and write it back into the post body under the recipe card with WordPress Update a Post using the placement snippet from settings. If the snippet is already present in the body, replace it in place rather than appending a second copy, so re-running is safe. Leave the rest of the post content, its status, categories, and tags untouched. Finally, save the link URL, the expiry window used, and the computed expiry date (generation date plus the window) back onto the app's record for that post so the countdown starts fresh.

If the agent cannot find a usable ingredient list, it should stop rather than invent quantities: mark the record as needing attention with a short reason, and leave the post untouched.

Settings view: the default expiry window in days (1 to 365, default 30), the warning threshold in days that decides when a link counts as expiring (default 14), the link placement snippet template with a placeholder for the generated URL and a stable marker the app can find on re-runs, and which posts count as recipes (a category, tag, or post type filter applied to WordPress List Posts). Settings are saved in the app and used by every generation from then on.

Keep it to two views, the coverage table and settings. No scheduled runs, no notifications. Nothing writes to WordPress except the link snippet.

What does this prompt do?

  • Lists every published recipe on your site in one table with its shopping link, the date that link stops working, and a days-remaining countdown.
  • Flags the recipes that need you: no link yet, expiring in the next two weeks, or already dead. A running count of live, expiring, and missing sits at the top of the screen.
  • Hit Generate on a row and a background agent reads the post, pulls out the ingredients with their quantities and units, builds a fresh shopping link, and drops it back under the recipe card for you.
  • Tick several recipes and renew them all in a single pass, with each new expiry date saved so the countdown is still right the next time you open the app.

What do I need to use this?

  • A WordPress site where your recipes are published as posts and you can edit them
  • An Instacart developer account that can create shoppable recipe pages
  • Recipes with their ingredients written out in the post body, ideally with quantities and units
  • A way to tell recipes apart from your other posts, such as a category or tag

How can I customize it?

  • Set the default expiry window for new links, from a few days up to a full year, and override it on any single recipe
  • Edit the wording and placement of the snippet that gets inserted under each recipe card
  • Change how early a link counts as expiring, so recipes flag sooner than fourteen days out
  • Point the app at the category, tag, or post type that holds your recipes

FAQs

Why do Instacart shopping links stop working?
Every shoppable link Instacart creates carries an expiry date. The standard window is 30 days and the longest you can ask for is a year. Once a link passes that date it no longer opens a cart, which is how your oldest and highest-traffic recipes end up with a button that quietly does nothing. This app keeps the expiry date for every recipe so you can renew before that happens.
Can I renew more than one recipe at a time?
Yes. Filter down to the recipes that are expiring or already dead, tick as many as you want, and start them all in one pass. Each one runs in the background and the table updates as they finish.
Will this change anything else in my posts?
No. Only the shopping link section under the recipe card is written back, and the app replaces the previous snippet rather than stacking a second one. The rest of your post, its publish status, and its categories stay exactly as they were.
Does it work with recipes I already added links to by hand?
Yes. When the app scans your archive it notices links already sitting in a post and picks them up. If it cannot tell when an older link expires it marks the date as unknown so you can regenerate it and start a clean countdown.
What happens to a post with no proper ingredient list?
It gets flagged instead of guessed at. The agent will not invent quantities, so the row is marked as needing attention and you can fix the ingredient list or skip that recipe.
Do I need a plugin installed on my site?
No plugin. The app reads and updates your posts through your normal WordPress login, so nothing new gets installed on the site itself.

Related templates

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.

Instacart
Airtable
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
Content decay review board for your WordPress pages

Replace the monthly decay spreadsheet with a live board of pages losing search traffic, moving each one from spotted to refreshed and monitored.

Google Search Console
WordPress
Google Analytics
App
Translation coverage grid for your published WordPress posts

One screen showing every published post, the languages it exists in, and which translations fell behind after the English was edited.

DeepL
WordPress
Google Sheets
App
Content audit and refresh desk for your marketing site

Pull every page on your site into one ranked table, see what is thin or broken, and hand your team a ready-to-edit draft without anything going live.

Firecrawl
WordPress
Google Sheets
App
Turn every WordPress post into a narrated audio version

A studio your content team opens after publishing to clean up the script, pick a voice, and ship a listenable version of every post.

Deepgram
WordPress
Cloudinary
App

Stop letting your best recipes lose their shopping links.

Set this up once and you get a single screen showing which recipes are covered, which are about to expire, and a button that renews them in batches.