This workflow corresponds to n8n.io template #14931 — we link there as the canonical source.
This workflow follows the Chainllm → Gmail 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": "beSXvU2G0O5JUu2n",
"name": "AI Weekly Business Health Report: Analyse Google Sheets Data and Email Insights with Claude",
"tags": [],
"nodes": [
{
"id": "0cfbed27-0221-4693-a962-d8ace2292475",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
-256
],
"parameters": {
"color": 0,
"width": 460,
"height": 1180,
"content": "## AI Weekly Business Health Report using Claude and Gmail\n\nStop spending Monday mornings building reports in spreadsheets. This workflow reads your last 7 days of business data from Google Sheets, asks Claude AI to find the trends, flag any problems, and highlight the wins -- then emails a plain-English summary straight to your inbox before your team standup.\n\n### How it works\n\n1. A schedule trigger fires every Monday at 7AM.\n2. The Configure node sets your business name, report email, and the date range for the past 7 days and the 7 days before that.\n3. This week's data and last week's data are both pulled from your Google Sheet.\n4. A Code node formats both datasets into a clean comparison table for Claude to read.\n5. Claude AI analyses the numbers, compares this week to last week, identifies trends, flags anything that looks off, and highlights wins.\n6. The report is formatted as a clean plain-text email and sent to your team via Gmail.\n7. Every report run is logged to a second sheet tab with the date and a summary for historical tracking.\n\n### Setup steps\n\n- [ ] **Google Sheets** -- Create a sheet where each row is one day and columns are your key metrics (e.g. Revenue, Leads, Calls, Conversions). Connect your Google account in the Fetch This Week and Fetch Last Week nodes and select your sheet.\n- [ ] **Configure node** -- Open Configure Report Settings and set YOUR_BUSINESS_NAME, YOUR_REPORT_EMAIL, and YOUR_METRICS_DESCRIPTION (a short plain-English description of what your columns mean).\n- [ ] **Claude AI** -- Click the Claude Sonnet sub-node under Analyse with Claude, add a new Anthropic credential, and paste your API key from console.anthropic.com.\n- [ ] **Gmail** -- Connect your Gmail account in the Send Weekly Report node.\n- [ ] **Log sheet** -- Create a second tab in your Google Sheet called Report Log with columns: Date, Summary, Status. Connect it in the Log Report Run node.\n- [ ] Activate the workflow. It will run automatically every Monday at 7AM.\n\n### Customization\n\nChange the trigger day and time in the Weekly Schedule Trigger node to suit your team. Add more data sources by pulling from additional sheets before the Format Data node. Swap Claude Sonnet for Claude Haiku to reduce API cost if your dataset is small."
},
"typeVersion": 1
},
{
"id": "a0295a60-fc6f-4380-abc7-684a793569a3",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
528,
0
],
"parameters": {
"color": 7,
"width": 440,
"height": 516,
"content": "## Schedule and configure\n\nFires every Monday at 7AM and sets up your business name, recipient email, and the exact date ranges for this week and last week so every downstream node knows what period to pull."
},
"typeVersion": 1
},
{
"id": "f5be4033-966b-45b3-9ccd-42815196836a",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1040,
0
],
"parameters": {
"color": 7,
"width": 440,
"height": 516,
"content": "## Fetch and format data\n\nPulls this week's rows and last week's rows from your Google Sheet in parallel, then merges them into a single formatted comparison table that Claude can read clearly."
},
"typeVersion": 1
},
{
"id": "b71f7874-66c5-4694-9d67-15d235198392",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
1552,
-32
],
"parameters": {
"color": 7,
"width": 380,
"height": 572,
"content": "## Analyse with Claude AI\n\nClaude Sonnet reads both weeks of data and returns a structured business health report covering: week-on-week changes, trends, any metrics that look off, and the top 3 actions to take this week.\n\nEdit the system prompt in this node to describe your business and what good performance looks like for you."
},
"typeVersion": 1
},
{
"id": "aa0cf241-711b-4532-9ac0-45f6f488dcf1",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2032,
-32
],
"parameters": {
"color": 7,
"width": 400,
"height": 564,
"content": "## Send report and log run\n\nSends the finished plain-text report to your team via Gmail, then logs the run date and a short summary to your Report Log sheet so you have a historical record of every weekly report."
},
"typeVersion": 1
},
{
"id": "b8dcfedd-c444-46e5-bc3b-d9522da12d72",
"name": "Weekly Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
560,
240
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 7
}
]
}
},
"typeVersion": 1.2
},
{
"id": "e577d204-1318-4c31-b847-4022e7caff1f",
"name": "Configure Report Settings",
"type": "n8n-nodes-base.code",
"position": [
784,
240
],
"parameters": {
"jsCode": "// ================================================\n// EDIT THIS NODE -- all your settings live here\n// ================================================\n\nconst BUSINESS_NAME = 'Your Business Name';\nconst REPORT_EMAIL = 'user@example.com';\nconst METRICS_DESCRIPTION = 'Revenue (USD), New Leads, Sales Calls Booked, Deals Closed, Refunds';\n\n// ================================================\n// DO NOT EDIT BELOW THIS LINE\n// ================================================\n\nconst now = new Date();\nconst today = now.toISOString().split('T')[0];\n\n// This week: last 7 days\nconst thisWeekEnd = new Date(now);\nconst thisWeekStart = new Date(now);\nthisWeekStart.setDate(thisWeekStart.getDate() - 7);\n\n// Last week: 8-14 days ago\nconst lastWeekEnd = new Date(thisWeekStart);\nconst lastWeekStart = new Date(thisWeekStart);\nlastWeekStart.setDate(lastWeekStart.getDate() - 7);\n\nfunction fmt(d) { return d.toISOString().split('T')[0]; }\n\nreturn [{\n json: {\n business_name: BUSINESS_NAME,\n report_email: REPORT_EMAIL,\n metrics_description: METRICS_DESCRIPTION,\n run_date: today,\n this_week_start: fmt(thisWeekStart),\n this_week_end: fmt(thisWeekEnd),\n last_week_start: fmt(lastWeekStart),\n last_week_end: fmt(lastWeekEnd)\n }\n}];"
},
"typeVersion": 2
},
{
"id": "e1f766d9-9901-4fae-b316-f6227052a432",
"name": "Fetch This Week Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
1088,
144
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "15242eec-11a4-40ad-aa73-3c7e4cf4aa6d",
"name": "Fetch Last Week Data",
"type": "n8n-nodes-base.googleSheets",
"position": [
1088,
352
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
},
{
"id": "7ffdf44a-2b97-4da9-b694-275102ca6af8",
"name": "Format Data for Claude",
"type": "n8n-nodes-base.code",
"position": [
1328,
240
],
"parameters": {
"jsCode": "const cfg = $('Configure Report Settings').first().json;\nconst allItems = $input.all();\n\n// Split into this week vs last week based on item order\n// Fetch This Week feeds first batch, Fetch Last Week feeds second\n// We'll use all items and label them by date column\nconst rows = allItems.map(function(item) { return item.json; });\n\n// Build a readable text block for Claude\nconst thisWeekRows = rows.filter(function(r) {\n return r.Date >= cfg.this_week_start && r.Date <= cfg.this_week_end;\n});\n\nconst lastWeekRows = rows.filter(function(r) {\n return r.Date >= cfg.last_week_start && r.Date <= cfg.last_week_end;\n});\n\nfunction rowsToText(rowArr) {\n if (!rowArr || rowArr.length === 0) return 'No data found for this period.';\n const headers = Object.keys(rowArr[0]).join(' | ');\n const lines = rowArr.map(function(r) { return Object.values(r).join(' | '); });\n return headers + '\\n' + lines.join('\\n');\n}\n\nconst formattedData = 'THIS WEEK (' + cfg.this_week_start + ' to ' + cfg.this_week_end + '):\\n'\n + rowsToText(thisWeekRows)\n + '\\n\\nLAST WEEK (' + cfg.last_week_start + ' to ' + cfg.last_week_end + '):\\n'\n + rowsToText(lastWeekRows);\n\nreturn [{\n json: {\n business_name: cfg.business_name,\n report_email: cfg.report_email,\n metrics_description: cfg.metrics_description,\n run_date: cfg.run_date,\n this_week_start: cfg.this_week_start,\n this_week_end: cfg.this_week_end,\n formatted_data: formattedData,\n this_week_row_count: thisWeekRows.length,\n last_week_row_count: lastWeekRows.length\n }\n}];"
},
"typeVersion": 2
},
{
"id": "704ee2e7-e619-45a7-9b89-41c07b5a3774",
"name": "Analyse with Claude",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1568,
240
],
"parameters": {
"text": "=You are a sharp business analyst reviewing weekly performance data for {{ $json.business_name }}.\n\nYour job is to write a clear, honest weekly business health report that a busy owner can read in 2 minutes.\n\nMETRICS IN THIS DATASET: {{ $json.metrics_description }}\n\nDATA:\n{{ $json.formatted_data }}\n\nWrite the report using EXACTLY this structure:\n\nWEEKLY BUSINESS HEALTH REPORT -- {{ $json.run_date }}\n\nOVERALL HEALTH: [One of: Strong / Steady / Needs Attention / Critical]\n\nWEEK-ON-WEEK SUMMARY:\nWrite 2-3 sentences comparing this week to last week in plain English. Be specific with numbers.\n\nWHAT IS WORKING:\n- [specific win with numbers]\n- [specific win with numbers]\n\nWHAT NEEDS ATTENTION:\n- [specific concern with numbers and why it matters]\n- [specific concern with numbers and why it matters]\n\nTOP 3 ACTIONS THIS WEEK:\n1. [Concrete action -- one sentence]\n2. [Concrete action -- one sentence]\n3. [Concrete action -- one sentence]\n\nTREND TO WATCH:\nOne sentence on the most important trend developing across both weeks.\n\nRules: Be direct. Use actual numbers from the data. Do not hedge or add disclaimers. If data is missing or incomplete, say so and explain what you can still see.",
"promptType": "define"
},
"typeVersion": 1.4
},
{
"id": "d55d1d70-e8aa-4947-85ea-f205627b4c72",
"name": "Claude Sonnet",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
1696,
416
],
"parameters": {
"model": "claude-sonnet-4-5",
"options": {
"temperature": 0.2
}
},
"typeVersion": 1.3
},
{
"id": "c9585512-1ec1-4d19-a3c1-aed533f19c92",
"name": "Parse Report Output",
"type": "n8n-nodes-base.set",
"position": [
1808,
240
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "59d3956e-d9c1-4663-8389-554ffff6e18d",
"name": "report_text",
"type": "string",
"value": "={{ $json.text }}"
},
{
"id": "f6fa3e13-732f-4f5a-b2bd-71c46091185d",
"name": "report_email",
"type": "string",
"value": "={{ $('Format Data for Claude').first().json.report_email }}"
},
{
"id": "04684a81-2676-4777-9140-65e3319a2254",
"name": "business_name",
"type": "string",
"value": "={{ $('Format Data for Claude').first().json.business_name }}"
},
{
"id": "763215e6-d415-4aee-883d-a1fbfa7c5dd1",
"name": "run_date",
"type": "string",
"value": "={{ $('Format Data for Claude').first().json.run_date }}"
},
{
"id": "dd6efc38-5111-4238-bd93-8cd87ff0f9f0",
"name": "this_week_start",
"type": "string",
"value": "={{ $('Format Data for Claude').first().json.this_week_start }}"
},
{
"id": "0d17c49a-1e14-4600-af46-a9c5313d8c11",
"name": "this_week_end",
"type": "string",
"value": "={{ $('Format Data for Claude').first().json.this_week_end }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "8203a891-fc6f-481d-bf08-414bf7769a1e",
"name": "Send Weekly Report",
"type": "n8n-nodes-base.gmail",
"position": [
2176,
144
],
"parameters": {
"sendTo": "={{ $json.report_email }}",
"message": "={{ 'Hi,\n\nHere is your automated weekly business health report for the week of ' + $json.this_week_start + ' to ' + $json.this_week_end + '.\n\n' + $json.report_text + '\n\n---\nGenerated automatically by your n8n AI Business Health Report workflow.' }}",
"options": {},
"subject": "={{ 'Weekly Business Health Report - ' + $json.run_date }}",
"emailType": "text"
},
"typeVersion": 2.1
},
{
"id": "080b3c77-503e-40a2-8936-dbfef15c06fe",
"name": "Log Report Run",
"type": "n8n-nodes-base.googleSheets",
"position": [
2176,
352
],
"parameters": {
"columns": {
"value": {
"Date": "={{ $json.run_date }}",
"Status": "Sent",
"Summary": "={{ $json.report_text.split('\\n').slice(0,3).join(' ') }}",
"Business": "={{ $json.business_name }}",
"Week Covered": "={{ $json.this_week_start + ' to ' + $json.this_week_end }}"
},
"mappingMode": "defineBelow"
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "name",
"value": "Report Log"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "YOUR_GOOGLE_SHEET_ID"
}
},
"typeVersion": 4.5
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "762f38db-a063-432b-a915-c76e3ee3fd9b",
"connections": {
"Claude Sonnet": {
"ai_languageModel": [
[
{
"node": "Analyse with Claude",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Analyse with Claude": {
"main": [
[
{
"node": "Parse Report Output",
"type": "main",
"index": 0
}
]
]
},
"Parse Report Output": {
"main": [
[
{
"node": "Send Weekly Report",
"type": "main",
"index": 0
},
{
"node": "Log Report Run",
"type": "main",
"index": 0
}
]
]
},
"Fetch Last Week Data": {
"main": [
[
{
"node": "Format Data for Claude",
"type": "main",
"index": 0
}
]
]
},
"Fetch This Week Data": {
"main": [
[
{
"node": "Format Data for Claude",
"type": "main",
"index": 0
}
]
]
},
"Format Data for Claude": {
"main": [
[
{
"node": "Analyse with Claude",
"type": "main",
"index": 0
}
]
]
},
"Weekly Schedule Trigger": {
"main": [
[
{
"node": "Configure Report Settings",
"type": "main",
"index": 0
}
]
]
},
"Configure Report Settings": {
"main": [
[
{
"node": "Fetch This Week Data",
"type": "main",
"index": 0
},
{
"node": "Fetch Last Week Data",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Stop spending Monday mornings manually pulling numbers and building reports. This workflow reads your last 7 days of business data from Google Sheets, asks Claude AI to compare it to the week before, spot trends, flag problems and highlight wins — then emails a plain-English…
Source: https://n8n.io/workflows/14931/ — 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.
The Multi-Model Agency Content Engine is a high-performance editorial system designed for agencies. It solves the "blank page" problem by alternating between real-world social proof and strategic expe
This workflow automates the creation, rendering, approval, and posting of TikTok-style POV (Point of View) videos to Instagram, with cross-posting to Facebook and YouTube. It eliminates manual video p
Categories Content Creation AI Automation Publishing Social Media
📺 Full walkthrough video: https://youtu.be/dXz5OTbm4c8
[](https://youtu.be/sKJAypXDTLA)