{
  "workflow": {
    "id": 5991,
    "name": "Restaurant daily insights with Gemini AI - sales, waste & feedback email summary",
    "views": 725,
    "recentViews": 0,
    "totalViews": 725,
    "createdAt": "2025-07-14T10:06:18.813Z",
    "description": "In this guide, we’ll walk you through setting up an AI-driven workflow that automatically fetches daily sales, food waste, and customer feedback data from Google Sheets, generates actionable insights using AI, merges them into a comprehensive report, and sends it as an email draft. Ready to automate your restaurant’s daily insights? Let’s dive in!\n\n## What’s the Goal?\n- Automatically retrieve daily sales data, food waste records, and customer feedback from Google Sheets.\n- Use AI to analyze data and generate insights, including top performers, waste reduction recommendations, and feedback summaries.\n- Merge the insights into a structured daily report.\n- Send the report as an AI-generated email draft for review or sending.\n- Enable scheduled automation for daily insights delivery.\n\nBy the end, you’ll have a self-running system that delivers daily restaurant insights effortlessly.\n\n## Why Does It Matter?\nManual data analysis and reporting are time-consuming and error-prone. Here’s why this workflow is a game-changer:\n\n- **Zero Human Error**: AI ensures accurate and consistent insights.\n- **Time-Saving Automation**: Instantly process data and draft reports, boosting efficiency.\n- **Scheduled Delivery**: Receive insights daily without manual effort.\n- **Actionable Insights**: Empower your team with data-driven decisions.\nThink of it as your tireless data analyst that keeps your restaurant informed.\n\n## How It Works\nHere’s the step-by-step magic behind the automation:\n\n### Step 1: Trigger the Workflow\n- Initiate the workflow daily using the Daily Report Scheduler node (e.g., every day at a set time).\n\n### Step 2: Fetch Daily Sales Data\n- Retrieve sales data from the Google Sheet using the Fetch Daily Sales Data node.\n\n### Step 3: Fetch Daily Food Waste Records\n- Retrieve food waste data from the Google Sheet using the Fetch Daily Food Waste Records node.\n\n### Step 4: Fetch Customer Feedback\n- Retrieve customer feedback from the Google Sheet using the Fetch Customer Feedback node.\n\n### Step 5: Normalize Sales Records\n- Process and standardize sales data for AI analysis.\n\n### Step 6: Normalize Waste Data\n- Process and standardize food waste data for AI analysis.\n\n### Step 7: Normalize Feedback Data\n- Process and standardize customer feedback data for AI analysis.\n\n### Step 8: AI Sales Insights Generator\n- Use AI (e.g., Google Chat Model) to analyze sales data, identify top performers, and provide recommendations.\n\n### Step 9: AI Waste Reduction Insights Generator\n- Use AI to analyze waste data and suggest reduction strategies.\n\n### Step 10: AI Feedback Summary\n- Use AI to summarize customer feedback and identify common themes.\n\n### Step 11: Format Sales Output\n- Structure the sales insights into a readable format.\n\n### Step 12: Format Waste Output\n- Structure the waste reduction insights into a readable format.\n\n### Step 13: Format Feedback AI Output\n- Structure the feedback summary into a readable format.\n\n### Step 14: Merge & Create Email\n- Combine all formatted insights into a single daily report email draft.\n\n### Step 15: Prepare Email Content\n- Finalize the email content for sending.\n\n### Step 16: Send Daily Report\n- Send the AI-generated daily summary email via Gmail.\n\n## How to Use the Workflow?\nImporting a workflow in n8n is a straightforward process that allows you to use pre-built workflows to save time. Below is a step-by-step guide to importing the Restaurant Daily Insights Automation workflow in n8n.\n\n### Steps to Import a Workflow in n8n\n\n1. **Obtain the Workflow JSON**\n   - **Source the Workflow**: Workflows are shared as JSON files or code snippets, e.g., from the n8n community, a colleague, or exported from another n8n instance.\n   - **Format**: Ensure you have the workflow in JSON format, either as a file (e.g., workflow.json) or copied text.\n\n2. **Access the n8n Workflow Editor**\n   - Log in to n8n (via n8n Cloud or self-hosted instance).\n   - Navigate to the Workflows tab in the n8n dashboard.\n   - Click Add Workflow to create a blank workflow.\n\n3. **Import the Workflow**\n   - **Option 1: Import via JSON Code (Clipboard)**:\n     - Click the three dots (⋯) in the top-right corner to open the menu.\n     - Select Import from Clipboard.\n     - Paste the JSON code into the text box.\n     - Click Import to load the workflow.\n   - **Option 2: Import via JSON File**:\n     - Click the three dots (⋯) in the top-right corner.\n     - Select Import from File.\n     - Choose the .json file from your computer.\n     - Click Open to import.\n\n### Setup Notes\n- **Google Sheet Columns**:\n  - **Sales Data Sheet**: `Date`, `Item Name`, `Quantity Sold`, `Revenue`, `Cost`, `Profit`.\n  - **Food Waste Records Sheet**: `Date`, `Item Name`, `Waste Quantity`, `Reason`, `Timestamp`.\n  - **Customer Feedback Sheet**: `Date`, `Customer Name`, `Feedback Text`, `Rating`, `Timestamp`.\n- **Google Sheets Credentials**: Configure OAuth2 settings in the fetch nodes with your Google Sheet ID and credentials.\n- **AI Models**: Set up the AI nodes (e.g., Google Chat Model) with appropriate API credentials.\n- **Gmail Integration**: Authorize the Send Daily Report node with Gmail API credentials to send emails.\n- **Scheduling**: Adjust the Daily Report Scheduler node to your preferred time (e.g., daily at 9 AM).",
    "workflow": {
      "id": "Dvr7DN12sJBV7qyr",
      "meta": {
        "instanceId": "dd69efaf8212c74ad206700d104739d3329588a6f3f8381a46a481f34c9cc281",
        "templateCredsSetupCompleted": true
      },
      "name": "Restaurant Daily Insights Automation – AI-Powered Email Report Generator",
      "tags": [],
      "nodes": [
        {
          "id": "d25f6d93-48a7-4213-9160-915a0a640f01",
          "name": "Workflow Overview",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            380,
            0
          ],
          "parameters": {
            "width": 600,
            "height": 200,
            "content": "## Restaurant Daily Report Workflow 🍽️\n\nThis workflow automates the generation and delivery of a daily performance report for a restaurant. It collects data from three sources: **Sales**, **Food Waste**, and **Customer Feedback**, processes them using AI, merges the insights, generates an email summary, and sends it out."
          },
          "typeVersion": 1
        },
        {
          "id": "577a3cfe-074e-41ef-8309-55ff22d523cd",
          "name": "Sales Data Analysis",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -760,
            380
          ],
          "parameters": {
            "color": 5,
            "width": 1320,
            "height": 500,
            "content": "## Sales Data Analysis 📈\n\n1. Fetches daily sales records from Google Sheets.\n2. Bundles raw sales rows into a single JSON object for the AI agent.\n3. An AI Agent processes sales data, performing validation, calculations (e.g., profit margin), identifying top/bottom performers, and generating recommendations.\n4. Normalizes the AI's JSON output for consistent data structure."
          },
          "typeVersion": 1
        },
        {
          "id": "85dc03eb-fef1-47ec-896a-7818e1f3eaf9",
          "name": "Food Waste Analysis",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -1440,
            1020
          ],
          "parameters": {
            "color": 4,
            "width": 800,
            "height": 260,
            "content": "## Food Waste Analysis 🗑️\n\n1. Retrieves daily food waste entries from Google Sheets.\n2. Formats the raw waste data into a single JSON payload for the AI agent.\n3. An AI Agent analyzes food waste data, validating records, calculating costs, identifying top waste items, and suggesting prevention actions.\n4. Cleans and normalizes the AI's JSON output for structured use."
          },
          "typeVersion": 1
        },
        {
          "id": "93dd3719-b6f1-478c-af4b-f156be0391a8",
          "name": "Customer Feedback Analysis",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -460,
            1420
          ],
          "parameters": {
            "color": 6,
            "width": 1300,
            "height": 800,
            "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Customer Feedback Analysis 💬\n\n1. Reads daily customer feedback entries from Google Sheets.\n2. Bundles raw feedback rows into a single JSON object for the AI agent.\n3. An AI Agent processes customer feedback, aggregating ratings, analyzing sentiment, identifying common themes, and providing actionable recommendations.\n4. Ensures the AI's JSON output is correctly parsed and normalized."
          },
          "typeVersion": 1
        },
        {
          "id": "7f24cc28-2b7e-4563-a27e-924bcb105919",
          "name": "Merge & Email Creation",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            646,
            760
          ],
          "parameters": {
            "color": 2,
            "width": 600,
            "height": 500,
            "content": "## Merge & Email Creation 📧\n\n1. Combines the processed sales, food waste, and customer feedback data from the three AI analysis branches into a single data item.\n2. A Code node structures the merged data for the final AI email summary generator.\n3. An AI Agent compiles the combined data into a comprehensive, plain-text email body, including key metrics, detailed insights, and next-day suggestions."
          },
          "typeVersion": 1
        },
        {
          "id": "3bc8c564-d29a-42bd-a529-7f7a52f32077",
          "name": "Send Daily Report",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            1680,
            800
          ],
          "parameters": {
            "color": 3,
            "width": 380,
            "height": 480,
            "content": "## Send Daily Report 🚀\n\n1. A Code node ensures the AI-generated email body is clean and ready for sending.\n\n2. Sends the final daily performance summary email via Gmail to the specified recipient."
          },
          "typeVersion": 1
        },
        {
          "id": "56b5f162-622c-4d29-be8d-634886b55e33",
          "name": "Google Gemini Chat Model for summary",
          "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
          "position": [
            1364,
            1320
          ],
          "parameters": {
            "options": {},
            "modelName": "models/gemini-2.5-pro"
          },
          "credentials": {
            "googlePalmApi": {
              "id": "credential-id",
              "name": "googlePalmApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "733727b2-114b-485e-96eb-0b2c04cf58af",
          "name": "Think for summary",
          "type": "@n8n/n8n-nodes-langchain.toolThink",
          "position": [
            1484,
            1320
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "90a4559d-6b77-48e8-a2b9-63950eab06aa",
          "name": "Daily Report Scheduler",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            -580,
            1100
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "triggerAtHour": 22
                }
              ]
            }
          },
          "typeVersion": 1.2
        },
        {
          "id": "28b16c0f-7733-4fee-bff9-48c9cdad7020",
          "name": "Fetch Daily Sales Data",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            -360,
            700
          ],
          "parameters": {
            "options": {},
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": 1013658249,
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A/edit#gid=1013658249",
              "cachedResultName": "sales page"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A/edit?usp=drivesdk",
              "cachedResultName": "daily report 13-07-2025"
            },
            "authentication": "serviceAccount"
          },
          "credentials": {
            "googleApi": {
              "id": "credential-id",
              "name": "googleApi Credential"
            }
          },
          "typeVersion": 4.6
        },
        {
          "id": "5c0adaba-b6e4-47e3-9d05-13c3088f1e84",
          "name": "Normalize Sales Records",
          "type": "n8n-nodes-base.code",
          "position": [
            -140,
            700
          ],
          "parameters": {
            "jsCode": "// Fetch all incoming items\nconst items = $input.all();\n\n// Extract the raw row data (each item.json is one row)\nconst rawRows = items.map(item => item.json);\n\n// Bundle everything into a single field\nconst payload = { rows: rawRows };\n\n// Return a single output item whose json contains your full dataset\nreturn [{ json: { data: payload } }];\n"
          },
          "typeVersion": 2
        },
        {
          "id": "60217633-b248-4cb8-bf79-077f88555734",
          "name": "AI Sales Insights Generator",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            80,
            600
          ],
          "parameters": {
            "text": "={{ $json.data }}",
            "options": {
              "systemMessage": "You are a data-driven AI Sales Analyst. You will receive structured input data (JSON) representing daily sales performance for various dishes including: Date, Dish Name, Category, Quantity Sold, Unit Price, Total Revenue, Cost Per Unit, Profit Margin (%), Peak Hour, Weather Impact.\n\nYour responsibilities:\n\n1. **Data Validation & Calculations**\n   - Confirm each record includes all fields.\n   - Calculate:\n     • Total Cost = Quantity Sold × Cost Per Unit  \n     • Profit Amount = Total Revenue − Total Cost  \n     • Actual Profit Margin (%) = (Profit Amount ÷ Total Revenue) × 100 (compare with provided field).\n\n2. **Aggregation & Insights**\n   - Identify top 3 dishes by quantity sold.\n   - Identify top 3 dishes by revenue.\n   - Identify dishes with highest and lowest profit margins.\n   - Analyze overall metrics: total quantity sold, total revenue, average profit margin for the day.\n\n3. **Trend & Pattern Analysis**\n   - Correlate weather impact (\"Cloudy\") with sales patterns.\n   - Highlight peak hours across categories.\n   - Suggest category-level performance insights.\n\n4. **Actionable Recommendations**\n   - Recommend strategic actions (e.g., menu adjustments, upsells, pricing changes, inventory focus).\n   - If a dish underperforms in revenue but has high margin, suggest promoting opportunities.\n\n5. **Output Format**\n   - Deliver a concise report with sections:\n     • Summary Metrics  \n     • Top/Bottom Performers  \n     • Weather/Peak-Hour Analysis  \n     • Recommendations  \n     • Data Quality (note mismatches or missing fields)\n\n- Return output as structured JSON with keys: `summary`, `top_dishes_by_quantity`, `top_dishes_by_revenue`, `margin_extremes`, `weather_insights`, `peak_hour_insights`, `recommendations`, `data_quality_issues`.\n\nOnly output valid JSON (no markdown, no explanatory text outside JSON).\n"
            },
            "promptType": "define"
          },
          "typeVersion": 1.9
        },
        {
          "id": "0557d918-2535-4d3f-a78e-df06dca98243",
          "name": "Format Sales AI Output",
          "type": "n8n-nodes-base.code",
          "position": [
            456,
            700
          ],
          "parameters": {
            "jsCode": "/**\n * Normalize raw AI JSON response (possibly wrapped in ```json blocks).\n * To be used inside an n8n Function/Code node.\n * Input item should have raw output under `item.json.output`.\n */\nfunction normalizeAI(item) {\n  let raw = item.json.output;\n  if (typeof raw !== 'string') {\n    throw new Error('Missing AI output string');\n  }\n\n  // 1. Strip ```json and backticks\n  raw = raw\n    .trim()\n    .replace(/^```json\\s*/, '')\n    .replace(/```$/, '')\n    .trim();\n\n  // 2. Remove stray backslashes (if necessary)\n  raw = raw.replace(/\\\\/g, '');\n\n  // 3. Parse JSON\n  let report;\n  try {\n    report = JSON.parse(raw);\n  } catch (e) {\n    throw new Error('Failed to parse AI JSON: ' + e.message);\n  }\n\n  // 4. Normalize numeric fields\n  const toNum = x => (x !== undefined ? Number(x) : x);\n\n  if (report.summary) {\n    report.summary.total_quantity_sold = toNum(report.summary.total_quantity_sold);\n    report.summary.total_revenue = toNum(report.summary.total_revenue);\n    report.summary.total_profit = toNum(report.summary.total_profit);\n    report.summary.average_profit_margin = toNum(report.summary.average_profit_margin);\n  }\n\n  const normalizeList = (arr, key) => {\n    if (!Array.isArray(arr)) return [];\n    return arr.map(i => ({\n      ...i,\n      [key]: toNum(i[key])\n    }));\n  };\n\n  report.top_dishes_by_quantity = normalizeList(report.top_dishes_by_quantity, 'quantity_sold');\n  report.top_dishes_by_revenue = normalizeList(report.top_dishes_by_revenue, 'total_revenue');\n\n  if (report.margin_extremes) {\n    if (report.margin_extremes.highest) {\n      report.margin_extremes.highest.calculated_profit_margin =\n        toNum(report.margin_extremes.highest.calculated_profit_margin);\n    }\n    if (report.margin_extremes.lowest) {\n      report.margin_extremes.lowest.calculated_profit_margin =\n        toNum(report.margin_extremes.lowest.calculated_profit_margin);\n    }\n  }\n\n  // 5. Ensure recommendations is array\n  if (!Array.isArray(report.recommendations)) {\n    report.recommendations = [];\n  }\n\n  return { json: report };\n}\n\n// Map over all incoming items\nreturn items.map(item => normalizeAI(item));\n"
          },
          "typeVersion": 2
        },
        {
          "id": "0464780d-0315-4b7d-80ab-9fef79ad7612",
          "name": "Google Chat Model",
          "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
          "position": [
            108,
            820
          ],
          "parameters": {
            "options": {},
            "modelName": "models/gemini-2.5-pro"
          },
          "credentials": {
            "googlePalmApi": {
              "id": "credential-id",
              "name": "googlePalmApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "e85b4ee4-6904-4ef6-a951-c147829f6421",
          "name": "Think Tool",
          "type": "@n8n/n8n-nodes-langchain.toolThink",
          "position": [
            228,
            820
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "170f519d-abc5-4ecb-ac84-6c359f983ce1",
          "name": "Fetch Daily Food Waste Records",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            -360,
            1100
          ],
          "parameters": {
            "options": {},
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": 1085743843,
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A/edit#gid=1085743843",
              "cachedResultName": "food waste page"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A/edit?usp=drivesdk",
              "cachedResultName": "daily report 13-07-2025"
            },
            "authentication": "serviceAccount"
          },
          "credentials": {
            "googleApi": {
              "id": "credential-id",
              "name": "googleApi Credential"
            }
          },
          "typeVersion": 4.6
        },
        {
          "id": "ab2eb33f-3306-4046-9f4f-4aaf66d6d53d",
          "name": "Normalize Waste Data",
          "type": "n8n-nodes-base.code",
          "position": [
            -140,
            1100
          ],
          "parameters": {
            "jsCode": "// Fetch all incoming items\nconst items = $input.all();\n\n// Extract the raw row data (each item.json is one row)\nconst rawRows = items.map(item => item.json);\n\n// Bundle everything into a single field\nconst payload = { rows: rawRows };\n\n// Return a single output item whose json contains your full dataset\nreturn [{ json: { data: payload } }];\n"
          },
          "typeVersion": 2
        },
        {
          "id": "85ce40ab-591e-4712-8072-da1d471a9a75",
          "name": "AI Waste Reduction Insights Generator",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            80,
            1000
          ],
          "parameters": {
            "text": "={{ $json.data }}",
            "options": {
              "systemMessage": "You are a Food‑Waste Analyst AI. You will receive structured JSON data rows representing daily waste entries, each with: Date, Item Name, Category, Waste Type, Quantity Wasted, Unit, Cost Per Unit, Total Waste Cost, Waste Reason, Prevention Action.\n\nYour tasks:\n1. **Validate & compute metrics**:\n   - Ensure each record has required fields.\n   - Calculate missing values if needed, e.g. Total Waste Cost = Quantity × Cost Per Unit.\n   - Aggregate daily totals: total quantity wasted, total waste cost, average cost/unit.\n\n2. **Categorical breakdown**:\n   - Summarize waste by Category (e.g. Prepared vs Raw) and Waste Type.\n   - Identify top 3 highest‑cost waste items and highest‑quantity waste items.\n\n3. **Reason & action analysis**:\n   - Count occurrences of Waste Reasons and Prevention Actions.\n   - Highlight recurring issues and evaluate if prevention actions align.\n\n4. **Best‑practice recommendations**:\n   - Suggest improvements based on proven strategies: waste audits, staff training, FIFO, inventory controls, automated tracking, tech integration :contentReference[oaicite:1]{index=1}.\n   - For frequent kitchen errors: recommend staff retraining or timer systems.\n   - For inventory expiration: suggest inventory analytics, par‑levels, FIFO adoption, supply‑chain review :contentReference[oaicite:2]{index=2}.\n\n5. **Output format**:\n   Return a JSON with keys:\n   - `validation` (missing fields, mismatches)\n   - `daily_totals`\n   - `by_category`\n   - `top_waste_items`\n   - `reason_summary`\n   - `action_evaluation`\n   - `recommendations`\n\nEnsure output is valid JSON only—no markdown or extra text.\n"
            },
            "promptType": "define"
          },
          "typeVersion": 1.9
        },
        {
          "id": "93c9c5ee-df52-4b7f-a5c5-62a6145f65c2",
          "name": "Format Waste AI Output",
          "type": "n8n-nodes-base.code",
          "position": [
            456,
            1100
          ],
          "parameters": {
            "jsCode": "/**\n * n8n Code node to parse and normalize AI Agent JSON response.\n * Expects raw output in item.json.output.\n */\nfunction normalizeAI(item) {\n  let raw = item.json.output;\n  if (typeof raw !== 'string') {\n    throw new Error('Expected output string in item.json.output');\n  }\n\n  // 1. Clean up markdown wrappers and code fences\n  raw = raw\n    .trim()\n    .replace(/^```json\\s*/, '')\n    .replace(/```$/, '')\n    .trim();\n\n  // 2. Parse JSON with safe fallback\n  let report;\n  try {\n    report = JSON.parse(raw);\n  } catch (e) {\n    throw new Error('Invalid JSON from AI: ' + e.message);\n  }\n\n  // 3. Helper to convert numeric fields\n  const toNumber = val => {\n    const num = Number(val);\n    return isNaN(num) ? null : num;\n  };\n\n  // 4. Normalize daily_totals\n  if (report.daily_totals) {\n    report.daily_totals.total_quantity_wasted = toNumber(report.daily_totals.total_quantity_wasted);\n    report.daily_totals.total_waste_cost = toNumber(report.daily_totals.total_waste_cost);\n    report.daily_totals.average_cost_per_unit_wasted = toNumber(report.daily_totals.average_cost_per_unit_wasted);\n  }\n\n  // 5. Normalize by_category and by_waste_type\n  ['by_category', 'by_waste_type'].forEach(section => {\n    if (report[section] && typeof report[section] === 'object') {\n      Object.entries(report[section]).forEach(([key, val]) => {\n        val.total_cost = toNumber(val.total_cost);\n        val.total_quantity = toNumber(val.total_quantity);\n      });\n    }\n  });\n\n  // 6. Normalize top_waste_items arrays\n  if (report.top_waste_items) {\n    if (Array.isArray(report.top_waste_items.by_cost)) {\n      report.top_waste_items.by_cost = report.top_waste_items.by_cost.map(i => ({\n        item_name: i['Item Name'],\n        total_waste_cost: toNumber(i['Total Waste Cost']),\n      }));\n    }\n    if (Array.isArray(report.top_waste_items.by_quantity)) {\n      report.top_waste_items.by_quantity = report.top_waste_items.by_quantity.map(i => ({\n        item_name: i['Item Name'],\n        quantity_wasted: toNumber(i['Quantity Wasted']),\n        unit: i['Unit'] || null,\n      }));\n    }\n  }\n\n  // 7. Normalize reason_summary counts\n  if (report.reason_summary && typeof report.reason_summary === 'object') {\n    Object.entries(report.reason_summary).forEach(([reason, count]) => {\n      report.reason_summary[reason] = toNumber(count);\n    });\n  }\n\n  // 8. Normalize action_evaluation.alignment\n  if (report.action_evaluation?.alignment && Array.isArray(report.action_evaluation.alignment)) {\n    report.action_evaluation.alignment = report.action_evaluation.alignment.map(i => ({\n      reason: i.reason || null,\n      action: i.action || null,\n      evaluation: i.evaluation || null,\n    }));\n  }\n\n  // 9. Ensure recommendations is an array with normalized entries\n  if (Array.isArray(report.recommendations)) {\n    report.recommendations = report.recommendations.map(r => ({\n      area: r.area || null,\n      issue: r.issue || null,\n      recommendation: r.recommendation || null,\n      reference: r.reference || null,\n    }));\n  } else {\n    report.recommendations = [];\n  }\n\n  // Return item with normalized JSON\n  return { json: report };\n}\n\n// Process all items\nreturn items.map(item => normalizeAI(item));\n"
          },
          "typeVersion": 2
        },
        {
          "id": "711a1507-04e4-4edf-b5fc-35b66da9338c",
          "name": "Chat Model For Food Waste",
          "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
          "position": [
            108,
            1220
          ],
          "parameters": {
            "options": {},
            "modelName": "models/gemini-2.5-pro"
          },
          "credentials": {
            "googlePalmApi": {
              "id": "credential-id",
              "name": "googlePalmApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "1328564d-4298-46ad-a08d-f5853ed57b03",
          "name": "Think For Food Waste",
          "type": "@n8n/n8n-nodes-langchain.toolThink",
          "position": [
            228,
            1220
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "78d8252d-4a7b-4585-8d95-c1be3810000e",
          "name": "Fetch Customer Feedback",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            -360,
            1500
          ],
          "parameters": {
            "options": {},
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": 1969429831,
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A/edit#gid=1969429831",
              "cachedResultName": "feedback page"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1BZnpfYjOlu2C_N-CnSiChJpRsYX6hsLWBMP_Lo4ZD_A/edit?usp=drivesdk",
              "cachedResultName": "daily report 13-07-2025"
            },
            "authentication": "serviceAccount"
          },
          "credentials": {
            "googleApi": {
              "id": "credential-id",
              "name": "googleApi Credential"
            }
          },
          "typeVersion": 4.6
        },
        {
          "id": "4aa3e303-d0cb-4973-a7ee-b8cc90d8960f",
          "name": "Normalize Feedback Entries",
          "type": "n8n-nodes-base.code",
          "position": [
            -140,
            1500
          ],
          "parameters": {
            "jsCode": "// Fetch all incoming items\nconst items = $input.all();\n\n// Extract the raw row data (each item.json is one row)\nconst rawRows = items.map(item => item.json);\n\n// Bundle everything into a single field\nconst payload = { rows: rawRows };\n\n// Return a single output item whose json contains your full dataset\nreturn [{ json: { data: payload } }];\n"
          },
          "typeVersion": 2
        },
        {
          "id": "3b1c4778-5936-4fde-8d74-7b24fd266a56",
          "name": "AI Feedback Summary Generator",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            80,
            1500
          ],
          "parameters": {
            "text": "={{ $json.data }}",
            "options": {
              "systemMessage": "You are a Customer Feedback Analyst AI for a restaurant. You receive structured JSON data representing feedback entries, each with:\n- Date, Customer ID, Dish Name\n- Overall Rating, Food Quality, Service Rating, Ambiance Rating\n- Feedback Type (Positive, Neutral, Complaint)\n- Comments (textual feedback)\n\nTasks:\n1. **Validate** each record (check presence/type of fields).\n2. **Aggregate Ratings & Sentiment**:\n   • Calculate average overall, food, service, and ambiance ratings.\n   • Count feedback types (Positive, Neutral, Complaint).\n3. **Dish-Level Insights**:\n   • For each dish, compute average ratings and sentiment distribution.\n   • Identify dishes with highest/lowest overall satisfaction.\n4. **Sentiment & Comments Analysis**:\n   • Detect common themes and sentiment polarity (positive/negative).\n   • Highlight key recurring issues or praises (e.g., cold food, freshness).\n5. **Actionable Recommendations**:\n   • Based on insights, suggest improvements (e.g., staff training for slow service, adjusting spice levels).\n   • If specific dishes underperform, advise focused menu review or training.\n   • For high-performing dishes, recommend upsell or highlight in marketing.\n6. **Output Format**:\n   Return valid JSON only, structured as:\n   {\n     \"validation\": {...},\n     \"summary_ratings\": {...},\n     \"feedback_counts\": {...},\n     \"dish_insights\": [...],\n     \"common_themes\": [...],\n     \"recommendations\": [...]\n   }\nNo additional text or markdown—only the JSON.\n"
            },
            "promptType": "define"
          },
          "typeVersion": 1.9
        },
        {
          "id": "b1d3646d-dbed-4e94-94aa-b6836724ffdd",
          "name": "Format Feedback AI Output",
          "type": "n8n-nodes-base.code",
          "position": [
            456,
            1500
          ],
          "parameters": {
            "jsCode": "/**\n * n8n Code node: normalize AI agent JSON feedback report\n * Input: item.json.output contains the raw JSON wrapped in ```json ... ```\n */\nfunction normalizeAI(item) {\n  let raw = item.json.output;\n  if (typeof raw !== 'string') {\n    throw new Error('Expected output string in item.json.output');\n  }\n\n  // 1. Remove ```json and trailing ``` fences\n  raw = raw\n    .trim()\n    .replace(/^```json\\s*/, '')\n    .replace(/```$/, '')\n    .trim(); // Adapted from StackOverflow advice :contentReference[oaicite:1]{index=1}\n\n  // 2. Parse JSON\n  let report;\n  try {\n    report = JSON.parse(raw);\n  } catch (e) {\n    throw new Error('Invalid JSON from AI: ' + e.message);\n  }\n\n  // 3. Utility to coerce numeric values\n  const toNum = v => {\n    const n = Number(v);\n    return isNaN(n) ? null : n;\n  };\n\n  // Normalize summary_ratings\n  if (report.summary_ratings) {\n    ['average_overall_rating', 'average_food_quality', 'average_service_rating', 'average_ambiance_rating']\n      .forEach(key => { report.summary_ratings[key] = toNum(report.summary_ratings[key]); });\n  }\n\n  // Normalize feedback_counts\n  if (report.feedback_counts) {\n    ['total', 'positive', 'neutral', 'complaint']\n      .forEach(key => { report.feedback_counts[key] = toNum(report.feedback_counts[key]); });\n  }\n\n  // Normalize dish_insights array\n  if (Array.isArray(report.dish_insights)) {\n    report.dish_insights = report.dish_insights.map(d => {\n      ['average_overall_rating','average_food_quality','average_service_rating','average_ambiance_rating']\n        .forEach(k => { d[k] = toNum(d[k]); });\n      d.record_count = toNum(d.record_count);\n      return d;\n    });\n  }\n\n  // Normalize common_themes array\n  if (Array.isArray(report.common_themes)) {\n    report.common_themes = report.common_themes.map(t => {\n      t.mentions = toNum(t.mentions);\n      return t;\n    });\n  }\n\n  // Normalize recommendations array\n  if (Array.isArray(report.recommendations)) {\n    report.recommendations = report.recommendations.map(r => ({\n      area: r.area,\n      priority: r.priority,\n      action: r.action,\n      dish_specific: r.dish_specific,\n    }));\n  }\n\n  return { json: report };\n}\n\n// Process all items\nreturn items.map(item => normalizeAI(item));\n"
          },
          "typeVersion": 2
        },
        {
          "id": "9bfd69bc-c1cc-4d13-96ab-926b4099d93b",
          "name": "Google Gemini Chat Model For Feedback",
          "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
          "position": [
            108,
            1720
          ],
          "parameters": {
            "options": {},
            "modelName": "models/gemini-2.5-pro"
          },
          "credentials": {
            "googlePalmApi": {
              "id": "credential-id",
              "name": "googlePalmApi Credential"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "27bf7481-e439-400f-88df-53482cd5e0a0",
          "name": "Think Tool For Feedback",
          "type": "@n8n/n8n-nodes-langchain.toolThink",
          "position": [
            228,
            1720
          ],
          "parameters": {},
          "typeVersion": 1
        },
        {
          "id": "ff5f1621-cf24-409a-bd3d-d5930ba8acf5",
          "name": "Combine All Insights",
          "type": "n8n-nodes-base.merge",
          "position": [
            676,
            1100
          ],
          "parameters": {
            "numberInputs": 3
          },
          "typeVersion": 3.1
        },
        {
          "id": "fb7c7b39-e17d-48d4-8562-bab407e1256b",
          "name": "Wait for All Data Processing",
          "type": "n8n-nodes-base.wait",
          "position": [
            896,
            1100
          ],
          "webhookId": "50615ec2-df7e-4021-8bc0-5096013df039",
          "parameters": {},
          "typeVersion": 1.1
        },
        {
          "id": "949a7b7f-0155-44cc-b30c-624e27a16295",
          "name": "Prepare Final Email Input",
          "type": "n8n-nodes-base.code",
          "position": [
            1116,
            1100
          ],
          "parameters": {
            "jsCode": "// Fetch all incoming items\nconst items = $input.all();\n\n// Extract the raw row data (each item.json is one row)\nconst rawRows = items.map(item => item.json);\n\n// Bundle everything into a single field\nconst payload = { rows: rawRows };\n\n// Return a single output item whose json contains your full dataset\nreturn [{ json: { data: payload } }];\n"
          },
          "typeVersion": 2
        },
        {
          "id": "300a9fad-55ed-438e-9398-b059285d79a1",
          "name": "AI-Generated Daily Summary",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            1336,
            1100
          ],
          "parameters": {
            "text": "={{ $json.data }}",
            "options": {
              "systemMessage": "You are the Restaurant Daily Performance Analyst AI. You will receive three structured JSON datasets for the same date:\n1. Sales Report\n2. Food Waste Report\n3. Customer Feedback Report\n\nYour single output must be the **email_body**—formatted plain text only (no JSON, no markdown)—ready to send via email. It must include:\n\n- **Greeting** and acknowledgment of date.\n- **Key Metrics at a glance** (bulleted): sales (revenue, profit, margin), waste cost, average customer rating, sentiment counts.\n- **Detailed Insights**, covering:\n  • Sales highlights & weather context  \n  • Waste issues & top waste items  \n  • Customer feedback summary & critical complaints  \n  • Cross‑analysis: link dishes across datasets where issues align\n- **Next‑day Suggestions** with clear, actionable steps under categories:\n  • Menu & upsell  \n  • Quality & service improvements  \n  • Waste reduction & inventory actions  \n  • Promotions (e.g., weather-based combos)\n\n- **Sign-off**: “Regards,\\nDaily Analytics Bot”\n\nEnsure each insight and suggestion is included. The tone should be professional, concise, and directive.\n\nExample structure:\n\nHello Team,\n\nKey Metrics at a glance:\n• Total Revenue: $X\n• Total Profit: $Y\n• Average Profit Margin: Z%\n• Total Waste Cost: $W\n• Average Customer Rating: R / 5\n• Customer Feedback: P Positive, N Neutral, C Complaints\n\nDetailed Insights:\n\nSales: explanation…\n\nWaste: explanation…\n\nFeedback: explanation…\n\nCross‑Analysis: bullet list…\n\nNext‑day Suggestions:\n\nMenu & upsell: …\n\nQuality & service: …\n\nWaste & inventory: …\n\nPromotions: …\n\n\nOutput **only** this email body as plain text—no JSON wrapper or other output.\n"
            },
            "promptType": "define"
          },
          "executeOnce": true,
          "typeVersion": 1.9,
          "alwaysOutputData": true
        },
        {
          "id": "2ca4c4ab-4a19-4dfd-a1bb-86cc61209bf6",
          "name": "Format Final Email Content",
          "type": "n8n-nodes-base.code",
          "position": [
            1712,
            1100
          ],
          "parameters": {
            "jsCode": "/**\n * n8n Function/Code node: Normalize AI email output\n * Input: item.json.output contains the raw email text (possibly with fences)\n */\nfunction normalizeEmail(item) {\n  let text = item.json.output;\n  if (typeof text !== 'string') {\n    throw new Error('Expected raw email text in item.json.output');\n  }\n\n  // 1. Clean common wrappers & prefixes\n  text = text\n    .replace(/^```(?:json|text)?\\n?/, '')\n    .replace(/\\n?```$/, '')\n    .replace(/^(Here is the output:|Output:)\\s*/, '');\n\n  // 2. Trim whitespace\n  text = text.trim();\n\n  return { json: { email_body: text } };\n}\n\n// Map over all items\nreturn items.map(item => normalizeEmail(item));\n"
          },
          "typeVersion": 2
        },
        {
          "id": "8c1b6c2e-b910-40ac-bf27-31aaf75a8828",
          "name": "Email Final Report via Gmail",
          "type": "n8n-nodes-base.gmail",
          "position": [
            1932,
            1100
          ],
          "webhookId": "9f54cf6e-88c6-4e17-8eb1-f07a87c9d381",
          "parameters": {
            "sendTo": "user@example.com",
            "message": "={{ $json.email_body }}\n",
            "options": {},
            "subject": "Next monday prediction",
            "emailType": "text"
          },
          "credentials": {
            "gmailOAuth2": {
              "id": "credential-id",
              "name": "gmailOAuth2 Credential"
            }
          },
          "typeVersion": 2.1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "6e30cc8b-6a89-412b-b291-cf85434bb375",
      "connections": {
        "Think Tool": {
          "ai_tool": [
            [
              {
                "node": "AI Sales Insights Generator",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Google Chat Model": {
          "ai_languageModel": [
            [
              {
                "node": "AI Sales Insights Generator",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "Think for summary": {
          "ai_tool": [
            [
              {
                "node": "AI-Generated Daily Summary",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Combine All Insights": {
          "main": [
            [
              {
                "node": "Wait for All Data Processing",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Normalize Waste Data": {
          "main": [
            [
              {
                "node": "AI Waste Reduction Insights Generator",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Think For Food Waste": {
          "ai_tool": [
            [
              {
                "node": "AI Waste Reduction Insights Generator",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Daily Report Scheduler": {
          "main": [
            [
              {
                "node": "Fetch Daily Sales Data",
                "type": "main",
                "index": 0
              },
              {
                "node": "Fetch Daily Food Waste Records",
                "type": "main",
                "index": 0
              },
              {
                "node": "Fetch Customer Feedback",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Daily Sales Data": {
          "main": [
            [
              {
                "node": "Normalize Sales Records",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Sales AI Output": {
          "main": [
            [
              {
                "node": "Combine All Insights",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Waste AI Output": {
          "main": [
            [
              {
                "node": "Combine All Insights",
                "type": "main",
                "index": 1
              }
            ]
          ]
        },
        "Fetch Customer Feedback": {
          "main": [
            [
              {
                "node": "Normalize Feedback Entries",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Normalize Sales Records": {
          "main": [
            [
              {
                "node": "AI Sales Insights Generator",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Think Tool For Feedback": {
          "ai_tool": [
            [
              {
                "node": "AI Feedback Summary Generator",
                "type": "ai_tool",
                "index": 0
              }
            ]
          ]
        },
        "Chat Model For Food Waste": {
          "ai_languageModel": [
            [
              {
                "node": "AI Waste Reduction Insights Generator",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "Format Feedback AI Output": {
          "main": [
            [
              {
                "node": "Combine All Insights",
                "type": "main",
                "index": 2
              }
            ]
          ]
        },
        "Prepare Final Email Input": {
          "main": [
            [
              {
                "node": "AI-Generated Daily Summary",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI-Generated Daily Summary": {
          "main": [
            [
              {
                "node": "Format Final Email Content",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Format Final Email Content": {
          "main": [
            [
              {
                "node": "Email Final Report via Gmail",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Normalize Feedback Entries": {
          "main": [
            [
              {
                "node": "AI Feedback Summary Generator",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI Sales Insights Generator": {
          "main": [
            [
              {
                "node": "Format Sales AI Output",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Wait for All Data Processing": {
          "main": [
            [
              {
                "node": "Prepare Final Email Input",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI Feedback Summary Generator": {
          "main": [
            [
              {
                "node": "Format Feedback AI Output",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Fetch Daily Food Waste Records": {
          "main": [
            [
              {
                "node": "Normalize Waste Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Google Gemini Chat Model for summary": {
          "ai_languageModel": [
            [
              {
                "node": "AI-Generated Daily Summary",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "AI Waste Reduction Insights Generator": {
          "main": [
            [
              {
                "node": "Format Waste AI Output",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Google Gemini Chat Model For Feedback": {
          "ai_languageModel": [
            [
              {
                "node": "AI Feedback Summary Generator",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        }
      }
    },
    "lastUpdatedBy": 29,
    "workflowInfo": {
      "nodeCount": 33,
      "nodeTypes": {
        "n8n-nodes-base.code": {
          "count": 8
        },
        "n8n-nodes-base.wait": {
          "count": 1
        },
        "n8n-nodes-base.gmail": {
          "count": 1
        },
        "n8n-nodes-base.merge": {
          "count": 1
        },
        "n8n-nodes-base.stickyNote": {
          "count": 6
        },
        "n8n-nodes-base.googleSheets": {
          "count": 3
        },
        "@n8n/n8n-nodes-langchain.agent": {
          "count": 4
        },
        "n8n-nodes-base.scheduleTrigger": {
          "count": 1
        },
        "@n8n/n8n-nodes-langchain.toolThink": {
          "count": 4
        },
        "@n8n/n8n-nodes-langchain.lmChatGoogleGemini": {
          "count": 4
        }
      }
    },
    "status": "published",
    "user": {
      "name": "Oneclick AI Squad",
      "username": "oneclick-ai",
      "bio": "The AI Squad Initiative is a pioneering effort to build, automate and scale AI-powered workflows using n8n.io. Our mission is to help individuals and businesses integrate AI agents seamlessly into their daily operations  from automating tasks and enhancing productivity to creating innovative, intelligent solutions. We design modular, reusable AI workflow templates that empower creators, developers and teams to supercharge their automation with minimal effort and maximum impact.",
      "verified": true,
      "links": [
        "https://www.oneclickitsolution.com/"
      ],
      "avatar": "https://gravatar.com/avatar/848fca91367142f65f9e5c55d64e5c9952b160d7b060d103b52aa343c6bc7b3d?r=pg&d=retro&size=200"
    },
    "nodes": [
      {
        "id": 18,
        "icon": "file:googleSheets.svg",
        "name": "n8n-nodes-base.googleSheets",
        "codex": {
          "data": {
            "alias": [
              "CSV",
              "Sheet",
              "Spreadsheet",
              "GS"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/love-at-first-sight-ricardos-n8n-journey/",
                  "icon": "❤️",
                  "label": "Love at first sight: Ricardo’s n8n journey"
                },
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/automatically-adding-expense-receipts-to-google-sheets-with-telegram-mindee-twilio-and-n8n/",
                  "icon": "🧾",
                  "label": "Automatically Adding Expense Receipts to Google Sheets with Telegram, Mindee, Twilio, and n8n"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/creating-triggers-for-n8n-workflows-using-polling/",
                  "icon": "⏲",
                  "label": "Creating triggers for n8n workflows using polling"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/how-honest-burgers-use-automation-to-save-100k-per-year/",
                  "icon": "🍔",
                  "label": "How Honest Burgers Use Automation to Save $100k per year"
                },
                {
                  "url": "https://n8n.io/blog/how-a-digital-strategist-uses-n8n-for-online-marketing/",
                  "icon": "💻",
                  "label": "How a digital strategist uses n8n for online marketing"
                },
                {
                  "url": "https://n8n.io/blog/why-this-product-manager-loves-workflow-automation-with-n8n/",
                  "icon": "🧠",
                  "label": "Why this Product Manager loves workflow automation with n8n"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/how-a-membership-development-manager-automates-his-work-and-investments/",
                  "icon": "📈",
                  "label": "How a Membership Development Manager automates his work and investments"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlesheets/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Data & Storage",
              "Productivity"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"input\",\"output\"]",
        "defaults": {
          "name": "Google Sheets"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCI+PGcgZmlsbD0ibm9uZSIgZmlsbC1ydWxlPSJldmVub2RkIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNS42OSAxIDUyIDE3LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0OC4yOTMgNjBIMTIuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDkgNTYuMzEyVjQuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTIuNzA3IDF6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM1LjY5IDEgNTIgMTcuMjI1SDM5LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzkuMjExIDE3LjIyNSA1MiAyMi40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTIwLjEyIDMxLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMS42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzEuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjxwYXRoIGZpbGw9IiMyOEI0NDYiIGQ9Ik0zNC42OSAwIDUxIDE2LjIyNXYzOS4wODdhMy42NyAzLjY3IDAgMCAxLTEuMDg0IDIuNjFBMy43IDMuNyAwIDAgMSA0Ny4yOTMgNTlIMTEuNzA3YTMuNyAzLjcgMCAwIDEtMi42MjMtMS4wNzhBMy42NyAzLjY3IDAgMCAxIDggNTUuMzEyVjMuNjg4YTMuNjcgMy42NyAwIDAgMSAxLjA4NC0yLjYxQTMuNyAzLjcgMCAwIDEgMTEuNzA3IDB6Ii8+PHBhdGggZmlsbD0iIzZBQ0U3QyIgZD0iTTM0LjY5IDAgNTEgMTYuMjI1SDM4LjM5N2MtMi4wNTQgMC0zLjcwNy0xLjgyOS0zLjcwNy0zLjg3MnoiLz48cGF0aCBmaWxsPSIjMjE5QjM4IiBkPSJNMzguMjExIDE2LjIyNSA1MSAyMS40OHYtNS4yNTV6Ii8+PHBhdGggZmlsbD0iI0ZGRiIgZD0iTTE5LjEyIDMwLjk3NWMwLS44MTcuNjYyLTEuNDc1IDEuNDgzLTEuNDc1aDE3Ljc5NGMuODIxIDAgMS40ODIuNjU4IDEuNDgyIDEuNDc1djE1LjQ4N2MwIC44MTgtLjY2MSAxLjQ3NS0xLjQ4MiAxLjQ3NUgyMC42MDNhMS40NzYgMS40NzYgMCAwIDEtMS40ODItMS40NzRWMzAuOTc0em0yLjIyNSAxLjQ3NWg2LjY3MnYyLjIxMmgtNi42NzJ6bTAgNS4xNjJoNi42NzJ2Mi4yMTNoLTYuNjcyem0wIDUuMTYzaDYuNjcydjIuMjEyaC02LjY3MnptOS42MzgtMTAuMzI1aDYuNjcydjIuMjEyaC02LjY3MnptMCA1LjE2Mmg2LjY3MnYyLjIxM2gtNi42NzJ6bTAgNS4xNjNoNi42NzJ2Mi4yMTJoLTYuNjcyeiIvPjwvZz48L3N2Zz4="
        },
        "displayName": "Google Sheets",
        "typeVersion": 5,
        "nodeCategories": [
          {
            "id": 3,
            "name": "Data & Storage"
          },
          {
            "id": 4,
            "name": "Productivity"
          }
        ]
      },
      {
        "id": 24,
        "icon": "file:merge.svg",
        "name": "n8n-nodes-base.merge",
        "codex": {
          "data": {
            "alias": [
              "Join",
              "Concatenate",
              "Wait"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/how-to-sync-data-between-two-systems/",
                  "icon": "🏬",
                  "label": "How to synchronize data between two systems (one-way vs. two-way sync"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/migrating-community-metrics-to-orbit-using-n8n/",
                  "icon": "📈",
                  "label": "Migrating Community Metrics to Orbit using n8n"
                },
                {
                  "url": "https://n8n.io/blog/build-your-own-virtual-assistant-with-n8n-a-step-by-step-guide/",
                  "icon": "👦",
                  "label": "Build your own virtual assistant with n8n: A step by step guide"
                },
                {
                  "url": "https://n8n.io/blog/sending-automated-congratulations-with-google-sheets-twilio-and-n8n/",
                  "icon": "🙌",
                  "label": "Sending Automated Congratulations with Google Sheets, Twilio, and n8n "
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Flow",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Merge"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTc3XzUxOCkiPgo8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTAgNDhDMCAyMS40OTAzIDIxLjQ5MDMgMCA0OCAwSDExMkMxMzguNTEgMCAxNjAgMjEuNDkwMyAxNjAgNDhWNTZIMTk2LjI1MkMyNDAuNDM1IDU2IDI3Ni4yNTIgOTEuODE3MiAyNzYuMjUyIDEzNlYxOTJDMjc2LjI1MiAyMTQuMDkxIDI5NC4xNjEgMjMyIDMxNi4yNTIgMjMySDM1MlYyMjRDMzUyIDE5Ny40OSAzNzMuNDkgMTc2IDQwMCAxNzZINDY0QzQ5MC41MSAxNzYgNTEyIDE5Ny40OSA1MTIgMjI0VjI4OEM1MTIgMzE0LjUxIDQ5MC41MSAzMzYgNDY0IDMzNkg0MDBDMzczLjQ5IDMzNiAzNTIgMzE0LjUxIDM1MiAyODhWMjgwSDMxNi4yNTJDMjk0LjE2MSAyODAgMjc2LjI1MiAyOTcuOTA5IDI3Ni4yNTIgMzIwVjM3NkMyNzYuMjUyIDQyMC4xODMgMjQwLjQzNSA0NTYgMTk2LjI1MiA0NTZIMTYwVjQ2NEMxNjAgNDkwLjUxIDEzOC41MSA1MTIgMTEyIDUxMkg0OEMyMS40OTAzIDUxMiAwIDQ5MC41MSAwIDQ2NFY0MDBDMCAzNzMuNDkgMjEuNDkwMyAzNTIgNDggMzUySDExMkMxMzguNTEgMzUyIDE2MCAzNzMuNDkgMTYwIDQwMFY0MDhIMTk2LjI1MkMyMTMuOTI1IDQwOCAyMjguMjUyIDM5My42NzMgMjI4LjI1MiAzNzZWMzIwQzIyOC4yNTIgMjk0Ljc4NCAyMzguODU5IDI3Mi4wNDQgMjU1Ljg1MyAyNTZDMjM4Ljg1OSAyMzkuOTU2IDIyOC4yNTIgMjE3LjIxNiAyMjguMjUyIDE5MlYxMzZDMjI4LjI1MiAxMTguMzI3IDIxMy45MjUgMTA0IDE5Ni4yNTIgMTA0SDE2MFYxMTJDMTYwIDEzOC41MSAxMzguNTEgMTYwIDExMiAxNjBINDhDMjEuNDkwMyAxNjAgMCAxMzguNTEgMCAxMTJWNDhaTTEwNCA0OEMxMDguNDE4IDQ4IDExMiA1MS41ODE3IDExMiA1NlYxMDRDMTEyIDEwOC40MTggMTA4LjQxOCAxMTIgMTA0IDExMkg1NkM1MS41ODE3IDExMiA0OCAxMDguNDE4IDQ4IDEwNFY1NkM0OCA1MS41ODE3IDUxLjU4MTcgNDggNTYgNDhIMTA0Wk00NTYgMjI0QzQ2MC40MTggMjI0IDQ2NCAyMjcuNTgyIDQ2NCAyMzJWMjgwQzQ2NCAyODQuNDE4IDQ2MC40MTggMjg4IDQ1NiAyODhINDA4QzQwMy41ODIgMjg4IDQwMCAyODQuNDE4IDQwMCAyODBWMjMyQzQwMCAyMjcuNTgyIDQwMy41ODIgMjI0IDQwOCAyMjRINDU2Wk0xMTIgNDA4QzExMiA0MDMuNTgyIDEwOC40MTggNDAwIDEwNCA0MDBINTZDNTEuNTgxNyA0MDAgNDggNDAzLjU4MiA0OCA0MDhWNDU2QzQ4IDQ2MC40MTggNTEuNTgxNyA0NjQgNTYgNDY0SDEwNEMxMDguNDE4IDQ2NCAxMTIgNDYwLjQxOCAxMTIgNDU2VjQwOFoiIGZpbGw9IiM1NEI4QzkiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTc3XzUxOCI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Merge",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 356,
        "icon": "file:gmail.svg",
        "name": "n8n-nodes-base.gmail",
        "codex": {
          "data": {
            "alias": [
              "email",
              "human",
              "form",
              "wait",
              "hitl",
              "approval"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/why-business-process-automation-with-n8n-can-change-your-daily-life/",
                  "icon": "🧬",
                  "label": "Why business process automation with n8n can change your daily life"
                },
                {
                  "url": "https://n8n.io/blog/supercharging-your-conference-registration-process-with-n8n/",
                  "icon": "🎫",
                  "label": "Supercharging your conference registration process with n8n"
                },
                {
                  "url": "https://n8n.io/blog/no-code-ecommerce-workflow-automations/",
                  "icon": "store",
                  "label": "6 e-commerce workflows to power up your Shopify s"
                },
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/automate-google-apps-for-productivity/",
                  "icon": "💡",
                  "label": "15 Google apps you can combine and automate to increase productivity"
                },
                {
                  "url": "https://n8n.io/blog/your-business-doesnt-need-you-to-operate/",
                  "icon": " 🖥️",
                  "label": "Hey founders! Your business doesn't need you to operate"
                },
                {
                  "url": "https://n8n.io/blog/using-automation-to-boost-productivity-in-the-workplace/",
                  "icon": "💪",
                  "label": "Using Automation to Boost Productivity in the Workplace"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail/"
                }
              ],
              "credentialDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/"
                }
              ]
            },
            "categories": [
              "Communication",
              "HITL"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "HITL": [
                "Human in the Loop"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Gmail"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNTYiIGhlaWdodD0iMTkzIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCI+PHBhdGggZmlsbD0iIzQyODVGNCIgZD0iTTU4LjE4MiAxOTIuMDVWOTMuMTRMMjcuNTA3IDY1LjA3NyAwIDQ5LjUwNHYxMjUuMDkxYzAgOS42NTggNy44MjUgMTcuNDU1IDE3LjQ1NSAxNy40NTV6Ii8+PHBhdGggZmlsbD0iIzM0QTg1MyIgZD0iTTE5Ny44MTggMTkyLjA1aDQwLjcyN2M5LjY1OSAwIDE3LjQ1NS03LjgyNiAxNy40NTUtMTcuNDU1VjQ5LjUwNWwtMzEuMTU2IDE3LjgzNy0yNy4wMjYgMjUuNzk4eiIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im01OC4xODIgOTMuMTQtNC4xNzQtMzguNjQ3IDQuMTc0LTM2Ljk4OUwxMjggNjkuODY4bDY5LjgxOC01Mi4zNjQgNC42NyAzNC45OTItNC42NyA0MC42NDRMMTI4IDE0NS41MDR6Ii8+PHBhdGggZmlsbD0iI0ZCQkMwNCIgZD0iTTE5Ny44MTggMTcuNTA0VjkzLjE0TDI1NiA0OS41MDRWMjYuMjMxYzAtMjEuNTg1LTI0LjY0LTMzLjg5LTQxLjg5LTIwLjk0NXoiLz48cGF0aCBmaWxsPSIjQzUyMjFGIiBkPSJtMCA0OS41MDQgMjYuNzU5IDIwLjA3TDU4LjE4MiA5My4xNFYxNy41MDRMNDEuODkgNS4yODZDMjQuNjEtNy42NiAwIDQuNjQ2IDAgMjYuMjN6Ii8+PC9zdmc+"
        },
        "displayName": "Gmail",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 6,
            "name": "Communication"
          },
          {
            "id": 28,
            "name": "HITL"
          }
        ]
      },
      {
        "id": 514,
        "icon": "fa:pause-circle",
        "name": "n8n-nodes-base.wait",
        "codex": {
          "data": {
            "alias": [
              "pause",
              "sleep",
              "delay",
              "timeout"
            ],
            "resources": {
              "generic": [
                {
                  "url": "https://n8n.io/blog/how-to-get-started-with-crm-automation-and-no-code-workflow-ideas/",
                  "icon": "👥",
                  "label": "How to get started with CRM automation (with 3 no-code workflow ideas"
                },
                {
                  "url": "https://n8n.io/blog/aws-workflow-automation/",
                  "label": "7 no-code workflow automations for Amazon Web Services"
                }
              ],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Flow"
              ]
            }
          }
        },
        "group": "[\"organization\"]",
        "defaults": {
          "name": "Wait",
          "color": "#804050"
        },
        "iconData": {
          "icon": "pause-circle",
          "type": "icon"
        },
        "displayName": "Wait",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 565,
        "icon": "fa:sticky-note",
        "name": "n8n-nodes-base.stickyNote",
        "codex": {
          "data": {
            "alias": [
              "Comments",
              "Notes",
              "Sticky"
            ],
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers"
              ]
            }
          }
        },
        "group": "[\"input\"]",
        "defaults": {
          "name": "Sticky Note",
          "color": "#FFD233"
        },
        "iconData": {
          "icon": "sticky-note",
          "type": "icon"
        },
        "displayName": "Sticky Note",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 834,
        "icon": "file:code.svg",
        "name": "n8n-nodes-base.code",
        "codex": {
          "data": {
            "alias": [
              "cpde",
              "Javascript",
              "JS",
              "Python",
              "Script",
              "Custom Code",
              "Function"
            ],
            "details": "The Code node allows you to execute JavaScript in your workflow.",
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/"
                }
              ]
            },
            "categories": [
              "Development",
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0",
            "subcategories": {
              "Core Nodes": [
                "Helpers",
                "Data Transformation"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Code"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8xMTcxXzQ0MSkiPgo8cGF0aCBkPSJNMTcwLjI4MyA0OEgxOTYuNUMyMDMuMTI3IDQ4IDIwOC41IDQyLjYyNzQgMjA4LjUgMzZWMTJDMjA4LjUgNS4zNzI1OCAyMDMuMTI3IDAgMTk2LjUgMEgxNzAuMjgzQzEyNi4xIDAgOTAuMjgzIDM1LjgxNzIgOTAuMjgzIDgwVjE3NkM5MC4yODMgMjA2LjkyOCA2NS4yMTA5IDIzMiAzNC4yODMgMjMySDIzQzE2LjM3MjYgMjMyIDExIDIzNy4zNzIgMTEgMjQ0VjI2OEMxMSAyNzQuNjI3IDE2LjM3MjQgMjgwIDIyLjk5OTYgMjgwTDM0LjI4MyAyODBDNjUuMjEwOSAyODAgOTAuMjgzIDMwNS4wNzIgOTAuMjgzIDMzNlY0NDBDOTAuMjgzIDQ3OS43NjQgMTIyLjUxOCA1MTIgMTYyLjI4MyA1MTJIMTk2LjVDMjAzLjEyNyA1MTIgMjA4LjUgNTA2LjYyNyAyMDguNSA1MDBWNDc2QzIwOC41IDQ2OS4zNzMgMjAzLjEyNyA0NjQgMTk2LjUgNDY0SDE2Mi4yODNDMTQ5LjAyOCA0NjQgMTM4LjI4MyA0NTMuMjU1IDEzOC4yODMgNDQwVjMzNkMxMzguMjgzIDMwOS4wMjIgMTI4LjAxMSAyODQuNDQzIDExMS4xNjQgMjY1Ljk2MUMxMDYuMTA5IDI2MC40MTYgMTA2LjEwOSAyNTEuNTg0IDExMS4xNjQgMjQ2LjAzOUMxMjguMDExIDIyNy41NTcgMTM4LjI4MyAyMDIuOTc4IDEzOC4yODMgMTc2VjgwQzEzOC4yODMgNjIuMzI2OSAxNTIuNjEgNDggMTcwLjI4MyA0OFoiIGZpbGw9IiNGRjk5MjIiLz4KPHBhdGggZD0iTTMwNSAzNkMzMDUgNDIuNjI3NCAzMTAuMzczIDQ4IDMxNyA0OEgzNDIuOTc5QzM2MC42NTIgNDggMzc0Ljk3OCA2Mi4zMjY5IDM3NC45NzggODBWMTc2QzM3NC45NzggMjAyLjk3OCAzODUuMjUxIDIyNy41NTcgNDAyLjA5OCAyNDYuMDM5QzQwNy4xNTMgMjUxLjU4NCA0MDcuMTUzIDI2MC40MTYgNDAyLjA5OCAyNjUuOTYxQzM4NS4yNTEgMjg0LjQ0MyAzNzQuOTc4IDMwOS4wMjIgMzc0Ljk3OCAzMzZWNDMyQzM3NC45NzggNDQ5LjY3MyAzNjAuNjUyIDQ2NCAzNDIuOTc5IDQ2NEgzMTdDMzEwLjM3MyA0NjQgMzA1IDQ2OS4zNzMgMzA1IDQ3NlY1MDBDMzA1IDUwNi42MjcgMzEwLjM3MyA1MTIgMzE3IDUxMkgzNDIuOTc5QzM4Ny4xNjEgNTEyIDQyMi45NzggNDc2LjE4MyA0MjIuOTc4IDQzMlYzMzZDNDIyLjk3OCAzMDUuMDcyIDQ0OC4wNTEgMjgwIDQ3OC45NzkgMjgwSDQ5MEM0OTYuNjI3IDI4MCA1MDIgMjc0LjYyOCA1MDIgMjY4VjI0NEM1MDIgMjM3LjM3MyA0OTYuNjI4IDIzMiA0OTAgMjMyTDQ3OC45NzkgMjMyQzQ0OC4wNTEgMjMyIDQyMi45NzggMjA2LjkyOCA0MjIuOTc4IDE3NlY4MEM0MjIuOTc4IDM1LjgxNzIgMzg3LjE2MSAwIDM0Mi45NzkgMEgzMTdDMzEwLjM3MyAwIDMwNSA1LjM3MjU4IDMwNSAxMlYzNloiIGZpbGw9IiNGRjk5MjIiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8xMTcxXzQ0MSI+CjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo="
        },
        "displayName": "Code",
        "typeVersion": 2,
        "nodeCategories": [
          {
            "id": 5,
            "name": "Development"
          },
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 839,
        "icon": "fa:clock",
        "name": "n8n-nodes-base.scheduleTrigger",
        "codex": {
          "data": {
            "alias": [
              "Time",
              "Scheduler",
              "Polling",
              "Cron",
              "Interval"
            ],
            "resources": {
              "generic": [],
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger/"
                }
              ]
            },
            "categories": [
              "Core Nodes"
            ],
            "nodeVersion": "1.0",
            "codexVersion": "1.0"
          }
        },
        "group": "[\"trigger\",\"schedule\"]",
        "defaults": {
          "name": "Schedule Trigger",
          "color": "#31C49F"
        },
        "iconData": {
          "icon": "clock",
          "type": "icon"
        },
        "displayName": "Schedule Trigger",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 9,
            "name": "Core Nodes"
          }
        ]
      },
      {
        "id": 1119,
        "icon": "fa:robot",
        "name": "@n8n/n8n-nodes-langchain.agent",
        "codex": {
          "data": {
            "alias": [
              "LangChain",
              "Chat",
              "Conversational",
              "Plan and Execute",
              "ReAct",
              "Tools"
            ],
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.agent/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Agents",
                "Root Nodes"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "AI Agent",
          "color": "#404040"
        },
        "iconData": {
          "icon": "robot",
          "type": "icon"
        },
        "displayName": "AI Agent",
        "typeVersion": 3,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1262,
        "icon": "file:google.svg",
        "name": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.lmchatgooglegemini/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Language Models",
                "Root Nodes"
              ],
              "Language Models": [
                "Chat Models (Recommended)"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Google Gemini Chat Model"
        },
        "iconData": {
          "type": "file",
          "fileBuffer": "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2aWV3Qm94PSIwIDAgNDggNDgiPjxkZWZzPjxwYXRoIGlkPSJhIiBkPSJNNDQuNSAyMEgyNHY4LjVoMTEuOEMzNC43IDMzLjkgMzAuMSAzNyAyNCAzN2MtNy4yIDAtMTMtNS44LTEzLTEzczUuOC0xMyAxMy0xM2MzLjEgMCA1LjkgMS4xIDguMSAyLjlsNi40LTYuNEMzNC42IDQuMSAyOS42IDIgMjQgMiAxMS44IDIgMiAxMS44IDIgMjRzOS44IDIyIDIyIDIyYzExIDAgMjEtOCAyMS0yMiAwLTEuMy0uMi0yLjctLjUtNCIvPjwvZGVmcz48Y2xpcFBhdGggaWQ9ImIiPjx1c2UgeGxpbms6aHJlZj0iI2EiIG92ZXJmbG93PSJ2aXNpYmxlIi8+PC9jbGlwUGF0aD48cGF0aCBmaWxsPSIjRkJCQzA1IiBkPSJNMCAzN1YxMWwxNyAxM3oiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiNFQTQzMzUiIGQ9Im0wIDExIDE3IDEzIDctNi4xTDQ4IDE0VjBIMHoiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiMzNEE4NTMiIGQ9Im0wIDM3IDMwLTIzIDcuOSAxTDQ4IDB2NDhIMHoiIGNsaXAtcGF0aD0idXJsKCNiKSIvPjxwYXRoIGZpbGw9IiM0Mjg1RjQiIGQ9Ik00OCA0OCAxNyAyNGwtNC0zIDM1LTEweiIgY2xpcC1wYXRoPSJ1cmwoI2IpIi8+PC9zdmc+"
        },
        "displayName": "Google Gemini Chat Model",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      },
      {
        "id": 1289,
        "icon": "fa:brain",
        "name": "@n8n/n8n-nodes-langchain.toolThink",
        "codex": {
          "data": {
            "resources": {
              "primaryDocumentation": [
                {
                  "url": "https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolthink/"
                }
              ]
            },
            "categories": [
              "AI",
              "Langchain"
            ],
            "subcategories": {
              "AI": [
                "Tools"
              ],
              "Tools": [
                "Other Tools"
              ]
            }
          }
        },
        "group": "[\"transform\"]",
        "defaults": {
          "name": "Think"
        },
        "iconData": {
          "icon": "brain",
          "type": "icon"
        },
        "displayName": "Think Tool",
        "typeVersion": 1,
        "nodeCategories": [
          {
            "id": 25,
            "name": "AI"
          },
          {
            "id": 26,
            "name": "Langchain"
          }
        ]
      }
    ],
    "categories": [
      {
        "id": 35,
        "name": "Document Extraction"
      },
      {
        "id": 49,
        "name": "AI Summarization"
      }
    ],
    "image": []
  }
}