AutomationFlowsAI & RAG › Audit Multi-page Cro with Gpt-4o-mini, Google Sheets, and Gmail Alerts

Audit Multi-page Cro with Gpt-4o-mini, Google Sheets, and Gmail Alerts

ByIncrementors @incrementors on n8n.io

Submit up to 3 landing page URLs using a simple form and the workflow audits each one automatically. For every page, GPT-4o-mini scrapes the content, scores it across five dimensions, identifies the top conversion issue, and generates five specific page fixes. Every result is…

Event trigger★★★★☆ complexityAI-powered17 nodesForm TriggerHTTP RequestAgentOpenAI ChatOutput Parser StructuredGoogle SheetsGmail
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #15126 — we link there as the canonical source.

This workflow follows the Agent → Form Trigger 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "c5e88f1a-b212-4bd8-ac7b-b2a7e2010001",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1584,
        1184
      ],
      "parameters": {
        "color": 4,
        "width": 556,
        "height": 1080,
        "content": "## Multi-Page CRO Audit Pipeline \u2014 GPT-4o-mini + Sheets + Gmail\n\nFor marketing managers, agency owners, and growth teams who need a fast structured conversion rate audit across multiple landing pages at once. Submit up to 3 page URLs via the form. The workflow scrapes each page, cleans the HTML, and sends it to GPT-4o-mini which scores it across five dimensions: overall CRO score, CTA strength, trust score, message clarity, and a 5-item specific fix list. Every result is logged to Google Sheets. Pages scoring below your alert threshold automatically trigger a Gmail alert with the score, top issue, fastest fix, and all five improvements.\n\n## How it works\n- **1. Form \u2014 Multi-Page CRO Audit** collects up to 3 page URLs with names, business type, and your name\n- **2. Set \u2014 Config Values** stores Sheet ID, alert email, sender name, and score threshold\n- **3. Code \u2014 Build Pages List** filters valid URLs and outputs one item per page so the rest of the workflow runs independently for each\n- **4. HTTP \u2014 Scrape Landing Page** fetches the raw HTML of each page\n- **5. Code \u2014 Clean HTML to Text** strips scripts and styles, decodes HTML entities, and keeps the first 4000 characters for GPT\n- **6. AI Agent \u2014 CRO Audit** uses GPT-4o-mini to score the page across 9 fields including overall score, grade, sub-scores, top issue, quick win, and 5 page-specific fixes\n- **9. Code \u2014 Prepare Audit Results** formats all fields for Sheets and Gmail and sets the needsAlert flag based on score versus threshold\n- **10. Google Sheets \u2014 Log CRO Audit** appends one row per page to the tracker\n- **11. IF \u2014 Score Below Threshold?** routes pages that fail the threshold to Gmail\n- **12. Gmail \u2014 Send CRO Alert** sends a detailed alert only for pages scoring below the threshold\n\n## Set up steps\n1. In **2. Set \u2014 Config Values** \u2014 replace PASTE_YOUR_GOOGLE_SHEET_ID_HERE, PASTE_YOUR_EMAIL_ADDRESS_HERE, PASTE_YOUR_NAME_HERE, and adjust scoreThreshold (default 6 means pages scoring 5 or below get an alert)\n2. In **7. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **10. Google Sheets \u2014 Log CRO Audit** \u2014 connect your Google Sheets OAuth2 credential\n4. In **12. Gmail \u2014 Send CRO Alert** \u2014 connect your Gmail OAuth2 credential\n5. Create a Google Sheet tab named CRO Audit Dashboard with columns: Date, Page URL, Page Name, CRO Score, Grade, Top Issue, Quick Win, CTA Strength, Trust Score, Message Clarity, Priority, Fix List, Audited By, Logged At\n6. Activate and open the Form URL to submit your first audit"
      },
      "typeVersion": 1
    },
    {
      "id": "2a6c222d-63b4-4ead-942e-c8ec72436228",
      "name": "Section \u2014 Form Input, Config, and Pages List",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -944,
        1360
      ],
      "parameters": {
        "color": 5,
        "width": 740,
        "height": 532,
        "content": "## Form Input, Config, and Pages List\nUser submits up to 3 page URLs with names and business type. Config stores sheet ID, alert email, sender name, and score threshold. The Code node filters valid URLs and outputs one item per page so each page is audited independently."
      },
      "typeVersion": 1
    },
    {
      "id": "86780f61-e686-4e02-9e5b-90511395a229",
      "name": "Section \u2014 Page Scraping, HTML Cleaning, and AI CRO Audit",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        1360
      ],
      "parameters": {
        "color": 6,
        "width": 788,
        "height": 884,
        "content": "## Page Scraping, HTML Cleaning, and AI CRO Audit\nHTTP fetches raw HTML for each page. A Code node strips scripts, styles, and tags \u2014 keeping 4000 chars of clean text for GPT. GPT-4o-mini scores the page across 9 fields including overall score, grade, CTA strength, trust score, message clarity, top issue, quick win, priority, and 5 page-specific fixes."
      },
      "typeVersion": 1
    },
    {
      "id": "51626482-65b4-4e8a-b7ed-ceba56855ec9",
      "name": "Section \u2014 Results Assembly, Sheet Logging, and Alert Routing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        816,
        1216
      ],
      "parameters": {
        "color": 4,
        "width": 836,
        "height": 836,
        "content": "## Results Assembly, Sheet Logging, and Alert Routing\nPrepares all fields for Sheets and Gmail. Sets needsAlert if score is below threshold. Google Sheets logs every page. The IF node routes low-scoring pages to Gmail. Pages passing the threshold exit cleanly with no email sent."
      },
      "typeVersion": 1
    },
    {
      "id": "2d5921fa-ec58-43b4-9ab1-402eb3fe0801",
      "name": "1. Form \u2014 Multi-Page CRO Audit",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -816,
        1568
      ],
      "parameters": {
        "options": {},
        "formTitle": "Multi-Page CRO Audit",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Your Name or Company",
              "placeholder": "Example: Rahul \u2014 Incrementors",
              "requiredField": true
            },
            {
              "fieldLabel": "Page 1 URL",
              "placeholder": "https://yoursite.com/page-1",
              "requiredField": true
            },
            {
              "fieldLabel": "Page 1 Name",
              "placeholder": "Example: Homepage, Pricing Page, Contact Page",
              "requiredField": true
            },
            {
              "fieldLabel": "Page 2 URL",
              "placeholder": "https://yoursite.com/page-2 (leave blank to skip)"
            },
            {
              "fieldLabel": "Page 2 Name",
              "placeholder": "Example: Product Page"
            },
            {
              "fieldLabel": "Page 3 URL",
              "placeholder": "https://yoursite.com/page-3 (leave blank to skip)"
            },
            {
              "fieldLabel": "Page 3 Name",
              "placeholder": "Example: Services Page"
            },
            {
              "fieldLabel": "Business Type",
              "placeholder": "Example: SaaS, Law Firm, E-commerce, Medical Spa"
            }
          ]
        },
        "formDescription": "Audit up to 3 landing pages at once. Each page gets a CRO score, key issues, and quick wins. Pages with low scores trigger an email alert automatically."
      },
      "typeVersion": 2.2
    },
    {
      "id": "aaf2285c-9f38-4782-a9c1-e520b09d7750",
      "name": "2. Set \u2014 Config Values",
      "type": "n8n-nodes-base.set",
      "position": [
        -592,
        1568
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cfg-001",
              "name": "sheetId",
              "type": "string",
              "value": "PASTE_YOUR_GOOGLE_SHEET_ID_HERE"
            },
            {
              "id": "cfg-002",
              "name": "sheetName",
              "type": "string",
              "value": "CRO Audit Dashboard"
            },
            {
              "id": "cfg-003",
              "name": "alertEmail",
              "type": "string",
              "value": "PASTE_YOUR_EMAIL_ADDRESS_HERE"
            },
            {
              "id": "cfg-004",
              "name": "senderName",
              "type": "string",
              "value": "PASTE_YOUR_NAME_HERE"
            },
            {
              "id": "cfg-005",
              "name": "scoreThreshold",
              "type": "string",
              "value": "6"
            },
            {
              "id": "cfg-006",
              "name": "auditorName",
              "type": "string",
              "value": "={{ $json['Your Name or Company'] }}"
            },
            {
              "id": "cfg-007",
              "name": "businessType",
              "type": "string",
              "value": "={{ $json['Business Type'] || 'General Business' }}"
            },
            {
              "id": "cfg-008",
              "name": "page1Url",
              "type": "string",
              "value": "={{ $json['Page 1 URL']?.trim() || '' }}"
            },
            {
              "id": "cfg-009",
              "name": "page1Name",
              "type": "string",
              "value": "={{ $json['Page 1 Name'] || 'Page 1' }}"
            },
            {
              "id": "cfg-010",
              "name": "page2Url",
              "type": "string",
              "value": "={{ $json['Page 2 URL']?.trim() || '' }}"
            },
            {
              "id": "cfg-011",
              "name": "page2Name",
              "type": "string",
              "value": "={{ $json['Page 2 Name'] || 'Page 2' }}"
            },
            {
              "id": "cfg-012",
              "name": "page3Url",
              "type": "string",
              "value": "={{ $json['Page 3 URL']?.trim() || '' }}"
            },
            {
              "id": "cfg-013",
              "name": "page3Name",
              "type": "string",
              "value": "={{ $json['Page 3 Name'] || 'Page 3' }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "56cb9946-1ea8-4905-9bf0-e0ed6e502068",
      "name": "3. Code \u2014 Build Pages List",
      "type": "n8n-nodes-base.code",
      "position": [
        -368,
        1568
      ],
      "parameters": {
        "jsCode": "const config = $input.first().json;\n\n// Build list of pages \u2014 skip any that have no URL\nconst pages = [\n  { url: config.page1Url, name: config.page1Name },\n  { url: config.page2Url, name: config.page2Name },\n  { url: config.page3Url, name: config.page3Name }\n].filter(p => p.url && p.url.startsWith('http'));\n\nif (pages.length === 0) {\n  throw new Error('No valid URLs found. Please submit at least one URL starting with http.');\n}\n\n// Return one item per page \u2014 the rest of the workflow runs once for each page\nreturn pages.map((page, index) => ({\n  json: {\n    pageUrl: page.url,\n    pageName: page.name,\n    pageIndex: index + 1,\n    totalPages: pages.length,\n    businessType: config.businessType,\n    auditorName: config.auditorName,\n    sheetId: config.sheetId,\n    sheetName: config.sheetName,\n    alertEmail: config.alertEmail,\n    senderName: config.senderName,\n    scoreThreshold: parseInt(config.scoreThreshold) || 6\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "602be28b-066c-4a17-a211-6e8717a284e3",
      "name": "4. HTTP \u2014 Scrape Landing Page",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -112,
        1568
      ],
      "parameters": {
        "url": "={{ $json.pageUrl }}",
        "options": {
          "timeout": 15000,
          "response": {
            "response": {
              "responseFormat": "text"
            }
          }
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "213ef460-7563-4b1f-a9f9-d749150e615b",
      "name": "5. Code \u2014 Clean HTML to Text",
      "type": "n8n-nodes-base.code",
      "position": [
        112,
        1568
      ],
      "parameters": {
        "jsCode": "const html = $input.first().json;\nconst pageData = $('3. Code \u2014 Build Pages List').item.json;\n\n// Get raw HTML as a string\nlet rawHtml = '';\nif (typeof html === 'string') {\n  rawHtml = html;\n} else if (html?.data) {\n  rawHtml = typeof html.data === 'string' ? html.data : JSON.stringify(html.data);\n} else {\n  rawHtml = JSON.stringify(html);\n}\n\nif (!rawHtml || rawHtml.length < 100) {\n  throw new Error('Page returned no usable content for: ' + pageData.pageUrl);\n}\n\n// Remove script and style blocks\nlet cleanText = rawHtml\n  .replace(/<script[\\s\\S]*?<\\/script>/gi, '')\n  .replace(/<style[\\s\\S]*?<\\/style>/gi, '')\n  .replace(/<!--[\\s\\S]*?-->/g, '')\n  .replace(/<\\/(div|p|li|h[1-6]|section|article|header|footer|nav|main)>/gi, '\\n')\n  .replace(/<[^>]+>/g, ' ')\n  .replace(/&nbsp;/g, ' ')\n  .replace(/&amp;/g, '&')\n  .replace(/&lt;/g, '<')\n  .replace(/&gt;/g, '>')\n  .replace(/&quot;/g, '\"')\n  .replace(/\\s{3,}/g, '\\n\\n')\n  .trim();\n\nconst wasTruncated = cleanText.length > 4000;\ncleanText = cleanText.substring(0, 4000);\nif (wasTruncated) cleanText += '\\n[Content cut off at 4000 characters]';\n\nreturn [{\n  json: {\n    pageUrl: pageData.pageUrl,\n    pageName: pageData.pageName,\n    businessType: pageData.businessType,\n    auditorName: pageData.auditorName,\n    pageContent: cleanText,\n    sheetId: pageData.sheetId,\n    sheetName: pageData.sheetName,\n    alertEmail: pageData.alertEmail,\n    senderName: pageData.senderName,\n    scoreThreshold: pageData.scoreThreshold\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "621b6317-9fea-4e7d-ab3e-510aba4bdcae",
      "name": "6. AI Agent \u2014 CRO Audit",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        352,
        1568
      ],
      "parameters": {
        "text": "=You are an expert in Conversion Rate Optimization with 15 years of experience auditing landing pages.\n\nBusiness Type: {{ $json.businessType }}\nPage Name: {{ $json.pageName }}\nPage URL: {{ $json.pageUrl }}\n\nLanding Page Content:\n{{ $json.pageContent }}\n\nAudit this landing page. Return ONLY a valid JSON object. No extra text. No markdown. No backticks.\n\nJSON fields required:\n\noverallScore\nA number from 1 to 10 based on overall conversion potential.\n1 to 3 means critical problems losing most visitors.\n4 to 5 means poor with major improvements needed.\n6 to 7 means average with noticeable gaps.\n8 to 9 means good with minor improvements needed.\n10 means excellent and fully optimized.\n\ngrade\nOne letter grade matching the score.\nF for 1 to 2, D for 3 to 4, C for 5 to 6, B for 7 to 8, A for 9, A+ for 10.\n\nctaStrength\nA number from 1 to 10. How clear and compelling is the main call to action button or link?\n\ntrustScore\nA number from 1 to 10. How strong is the social proof, testimonials, and trust signals?\n\nmessageClarity\nA number from 1 to 10. Can a visitor understand what this page offers within 5 seconds?\n\ntopIssue\nOne sentence. The single biggest problem hurting conversions on this page. Reference something specific from the page content. Keep it under 20 words.\n\nquickWin\nOne sentence. The single change that would boost conversions the fastest. Be specific and practical. Keep it under 25 words.\n\nfixList\nAn array of exactly 5 strings. Each string is one specific improvement for this page.\nEach fix must reference actual elements from the page.\nEach fix must be doable within 1 to 2 days.\nEach fix must be specific to this page and this business type.\nDo not write generic advice. Keep each fix under 30 words.\n\npriority\nOne word showing urgency level.\nCRITICAL for score 1 to 4.\nHIGH for score 5 to 6.\nMEDIUM for score 7 to 8.\nLOW for score 9 to 10.",
        "options": {},
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    },
    {
      "id": "029b0cf7-0312-47de-8d13-c9dfa6f75e1d",
      "name": "7. OpenAI \u2014 GPT-4o-mini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        352,
        1872
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {
          "maxTokens": 800,
          "temperature": 0.3
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "a68050d6-eb20-4c96-bd5f-6a81c45ab279",
      "name": "8. Parser \u2014 Structured CRO Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        496,
        2016
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"overallScore\": { \"type\": \"number\", \"description\": \"CRO score from 1 to 10\" },\n    \"grade\": { \"type\": \"string\", \"description\": \"F, D, C, B, A, or A+\" },\n    \"ctaStrength\": { \"type\": \"number\", \"description\": \"CTA quality from 1 to 10\" },\n    \"trustScore\": { \"type\": \"number\", \"description\": \"Trust and social proof from 1 to 10\" },\n    \"messageClarity\": { \"type\": \"number\", \"description\": \"Value proposition clarity from 1 to 10\" },\n    \"topIssue\": { \"type\": \"string\", \"description\": \"The biggest conversion problem on the page\" },\n    \"quickWin\": { \"type\": \"string\", \"description\": \"The single fastest fix to boost conversions\" },\n    \"fixList\": { \"type\": \"array\", \"items\": { \"type\": \"string\" }, \"description\": \"List of 5 specific improvements\" },\n    \"priority\": { \"type\": \"string\", \"description\": \"CRITICAL, HIGH, MEDIUM, or LOW\" }\n  },\n  \"required\": [\"overallScore\", \"grade\", \"ctaStrength\", \"trustScore\", \"messageClarity\", \"topIssue\", \"quickWin\", \"fixList\", \"priority\"]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "150018b6-35e2-4b13-852f-9a5cfe323075",
      "name": "9. Code \u2014 Prepare Audit Results",
      "type": "n8n-nodes-base.code",
      "position": [
        864,
        1568
      ],
      "parameters": {
        "jsCode": "const aiOutput = $input.first().json.output;\nconst pageData = $('5. Code \u2014 Clean HTML to Text').item.json;\n\nconst score = aiOutput?.overallScore || 0;\nconst grade = aiOutput?.grade || 'N/A';\nconst priority = aiOutput?.priority || 'HIGH';\nconst threshold = pageData.scoreThreshold || 6;\n\nconst scoreEmoji = score >= 8 ? 'Good' : score >= 6 ? 'Average' : score >= 4 ? 'Poor' : 'Critical';\n\nconst priorityLabel = {\n  'LOW': 'Low',\n  'MEDIUM': 'Medium',\n  'HIGH': 'High',\n  'CRITICAL': 'Critical'\n}[priority] || 'High';\n\nconst fixListForSheet = (aiOutput?.fixList || []).map((f, i) => (i + 1) + '. ' + f).join(' | ');\nconst fixListForEmail = (aiOutput?.fixList || []).map((f, i) => (i + 1) + '. ' + f).join('\\n');\n\nconst today = new Date().toLocaleDateString('en-GB', {\n  day: '2-digit', month: 'short', year: 'numeric'\n});\nconst loggedAt = new Date().toISOString().replace('T', ' ').substring(0, 16);\n\nconst emailSubject = 'CRO Alert \u2014 ' + pageData.pageName + ' scored ' + score + ' out of 10 (' + grade + ')';\nconst emailBody =\n  'Hi ' + pageData.senderName + ',\\n\\n' +\n  'One of your landing pages scored below your alert threshold.\\n\\n' +\n  'Page name: ' + pageData.pageName + '\\n' +\n  'Page URL: ' + pageData.pageUrl + '\\n' +\n  'CRO score: ' + score + ' out of 10 \u2014 ' + grade + ' \u2014 ' + scoreEmoji + '\\n' +\n  'Priority level: ' + priorityLabel + '\\n\\n' +\n  'Top issue:\\n' + (aiOutput?.topIssue || 'Not available') + '\\n\\n' +\n  'Fastest fix:\\n' + (aiOutput?.quickWin || 'Not available') + '\\n\\n' +\n  '5 specific fixes for this page:\\n' + fixListForEmail + '\\n\\n' +\n  'Sub-scores:\\n' +\n  'CTA strength: ' + (aiOutput?.ctaStrength || 'N/A') + ' out of 10\\n' +\n  'Trust score: ' + (aiOutput?.trustScore || 'N/A') + ' out of 10\\n' +\n  'Message clarity: ' + (aiOutput?.messageClarity || 'N/A') + ' out of 10\\n\\n' +\n  'Please fix this page before your next campaign.\\n\\n' +\n  'Best regards,\\n' + pageData.senderName;\n\nreturn [{\n  json: {\n    date: today,\n    pageUrl: pageData.pageUrl,\n    pageName: pageData.pageName,\n    croScore: score + ' out of 10 \u2014 ' + scoreEmoji,\n    grade: grade,\n    topIssue: aiOutput?.topIssue || 'Not available',\n    quickWin: aiOutput?.quickWin || 'Not available',\n    ctaStrength: (aiOutput?.ctaStrength || 0) + ' out of 10',\n    trustScore: (aiOutput?.trustScore || 0) + ' out of 10',\n    messageClarity: (aiOutput?.messageClarity || 0) + ' out of 10',\n    priority: priorityLabel,\n    fixList: fixListForSheet,\n    auditorName: pageData.auditorName,\n    loggedAt: loggedAt,\n    needsAlert: score < threshold,\n    rawScore: score,\n    emailSubject: emailSubject,\n    emailBody: emailBody,\n    alertEmail: pageData.alertEmail,\n    sheetId: pageData.sheetId,\n    sheetName: pageData.sheetName\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "df4698c7-e277-4816-ad85-b65aae9463a7",
      "name": "10. Google Sheets \u2014 Log CRO Audit",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1088,
        1408
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ $json.date }}",
            "Grade": "={{ $json.grade }}",
            "Fix List": "={{ $json.fixList }}",
            "Page URL": "={{ $json.pageUrl }}",
            "Priority": "={{ $json.priority }}",
            "CRO Score": "={{ $json.croScore }}",
            "Logged At": "={{ $json.loggedAt }}",
            "Page Name": "={{ $json.pageName }}",
            "Quick Win": "={{ $json.quickWin }}",
            "Top Issue": "={{ $json.topIssue }}",
            "Audited By": "={{ $json.auditorName }}",
            "Trust Score": "={{ $json.trustScore }}",
            "CTA Strength": "={{ $json.ctaStrength }}",
            "Message Clarity": "={{ $json.messageClarity }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {
          "cellFormat": "USER_ENTERED"
        },
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $json.sheetName }}"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.sheetId }}"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "7af7a8cd-e81d-49bc-9958-774b0a8fc500",
      "name": "11. IF \u2014 Score Below Threshold?",
      "type": "n8n-nodes-base.if",
      "position": [
        1088,
        1728
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cond-alert",
              "operator": {
                "type": "boolean",
                "operation": "true"
              },
              "leftValue": "={{ $('9. Code \u2014 Prepare Audit Results').item.json.needsAlert }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "1c0b3364-a4ed-4521-b088-f96720479548",
      "name": "12. Gmail \u2014 Send CRO Alert",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1312,
        1568
      ],
      "parameters": {
        "sendTo": "={{ $('9. Code \u2014 Prepare Audit Results').item.json.alertEmail }}",
        "message": "={{ $('9. Code \u2014 Prepare Audit Results').item.json.emailBody }}",
        "options": {
          "appendAttribution": false
        },
        "subject": "={{ $('9. Code \u2014 Prepare Audit Results').item.json.emailSubject }}"
      },
      "typeVersion": 2.1
    },
    {
      "id": "bd2b72d6-e542-480d-bd70-7397b9981205",
      "name": "13. Set \u2014 No Alert Needed",
      "type": "n8n-nodes-base.set",
      "position": [
        1312,
        1888
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "no-alert-001",
              "name": "result",
              "type": "string",
              "value": "=Page passed \u2014 {{ $('9. Code \u2014 Prepare Audit Results').item.json.pageName }} scored {{ $('9. Code \u2014 Prepare Audit Results').item.json.rawScore }} out of 10. Logged to Sheets. No email sent."
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "connections": {
    "2. Set \u2014 Config Values": {
      "main": [
        [
          {
            "node": "3. Code \u2014 Build Pages List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6. AI Agent \u2014 CRO Audit": {
      "main": [
        [
          {
            "node": "9. Code \u2014 Prepare Audit Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3. Code \u2014 Build Pages List": {
      "main": [
        [
          {
            "node": "4. HTTP \u2014 Scrape Landing Page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5. Code \u2014 Clean HTML to Text": {
      "main": [
        [
          {
            "node": "6. AI Agent \u2014 CRO Audit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. HTTP \u2014 Scrape Landing Page": {
      "main": [
        [
          {
            "node": "5. Code \u2014 Clean HTML to Text",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7. OpenAI \u2014 GPT-4o-mini Model": {
      "ai_languageModel": [
        [
          {
            "node": "6. AI Agent \u2014 CRO Audit",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "1. Form \u2014 Multi-Page CRO Audit": {
      "main": [
        [
          {
            "node": "2. Set \u2014 Config Values",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "11. IF \u2014 Score Below Threshold?": {
      "main": [
        [
          {
            "node": "12. Gmail \u2014 Send CRO Alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "13. Set \u2014 No Alert Needed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9. Code \u2014 Prepare Audit Results": {
      "main": [
        [
          {
            "node": "10. Google Sheets \u2014 Log CRO Audit",
            "type": "main",
            "index": 0
          },
          {
            "node": "11. IF \u2014 Score Below Threshold?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8. Parser \u2014 Structured CRO Output": {
      "ai_outputParser": [
        [
          {
            "node": "6. AI Agent \u2014 CRO Audit",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Submit up to 3 landing page URLs using a simple form and the workflow audits each one automatically. For every page, GPT-4o-mini scrapes the content, scores it across five dimensions, identifies the top conversion issue, and generates five specific page fixes. Every result is…

Source: https://n8n.io/workflows/15126/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

🎯 Create viral TikToks, Shorts, Reels, podcasts, and ASMR videos in minutes — all on autopilot.

OpenAI, HTTP Request, Form Trigger +7
AI & RAG

Digistars - Scrape & Crawl. Uses httpRequest, n8n-nodes-firecrawl-scraper, googleSheets, lmChatOpenAi. Event-driven trigger; 63 nodes.

HTTP Request, N8N Nodes Firecrawl Scraper, Google Sheets +5
AI & RAG

🧠 Automate end-to-end SEO blog creation and WordPress publishing using a GPT-5 multi-agent workflow with real-time research, metadata generation, and optional featured images.

Output Parser Structured, HTTP Request, OpenAI +10
AI & RAG

This workflow automates end-to-end contract and invoice management using AI intelligence. It processes proposals through intelligent contract generation, approval workflows, and automated invoicing. O

Form Trigger, Data Table, Agent +4
AI & RAG

This n8n workflow template automates your lead generation and follow-up process using AI. It captures leads through a form, enriches them with company data, classifies them into different categories,

Gmail, Output Parser Structured, Form Trigger +5