This workflow corresponds to n8n.io template #14858 — we link there as the canonical source.
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 →
{
"id": "s4jgZO9U3unLVD9G",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "AI Fitness Coach",
"tags": [],
"nodes": [
{
"id": "8ca44c49-b922-4b49-b0b0-0485ebbe4284",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
-928
],
"parameters": {
"color": 7,
"width": 752,
"height": 384,
"content": "## Reset Daily Nutrition Data\nThis section runs on a schedule to reset daily user metrics such as calories, protein and risk count. It ensures that each day starts fresh, allowing accurate daily tracking and preventing old data from affecting new calculations.\n"
},
"typeVersion": 1
},
{
"id": "f2de3585-6f46-4f65-83dc-9b7666d9c95d",
"name": "Receive User Input",
"type": "n8n-nodes-base.webhook",
"position": [
-224,
-224
],
"parameters": {
"path": "diet-input",
"options": {},
"responseMode": "responseNode"
},
"typeVersion": 2.1
},
{
"id": "81c70aca-5fe3-4677-a979-6fcd9c148f03",
"name": "Fetch User Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
0,
-224
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $json.body.phone }}",
"lookupColumn": "Phone"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1453522644,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit#gid=1453522644",
"cachedResultName": "Fittness tracker"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit?usp=drivesdk",
"cachedResultName": "LinkedIn Profile Monitor"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "9590adbb-f114-4828-8563-f8498144147d",
"name": "Validate User Exists",
"type": "n8n-nodes-base.if",
"position": [
224,
-224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "4669e763-a21f-400f-b742-95dc12528632",
"operator": {
"type": "object",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "9c594b08-7633-4573-96f8-e59344553ab0",
"name": "AI Nutrition Analyzer",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
640,
-240
],
"parameters": {
"text": "=You are an advanced nutrition and fitness AI.\n\nUser Goal: {{ $json.Goal }}\nDaily Calorie Target: {{ $json.Daily_Calorie_Target }}\n\nUser Input:\n\"{{ $('Receive User Input').item.json.body.message }}\"\n\nTasks:\n1. Detect type:\n - FOOD\n - ACTIVITY\n - UNKNOWN\n\n2. If FOOD:\n - Estimate calories\n - Estimate protein\n - Detect meal type (breakfast/lunch/dinner/snack)\n\n3. If ACTIVITY:\n - Estimate calories burned\n\n4. Detect risk:\n - OVER_EATING\n - LOW_PROTEIN\n - UNHEALTHY\n - NONE\n\nReturn STRICT JSON:\n\n{\n \"type\": \"FOOD | ACTIVITY | UNKNOWN\",\n \"calories\": number,\n \"protein\": number,\n \"calories_burned\": number,\n \"meal_type\": \"breakfast | lunch | dinner | snack\",\n \"risk\": \"NONE | OVER_EATING | LOW_PROTEIN | UNHEALTHY\",\n \"suggestion\": \"short advice\",\n \"reply\": \"friendly message\"\n}",
"options": {},
"promptType": "define"
},
"typeVersion": 3
},
{
"id": "22ba5100-ea1e-4ad2-bae3-0ac039d28178",
"name": "AI Model (GPT)",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"position": [
640,
16
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini"
},
"options": {}
},
"credentials": {
"openAiApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.2
},
{
"id": "a070183a-fed2-40ee-a544-21dd44965d7f",
"name": "Process Nutrition Data",
"type": "n8n-nodes-base.code",
"position": [
1264,
-240
],
"parameters": {
"jsCode": "const raw = $input.first().json.output;\n\nlet parsed;\n\ntry {\n parsed = JSON.parse(raw);\n} catch (e) {\n parsed = {\n type: \"UNKNOWN\",\n calories: 0,\n protein: 0,\n calories_burned: 0,\n risk: \"NONE\",\n suggestion: \"AI parsing failed\",\n reply: \"Sorry, I couldn't understand. Try again.\"\n };\n}\n\n// Get user data\nlet user = $('Fetch User Data').first().json;\n\nlet totalCalories = parseInt(user.Consumed_Calories || 0);\nlet protein = parseInt(user.Protein || 0);\nlet riskCount = parseInt(user.Risk_Count || 0);\n\n// FOOD\nif (parsed.type === \"FOOD\") {\n totalCalories += parsed.calories;\n protein += parsed.protein;\n}\n\n// ACTIVITY\nif (parsed.type === \"ACTIVITY\") {\n totalCalories -= parsed.calories_burned;\n}\n\n// Risk tracking\nif (parsed.risk !== \"NONE\") {\n riskCount += 1;\n}\n\nreturn [{\n json: {\n ...user,\n ...parsed,\n Consumed_Calories: totalCalories,\n Protein: protein,\n Risk_Count: riskCount,\n message: $('Receive User Input').first().json.body.message\n }\n}];"
},
"typeVersion": 2
},
{
"id": "580623d7-b0c8-4f1f-86ff-cab0f83d6af0",
"name": "Check Calorie Threshold",
"type": "n8n-nodes-base.if",
"position": [
1664,
-240
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "45413895-62e1-478c-950d-71ccadc84e9b",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.Consumed_Calories }}",
"rightValue": "={{ $json.Daily_Calorie_Target }}"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "bb30bc6b-51e4-4398-841d-0c3bbe9cb0de",
"name": "Alert: Calorie Limit Exceeded",
"type": "n8n-nodes-base.slack",
"position": [
1904,
-256
],
"parameters": {
"text": "=You have exceeded your daily calorie limit. Consumed: {{ $('Process Nutrition Data').item.json.Consumed_Calories }} Target: {{ $('Process Nutrition Data').item.json.Daily_Calorie_Target }}\n{{ $('Process Nutrition Data').item.json.suggestion }}\n\n\n\nCalorie Limit Exceeded\n\nUser: {{$json.Name}}\nConsumed: {{$json.Consumed_Calories}}\nTarget: {{$json.Daily_Calorie_Target}}\n\n{{$json.suggestion}}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C0ALTQD6L0H",
"cachedResultName": "feature-addition"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "d4ae622d-30a2-4951-88da-9b61d87358dd",
"name": "Check Health Risk",
"type": "n8n-nodes-base.if",
"position": [
2240,
-256
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "108f7ab5-b30a-4429-9249-307575f2133a",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $('Process Nutrition Data').item.json.risk }}",
"rightValue": "NONE"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "8db1d125-776d-47b9-b9b2-1385be931ca9",
"name": "Alert: Health Risk",
"type": "n8n-nodes-base.slack",
"position": [
2464,
-272
],
"parameters": {
"text": "=Health Risk Detected User: {{ $('Process Nutrition Data').item.json.Name }} Risk: {{ $('Process Nutrition Data').item.json.risk }} \n{{ $('Process Nutrition Data').item.json.suggestion }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C0ALCNTB03G",
"cachedResultName": "complain"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "08aa8c9d-1328-4171-933f-efc2b7360501",
"name": "Check Critical Risk",
"type": "n8n-nodes-base.if",
"position": [
2656,
-272
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "b268556d-434b-44ff-a80a-e33a35bb0a9e",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $('Process Nutrition Data').item.json.Risk_Count }}",
"rightValue": 3
}
]
}
},
"typeVersion": 2.2
},
{
"id": "e71441ea-e8cf-46dd-85b6-766030768c4f",
"name": "Alert: Critical Health Issue",
"type": "n8n-nodes-base.slack",
"position": [
2880,
-288
],
"parameters": {
"text": "=CRITICAL ALERT User: {{ $('Process Nutrition Data').item.json.Name }} Multiple unhealthy patterns detected. Immediate attention required.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": "C0ALCNTB03G",
"cachedResultName": "complain"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "11837d64-a88a-4417-a66f-a17bed17f3e5",
"name": "Send API Response",
"type": "n8n-nodes-base.respondToWebhook",
"position": [
3248,
-288
],
"parameters": {
"options": {},
"respondWith": "json",
"responseBody": "={\n \"message\": \"{{ $('Process Nutrition Data').item.json.reply }}\",\n \"calories\": \"{{ $('Process Nutrition Data').item.json.calories }}\",\n \"total_today\": \"{{ $('Process Nutrition Data').item.json.Consumed_Calories }}\"\n}"
},
"typeVersion": 1.4
},
{
"id": "81687bd8-0b7d-48af-b13e-2b01e5a24815",
"name": "Update User Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
3456,
-288
],
"parameters": {
"columns": {
"value": {
"Phone": "={{ $('Process Nutrition Data').item.json.Phone }}",
"Status": "={{ $('Process Nutrition Data').item.json.Status }}",
"Protein": "={{ $('Process Nutrition Data').item.json.Protein }}",
"Last_Meal": "={{ $('Process Nutrition Data').item.json.Last_Meal }}",
"Risk_Count": "={{ $('Process Nutrition Data').item.json.Risk_Count }}",
"Consumed_Calories": "={{ $('Process Nutrition Data').item.json.Consumed_Calories }}"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Goal",
"type": "string",
"display": true,
"required": false,
"displayName": "Goal",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Daily_Calorie_Target",
"type": "string",
"display": true,
"required": false,
"displayName": "Daily_Calorie_Target",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Consumed_Calories",
"type": "string",
"display": true,
"required": false,
"displayName": "Consumed_Calories",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Protein",
"type": "string",
"display": true,
"required": false,
"displayName": "Protein",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last_Meal",
"type": "string",
"display": true,
"required": false,
"displayName": "Last_Meal",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risk_Count",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Risk_Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Phone"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1453522644,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit#gid=1453522644",
"cachedResultName": "Fittness tracker"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit?usp=drivesdk",
"cachedResultName": "LinkedIn Profile Monitor"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "de83bc4d-5f9c-406b-9213-4961f78254b7",
"name": "Daily Reset Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-272,
-752
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.2
},
{
"id": "721cb82e-b9fd-43d5-9833-65afae2cac9d",
"name": "Fetch All Users",
"type": "n8n-nodes-base.googleSheets",
"position": [
-32,
-752
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1453522644,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit#gid=1453522644",
"cachedResultName": "Fittness tracker"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit?usp=drivesdk",
"cachedResultName": "LinkedIn Profile Monitor"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "320bfe58-fd06-47a9-a44c-1969a41df000",
"name": "Reset Daily Stats",
"type": "n8n-nodes-base.googleSheets",
"position": [
224,
-752
],
"parameters": {
"columns": {
"value": {
"Phone": "={{ $json.Phone }}",
"Status": "NEW_DAY",
"Protein": "0",
"Risk_Count": "0",
"Consumed_Calories": "0"
},
"schema": [
{
"id": "Name",
"type": "string",
"display": true,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Phone",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Phone",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Goal",
"type": "string",
"display": true,
"required": false,
"displayName": "Goal",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Daily_Calorie_Target",
"type": "string",
"display": true,
"required": false,
"displayName": "Daily_Calorie_Target",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Consumed_Calories",
"type": "string",
"display": true,
"required": false,
"displayName": "Consumed_Calories",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Protein",
"type": "string",
"display": true,
"required": false,
"displayName": "Protein",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Last_Meal",
"type": "string",
"display": true,
"required": false,
"displayName": "Last_Meal",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Risk_Count",
"type": "string",
"display": true,
"required": false,
"displayName": "Risk_Count",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "row_number",
"type": "number",
"display": true,
"removed": true,
"readOnly": true,
"required": false,
"displayName": "row_number",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Phone"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update",
"sheetName": {
"__rl": true,
"mode": "list",
"value": 1453522644,
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit#gid=1453522644",
"cachedResultName": "Fittness tracker"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1b4XQG0yh1s3ZrnYTsKBlnSMNdlYzQt42zJ8DUneVTS8/edit?usp=drivesdk",
"cachedResultName": "LinkedIn Profile Monitor"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "c5aba6cd-1b16-48b4-bca2-23a90b2e863d",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
-480
],
"parameters": {
"color": 7,
"width": 800,
"height": 640,
"content": "## Receive and Validate User Input\nThis section receives user input through a webhook and fetches corresponding user data from Google Sheets using the phone number. It validates whether the user exists before continuing. This ensures only registered users are processed, maintaining data accuracy and avoiding unnecessary AI processing."
},
"typeVersion": 1
},
{
"id": "011a2612-3ae2-4c19-8e9d-bcf956492339",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
-480
],
"parameters": {
"color": 7,
"width": 512,
"height": 640,
"content": "## Analyze Food or Activity with AI\nThis section uses AI to analyze user input such as food or physical activity. It identifies whether the input is food or exercise, estimates calories and protein and detects potential health risks. This transforms raw user messages into structured nutritional insights for further processing."
},
"typeVersion": 1
},
{
"id": "424c2b61-a4dc-4b7f-aa22-d4524e3c8cc6",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1104,
-480
],
"parameters": {
"color": 7,
"width": 416,
"height": 640,
"content": "## Calculate Calories and Update Metrics\nThis section processes AI output and combines it with existing user data. It updates total calories consumed, protein intake and risk count. It also adjusts calories based on activities. This step ensures accurate tracking of daily nutrition and health metrics for each user."
},
"typeVersion": 1
},
{
"id": "5e4fc328-9dae-4b8d-8664-b141450357ef",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1584,
-480
],
"parameters": {
"color": 7,
"width": 496,
"height": 624,
"content": "## Monitor Daily Calorie Limit \nThis section checks whether the user has exceeded their daily calorie target. If the limit is crossed, a notification is sent to alert the user or team. This helps users stay within their calorie goals and maintain better dietary discipline."
},
"typeVersion": 1
},
{
"id": "fc3ff4c7-1745-41b6-9c55-f8be80470bef",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2144,
-480
],
"parameters": {
"color": 7,
"width": 912,
"height": 624,
"content": "## Detect Health Risks and Escalate Alerts \nThis section evaluates potential health risks based on user behavior. If any risk is detected, a warning is sent. If repeated risks occur multiple times, the system escalates to a critical alert. This ensures proactive monitoring and timely intervention for unhealthy patterns."
},
"typeVersion": 1
},
{
"id": "fd815dc0-4134-4276-9d7d-a29786178546",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
3120,
-480
],
"parameters": {
"color": 7,
"width": 560,
"height": 624,
"content": "## Response & Data Storage \nThis section sends a response back to the user with insights such as calories consumed and suggestions. It also updates the user\u2019s data in Google Sheets, including calories, protein and risk count. This ensures data persistence and continuous tracking of user progress."
},
"typeVersion": 1
},
{
"id": "d2e62464-5d84-4d52-8344-7c230df6c2c6",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
-336,
-1456
],
"parameters": {
"width": 992,
"height": 480,
"content": "## Workflow Overview & Setup Guide \nThis workflow is an AI-powered fitness and nutrition tracking system that processes user input in real time. Users send messages through a webhook, such as food intake or physical activity. The system retrieves user data from Google Sheets and validates the user before proceeding.\n\nThe input is then analyzed using an AI model, which identifies whether it is food or activity and calculates calories, protein and potential health risks. This structured data is processed to update total daily consumption and health metrics.\n\nThe workflow checks if the user exceeds their daily calorie limit and sends alerts if necessary. It also detects unhealthy patterns and escalates alerts if risks occur repeatedly. All updates are stored in Google Sheets to maintain user history.\n\nAdditionally, a scheduled trigger resets daily metrics like calories and protein, ensuring fresh tracking every day.\n\nSetup steps:\n1. Connect Google Sheets with required columns (Phone, Calories, Protein, etc.)\n2. Configure OpenAI API credentials\n3. Set up Slack integration for alerts\n4. Deploy webhook for user input (e.g., from app or chatbot)\n5. Configure schedule trigger for daily reset\n\nThis system automates health tracking and provides real-time feedback efficiently."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "00a567d3-7ce2-40a4-a465-4d77a2225bf8",
"connections": {
"AI Model (GPT)": {
"ai_languageModel": [
[
{
"node": "AI Nutrition Analyzer",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Fetch All Users": {
"main": [
[
{
"node": "Reset Daily Stats",
"type": "main",
"index": 0
}
]
]
},
"Fetch User Data": {
"main": [
[
{
"node": "Validate User Exists",
"type": "main",
"index": 0
}
]
]
},
"Check Health Risk": {
"main": [
[
{
"node": "Alert: Health Risk",
"type": "main",
"index": 0
}
]
]
},
"Send API Response": {
"main": [
[
{
"node": "Update User Data",
"type": "main",
"index": 0
}
]
]
},
"Alert: Health Risk": {
"main": [
[
{
"node": "Check Critical Risk",
"type": "main",
"index": 0
}
]
]
},
"Receive User Input": {
"main": [
[
{
"node": "Fetch User Data",
"type": "main",
"index": 0
}
]
]
},
"Check Critical Risk": {
"main": [
[
{
"node": "Alert: Critical Health Issue",
"type": "main",
"index": 0
}
]
]
},
"Daily Reset Trigger": {
"main": [
[
{
"node": "Fetch All Users",
"type": "main",
"index": 0
}
]
]
},
"Validate User Exists": {
"main": [
[
{
"node": "AI Nutrition Analyzer",
"type": "main",
"index": 0
}
]
]
},
"AI Nutrition Analyzer": {
"main": [
[
{
"node": "Process Nutrition Data",
"type": "main",
"index": 0
}
]
]
},
"Process Nutrition Data": {
"main": [
[
{
"node": "Check Calorie Threshold",
"type": "main",
"index": 0
}
]
]
},
"Check Calorie Threshold": {
"main": [
[
{
"node": "Alert: Calorie Limit Exceeded",
"type": "main",
"index": 0
}
]
]
},
"Alert: Critical Health Issue": {
"main": [
[
{
"node": "Send API Response",
"type": "main",
"index": 0
}
]
]
},
"Alert: Calorie Limit Exceeded": {
"main": [
[
{
"node": "Check Health Risk",
"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.
googleSheetsOAuth2ApiopenAiApislackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is an AI-powered nutrition and fitness tracking system built in n8n. It receives user input via webhook, analyzes food or activity using AI, updates daily calorie and protein intake in Google Sheets and sends alerts via Slack when limits or risks are detected. It…
Source: https://n8n.io/workflows/14858/ — 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 n8n workflow orchestrates a powerful suite of AI Agents and automations to manage and optimize various aspects of an e-commerce operation, particularly for platforms like Shopify. It leverages La
Enhance your support, onboarding, and internal knowledge workflows with an intelligent RAG-powered chatbot that responds using live data stored in Google Sheets. 🤖📚 Built for teams that rely on struct
This workflow automates customer feedback processing by analyzing sentiment, identifying key issues, generating personalized responses, and escalating critical cases to support teams when required. De
This workflow automates financial reconciliation across multiple data sources such as bank statements, invoices, ERP systems, and CSV uploads.
This workflow automates the creation and publishing of LinkedIn posts with AI-generated content and human approval via Slack, using Google Sheets, OpenAI (GPT-4), Slack Interactive Messages, and the L