This workflow follows the Agent → Google Sheets recipe pattern — see all workflows that pair these two integrations.
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 →
{
"name": "recipes-ingredients",
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
-3680,
304
],
"id": "a0f59788-89d8-4b24-8573-885e97a99513",
"name": "When clicking \u2018Execute workflow\u2019"
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8",
"mode": "list",
"cachedResultName": "ingredients",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Sayfa1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit#gid=0"
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-3040,
304
],
"id": "cdbdbd7d-96ec-4772-9b95-58c448d272c1",
"name": "Get row(s) in sheet",
"retryOnFail": false,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"options": {}
},
"type": "n8n-nodes-base.splitInBatches",
"typeVersion": 3,
"position": [
-2256,
304
],
"id": "699fdef4-8055-4d05-9ded-ccd3d5b78e2d",
"name": "Loop Over Items"
},
{
"parameters": {
"promptType": "define",
"text": "=\u00dcr\u00fcn ad\u0131: {{ $('If').item.json.Name }}\n\nG\u00f6rev: Yukar\u0131daki kurallara g\u00f6re bu \u00fcr\u00fcn i\u00e7in JSON \u00fcret.",
"hasOutputParser": true,
"options": {
"systemMessage": "Sen bir i\u00e7erik \u00fcretim ajan\u0131s\u0131n. \u00c7IKTI FORMATIN KES\u0130NL\u0130KLE YALNIZCA GE\u00c7ERL\u0130 JSON OLMALIDIR.\nMarkdown, kod blo\u011fu, a\u00e7\u0131klama, ek metin YOK.\n\nG\u00f6rev: Verilen \u00fcr\u00fcn i\u00e7in T\u00fcrk\u00e7e bir ba\u015fl\u0131k, a\u00e7\u0131klama ve anahtar kelimeler \u00fcret.\n\nJSON \u015eEMASI (zorunlu):\n{\n \"title\": \"string, 50-60 karakter\",\n \"description\": \"string, 140-150 karakter\",\n \"keywords\": [\"string\", \"string\", \"string\", ...] // 5 ila 7 kelime\n}\n\nKurallar:\n- Sadece {\"title\": \"...\", \"description\": \"...\", \"keywords\": [...]} anahtarlar\u0131n\u0131 d\u00f6nd\u00fcr.\n- Ba\u015fl\u0131k (title) YALNIZCA \u00fcr\u00fcn ad\u0131 + varsa bilimsel ad\u0131 parantez i\u00e7inde olmal\u0131d\u0131r.\n Ba\u015fl\u0131kta ba\u015fka s\u0131fat, a\u00e7\u0131klama, slogan, ek bilgi, noktalama veya tire (-) kullan\u0131lamaz.\n \u2705 \u00d6rnek do\u011fru: \"Domates (Solanum lycopersicum)\"\n \u274c Yanl\u0131\u015f: \"Domates (Solanum lycopersicum) - K\u0131rm\u0131z\u0131 ve Lezzetli Sebze\"\n- A\u00e7\u0131klama tek sat\u0131r olmal\u0131, dolgu s\u00f6zc\u00fck yok.\n- Keywords T\u00fcrk\u00e7e, sebze ile do\u011frudan ilgili 5\u20137 kelime olmal\u0131.\n- Uzunluk kurallar\u0131n\u0131 kat\u0131 uygula.\n- JSON d\u0131\u015f\u0131na \u00e7\u0131kma, yorum ekleme, fazladan alan ekleme.\n\n\u00c7\u0131kt\u0131 \u00f6rne\u011fi:\n{\n \"title\":\"Domates (Solanum lycopersicum)\",\n \"description\":\"Domates, k\u0131rm\u0131z\u0131 rengi ve etli dokusuyla \u00f6ne \u00e7\u0131kar; likopen, C ve K vitamini i\u00e7erir. Salata ve soslarda do\u011fal tat ve besleyici de\u011fer sunar.\",\n \"keywords\":[\"domates\",\"sebze\",\"likopen\",\"salata\",\"sos\",\"k\u0131rm\u0131z\u0131\",\"besleyici\"]\n}\n"
}
},
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 2.2,
"position": [
-864,
304
],
"id": "9225e3af-f5d2-4e60-9c3a-334a7e293504",
"name": "AI Agent1",
"retryOnFail": true,
"onError": "continueErrorOutput"
},
{
"parameters": {
"model": "openai/gpt-4.1",
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"typeVersion": 1,
"position": [
-864,
560
],
"id": "8e43f1a5-39dd-4246-b7a1-27fa4af4fb32",
"name": "OpenRouter Chat Model1",
"credentials": {
"openRouterApi": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"jsonSchemaExample": "{\n \"title\": \"string\",\n \"description\": \"string\",\n \"keywords\": [\"string\"]\n}"
},
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"typeVersion": 1.3,
"position": [
-720,
560
],
"id": "dd5ef115-d3ab-470f-81db-304e342d1ceb",
"name": "Structured Output Parser"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8",
"mode": "list",
"cachedResultName": "ingredients",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Sayfa1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Title": "={{ $json.output.title }}",
"Description": "={{ $json.output.description }}",
"Keywords": "={{ $json.output.keywords }}",
"row_number": "={{ $('Get row(s) in sheet').item.json.row_number }}",
"ProcessEndTime": "={{ new Date().toISOString() }}",
"ProcessStatus": "COMPLETED",
"ProcessLastUpdateTime": "={{ new Date().toISOString() }}",
"ProcessCurrentStage": "AI",
"Status": "1"
},
"matchingColumns": [
"row_number"
],
"schema": [
{
"id": "Order",
"displayName": "Order",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Name",
"displayName": "Name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Title",
"displayName": "Title",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Description",
"displayName": "Description",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Keywords",
"displayName": "Keywords",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Status",
"displayName": "Status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessStartTime",
"displayName": "ProcessStartTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "ProcessLastUpdateTime",
"displayName": "ProcessLastUpdateTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessEndTime",
"displayName": "ProcessEndTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessCurrentStage",
"displayName": "ProcessCurrentStage",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessStatus",
"displayName": "ProcessStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessErrorDetails",
"displayName": "ProcessErrorDetails",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-240,
288
],
"id": "f35855a2-79cb-4ea5-8a23-9422aac3fd6f",
"name": "Update row in sheet",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8",
"mode": "list",
"cachedResultName": "ingredients",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Sayfa1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Status": "-1",
"row_number": "={{ $('Loop Over Items').item.json.row_number }}",
"ProcessLastUpdateTime": "={{ new Date().toISOString() }}",
"ProcessEndTime": "={{ new Date().toISOString() }}",
"ProcessCurrentStage": "AI",
"ProcessStatus": "ERROR"
},
"matchingColumns": [
"row_number"
],
"schema": [
{
"id": "Order",
"displayName": "Order",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Name",
"displayName": "Name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Title",
"displayName": "Title",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Description",
"displayName": "Description",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Keywords",
"displayName": "Keywords",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Status",
"displayName": "Status",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "ProcessStartTime",
"displayName": "ProcessStartTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "ProcessLastUpdateTime",
"displayName": "ProcessLastUpdateTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessEndTime",
"displayName": "ProcessEndTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessCurrentStage",
"displayName": "ProcessCurrentStage",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessStatus",
"displayName": "ProcessStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessErrorDetails",
"displayName": "ProcessErrorDetails",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-224,
912
],
"id": "93ca896a-6c1d-458e-a729-899bac99b542",
"name": "Update row in sheet1",
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 2
},
"conditions": [
{
"id": "b61fcdb2-ac30-43ce-ba81-1e8057b3ae2f",
"leftValue": "={{ $json._shouldContinue }}",
"rightValue": "",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
}
}
],
"combinator": "and"
},
"options": {}
},
"type": "n8n-nodes-base.if",
"typeVersion": 2.2,
"position": [
-1408,
-16
],
"id": "1d2644e4-2073-4678-8d68-962efde505b1",
"name": "If"
},
{
"parameters": {
"jsCode": "// Code node\nconst items = $input.all();\n\nreturn items.map(item => {\n const name = item.json.Name?.toString() || '';\n const status = item.json.Status?.toString() || '';\n \n // Name bo\u015f DE\u011e\u0130L VE (Status bo\u015f VEYA -1)\n const shouldContinue = name !== '' && (status === '' || status === '-1');\n \n return {\n json: {\n ...item.json,\n _shouldContinue: shouldContinue\n }\n };\n});"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
-1792,
320
],
"id": "2a6a3320-e4ee-47cd-9c89-3097028205d9",
"name": "Code in JavaScript"
},
{
"parameters": {
"operation": "update",
"documentId": {
"__rl": true,
"value": "1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8",
"mode": "list",
"cachedResultName": "ingredients",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Sayfa1",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1gyQ9yWDir-WXZ-nDJhBFutzsHDuNIGbUUR6jhGreIB8/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"ProcessCurrentStage": "FIELD",
"ProcessStatus": "COMPLETED",
"row_number": "={{ $json.row_number }}",
"ProcessLastUpdateTime": "={{ new Date().toISOString() }}",
"ProcessStartTime": "={{ new Date().toISOString() }}"
},
"matchingColumns": [
"row_number"
],
"schema": [
{
"id": "Order",
"displayName": "Order",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Name",
"displayName": "Name",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Title",
"displayName": "Title",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Description",
"displayName": "Description",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "Keywords",
"displayName": "Keywords",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "ProcessStartTime",
"displayName": "ProcessStartTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessLastUpdateTime",
"displayName": "ProcessLastUpdateTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": false
},
{
"id": "ProcessEndTime",
"displayName": "ProcessEndTime",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "ProcessCurrentStage",
"displayName": "ProcessCurrentStage",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "ProcessStatus",
"displayName": "ProcessStatus",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "ProcessErrorDetails",
"displayName": "ProcessErrorDetails",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true,
"removed": true
},
{
"id": "row_number",
"displayName": "row_number",
"required": false,
"defaultMatch": false,
"display": true,
"type": "number",
"canBeUsedToMatch": true,
"readOnly": true,
"removed": false
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"type": "n8n-nodes-base.googleSheets",
"typeVersion": 4.7,
"position": [
-1184,
-224
],
"id": "b3fe65d2-2adf-42a4-a073-7cf87264cb4f",
"name": "Update row in sheet3",
"retryOnFail": false,
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
}
}
],
"connections": {
"When clicking \u2018Execute workflow\u2019": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"AI Agent1": {
"main": [
[
{
"node": "Update row in sheet",
"type": "main",
"index": 0
}
],
[
{
"node": "Update row in sheet1",
"type": "main",
"index": 0
}
]
]
},
"OpenRouter Chat Model1": {
"ai_languageModel": [
[
{
"node": "AI Agent1",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Agent1",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Update row in sheet": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"If": {
"main": [
[
{
"node": "Update row in sheet3",
"type": "main",
"index": 0
},
{
"node": "AI Agent1",
"type": "main",
"index": 0
}
],
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Update row in sheet1": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "33f06b98-ac9b-4966-9e53-8faa97587a49",
"meta": {
"templateCredsSetupCompleted": true
},
"id": "j3WeD0aRJkzn2glV",
"tags": []
}
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.
googleSheetsOAuth2ApiopenRouterApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
recipes-ingredients. Uses googleSheets, agent, lmChatOpenRouter, outputParserStructured. Event-driven trigger; 11 nodes.
Source: https://github.com/kenangundogan/n8n-workflow-automation/blob/a39dbb97f16bbfdc34ad6d19255abef4e163f59b/workflows/recipes-ingredients.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow transforms your Telegram bot into an intelligent creative assistant. It can chat conversationally, fetch trending image prompts from PromptHero for inspiration, or perform a deep "remix"
🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
YouTube Strategist. Uses formTrigger, splitOut, splitInBatches, agent. Event-driven trigger; 50 nodes.
This advanced multi-phase n8n workflow automates the complete research, analysis, and ideation pipeline for a YouTube strategist. It scrapes competitor channels, analyzes top-performing titles and thu