AutomationFlowsWeb Scraping › Wf-rev-04 — AI Auto-response (gbp + Claude)

Wf-rev-04 — AI Auto-response (gbp + Claude)

WF-REV-04 — AI Auto-Response (GBP + Claude). Uses httpRequest. Scheduled trigger; 11 nodes.

Cron / scheduled trigger★★★★☆ complexity11 nodesHTTP Request
Web Scraping Trigger: Cron / scheduled Nodes: 11 Complexity: ★★★★☆ Added:

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
{
  "name": "WF-REV-04 \u2014 AI Auto-Response (GBP + Claude)",
  "nodes": [
    {
      "id": "1",
      "name": "Every 15 Min",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.3,
      "position": [
        240,
        300
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "*/15 * * * *"
            }
          ]
        }
      },
      "notes": "Cron: every 15 min. Polls GBP for new reviews across all clients past 7-day cooldown"
    },
    {
      "id": "2",
      "name": "GET Clients With GBP Active",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        460,
        300
      ],
      "parameters": {
        "url": "https://YOUR_CONVEX_DEPLOYMENT/reviews/clients-with-gbp-active",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpHeaderAuth"
      },
      "notes": "Only clients past 7-day GBP Manager cooldown",
      "onError": "continueRegularOutput",
      "retryOnFail": true,
      "maxTries": 3
    },
    {
      "id": "3",
      "name": "Split Clients",
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        680,
        300
      ],
      "parameters": {
        "fieldToSplitOut": "clients",
        "options": {}
      }
    },
    {
      "id": "4",
      "name": "Loop Clients (5)",
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        900,
        300
      ],
      "parameters": {
        "batchSize": 5,
        "options": {}
      }
    },
    {
      "id": "5",
      "name": "GBP API \u2014 List Reviews",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        1120,
        300
      ],
      "parameters": {
        "method": "GET",
        "url": "=https://mybusiness.googleapis.com/v4/accounts/{{ $json.gbpAccountId }}/locations/{{ $json.gbpLocationId }}/reviews?pageSize=20&orderBy=updateTime desc",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $json.gbpAccessToken }}"
            }
          ]
        },
        "options": {}
      },
      "notes": "GBP API v4 \u2014 reviews list. Requires GBP Manager access + 7-day cooldown cleared.",
      "onError": "continueRegularOutput",
      "retryOnFail": true,
      "maxTries": 3
    },
    {
      "id": "6",
      "name": "Filter New Reviews",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1340,
        300
      ],
      "parameters": {
        "language": "javaScript",
        "jsCode": "const reviews = ($input.first().json.reviews || []).filter(r => !r.reviewReply);\nconst clientData = $node['Loop Clients (5)'].json;\nreturn reviews.map(r => ({ json: { ...clientData, review: r, gbpReviewId: r.reviewId, reviewerName: r.reviewer?.displayName, rating: parseInt(String(r.starRating).replace(/[^0-9]/g, ''), 10), text: r.comment } }));"
      }
    },
    {
      "id": "7",
      "name": "Claude Draft Response",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        1560,
        300
      ],
      "parameters": {
        "method": "POST",
        "url": "https://openrouter.ai/api/v1/chat/completions",
        "sendHeaders": false,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $env.OPENROUTER_API_KEY }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "bodyContentType": "json",
        "jsonBody": "={{ JSON.stringify({ model: 'anthropic/claude-haiku-4-5-20251001', max_tokens: 200, temperature: 0.7, messages: [ { role: 'system', content: 'You are ' + $json.ownerFirstName + ', owner of ' + $json.businessName + '. Respond to this Google review authentically, warmly, briefly (2-4 sentences). 5-star: warm thanks. 4-star: thank + acknowledge feedback. 3-star or below: sincere apology + provide ' + $json.ownerPhone + ' for direct contact. Sign with \\'- ' + $json.ownerFirstName + '\\'. Sound human. Never mention AI.' }, { role: 'user', content: 'Review from ' + $json.reviewerName + ' (' + $json.rating + ' stars): \\'' + $json.text + '\\'' } ] }) }}",
        "options": {},
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "onError": "continueRegularOutput",
      "retryOnFail": true,
      "maxTries": 3
    },
    {
      "id": "8",
      "name": "POST Response Drafted",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        1780,
        300
      ],
      "parameters": {
        "method": "POST",
        "url": "https://YOUR_CONVEX_DEPLOYMENT/reviews/response-drafted",
        "sendBody": true,
        "bodyContentType": "json",
        "jsonBody": "={{ JSON.stringify({ clientId: $node['Filter New Reviews'].json.id, gbpReviewId: $node['Filter New Reviews'].json.gbpReviewId, reviewerName: $node['Filter New Reviews'].json.reviewerName, reviewRating: $node['Filter New Reviews'].json.rating, reviewText: $node['Filter New Reviews'].json.text, aiDraft: $json.choices[0].message.content }) }}",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "httpHeaderAuth"
      },
      "onError": "continueRegularOutput",
      "retryOnFail": true,
      "maxTries": 3
    },
    {
      "id": "9",
      "name": "Route by Rating",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.3,
      "position": [
        2000,
        300
      ],
      "parameters": {
        "conditions": {
          "conditions": [
            {
              "leftValue": "={{ $node['Filter New Reviews'].json.rating }}",
              "rightValue": 4,
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "id": "condition-1783697686137-0fvj9bei4"
            }
          ],
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and"
        }
      }
    },
    {
      "id": "10",
      "name": "Auto-Post 4-5 Star",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        2220,
        200
      ],
      "parameters": {
        "method": "PUT",
        "url": "=https://mybusiness.googleapis.com/v4/{{ $node['Filter New Reviews'].json.gbpReviewId }}/reply",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $node['Loop Clients (5)'].json.gbpAccessToken }}"
            }
          ]
        },
        "sendBody": true,
        "bodyContentType": "json",
        "jsonBody": "={{ JSON.stringify({ comment: $node['Claude Draft Response'].json.choices[0].message.content }) }}",
        "options": {}
      },
      "onError": "continueRegularOutput",
      "retryOnFail": true,
      "maxTries": 3
    },
    {
      "id": "11",
      "name": "Post to Slack Approval (1-3 Star)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.4,
      "position": [
        2220,
        400
      ],
      "parameters": {
        "method": "POST",
        "url": "YOUR_SLACK_WEBHOOK-ENGINE-APPROVALS/PLACEHOLDER",
        "sendBody": true,
        "bodyContentType": "json",
        "jsonBody": "={{ JSON.stringify({ text: '\u2757 New ' + $node['Filter New Reviews'].json.rating + '-star review for ' + $node['Loop Clients (5)'].json.businessName + '\\n\\nReviewer: ' + $node['Filter New Reviews'].json.reviewerName + '\\nReview: ' + $node['Filter New Reviews'].json.text + '\\n\\nAI Draft: ' + $node['Claude Draft Response'].json.choices[0].message.content + '\\n\\nApprove within 60 min or auto-posts.' }) }}",
        "options": {}
      },
      "onError": "continueRegularOutput",
      "retryOnFail": true,
      "maxTries": 3
    }
  ],
  "connections": {
    "Every 15 Min": {
      "main": [
        [
          {
            "node": "GET Clients With GBP Active",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GET Clients With GBP Active": {
      "main": [
        [
          {
            "node": "Split Clients",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Clients": {
      "main": [
        [
          {
            "node": "Loop Clients (5)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Clients (5)": {
      "main": [
        [],
        [
          {
            "node": "GBP API \u2014 List Reviews",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GBP API \u2014 List Reviews": {
      "main": [
        [
          {
            "node": "Filter New Reviews",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter New Reviews": {
      "main": [
        [
          {
            "node": "Claude Draft Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude Draft Response": {
      "main": [
        [
          {
            "node": "POST Response Drafted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "POST Response Drafted": {
      "main": [
        [
          {
            "node": "Route by Rating",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Route by Rating": {
      "main": [
        [
          {
            "node": "Auto-Post 4-5 Star",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post to Slack Approval (1-3 Star)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "timezone": "America/New_York",
    "saveDataSuccessExecution": "none",
    "callerPolicy": "workflowsFromSameOwner",
    "availableInMCP": false
  },
  "active": false
}
Pro

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

About this workflow

WF-REV-04 — AI Auto-Response (GBP + Claude). Uses httpRequest. Scheduled trigger; 11 nodes.

Source: https://github.com/rafiulislam4246/review-engine/blob/main/workflows/07-ai-auto-response-gbp-claude.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Birthday Automation - Production (Fixed). Uses stopAndError, httpRequest, emailSend, bannerbear. Scheduled trigger; 86 nodes.

Stop And Error, HTTP Request, Email Send +1
Web Scraping

This template runs two scheduled workflows to govern Microsoft Entra ID (Azure AD) guest accounts by detecting stale users via Microsoft Graph, staging deletions in SharePoint with a 72-hour window, n

Microsoft SharePoint, Microsoft Teams, Microsoft Entra +1
Web Scraping

Jira-Allure-Auto-Qa. Uses httpRequest, jira. Scheduled trigger; 68 nodes.

HTTP Request, Jira
Web Scraping

Spotify-Sync-Surrealdb-V1. Uses httpRequest, n8n-nodes-surrealdb, spotify. Scheduled trigger; 62 nodes.

HTTP Request, N8N Nodes Surrealdb, Spotify
Web Scraping

As n8n instances scale, teams often lose track of sub-workflows—who uses them, where they are referenced, and whether they can be safely updated. This leads to inefficiencies like unnecessary copies o

HTTP Request, n8n, N8N Trigger +1