AutomationFlowsGeneral › Automated Weekly Meal Plan Generator

Automated Weekly Meal Plan Generator

Original n8n title: Code Schedule (http Request) #5

Code Schedule. Uses scheduleTrigger, httpRequest, manualTrigger, stickyNote. Scheduled trigger; 10 nodes.

Cron / scheduled trigger★★★★☆ complexity10 nodesHTTP Request
General Trigger: Cron / scheduled Nodes: 10 Complexity: ★★★★☆ Added:

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "nodes": [
    {
      "id": "396bb28b-e40d-4bea-aa80-4abd04db045a",
      "name": "Friday 8pm",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        100,
        120
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                5
              ],
              "triggerAtHour": 20
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "993f0d31-5639-4cea-b2f8-d1a41ecdeb83",
      "name": "Create Meal Plan",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1080,
        120
      ],
      "parameters": {
        "url": "={{ $('Config').first().json.mealieBaseUrl }}/api/households/mealplans",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "responseFormat": "json"
            }
          }
        },
        "jsonBody": "={{ $json }}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "ad53512d-7246-49f4-a86b-f258b7c1c47e",
      "name": "When clicking \"Test workflow\"",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        100,
        320
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c0d1d7e0-9411-4e6a-871a-0374b8a9f5db",
      "name": "Get Recipes",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        640,
        120
      ],
      "parameters": {
        "url": "={{ $json.mealieBaseUrl }}/api/recipes",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "perPage",
              "value": "100"
            },
            {
              "name": "categories",
              "value": "={{ $json.mealieCategoryId }}"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.1
    },
    {
      "id": "2f9757fc-77f5-4bda-ae2e-7088ea5c114d",
      "name": "Config",
      "type": "n8n-nodes-base.set",
      "position": [
        380,
        120
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cd2665dd-b505-41e4-936d-cfa2de7bd09b",
              "name": "numberOfRecipes",
              "type": "number",
              "value": 5
            },
            {
              "id": "e09da5c5-3f0d-4cd3-909d-e3df2888abde",
              "name": "offsetPlanDays",
              "type": "number",
              "value": 3
            },
            {
              "id": "80e95139-83df-45ae-99a0-fc50d3e9475f",
              "name": "mealieCategoryId",
              "type": "string",
              "value": "6ec172b7-a87d-4877-8fe3-34cecc20f2c5"
            },
            {
              "id": "f511e874-c373-4648-9e49-120367474d6d",
              "name": "mealieBaseUrl",
              "type": "string",
              "value": "http://192.168.1.5:9925"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "fed805ea-0580-444d-8312-a68b25e91bbd",
      "name": "Generate Random Items",
      "type": "n8n-nodes-base.code",
      "position": [
        860,
        120
      ],
      "parameters": {
        "jsCode": "const numberOfRecipes = $('Config').first().json.numberOfRecipes;\nconst offsetPlanDays = $('Config').first().json.offsetPlanDays;\nconst items = $input.first().json.items;\n\nlet planFirstDate = new Date();\nplanFirstDate.setDate(planFirstDate.getDate() + offsetPlanDays);\n\nconst recipeList = [];\nconst randomNums = [];\nlet currentItem = 0;\n\nwhile (recipeList.length < numberOfRecipes) {\n  const randomNum = Math.floor(Math.random() * Math.floor(items.length));\n\n  if (!randomNums.includes(randomNum)) {\n    const thisRecipe = items[randomNum];\n\n    const newDate = new Date(planFirstDate);\n    newDate.setDate(planFirstDate.getDate() + currentItem);\n  \n    const planDate = [\n      newDate.getFullYear(),\n      ('0' + (newDate.getMonth() + 1)).slice(-2),\n      ('0' + newDate.getDate()).slice(-2)\n    ].join('-');\n  \n    const planDay = {\n      \"date\": planDate,\n      \"entryType\": \"dinner\",\n      \"recipeId\": thisRecipe.id,\n      \"name\": thisRecipe.name\n    };\n\n    currentItem++;\n    recipeList.push(planDay);\n    randomNums.push(randomNum);\n  }\n}\n\nreturn recipeList;"
      },
      "typeVersion": 2
    },
    {
      "id": "f440ce9d-cc27-4982-a0bd-b0ce2e5217d9",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40,
        -60
      ],
      "parameters": {
        "color": 4,
        "height": 340,
        "content": "## Trigger\nSet the trigger to run when you like"
      },
      "typeVersion": 1
    },
    {
      "id": "2bac2f08-2969-4f47-9fce-0e7de416cd09",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        280,
        -60
      ],
      "parameters": {
        "color": 5,
        "width": 300,
        "height": 340,
        "content": "## Update this Config\nSet the base Url of your Mealie instance\nSet number of recipes to generate and number of days to offset the plan (0 will start today).\nGrab a category id from Mealie (or leave blank for all categories)"
      },
      "typeVersion": 1
    },
    {
      "id": "a2850e39-c25f-4210-8f9e-a657c0c63bf5",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        40,
        -280
      ],
      "parameters": {
        "width": 540,
        "height": 220,
        "content": "## Get started\n* Set up a credential for your Mealie API token\n* Apply the credential to the 2 Http request nodes\n* Set schedule trigger and desired config"
      },
      "typeVersion": 1
    },
    {
      "id": "20d7301c-8946-45c3-8f5f-fbe2fc80cf37",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        580,
        -60
      ],
      "parameters": {
        "color": 7,
        "width": 660,
        "height": 340,
        "content": "## Workflow logic\n* Get all recipes from Mealie (within category if supplied)\n* Randomly pick out the number set in the config\n* Create dinner meal plans for the upcoming days"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Config": {
      "main": [
        [
          {
            "node": "Get Recipes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Friday 8pm": {
      "main": [
        [
          {
            "node": "Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Recipes": {
      "main": [
        [
          {
            "node": "Generate Random Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate Random Items": {
      "main": [
        [
          {
            "node": "Create Meal Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \"Test workflow\"": {
      "main": [
        [
          {
            "node": "Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow automates the generation of weekly meal plans and recipe suggestions, saving you time on planning healthy, varied meals for your family or personal routine. It suits busy professionals or home cooks who want consistent, effortless organisation without manual effort each week. The key step involves a scheduled HTTP request to a meal planning API on Friday evenings, pulling in fresh recipe ideas based on your preferences, followed by custom code to randomise selections for diversity.

Use this when you need a reliable weekly refresh of meal ideas integrated with simple HTTP endpoints, especially if you're comfortable tweaking code for personalisation. Avoid it for complex dietary tracking requiring dedicated apps like MyFitnessPal, or if you prefer real-time adjustments over fixed scheduling. Common variations include swapping the HTTP request for integrations like Google Sheets to store plans or adding email nodes to notify you directly.

About this workflow

Code Schedule. Uses scheduleTrigger, httpRequest, manualTrigger, stickyNote. Scheduled trigger; 10 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Create Threads on Bluesky. Uses httpRequest, scheduleTrigger, stickyNote, splitInBatches. Scheduled trigger; 20 nodes.

HTTP Request
General

Backup workflows to git repository on Gitea. Uses n8n, scheduleTrigger, stickyNote, httpRequest. Scheduled trigger; 20 nodes.

n8n, HTTP Request
General

Datetime Todoist. Uses scheduleTrigger, todoist, dateTime, stickyNote. Scheduled trigger; 19 nodes.

Todoist, Crypto, Item Lists +1
General

Http Schedule. Uses scheduleTrigger, httpRequest, stickyNote, @horka. Scheduled trigger; 18 nodes.

HTTP Request, @Horka
General

💥workflow n8n d'Auto-Post sur les réseaux sociaux - vide. Uses scheduleTrigger, googleSheets, httpRequest, stickyNote. Scheduled trigger; 15 nodes.

Google Sheets, HTTP Request