AutomationFlowsWeb Scraping › Intent Layered Account Priority Engine

Intent Layered Account Priority Engine

Intent Layered Account Priority Engine. Uses httpRequest. Scheduled trigger; 9 nodes.

Cron / scheduled trigger★★★★☆ complexity9 nodesHTTP Request
Web Scraping Trigger: Cron / scheduled Nodes: 9 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": "Intent Layered Account Priority Engine",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 7 * * 1-5"
            }
          ]
        }
      },
      "name": "Every Weekday 7am",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        200,
        300
      ]
    },
    {
      "parameters": {
        "url": "https://sheets.googleapis.com/v4/spreadsheets/YOUR_SHEET_ID/values/signals!A2:F500",
        "jsonParameters": true,
        "options": {},
        "headerParametersJson": "{\"Authorization\": \"Bearer YOUR_GOOGLE_OAUTH_TOKEN\"}"
      },
      "name": "Pull Signal Log (Sheet)",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        440,
        300
      ],
      "notesInFlow": true,
      "notes": "Signal log columns: account, domain, signal_type (web_visit | job_change | content_download | webinar | pricing_view), detail, signal_date, source. RB2B, Apollo job-change alerts, and form fills all append rows here via their own small webhook flows."
    },
    {
      "parameters": {
        "jsCode": "// INTENT SCORING with weights and 30-day time decay\nconst rows = ($json.values || []).map(r => ({ account: r[0], domain: r[1], type: r[2], detail: r[3], date: new Date(r[4]), source: r[5] }));\nconst WEIGHTS = { pricing_view: 4, web_visit: 3, content_download: 3, webinar: 3, job_change: 2, funding: 2, hiring_surge: 2 };\nconst now = Date.now();\nconst accounts = {};\nfor (const s of rows) {\n  const ageDays = (now - s.date.getTime()) / 86400000;\n  if (ageDays > 30 || isNaN(ageDays)) continue; // TIME DECAY: signals expire\n  const decay = 1 - (ageDays / 30); // linear decay to zero at 30 days\n  const pts = (WEIGHTS[s.type] || 1) * decay;\n  if (!accounts[s.domain]) accounts[s.domain] = { account: s.account, domain: s.domain, score: 0, signals: [] };\n  accounts[s.domain].score += pts;\n  accounts[s.domain].signals.push(`${s.type}: ${s.detail} (${Math.round(ageDays)}d ago)`);\n}\nconst out = Object.values(accounts).map(a => ({\n  ...a,\n  score: Math.round(a.score * 10) / 10,\n  tier: a.score >= 8 ? 'T1' : a.score >= 4 ? 'T2' : 'T3'\n})).sort((x, y) => y.score - x.score);\nreturn out.map(a => ({ json: a }));"
      },
      "name": "Score + Decay + Tier",
      "type": "n8n-nodes-base.code",
      "typeVersion": 1,
      "position": [
        680,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.tier }}",
              "operation": "equals",
              "value2": "T1"
            }
          ]
        }
      },
      "name": "Tier 1 Today?",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        920,
        300
      ]
    },
    {
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "requestMethod": "POST",
        "jsonParameters": true,
        "options": {},
        "headerParametersJson": "{\"x-api-key\": \"YOUR_ANTHROPIC_API_KEY\", \"anthropic-version\": \"2023-06-01\", \"content-type\": \"application/json\"}",
        "bodyParametersJson": "{\"model\": \"claude-haiku-4-5-20251001\", \"max_tokens\": 200, \"system\": \"You summarize buying intent for a sales team. Given an account's intent signals, write ONE sentence starting with 'Why now:' that a rep can read in 5 seconds before reaching out. Be concrete, reference the strongest signal.\", \"messages\": [{\"role\": \"user\", \"content\": \"Account: {{ $json.account }} ({{ $json.domain }}), score {{ $json.score }}. Signals: {{ $json.signals.join(' | ') }}\"}]}"
      },
      "name": "Claude - Why Now Summary",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        1160,
        200
      ]
    },
    {
      "parameters": {
        "jsCode": "const why = ($json.content?.[0]?.text || '').trim();\nreturn [{ json: { ...($node['Score + Decay + Tier'].json), why_now: why } }];"
      },
      "name": "Attach Why Now",
      "type": "n8n-nodes-base.code",
      "typeVersion": 1,
      "position": [
        1380,
        200
      ]
    },
    {
      "parameters": {
        "url": "https://www.zohoapis.com/crm/v2/Tasks",
        "requestMethod": "POST",
        "jsonParameters": true,
        "options": {},
        "headerParametersJson": "{\"Authorization\": \"Zoho-oauthtoken YOUR_ZOHO_TOKEN\", \"Content-Type\": \"application/json\"}",
        "bodyParametersJson": "{\"data\": [{\"Subject\": \"T1 INTENT: {{ $json.account }} (score {{ $json.score }})\", \"Description\": \"{{ $json.why_now }} Signals: {{ $json.signals.join(' | ') }}\", \"Priority\": \"High\", \"Due_Date\": \"={{ $now.toFormat('yyyy-MM-dd') }}\"}]}"
      },
      "name": "T1 - Create 1:1 Outreach Task",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        1620,
        200
      ]
    },
    {
      "parameters": {
        "url": "https://api.instantly.ai/api/v2/leads",
        "requestMethod": "POST",
        "jsonParameters": true,
        "options": {},
        "headerParametersJson": "{\"Authorization\": \"Bearer YOUR_INSTANTLY_API_KEY\", \"Content-Type\": \"application/json\"}",
        "bodyParametersJson": "{\"campaign\": \"YOUR_T2_SEQUENCE_CAMPAIGN_ID\", \"company_name\": \"={{ $json.account }}\", \"email\": \"PENDING_CONTACT_LOOKUP@{{ $json.domain }}\", \"custom_variables\": {\"intent_score\": \"={{ $json.score }}\"}}"
      },
      "name": "T2 - Enroll in Sequence",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        1160,
        420
      ],
      "notesInFlow": true,
      "notes": "In production this first calls Apollo people search to find the right committee contact at the domain, then enrolls. Kept single-node here for clarity."
    },
    {
      "parameters": {
        "url": "YOUR_SLACK_INCOMING_WEBHOOK_URL",
        "requestMethod": "POST",
        "jsonParameters": true,
        "options": {},
        "bodyParametersJson": "{\"text\": \"DAILY PRIORITY QUEUE\\nT1 today: {{ $json.account }} (score {{ $json.score }})\\n{{ $json.why_now }}\"}"
      },
      "name": "Slack - Morning Priority Queue",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        1860,
        200
      ]
    }
  ],
  "connections": {
    "Every Weekday 7am": {
      "main": [
        [
          {
            "node": "Pull Signal Log (Sheet)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pull Signal Log (Sheet)": {
      "main": [
        [
          {
            "node": "Score + Decay + Tier",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Score + Decay + Tier": {
      "main": [
        [
          {
            "node": "Tier 1 Today?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tier 1 Today?": {
      "main": [
        [
          {
            "node": "Claude - Why Now Summary",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "T2 - Enroll in Sequence",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Claude - Why Now Summary": {
      "main": [
        [
          {
            "node": "Attach Why Now",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Attach Why Now": {
      "main": [
        [
          {
            "node": "T1 - Create 1:1 Outreach Task",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "T1 - Create 1:1 Outreach Task": {
      "main": [
        [
          {
            "node": "Slack - Morning Priority Queue",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}
Pro

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

About this workflow

Intent Layered Account Priority Engine. Uses httpRequest. Scheduled trigger; 9 nodes.

Source: https://github.com/saurabhshuklagrowisto/saurabh-ai-systems/blob/main/pipeline-automation/intent-priority-engine.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