AutomationFlowsSocial Media › Score Company Ad Spend From Meta, Google and Linkedin Ads with Google Sheets

Score Company Ad Spend From Meta, Google and Linkedin Ads with Google Sheets

ByZain Khan @zain on n8n.io

This workflow pulls Pending companies from Google Sheets, checks their ad activity via Adyntel for Meta (Facebook), Google Ads, and LinkedIn Ads, calculates a budget signal score from ad volume and channel diversity, and writes the results back to the same sheet. Runs when you…

Event trigger★★★★☆ complexity13 nodesGoogle SheetsN8N Nodes Adyntel
Social Media Trigger: Event Nodes: 13 Complexity: ★★★★☆ Added:

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

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": "zoCShejXJq2jQ9Fr",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Bulk List Ad-Spend Scorer",
  "tags": [],
  "nodes": [
    {
      "id": "17ef24d1-4378-46a7-ad11-3ae0da12ac07",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -112,
        64
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "ff49010e-c187-460f-ac8a-665ac5177483",
      "name": "Bulk List Ad-Spend Scorer",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        112,
        64
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "Pending",
              "lookupColumn": "Status"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4EFJG_be8aaAn3_dwnUTfOepDIroox2qGWiD6CDH90/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1y4EFJG_be8aaAn3_dwnUTfOepDIroox2qGWiD6CDH90",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4EFJG_be8aaAn3_dwnUTfOepDIroox2qGWiD6CDH90/edit?usp=drivesdk",
          "cachedResultName": "Bulk List Ad-Spend Scorer"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "ef701f7c-14bb-4086-a788-970497061352",
      "name": "Loop Over Accounts",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        336,
        64
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "3edca6f6-4a81-4142-a756-f8cd6cd2f38d",
      "name": "Search LinkedIn Ads",
      "type": "n8n-nodes-adyntel.adyntel",
      "position": [
        592,
        272
      ],
      "parameters": {
        "resource": "linkedInAds",
        "companyDomain": "={{ $json.domain }}",
        "requestOptions": {}
      },
      "credentials": {
        "adyntelApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8117867c-ac82-4842-a46d-39e4c1d71f50",
      "name": "Search Google Ads",
      "type": "n8n-nodes-adyntel.adyntel",
      "position": [
        592,
        80
      ],
      "parameters": {
        "resource": "googleAds",
        "companyDomain": "={{ $json.domain }}",
        "requestOptions": {}
      },
      "credentials": {
        "adyntelApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "2b186ff0-a105-4edb-9932-7f6a77f8a098",
      "name": "Search Facebook Ads",
      "type": "n8n-nodes-adyntel.adyntel",
      "position": [
        592,
        -112
      ],
      "parameters": {
        "companyDomain": "={{ $json.domain }}",
        "requestOptions": {}
      },
      "credentials": {
        "adyntelApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "893d16ab-d753-4353-ab60-244d2853b37d",
      "name": "Merge All Platform Results",
      "type": "n8n-nodes-base.merge",
      "position": [
        816,
        64
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition",
        "numberInputs": 3
      },
      "typeVersion": 3.2
    },
    {
      "id": "17357559-6952-4a3b-b2c9-4f556e8cc347",
      "name": "Score & Enrich",
      "type": "n8n-nodes-base.code",
      "position": [
        1056,
        80
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nfunction extractAdCount(item) {\n  if (!item) return 0;\n  const data = item.json;\n  if (typeof data.total_ads === 'number') return data.total_ads;\n  if (Array.isArray(data.ads)) return data.ads.length;\n  if (Array.isArray(data.results)) return data.results.length;\n  if (typeof data.number_of_ads === 'number') return data.number_of_ads;\n  if (Array.isArray(data)) return data.length;\n  return 0;\n}\n\nconst metaAds     = extractAdCount(items[0]);\nconst googleAds   = extractAdCount(items[1]);\nconst linkedinAds = extractAdCount(items[2]);\nconst totalAds    = metaAds + googleAds + linkedinAds;\n\nconst activePlatforms = [];\nif (metaAds > 0)     activePlatforms.push('Meta');\nif (googleAds > 0)   activePlatforms.push('Google');\nif (linkedinAds > 0) activePlatforms.push('LinkedIn');\n\nconst channelDiversity = activePlatforms.length;\n\n// Composite score: volume weighted + diversity bonus\nconst budgetSignalScore = (totalAds * 2) + (channelDiversity * 15);\n\nconst leadData = $('Loop Over Accounts').item.json;\n\nreturn [{\n  json: {\n    company_name:        leadData.company_name,\n    domain:              leadData.domain,\n    meta_ads:            metaAds,\n    google_ads:          googleAds,\n    linkedin_ads:        linkedinAds,\n    total_ads:           totalAds,\n    active_platforms:    activePlatforms.join(', ') || 'None',\n    channel_diversity:   channelDiversity,\n    budget_signal_score: budgetSignalScore,\n    checked_at:          new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "9b97eb51-b01f-4bca-b9b7-68af5c1342e6",
      "name": "Update Sheet \u2014 Scored",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1280,
        240
      ],
      "parameters": {
        "columns": {
          "value": {
            "Status": "Done",
            "domain": "={{$json[\"domain\"]}}",
            "meta_ads": "={{$json[\"meta_ads\"]}}",
            "total_ads": "={{$json[\"total_ads\"]}}",
            "checked_at": "={{$json[\"checked_at\"]}}",
            "google_ads": "={{$json[\"google_ads\"]}}",
            "linkedin_ads": "={{$json[\"linkedin_ads\"]}}",
            "active_platforms": "={{$json[\"active_platforms\"]}}",
            "channel_diversity": "={{$json[\"channel_diversity\"]}}",
            "budget_signal_score": "={{$json[\"budget_signal_score\"]}}"
          },
          "schema": [
            {
              "id": "company_name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "company_name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "domain",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "domain",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "meta_ads",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "meta_ads",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "google_ads",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "google_ads",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "linkedin_ads",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "linkedin_ads",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "total_ads",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "total_ads",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "active_platforms",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "active_platforms",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "channel_diversity",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "channel_diversity",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "budget_signal_score",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "budget_signal_score",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "checked_at",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "checked_at",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "domain"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4EFJG_be8aaAn3_dwnUTfOepDIroox2qGWiD6CDH90/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1y4EFJG_be8aaAn3_dwnUTfOepDIroox2qGWiD6CDH90",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1y4EFJG_be8aaAn3_dwnUTfOepDIroox2qGWiD6CDH90/edit?usp=drivesdk",
          "cachedResultName": "Bulk List Ad-Spend Scorer"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "df4f51f3-1d51-4294-b91b-bd4b46d8de6f",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -672,
        -240
      ],
      "parameters": {
        "width": 432,
        "height": 512,
        "content": "## \ud83d\ude80 Bulk List Ad-Spend Scorer\n\n\ud83d\udd0d How it works\n\nScores advertising activity for a list of companies by collecting active ads across Meta, Google, and LinkedIn. The workflow calculates an Ad-Spend Signal Score based on ad volume and channel diversity, then updates the results back to Google Sheets.\n\n\u2699\ufe0f How to set up\n - [ ] Connect Google Sheets credentials\n - [x] Configure Adyntel API credentials\n - [ ] Populate the target account list in Google Sheets\n - [ ] Ensure each company has a valid domain\n - [ ] Set Status = Pending for rows to process\n - [ ] Test with a small batch before running at scale\n\n\ud83d\udee0\ufe0f Customization\n- Adjust scoring formula and weights\n- Add additional advertising platforms\n- Include spend estimates or engagement metrics\n- Replace Google Sheets with Airtable or a database\n- Add notifications for high-scoring companies\n"
      },
      "typeVersion": 1
    },
    {
      "id": "020f1060-542c-4d80-915d-8d378ea21f8b",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        -176
      ],
      "parameters": {
        "color": 6,
        "width": 672,
        "height": 368,
        "content": "##  \ud83d\udccb Account Loading & Processing\n\nLoads pending companies from Google Sheets and processes them one at a time to ensure accurate scoring and controlled execution.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "eeb8037a-2396-4dc4-9b52-8f514b330207",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        512,
        -240
      ],
      "parameters": {
        "color": 2,
        "width": 416,
        "height": 640,
        "content": "## \ud83d\udce2 Multi-Platform Ad Collection\n\nCollects active advertising data across multiple channels and combines the results into a unified dataset for analysis.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "626c602b-c649-4677-94a5-50684fadbbf2",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        -48
      ],
      "parameters": {
        "color": 4,
        "width": 496,
        "height": 480,
        "content": "## \ud83d\udcca Ad-Spend Scoring & Data Updates\n\nCalculates advertising intensity using ad volume and platform diversity, enriches the account record with scoring metrics, updates Google Sheets, and continues processing the next account."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "1037e32b-7950-4bf4-99c7-5e9bee4925a2",
  "connections": {
    "Score & Enrich": {
      "main": [
        [
          {
            "node": "Update Sheet \u2014 Scored",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Google Ads": {
      "main": [
        [
          {
            "node": "Merge All Platform Results",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Loop Over Accounts": {
      "main": [
        [],
        [
          {
            "node": "Search Facebook Ads",
            "type": "main",
            "index": 0
          },
          {
            "node": "Search Google Ads",
            "type": "main",
            "index": 0
          },
          {
            "node": "Search LinkedIn Ads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Facebook Ads": {
      "main": [
        [
          {
            "node": "Merge All Platform Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search LinkedIn Ads": {
      "main": [
        [
          {
            "node": "Merge All Platform Results",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "Update Sheet \u2014 Scored": {
      "main": [
        [
          {
            "node": "Loop Over Accounts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Bulk List Ad-Spend Scorer": {
      "main": [
        [
          {
            "node": "Loop Over Accounts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge All Platform Results": {
      "main": [
        [
          {
            "node": "Score & Enrich",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Bulk List Ad-Spend Scorer",
            "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

This workflow pulls Pending companies from Google Sheets, checks their ad activity via Adyntel for Meta (Facebook), Google Ads, and LinkedIn Ads, calculates a budget signal score from ad volume and channel diversity, and writes the results back to the same sheet. Runs when you…

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

More Social Media workflows → · Browse all categories →

Related workflows

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

Social Media

Disclaimer: this workflow only works on self-hosted instances due to the file system usage.

Execute Workflow Trigger, HTTP Request, Form Trigger +3
Social Media

More workflow: https://aitool.wiki/

Google Sheets, Google Drive, Read Write File +3
Social Media

⚠️ Important — Start Here Before importing this template, make a personal copy of the provided Google Sheets template. This workflow is designed to work out of the box with that sheet.

Google Sheets, N8N Nodes Browserflow
Social Media

&gt; ⚠️ Disclaimer: This workflow uses Community Nodes and requires a self-hosted n8n instance.

HTTP Request, Telegram Trigger, Google Sheets +1
Social Media

This n8n workflow automates the process of scraping job listings from both LinkedIn and Indeed platforms simultaneously, combining results, and exporting data to Google Sheets for comprehensive job ma

Form Trigger, HTTP Request, Google Sheets