This workflow corresponds to n8n.io template #16632 — we link there as the canonical source.
This workflow follows the Chainllm → Google Drive 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": "Ld1GNB3zUvUrGSN4",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Visual Regression Testing with Apify & AI Vision",
"tags": [],
"nodes": [
{
"id": "95f1570a-f6a4-4f89-b3e3-66a87dedf109",
"name": "Base Image",
"type": "n8n-nodes-base.googleDrive",
"position": [
-3312,
736
],
"parameters": {
"fileId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.base }}"
},
"options": {
"binaryPropertyName": "data_1"
},
"operation": "download"
},
"typeVersion": 3
},
{
"id": "da124fea-c2cf-4ddd-a285-d3b32c6209fe",
"name": "Google Gemini Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
-2432,
1008
],
"parameters": {
"options": {},
"modelName": "models/gemini-1.5-pro-latest"
},
"typeVersion": 1
},
{
"id": "428121ef-9e32-4587-b430-c4dd61a0c8a5",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-2240,
1008
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n\t\"properties\": {\n\t\t\"type\": {\n \t\t\"type\": \"string\",\n \"description\": \"type of regression. One of text, number, image, color or position.\"\n \t\t},\n\t\t\"description\": { \"type\": \"string\" },\n \"previous_state\": { \"type\": \"string\" },\n \"current_state\": { \"type\": \"string\" }\n\t}\n }\n}"
},
"typeVersion": 1.2
},
{
"id": "0284fb3d-793c-42e6-a844-2e592623d45f",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-5248,
656
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "30fb0e2e-57c3-4627-ba09-6a908b4c6d2d",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
-4816,
896
],
"parameters": {
"amount": 2
},
"typeVersion": 1.1
},
{
"id": "49a17678-adf1-40f2-8f99-0a54d749c296",
"name": "Download Screenshot",
"type": "n8n-nodes-base.httpRequest",
"position": [
-4832,
432
],
"parameters": {
"url": "={{ $json.screenshotUrl }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "c5c5a4ad-7cf0-47c0-aeb9-fd23236edcb5",
"name": "Upload to Drive",
"type": "n8n-nodes-base.googleDrive",
"position": [
-4656,
432
],
"parameters": {
"name": "={{ $('Merge').item.json.url.urlEncode() }}",
"driveId": {
"__rl": true,
"mode": "list",
"value": "My Drive"
},
"options": {
"simplifyOutput": true
},
"folderId": {
"__rl": true,
"mode": "list",
"value": "1lAFxJPWcA_sOcjr3UUKKfFfoTwd4Stkh",
"cachedResultUrl": "https://drive.google.com/drive/folders/1lAFxJPWcA_sOcjr3UUKKfFfoTwd4Stkh",
"cachedResultName": "base_images"
}
},
"typeVersion": 3
},
{
"id": "3eaa19f5-59bd-49a6-906a-5a2466fd1c6c",
"name": "Update Base Image",
"type": "n8n-nodes-base.googleSheets",
"position": [
-4464,
432
],
"parameters": {
"columns": {
"value": {
"url": "={{ $('Merge').item.json.url }}",
"base": "={{ $json.id }}"
},
"schema": [
{
"id": "service",
"type": "string",
"display": true,
"required": false,
"displayName": "service",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "base",
"type": "string",
"display": true,
"required": false,
"displayName": "base",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"url"
]
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84/edit?usp=drivesdk",
"cachedResultName": "Visual Regression List"
}
},
"typeVersion": 4.5
},
{
"id": "66bfc45c-33a4-4467-b091-544b1e91666a",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
-5008,
432
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3
},
{
"id": "9399efa6-a9c1-4487-9aab-abc0cd29d035",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-4128,
448
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 6
}
]
}
},
"typeVersion": 1.2
},
{
"id": "f7b1a15f-7dcb-47c2-8eba-058a99b4316d",
"name": "Get URLs with Missing Base Images",
"type": "n8n-nodes-base.googleSheets",
"position": [
-5552,
560
],
"parameters": {
"options": {},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84/edit?usp=drivesdk",
"cachedResultName": "Visual Regression List"
}
},
"typeVersion": 4.5
},
{
"id": "e70b38fb-fb97-4d89-a3ec-dbf622b17c99",
"name": "Run Webpage Screenshot",
"type": "n8n-nodes-base.httpRequest",
"position": [
-4992,
896
],
"parameters": {
"url": "https://api.apify.com/v2/acts/apify~screenshot-url/run-sync-get-dataset-items",
"method": "POST",
"options": {},
"jsonBody": "={{\n{\n \"delay\": 0,\n \"format\": \"png\",\n \"proxy\": {\n \"useApifyProxy\": true\n },\n \"scrollToBottom\": false,\n \"urls\": [\n {\n \"url\": $json.url\n }\n ],\n \"viewportWidth\": 1280,\n \"waitUntil\": \"domcontentloaded\",\n \"waitUntilNetworkIdleAfterScroll\": false\n}\n}}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpQueryAuth"
},
"typeVersion": 4.2
},
{
"id": "f35dbad6-4928-40e7-a6fc-6cd33f964be3",
"name": "Run Webpage Screenshot1",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3296,
912
],
"parameters": {
"url": "https://api.apify.com/v2/acts/apify~screenshot-url/run-sync-get-dataset-items",
"method": "POST",
"options": {},
"jsonBody": "={{\n{\n \"delay\": 0,\n \"format\": \"png\",\n \"proxy\": {\n \"useApifyProxy\": true\n },\n \"scrollToBottom\": false,\n \"urls\": [\n {\n \"url\": $json.url\n }\n ],\n \"viewportWidth\": 1280,\n \"waitUntil\": \"domcontentloaded\",\n \"waitUntilNetworkIdleAfterScroll\": false\n}\n}}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpQueryAuth"
},
"typeVersion": 4.2
},
{
"id": "19d53be0-3bf9-4c88-9164-aa0b7219ed55",
"name": "Has Changes",
"type": "n8n-nodes-base.filter",
"position": [
-2272,
448
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "20b18a7e-bf98-4f39-baa9-4d965097526a",
"operator": {
"type": "array",
"operation": "lengthGt",
"rightType": "number"
},
"leftValue": "={{ $json.output }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2.2
},
{
"id": "0dea3e19-35d1-482b-a81c-f2a9f20a9895",
"name": "Combine Row and Result",
"type": "n8n-nodes-base.set",
"position": [
-2448,
448
],
"parameters": {
"mode": "raw",
"options": {},
"jsonOutput": "={{\n{\n ...$('Get Webpages List').item.json,\n output: $json.output\n}\n}}\n"
},
"typeVersion": 3.4
},
{
"id": "b4ca7d69-c8e7-4355-866d-23845721dd33",
"name": "Wait1",
"type": "n8n-nodes-base.wait",
"position": [
-1968,
1008
],
"parameters": {
"amount": 1
},
"typeVersion": 1.1
},
{
"id": "bcf91a69-2e07-4163-bb0f-ac61a4d640fc",
"name": "Aggregate",
"type": "n8n-nodes-base.aggregate",
"position": [
-2080,
448
],
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData"
},
"typeVersion": 1
},
{
"id": "69d85596-7a6c-490a-8681-dd2107b7059a",
"name": "Create Report",
"type": "n8n-nodes-base.linear",
"position": [
-1904,
448
],
"parameters": {
"title": "=Visual Regression Report {{ $now.format('yyyy-MM-dd') }}",
"teamId": "1c721608-321d-4132-ac32-6e92d04bb487",
"additionalFields": {
"description": "=Visual Regression Workflow picked up the following changes:\n\n{{\n$json.data.map(row =>\n`### ${row.url}\n${row.output.map(issue =>\n`* **${issue.description}** - expected \"${issue.previous_state}\" but got \"${issue.current_state}\"`\n).join('\\n')}`\n).join('\\n');\n}}"
}
},
"typeVersion": 1
},
{
"id": "9d8ce612-552f-4356-9f80-76cd03c22f53",
"name": "When clicking \u2018Test workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-5744,
560
],
"parameters": {},
"typeVersion": 1
},
{
"id": "c921ea24-8ddc-47e7-8dd3-0246a85f2ddd",
"name": "Get Webpages List",
"type": "n8n-nodes-base.googleSheets",
"position": [
-3936,
448
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "2",
"lookupColumn": "=row_number"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/1RbobwHCJiYKnic6T-VA3kPr-Grd4Y_ZSQXqy2st_T84/edit?usp=drivesdk",
"cachedResultName": "Visual Regression List"
}
},
"typeVersion": 4.5
},
{
"id": "845bdb6c-6d4e-46a2-914c-ff0c8f7083a3",
"name": "For Each Webpage...",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-3616,
512
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "24c341f1-92a4-4ca4-86a1-ce0487554f20",
"name": "Download New Screenshot",
"type": "n8n-nodes-base.httpRequest",
"position": [
-3120,
912
],
"parameters": {
"url": "={{ $json.screenshotUrl }}",
"options": {
"response": {
"response": {
"responseFormat": "file",
"outputPropertyName": "data_2"
}
}
}
},
"typeVersion": 4.2
},
{
"id": "cbdb4603-2cbb-4cb9-9ba4-cf0128e7df6d",
"name": "Combine Screenshots",
"type": "n8n-nodes-base.merge",
"position": [
-2912,
736
],
"parameters": {
"mode": "combine",
"options": {},
"combineBy": "combineByPosition"
},
"typeVersion": 3
},
{
"id": "1f317f8a-35bc-468d-be6f-889c7db9e46b",
"name": "Visual Regression Agent",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
-2432,
848
],
"parameters": {
"text": "Identify changes between the base image and test image.",
"messages": {
"messageValues": [
{
"message": "=You help with visual regression testing for websites. Identify changes to text content, images, colors, position and layouts of the elements in the screenshots. Ignore text styling or casing changes.\nThe first image will be the base image and the second image will be the test. Note all changes to the test image which differ from the base. If there are no changes, it is okay to return an empty array."
},
{
"type": "HumanMessagePromptTemplate",
"messageType": "imageBinary",
"binaryImageDataKey": "data_1"
},
{
"type": "HumanMessagePromptTemplate",
"messageType": "imageBinary",
"binaryImageDataKey": "data_2"
}
]
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.4
},
{
"id": "cc43fd8f-3fb7-4cd7-8df9-d9bc4aefc792",
"name": "Main Overview",
"type": "n8n-nodes-base.stickyNote",
"position": [
-6464,
256
],
"parameters": {
"color": 7,
"width": 560,
"height": 1812,
"content": "## \ud83d\udd0d Visual Regression Testing with Apify & AI Vision\n\nCaptures fresh screenshots of your web pages with Apify, compares them against stored baseline images using a Gemini vision model, and files a Linear issue whenever a visual regression is detected.\n\n**Perfect for:** QA engineers and front-end teams who want automated, pixel-aware visual regression checks without writing assertion code.\n\n---\n\n## How it works\n\n**Part A \u2014 Generate base images (run manually first)**\n\n1. **When clicking 'Test workflow'** \u2014 Manually starts the baseline-generation run.\n2. **Get URLs with Missing Base Images** \u2014 Reads the Google Sheet for any rows that have a URL but no stored base screenshot.\n3. **Loop Over Items** \u2014 Iterates through each URL that needs a baseline.\n4. **Run Webpage Screenshot** \u2014 Calls the Apify screenshot actor to capture the page.\n5. **Wait** \u2014 Pauses for the Apify run to finish before looping again.\n6. **Merge** \u2014 Recombines the loop output with the screenshot result.\n7. **Download Screenshot** \u2014 Fetches the rendered screenshot file from the Apify URL.\n8. **Upload to Drive** \u2014 Saves the baseline image to Google Drive.\n9. **Update Base Image** \u2014 Writes the new Drive file ID back into the Google Sheet.\n\n**Part B \u2014 Run the regression test (scheduled)**\n\n10. **Schedule Trigger** \u2014 Fires the regression run on a recurring schedule.\n11. **Get Webpages List** \u2014 Reads every page to test from the Google Sheet.\n12. **For Each Webpage...** \u2014 Loops through each page one at a time.\n13. **Base Image** \u2014 Downloads the stored baseline screenshot from Google Drive.\n14. **Run Webpage Screenshot1** \u2014 Calls the Apify actor to capture a fresh screenshot.\n15. **Download New Screenshot** \u2014 Fetches that fresh screenshot file from Apify.\n16. **Combine Screenshots** \u2014 Merges the baseline and the new image into one item.\n17. **Visual Regression Agent** \u2014 Sends both images to the AI model to detect differences.\n18. **Google Gemini Chat Model** \u2014 The Gemini vision model that performs the comparison.\n19. **Structured Output Parser** \u2014 Forces the AI to return a typed list of regressions.\n20. **Wait1** \u2014 Throttles between AI calls to respect rate limits.\n21. **Combine Row and Result** \u2014 Joins the sheet row with the AI's regression findings.\n22. **Has Changes** \u2014 Filters out pages where no regression was found.\n23. **Aggregate** \u2014 Collects all flagged pages into a single dataset.\n24. **Create Report** \u2014 Files a Linear issue summarising the detected regressions.\n\n---\n\n## Setup (~15 minutes)\n\n1. **Apify** \u2014 Add your Apify token (Query Auth) in the *Run Webpage Screenshot* and *Run Webpage Screenshot1* nodes.\n2. **Google Sheets** \u2014 Connect your account in *Get URLs with Missing Base Images*, *Update Base Image*, and *Get Webpages List*; the sheet needs a URL column and a base-image column.\n3. **Google Drive** \u2014 Connect your account in *Base Image* and *Upload to Drive* for baseline storage.\n4. **Google Gemini (PaLM) API** \u2014 Add your key in the *Google Gemini Chat Model* node.\n5. **Linear** \u2014 Connect your Linear API credential in the *Create Report* node and pick the target team.\n> Run Part A manually first to seed every page's baseline before enabling the Schedule Trigger. Apify screenshot runs are billed per execution, so watch your actor usage."
},
"typeVersion": 1
},
{
"id": "b6510290-92d4-4d04-a76a-022558259891",
"name": "Section - Base Images",
"type": "n8n-nodes-base.stickyNote",
"position": [
-5856,
256
],
"parameters": {
"color": 5,
"width": 1640,
"height": 980,
"content": "## 1\ufe0f\u20e3 Generate Base Images\n\nTriggered manually by **When clicking 'Test workflow'**, this stage reads any rows lacking a baseline via **Get URLs with Missing Base Images**, then **Loop Over Items** processes each URL. **Run Webpage Screenshot** calls the Apify actor, **Wait** lets it finish, and after **Merge** the **Download Screenshot** node pulls the image. **Upload to Drive** stores it and **Update Base Image** records the Drive file ID back in the sheet."
},
"typeVersion": 1
},
{
"id": "bdf73f29-cde6-447d-be59-a7ff6ed917f7",
"name": "Section - Capture",
"type": "n8n-nodes-base.stickyNote",
"position": [
-4176,
256
],
"parameters": {
"color": 6,
"width": 1580,
"height": 973,
"content": "## 2\ufe0f\u20e3 Scheduled Capture\n\nOn a recurring **Schedule Trigger**, **Get Webpages List** loads every page to test and **For Each Webpage...** loops through them. For each page, **Base Image** downloads the stored baseline from Drive while **Run Webpage Screenshot1** and **Download New Screenshot** capture a fresh shot via Apify, and **Combine Screenshots** merges both images into a single item ready for comparison."
},
"typeVersion": 1
},
{
"id": "30ae1983-0d62-4b2c-984f-5c3c20cbf845",
"name": "Section - AI Regression",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2544,
640
],
"parameters": {
"color": 3,
"width": 900,
"height": 584,
"content": "## 3\ufe0f\u20e3 AI Visual Regression\n\nThe **Visual Regression Agent** sends the baseline and the new screenshot to the **Google Gemini Chat Model**, which inspects both images for visual differences. The **Structured Output Parser** forces the response into a typed list of regressions (text, number, image, color or position), and **Wait1** throttles calls to stay within rate limits."
},
"typeVersion": 1
},
{
"id": "2e6f60bc-bce0-43a9-9bb3-4625392ab020",
"name": "Section - Report",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2544,
256
],
"parameters": {
"color": 4,
"width": 900,
"height": 360,
"content": "## 4\ufe0f\u20e3 Report Generation\n\n**Combine Row and Result** joins each sheet row with its AI findings, then **Has Changes** filters down to only the pages where a regression was detected. **Aggregate** collects every flagged page into one dataset and **Create Report** files a single Linear issue documenting the detected visual regressions."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"executionOrder": "v1"
},
"versionId": "428def22-1fc2-433f-9d70-8d2c60122125",
"nodeGroups": [],
"connections": {
"Wait": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Download Screenshot",
"type": "main",
"index": 0
}
]
]
},
"Wait1": {
"main": [
[
{
"node": "For Each Webpage...",
"type": "main",
"index": 0
}
]
]
},
"Aggregate": {
"main": [
[
{
"node": "Create Report",
"type": "main",
"index": 0
}
]
]
},
"Base Image": {
"main": [
[
{
"node": "Combine Screenshots",
"type": "main",
"index": 0
}
]
]
},
"Has Changes": {
"main": [
[
{
"node": "Aggregate",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
],
[
{
"node": "Run Webpage Screenshot",
"type": "main",
"index": 0
}
]
]
},
"Upload to Drive": {
"main": [
[
{
"node": "Update Base Image",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Get Webpages List",
"type": "main",
"index": 0
}
]
]
},
"Get Webpages List": {
"main": [
[
{
"node": "For Each Webpage...",
"type": "main",
"index": 0
}
]
]
},
"Combine Screenshots": {
"main": [
[
{
"node": "Visual Regression Agent",
"type": "main",
"index": 0
}
]
]
},
"Download Screenshot": {
"main": [
[
{
"node": "Upload to Drive",
"type": "main",
"index": 0
}
]
]
},
"For Each Webpage...": {
"main": [
[
{
"node": "Combine Row and Result",
"type": "main",
"index": 0
}
],
[
{
"node": "Base Image",
"type": "main",
"index": 0
},
{
"node": "Run Webpage Screenshot1",
"type": "main",
"index": 0
}
]
]
},
"Combine Row and Result": {
"main": [
[
{
"node": "Has Changes",
"type": "main",
"index": 0
}
]
]
},
"Run Webpage Screenshot": {
"main": [
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Download New Screenshot": {
"main": [
[
{
"node": "Combine Screenshots",
"type": "main",
"index": 1
}
]
]
},
"Run Webpage Screenshot1": {
"main": [
[
{
"node": "Download New Screenshot",
"type": "main",
"index": 0
}
]
]
},
"Visual Regression Agent": {
"main": [
[
{
"node": "Wait1",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "Visual Regression Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Visual Regression Agent",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Get URLs with Missing Base Images": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
},
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"When clicking \u2018Test workflow\u2019": {
"main": [
[
{
"node": "Get URLs with Missing Base Images",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow generates baseline website screenshots with Apify, stores them in Google Drive, and logs the file IDs in Google Sheets, then runs scheduled visual regression checks by comparing new screenshots against the baselines with Google Gemini Vision and creating a…
Source: https://n8n.io/workflows/16632/ — 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.
Visual Regression Testing With Apify And Ai Vision Model. Uses googleDrive, lmChatGoogleGemini, outputParserStructured, stickyNote. Scheduled trigger; 34 nodes.
This n8n workflow is a proof-of-concept template exploring how we might work with multimodal LLMs and their multi-image analysis capabilities. In this demo, we compare 2 screenshots of a webpage taken
Visual Regression Testing with Apify and AI Vision Model. Uses googleDrive, lmChatGoogleGemini, outputParserStructured, httpRequest. Scheduled trigger; 34 nodes.
This n8n workflow automates the process of collecting job and decision-maker data, crafting AI-generated referral messages, and drafting them in Gmail—all using a combination of Apify, Google Sheets,
Community nodes are used in this workflow. B2B Sales Teams & SDRs Recruitment Agencies & Tech Recruiters Startup Founders Growth Marketing Teams Scrape Hiring Signals: The workflow starts by using an