This workflow corresponds to n8n.io template #15846 — we link there as the canonical source.
This workflow follows the Googlegemini → Google Sheets recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"id": "4i4l9KLreTzkLNX3",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Compliance Checklist Auto-Generator",
"tags": [],
"nodes": [
{
"id": "af011c61-a469-4be3-9d65-e4a6b78f2083",
"name": "Watch Tax Compliance RSS Feed",
"type": "n8n-nodes-base.rssFeedReadTrigger",
"position": [
480,
784
],
"parameters": {
"feedUrl": "https://www.bakermckenzie.com/en/rss-landing/expertise/tax",
"pollTimes": {
"item": [
{
"mode": "everyHour"
}
]
}
},
"typeVersion": 1
},
{
"id": "5e100de0-debc-4b86-bc52-11f2d9342eb3",
"name": "Filter Relevant Tax Compliance Updates",
"type": "n8n-nodes-base.code",
"position": [
720,
784
],
"parameters": {
"jsCode": "const items = $input.all();\n\nreturn items.filter((item) => {\n const normalizedTitle = (item.json.title || '').toLowerCase();\n const normalizedLink = (item.json.link || '').toLowerCase();\n\n const includeKeywords = [\n 'tax',\n 'guideline',\n 'compliance',\n 'reporting',\n 'filing',\n 'penalty',\n 'enforcement',\n 'transparency',\n 'electronic invoicing',\n 'e-invoicing',\n 'policy',\n 'law',\n 'regulation',\n 'reform',\n 'withholding',\n 'irs',\n 'fbar',\n 'vat'\n ];\n\n const excludeKeywords = [\n 'advises',\n 'advised',\n 'featured in',\n 'earns',\n 'receives',\n 'rankings',\n 'award',\n 'acquisition',\n 'financing',\n 'counsel to',\n 'sale of'\n ];\n\n const matchesIncludeKeyword = includeKeywords.some((keyword) =>\n normalizedTitle.includes(keyword)\n );\n\n const matchesExcludeKeyword = excludeKeywords.some((keyword) =>\n normalizedTitle.includes(keyword)\n );\n\n const isInsightPublication = normalizedLink.includes('/insight/publications/');\n\n return isInsightPublication && matchesIncludeKeyword && !matchesExcludeKeyword;\n});"
},
"typeVersion": 2
},
{
"id": "b9a3a15e-4efb-48c9-88ca-0d24f9d05ceb",
"name": "Process Articles One by One",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1056,
784
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "daad88a1-177d-46ef-a7b9-39c98b8a0a81",
"name": "Fetch Full Article",
"type": "n8n-nodes-base.httpRequest",
"position": [
1280,
800
],
"parameters": {
"url": "={{ $json.link }}",
"options": {}
},
"typeVersion": 4.4
},
{
"id": "cae25ec9-35bd-4186-9f08-9835487ffaa0",
"name": "Extract Article Brief",
"type": "n8n-nodes-base.html",
"position": [
1472,
800
],
"parameters": {
"options": {},
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "briefText",
"cssSelector": "div.overview-intro.description.rte.no-expand-text p"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "8adae3be-d084-4a57-b5e6-d408ec426f75",
"name": "Prepare Article Data for AI",
"type": "n8n-nodes-base.set",
"position": [
1680,
800
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "055cf11e-8a5d-4ddc-95fb-6e49ed2231cb",
"name": "title",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.title }}"
},
{
"id": "06663aae-0562-4924-b253-ec34a5f1fa7e",
"name": "briefText",
"type": "string",
"value": "={{ $json.briefText }}"
},
{
"id": "0d79b15e-611c-45fc-8ae3-3d317e0e7a58",
"name": "link",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.link }}"
},
{
"id": "0eb153cb-c251-48b8-9be0-00b2cf8b7ddf",
"name": "pubDate",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.pubDate }}"
},
{
"id": "63a609b4-b4bd-4e5a-a04d-36fbc702c1bc",
"name": "category",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.categories[0] }}"
},
{
"id": "05106433-b7c8-4890-a3dc-614ae0e5c4f6",
"name": "guid",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.guid }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "b8f2bd5a-33d8-4949-b6d9-aa9c9246129f",
"name": "Generate Compliance Checklist with Gemini",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
1952,
800
],
"parameters": {
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/gemini-flash-lite-latest",
"cachedResultName": "models/gemini-flash-lite-latest"
},
"options": {},
"messages": {
"values": [
{
"content": "=You are a compliance analyst.\n\nAnalyze the following regulatory update and generate a structured compliance response.\n\nInput:\nTitle: {{ $json.title }}\nPublished Date: {{ $json.pubDate }}\nCategory: {{ $json.category }}\nSource Link: {{ $json.link }}\nContent: {{ $json.briefText }}\n\nInstructions:\n1. Determine whether this update is actionable for a company compliance team.\n2. Focus on concrete tax, reporting, filing, invoicing, enforcement, penalty, disclosure or policy impacts.\n3. If the update mainly reports a legal or regulatory change with potential business impact, treat it as actionable.\n4. If the update is informational only and does not imply a likely compliance action, treat it as not actionable.\n\nIf NOT actionable, return:\n{\n \"actionable\": \"No\",\n \"reason\": \"short reason\",\n \"summary\": \"brief summary\",\n \"priority\": \"Low\",\n \"checklist\": [],\n \"owner_team\": \"Monitor\",\n \"due_timeline\": \"monitor\"\n}\n\nIf actionable, return:\n{\n \"actionable\": \"Yes\",\n \"reason\": \"why this requires action\",\n \"summary\": \"2-3 sentence summary of the update\",\n \"priority\": \"High or Medium or Low\",\n \"checklist\": [\n \"specific action 1\",\n \"specific action 2\",\n \"specific action 3\"\n ],\n \"owner_team\": \"Compliance or Finance or Legal or IT\",\n \"due_timeline\": \"immediate or 7 days or 30 days or monitor\"\n}\n\nRules:\n- Return ONLY valid JSON\n- Do NOT include markdown or explanations\n- Checklist must contain specific actionable steps based on the provided content\n- Do not use generic checklist items unless clearly supported by the content\n- Base your reasoning primarily on the Content field, using the title and category as supporting context"
}
]
},
"builtInTools": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "85a54fde-f2b0-4bd5-85cb-af042a9d9cb0",
"name": "Parse Gemini JSON Response",
"type": "n8n-nodes-base.code",
"position": [
2304,
800
],
"parameters": {
"jsCode": "const items = $input.all();\n\nreturn items.map((item) => {\n const rawText = item.json.content?.parts?.[0]?.text || '';\n\n let parsed;\n\n try {\n parsed = JSON.parse(rawText);\n } catch (error) {\n parsed = {\n actionable: \"No\",\n reason: \"Failed to parse Gemini JSON response\",\n summary: rawText,\n priority: \"Low\",\n checklist: [],\n owner_team: \"Monitor\",\n due_timeline: \"monitor\"\n };\n }\n\n return {\n json: {\n ...item.json,\n ...parsed\n }\n };\n});"
},
"typeVersion": 2
},
{
"id": "a4c8bbd5-6a6a-437a-8623-e0d13f568a5b",
"name": "Check If Update Is Actionable",
"type": "n8n-nodes-base.if",
"position": [
2592,
800
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "8a88f1d0-620f-490a-af5d-656baa022d83",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.actionable.toLowerCase() }}",
"rightValue": "yes"
}
]
}
},
"typeVersion": 2.3
},
{
"id": "71109a24-de45-48c8-ac4c-d934463decfc",
"name": "Format Row for Google Sheets",
"type": "n8n-nodes-base.set",
"position": [
2832,
688
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "d99c6389-2e25-4c83-bdc4-ee389bf7de99",
"name": "date_added",
"type": "string",
"value": "={{ new Date().toISOString() }}"
},
{
"id": "646d3455-637a-4ec8-baa6-999c21f09cc0",
"name": "title",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.title }}"
},
{
"id": "552b59e6-3bfa-47cb-991b-3aea9197be1e",
"name": "published_date",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.isoDate }}"
},
{
"id": "241870df-8d4c-46f9-8ee2-ddfd26f2b02f",
"name": "guid",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.guid }}"
},
{
"id": "d68f9086-c576-4aba-8553-9e8dbc5f6c6a",
"name": "category",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.categories[0] }}"
},
{
"id": "ce96ab48-8291-4f05-855b-6439345cddc9",
"name": "link",
"type": "string",
"value": "={{ $('Process Articles One by One').item.json.link }}"
},
{
"id": "2c5284b6-2ce8-4b2f-8b15-c710e55b9b91",
"name": "summary",
"type": "string",
"value": "={{ $json.summary }}"
},
{
"id": "0f96211b-1c65-4dd2-acc3-0332bc8846ef",
"name": "reason",
"type": "string",
"value": "={{ $json.reason }}"
},
{
"id": "356e7e60-cd74-49ee-a808-dcf7e5c293b5",
"name": "priority",
"type": "string",
"value": "={{ $json.priority }}"
},
{
"id": "b00161ff-3c20-4ff9-9f10-90f4e76e2a7a",
"name": "checklist",
"type": "string",
"value": "={{ $json.checklist.map(item => '- ' + item).join('\\n') }}"
},
{
"id": "5890a937-3260-4a16-9e5e-e34d6ab0bd24",
"name": "owner_team",
"type": "string",
"value": "={{ $json.owner_team }}"
},
{
"id": "28e8d8d1-b204-4303-a779-3216688f9e69",
"name": "due_timeline",
"type": "string",
"value": "={{ $json.due_timeline }}"
},
{
"id": "6cdaee94-16c2-4add-b423-bb9ff454923d",
"name": "status",
"type": "string",
"value": "New"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "ebaf890a-d447-49f5-a527-008614d5c92c",
"name": "Add Actionable Update to Tracker",
"type": "n8n-nodes-base.googleSheets",
"position": [
3072,
624
],
"parameters": {
"columns": {
"value": {
"GUID": "={{ $json.guid }}",
"Link": "={{ $json.link }}",
"Title": "={{ $json.title }}",
"Reason": "={{ $json.reason }}",
"Status": "={{ $json.status }}",
"Summary": "={{ $json.summary }}",
"Category": "={{ $json.category }}",
"Priority": "={{ $json.priority }}",
"Checklist": "={{ $json.checklist }}",
"Date Added": "={{ $json.date_added }}",
"Owner Team": "={{ $json.owner_team }}",
"Due Timeline": "={{ $json.due_timeline }}",
"Published Date": "={{ $json.published_date }}"
},
"schema": [
{
"id": "Sr. No.",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Sr. No.",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Date Added",
"type": "string",
"display": true,
"required": false,
"displayName": "Date Added",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Published Date",
"type": "string",
"display": true,
"required": false,
"displayName": "Published Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Title",
"type": "string",
"display": true,
"required": false,
"displayName": "Title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Link",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Link",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Category",
"type": "string",
"display": true,
"required": false,
"displayName": "Category",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "GUID",
"type": "string",
"display": true,
"required": false,
"displayName": "GUID",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Summary",
"type": "string",
"display": true,
"required": false,
"displayName": "Summary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Reason",
"type": "string",
"display": true,
"required": false,
"displayName": "Reason",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Priority",
"type": "string",
"display": true,
"required": false,
"displayName": "Priority",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Checklist",
"type": "string",
"display": true,
"required": false,
"displayName": "Checklist",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Owner Team",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Owner Team",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Due Timeline",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Due Timeline",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Status",
"type": "string",
"display": true,
"required": false,
"displayName": "Status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1X-ogoupF_bG7P2hkkBvDrZLh3QzUzqBG2WPfIREyB-A/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1X-ogoupF_bG7P2hkkBvDrZLh3QzUzqBG2WPfIREyB-A",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1X-ogoupF_bG7P2hkkBvDrZLh3QzUzqBG2WPfIREyB-A/edit?usp=drivesdk",
"cachedResultName": "Compliance Checklist Tracker"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "67dfbebc-e3dd-4d31-8da1-49ed88e4ca05",
"name": "Skip Non-Actionable Update",
"type": "n8n-nodes-base.noOp",
"position": [
3024,
816
],
"parameters": {},
"typeVersion": 1
},
{
"id": "2f21edc4-7ff4-44db-80b5-43f0c7764112",
"name": "Pause Before Next Article",
"type": "n8n-nodes-base.wait",
"position": [
3312,
816
],
"parameters": {
"unit": "minutes",
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "1f2dca11-80a3-44c7-a344-3b83dc8b4e5d",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-16
],
"parameters": {
"width": 960,
"height": 512,
"content": "# Compliance Checklist Auto-Generator\n\n## How it works:\nThis workflow monitors a tax-focused RSS feed and automatically converts regulatory updates into structured compliance checklists. When a new item is detected, it filters for relevant tax and compliance content, processes each article individually and fetches its full page to extract a concise \u201cIn brief\u201d summary. An AI model then analyzes this content to determine whether the update is actionable for a compliance team. If actionable, it generates a summary, reason, priority and a checklist of required actions along with the responsible team and timeline. The final output is stored in Google Sheets for tracking and follow-up.\n\n\n## Setup steps:\n1. Create a Google Sheet with columns such as Date Added, Published Date, Title, Category, Link, GUID, Summary, Reason, Priority, Checklist, Owner Team, Due Timeline and Status.\n2. Connect your Google Sheets account in n8n and select the target spreadsheet and sheet.\n3. Configure your Gemini (Google AI) API credentials to enable AI-based analysis.\n4. Configure the RSS feed URL for a trusted tax or regulatory updates source (e.g., Baker McKenzie tax insights), ensuring it provides relevant compliance-focused content.\n5. Verify the HTML extraction selector matches the \u201cIn brief\u201d section of your source articles.\n6. Adjust the RSS polling interval (e.g., hourly) and wait time between items (e.g., 30\u2013120 seconds) to manage API usage.\n7. Test the workflow with a few items to ensure correct parsing and sheet updates.\n8. Activate the workflow to start automatically monitoring and logging compliance updates."
},
"typeVersion": 1
},
{
"id": "16447322-466d-4ce1-bf88-de8501bcced5",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
624
],
"parameters": {
"color": 7,
"width": 528,
"height": 336,
"content": "## RSS Monitoring & Relevance Filtering\nAutomatically monitors tax compliance RSS feed for new updates. Filters incoming items using keyword logic to retain only relevant regulatory and compliance-related articles for further processing."
},
"typeVersion": 1
},
{
"id": "142cf5d2-2e53-4fcc-a927-0dbd595c58c1",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
976,
624
],
"parameters": {
"color": 7,
"width": 864,
"height": 400,
"content": "## Article Processing & Extraction\nProcesses articles one by one, fetches full content and extracts the \u201cIn brief\u201d section. Structures key fields like title, date, category and content for AI analysis."
},
"typeVersion": 1
},
{
"id": "0402b072-db78-4783-ae55-178d2cbec1fa",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
1904,
624
],
"parameters": {
"color": 7,
"width": 560,
"height": 400,
"content": "## AI Compliance Analysis\nSends structured article data to Gemini AI to evaluate whether the update is actionable. Parses the JSON response and extracts summary, priority, checklist, owner team and timeline."
},
"typeVersion": 1
},
{
"id": "41cf7265-4286-4cba-8369-fe6715ef5e29",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2528,
528
],
"parameters": {
"color": 7,
"width": 976,
"height": 496,
"content": "## Action Filtering & Logging\nFilters actionable updates, formats them into structured rows and logs them into Google Sheets. Skips non-actionable items and controls execution flow using a wait node."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "9a988f74-b2de-4378-bd09-b88749cc0310",
"connections": {
"Fetch Full Article": {
"main": [
[
{
"node": "Extract Article Brief",
"type": "main",
"index": 0
}
]
]
},
"Extract Article Brief": {
"main": [
[
{
"node": "Prepare Article Data for AI",
"type": "main",
"index": 0
}
]
]
},
"Pause Before Next Article": {
"main": [
[
{
"node": "Process Articles One by One",
"type": "main",
"index": 0
}
]
]
},
"Parse Gemini JSON Response": {
"main": [
[
{
"node": "Check If Update Is Actionable",
"type": "main",
"index": 0
}
]
]
},
"Skip Non-Actionable Update": {
"main": [
[
{
"node": "Pause Before Next Article",
"type": "main",
"index": 0
}
]
]
},
"Prepare Article Data for AI": {
"main": [
[
{
"node": "Generate Compliance Checklist with Gemini",
"type": "main",
"index": 0
}
]
]
},
"Process Articles One by One": {
"main": [
[],
[
{
"node": "Fetch Full Article",
"type": "main",
"index": 0
}
]
]
},
"Format Row for Google Sheets": {
"main": [
[
{
"node": "Add Actionable Update to Tracker",
"type": "main",
"index": 0
}
]
]
},
"Check If Update Is Actionable": {
"main": [
[
{
"node": "Format Row for Google Sheets",
"type": "main",
"index": 0
}
],
[
{
"node": "Skip Non-Actionable Update",
"type": "main",
"index": 0
}
]
]
},
"Watch Tax Compliance RSS Feed": {
"main": [
[
{
"node": "Filter Relevant Tax Compliance Updates",
"type": "main",
"index": 0
}
]
]
},
"Add Actionable Update to Tracker": {
"main": [
[
{
"node": "Pause Before Next Article",
"type": "main",
"index": 0
}
]
]
},
"Filter Relevant Tax Compliance Updates": {
"main": [
[
{
"node": "Process Articles One by One",
"type": "main",
"index": 0
}
]
]
},
"Generate Compliance Checklist with Gemini": {
"main": [
[
{
"node": "Parse Gemini JSON Response",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googlePalmApigoogleSheetsOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
> n8n + Gemini + Google Sheets
Source: https://n8n.io/workflows/15846/ — 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.
Sales Lead Qualifier. Uses telegramTrigger, googleSheets, telegram, googleGemini. Event-driven trigger; 41 nodes.
Monitor a Google Drive folder, process each image based on the prompt defined in and save the new image to the specified output Google Drive folder. Maintain a processing log in Google Sheets.
Understand your customers before you build for them. This workflow, Market Segmentation: Buyer Persona Pain Point Report, automates the grueling process of primary market research. By scraping real-wo
Categories Marketing Intelligence, Ad Operations, Competitive Research, Creative Analysis
Automate your product visuals! This n8n workflow instantly processes new product photography requests from Jotform or Google Sheets, uses an AI agent (Gemini Nano Banana) to generate professional AI p