AutomationFlowsMarketing & Ads › Discover Competitor Clients with PredictLeads & Google Sheets

Discover Competitor Clients with PredictLeads & Google Sheets

Original n8n title: Discover and Enrich Competitor Clients with Predictleads and Google Sheets

ByYaron Been @yaron-nofluff on n8n.io

Discover your competitor's clients through PredictLeads connections data, enrich each client with company details, and export everything to Google Sheets.

Event trigger★★★★☆ complexity14 nodesGoogle SheetsHTTP Request
Marketing & Ads Trigger: Event Nodes: 14 Complexity: ★★★★☆ Added:

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

This workflow follows the Google Sheets → HTTP Request 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
{
  "id": "j0I1XZANnF7nCozj",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Competitor Client Enrichment & Discovery with PredictLeads",
  "tags": [],
  "nodes": [
    {
      "id": "3034a08d-3447-4906-8ef3-7bdb8b5ca38f",
      "name": "About This Workflow",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1312,
        208
      ],
      "parameters": {
        "color": 4,
        "width": 420,
        "height": 400,
        "content": "ABOUT THIS WORKFLOW\n\nTakes a list of competitor domains, discovers their clients through PredictLeads connections API, enriches each client with company data, and exports everything to Google Sheets.\n\nSetup: Google Sheet with competitor domains, PredictLeads API, Google Sheets OAuth2.\n\nUse case: You want to know who your competitor's customers are. Feed in their domain, and this workflow maps out their client relationships with industry, size, and location data.\n\nPredictLeads API: https://predictleads.com\nQuestions: https://www.linkedin.com/in/yaronbeen"
      },
      "typeVersion": 1
    },
    {
      "id": "601ada32-a658-4666-8c30-24356bd22a47",
      "name": "\ud83d\udccc INPUT",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -768,
        -128
      ],
      "parameters": {
        "color": 5,
        "width": 520,
        "height": 748,
        "content": "## 1\ufe0f\u20e3 Trigger & Competitor Source\n\n**Nodes:**  \n\u25b6\ufe0f Manual Trigger \u2192 \ud83d\udccb Read Competitors\n\n**Description:**  \nThe workflow starts with a manual trigger, allowing the user to run the process whenever competitor analysis is needed.  \nIt reads a list of **competitor company domains** from a Google Sheets watchlist.\n\nThis sheet acts as the source dataset for the discovery process. Each domain represents a competitor whose client relationships will be analyzed using the PredictLeads API."
      },
      "typeVersion": 1
    },
    {
      "id": "25501765-9ac9-42f0-a6f2-c96d21687d16",
      "name": "\ud83d\udd0d DISCOVERY",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        -128
      ],
      "parameters": {
        "color": 5,
        "width": 740,
        "height": 748,
        "content": "## 2\ufe0f\u20e3 Client Discovery from Competitors\n\n**Nodes:**  \n\ud83d\udd04 Loop Competitors \u2192 \ud83d\udd0d Fetch Connections \u2192 \u2699\ufe0f Extract Client Domains\n\n**Description:**  \nEach competitor domain is processed individually using a loop.\n\nThe workflow queries the **PredictLeads Connections API** to retrieve company relationships associated with the competitor.  \nFrom the returned connections data, a code node extracts domains that represent **clients, customers, or users** of the competitor.\n\nThis step transforms raw connection data into a clean list of **potential client companies linked to each competitor**."
      },
      "typeVersion": 1
    },
    {
      "id": "5bb27d7c-675f-4667-a14f-2e3f3197580f",
      "name": "\ud83d\udd0d ENRICHMENT",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        592,
        -176
      ],
      "parameters": {
        "color": 5,
        "width": 740,
        "height": 796,
        "content": "## 3\ufe0f\u20e3 Client Company Enrichment\n\n**Nodes:**  \n\ud83d\udd04 Loop Clients \u2192 \ud83d\udd0d Enrich Client Company \u2192 \u2699\ufe0f Format Output Row\n\n**Description:**  \nEach discovered client domain is processed individually.\n\nThe workflow calls the **PredictLeads Company API** to retrieve detailed company information such as industry, employee count, and location.  \nA code node then formats this enriched data into a structured row that includes:\n\n- Competitor source  \n- Client domain  \n- Client company name  \n- Industry  \n- Employee count  \n- Location  \n\nThis creates a clean dataset ready for reporting or further analysis."
      },
      "typeVersion": 1
    },
    {
      "id": "338cb3da-a85f-4b73-a051-297b26d6d750",
      "name": "\ud83d\udce4 OUTPUT",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1376,
        -80
      ],
      "parameters": {
        "color": 5,
        "width": 400,
        "height": 700,
        "content": "## 4\ufe0f\u20e3 Data Export & Reporting\n\n**Nodes:**  \n\ud83d\udcca Write to Google Sheets\n\n**Description:**  \nThe enriched client data is appended to a **Google Sheets output table**.\n\nEach row represents a discovered client relationship between a competitor and another company, along with key enrichment details.  \nThis sheet becomes a structured dataset for **competitor intelligence, market mapping, and potential lead discovery**."
      },
      "typeVersion": 1
    },
    {
      "id": "5a81d9a0-fa40-4caf-8315-406713cad7e9",
      "name": "\u25b6\ufe0f Manual Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -672,
        400
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "dfeb5d9c-e4d3-45e4-be9d-3391a6b109c9",
      "name": "\ud83d\udccb Read Competitors",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -464,
        400
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_08/edit#gid=0",
          "cachedResultName": "Competitors"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID_08",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_08/edit?usp=drivesdk",
          "cachedResultName": "08"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "241d5879-9189-453f-be3d-15afa78275e7",
      "name": "\ud83d\udd04 Loop Competitors",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -112,
        400
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "7ac48d82-4dd0-4d08-825e-c303a2598c48",
      "name": "\ud83d\udd0d Fetch Connections",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        112,
        416
      ],
      "parameters": {
        "url": "=https://predictleads.com/api/v3/companies/{{ $json.domain }}/connections",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Api-Key",
              "value": "YOUR_PREDICTLEADS_API_KEY"
            },
            {
              "name": "X-Api-Token",
              "value": "YOUR_PREDICTLEADS_API_TOKEN"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5543f536-32f3-4cf0-9213-77a311a6ec49",
      "name": "\u2699\ufe0f Extract Client Domains",
      "type": "n8n-nodes-base.code",
      "position": [
        336,
        416
      ],
      "parameters": {
        "jsCode": "// Extract client company domains from connections response\nconst items = $input.all();\nconst clients = [];\n\nfor (const item of items) {\n  const connections = item.json.data || item.json.connections || [];\n  const competitorDomain = item.json.domain || $('\ud83d\udd04 Loop Competitors').item.json.domain || 'unknown';\n\n  for (const conn of connections) {\n    const attrs = conn.attributes || conn;\n    const relationType = (attrs.connection_type || attrs.relationship_type || attrs.type || '').toLowerCase();\n\n    // Include client relationships, or if no type filter, include all connections\n    if (\n      relationType.includes('client') ||\n      relationType.includes('customer') ||\n      relationType.includes('user') ||\n      relationType === ''\n    ) {\n      const clientDomain = attrs.domain || attrs.company_domain || attrs.connected_company_domain || null;\n      if (clientDomain) {\n        clients.push({\n          json: {\n            competitor_source: competitorDomain,\n            client_domain: clientDomain,\n            relationship_type: relationType || 'connection'\n          }\n        });\n      }\n    }\n  }\n}\n\n// If no clients found, pass empty marker\nif (clients.length === 0) {\n  return [{ json: { _no_clients: true, competitor_source: 'N/A' } }];\n}\n\nreturn clients;"
      },
      "typeVersion": 2
    },
    {
      "id": "49dfa78c-8001-4665-9416-6993fcb45c9e",
      "name": "\ud83d\udd04 Loop Clients",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        688,
        416
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "7bbee9ce-1104-438c-b79d-70a17d74e125",
      "name": "\ud83d\udd0d Enrich Client Company",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        928,
        432
      ],
      "parameters": {
        "url": "=https://predictleads.com/api/v3/companies/{{ $('\ud83d\udd04 Loop Clients').item.json.client_domain }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Api-Key",
              "value": "YOUR_PREDICTLEADS_API_KEY"
            },
            {
              "name": "X-Api-Token",
              "value": "YOUR_PREDICTLEADS_API_TOKEN"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f97556ca-dba9-40ba-b800-b047ee66fb3f",
      "name": "\u2699\ufe0f Format Output Row",
      "type": "n8n-nodes-base.code",
      "position": [
        1152,
        432
      ],
      "parameters": {
        "jsCode": "// Format enriched client data into output row\nconst item = $input.first();\nconst companyData = item.json.data?.attributes || item.json.attributes || item.json;\n\n// Get competitor source from the Loop Clients context\nconst competitorSource = $('\ud83d\udd04 Loop Clients').item.json.competitor_source || 'unknown';\nconst clientDomain = $('\ud83d\udd04 Loop Clients').item.json.client_domain || item.json.domain || 'unknown';\n\nreturn [{\n  json: {\n    competitor_source: competitorSource,\n    client_domain: clientDomain,\n    client_name: companyData.company_name || companyData.name || clientDomain,\n    industry: companyData.industry || companyData.sector || 'Unknown',\n    employee_count: companyData.employee_count || companyData.employees || 'Unknown',\n    location: [\n      companyData.city,\n      companyData.state,\n      companyData.country\n    ].filter(Boolean).join(', ') || 'Unknown'\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "7327eaed-b63c-4ae5-bd2b-ea321136ebc4",
      "name": "\ud83d\udcca Write to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1504,
        432
      ],
      "parameters": {
        "columns": {
          "value": {
            "industry": "={{ $json.industry }}",
            "location": "={{ $json.location }}",
            "client_name": "={{ $json.client_name }}",
            "client_domain": "={{ $json.client_domain }}",
            "employee_count": "={{ $json.employee_count }}",
            "competitor_source": "={{ $json.competitor_source }}"
          },
          "schema": [
            {
              "id": "competitor_source",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "competitor_source",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "client_domain",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "client_domain",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "client_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "client_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "industry",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "industry",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "employee_count",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "employee_count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "location",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "location",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 1354720506,
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_08/edit#gid=1354720506",
          "cachedResultName": "Client Discovery"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "YOUR_GOOGLE_SHEET_ID_08",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_GOOGLE_SHEET_ID_08/edit?usp=drivesdk",
          "cachedResultName": "08"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.5
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "0bb32f2e-eeef-4c45-b8ac-8296a6b248dc",
  "connections": {
    "\ud83d\udd04 Loop Clients": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop Competitors",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\ud83d\udd0d Enrich Client Company",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u25b6\ufe0f Manual Trigger": {
      "main": [
        [
          {
            "node": "\ud83d\udccb Read Competitors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udccb Read Competitors": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop Competitors",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd04 Loop Competitors": {
      "main": [
        [],
        [
          {
            "node": "\ud83d\udd0d Fetch Connections",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd0d Fetch Connections": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f Extract Client Domains",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2699\ufe0f Format Output Row": {
      "main": [
        [
          {
            "node": "\ud83d\udcca Write to Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd0d Enrich Client Company": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f Format Output Row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcca Write to Google Sheets": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop Clients",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2699\ufe0f Extract Client Domains": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Loop Clients",
            "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.

Pro

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

About this workflow

Discover your competitor's clients through PredictLeads connections data, enrich each client with company details, and export everything to Google Sheets.

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

More Marketing & Ads workflows → · Browse all categories →

Related workflows

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

Marketing & Ads

This n8n workflow automates the process of finding ecommerce seller leads, enriching them with product and business details, discovering company websites, and extracting contact information such as em

Google Sheets, N8N Nodes Mrscraper, HTTP Request
Marketing & Ads

This template is for B2B sales teams, SDRs, growth marketers, and founders who maintain a spreadsheet of prospects and need verified contact details -- emails and mobile numbers -- without manual rese

Google Sheets, HTTP Request
Marketing & Ads

This workflow finds local businesses from Google Maps and automatically enriches them with emails, social profiles, AI summaries, and personalized outreach messages — all saved to Google Sheets. Searc

HTTP Request, Google Sheets
Marketing & Ads

This workflow leverages n8n to perform automated Google Maps API queries and manage data efficiently in Google Sheets. It's designed to extract specific location data based on a given list of ZIP code

Execute Workflow Trigger, Stop And Error, HTTP Request +1
Marketing & Ads

This repository contains an SLA-based lead routing workflow built in n8n, designed to ensure fast lead response, fair sales distribution, and controlled escalation without relying on a full CRM system

Form Trigger, Google Sheets, Slack +1