AutomationFlowsData & Sheets › Enrich Creator Handles with Cross-platform Social Data From Influencers.club

Enrich Creator Handles with Cross-platform Social Data From Influencers.club

ByInfluencers Club @influencers-club on n8n.io

How it works:

Cron / scheduled trigger★★★★☆ complexity15 nodesHTTP RequestSupabaseN8N Nodes Influencersclub
Data & Sheets Trigger: Cron / scheduled Nodes: 15 Complexity: ★★★★☆ Added:

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

This workflow follows the HTTP Request → Supabase 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": "LyAmRVkY63mstf2f0eVCQ",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Enrich creator handles with cross-platform social data from influencers.club",
  "tags": [],
  "nodes": [
    {
      "id": "70470cd8-75cb-46c3-9389-69ce3a48f762",
      "name": "Daily Refresh Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -560,
        768
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 0 * * *"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "f83022f3-d34a-48eb-9866-45244b93760b",
      "name": "Process in Batches",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -32,
        768
      ],
      "parameters": {
        "options": {},
        "batchSize": 5
      },
      "typeVersion": 3
    },
    {
      "id": "bb2a5ec7-fae7-423d-975a-bfb5aaf3585a",
      "name": "Wait 5 Second",
      "type": "n8n-nodes-base.wait",
      "position": [
        976,
        784
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "ea9e3a2d-0156-4141-acf1-aaa29f9fe23a",
      "name": "Update Null Values Only",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        704,
        784
      ],
      "parameters": {
        "url": "https://yphzlsruptlrnehidveq.supabase.co/rest/v1/rpc/enrich_lead",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "sendHeaders": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "p_creator_handle",
              "value": "={{ $('Process in Batches').item.json.creator_handle }}"
            },
            {
              "name": "p_platform",
              "value": "={{ $('Process in Batches').item.json.platform }}"
            },
            {
              "name": "p_payload",
              "value": "={{$json}}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "nodeCredentialType": "supabaseApi"
      },
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "c6c9adf0-c6f3-49bd-8987-f40d658956f3",
      "name": "Update a row",
      "type": "n8n-nodes-base.supabase",
      "disabled": true,
      "position": [
        640,
        288
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "creator_handle",
              "keyValue": "={{ $json.username }}",
              "condition": "eq"
            }
          ]
        },
        "tableId": "leads3",
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "username",
              "fieldValue": "={{ $json.username }}"
            },
            {
              "fieldId": "platform",
              "fieldValue": "={{ $json.platform }}"
            },
            {
              "fieldId": "userid",
              "fieldValue": "={{ $json.userid }}"
            },
            {
              "fieldId": "full_name",
              "fieldValue": "={{ $json.full_name }}"
            },
            {
              "fieldId": "biography",
              "fieldValue": "={{ $json.biography }}"
            },
            {
              "fieldId": "category",
              "fieldValue": "={{ $json.category }}"
            },
            {
              "fieldId": "profile_picture",
              "fieldValue": "={{ $json.profile_picture }}"
            },
            {
              "fieldId": "exists",
              "fieldValue": "={{ $json.exists }}"
            },
            {
              "fieldId": "has_profile_pic",
              "fieldValue": "={{ $json.has_profile_pic }}"
            },
            {
              "fieldId": "is_private",
              "fieldValue": "={{ $json.is_private }}"
            },
            {
              "fieldId": "is_business_account",
              "fieldValue": "={{ $json.is_business_account }}"
            },
            {
              "fieldId": "is_verified",
              "fieldValue": "={{ $json.is_verified }}"
            },
            {
              "fieldId": "video_content_creator",
              "fieldValue": "={{ $json.video_content_creator }}"
            },
            {
              "fieldId": "uses_link_in_bio",
              "fieldValue": "={{ $json.uses_link_in_bio }}"
            },
            {
              "fieldId": "follower_count",
              "fieldValue": "={{ $json.following_count }}"
            },
            {
              "fieldId": "following_count",
              "fieldValue": "={{ $json.following_count }}"
            },
            {
              "fieldId": "media_count",
              "fieldValue": "={{ $json.media_count }}"
            },
            {
              "fieldId": "links_in_bio",
              "fieldValue": "={{ $json.links_in_bio }}"
            },
            {
              "fieldId": "post_data",
              "fieldValue": "={{ $json.post_data }}"
            },
            {
              "fieldId": "avg_likes",
              "fieldValue": "={{ $json.avg_likes }}"
            },
            {
              "fieldId": "avg_comments",
              "fieldValue": "={{ $json.avg_comments }}"
            },
            {
              "fieldId": "total_posts_analyzed",
              "fieldValue": "={{ $json.total_posts_analyzed }}"
            },
            {
              "fieldId": "engagement_rate",
              "fieldValue": "={{ $json.engagement_rate }}"
            },
            {
              "fieldId": "raw_response",
              "fieldValue": "={{ $json.raw_response }}"
            },
            {
              "fieldId": "enriched_at",
              "fieldValue": "={{ $json.enriched_at }}"
            },
            {
              "fieldId": "credits_cost",
              "fieldValue": "={{ $json.credits_cost }}"
            }
          ]
        },
        "operation": "update",
        "useCustomSchema": true
      },
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "a81bf1fe-3daa-484b-937b-3d29154c2559",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -640,
        480
      ],
      "parameters": {
        "width": 272,
        "height": 496,
        "content": "## Triggers the creator enrichment workflow once per day.\nThe workflow is safe to re-run and will only process creators that have not been enriched yet.\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "0131dea9-44fa-417f-8464-18af8d29b8e2",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -352,
        480
      ],
      "parameters": {
        "color": 3,
        "width": 272,
        "height": 496,
        "content": "## Fetches creators that have not yet been enriched by checking for an empty enrichment payload.\nUses the \u201cIs Empty\u201d filter to correctly match NULL jsonb fields."
      },
      "typeVersion": 1
    },
    {
      "id": "fb35656f-501a-4e0e-a793-e86eecd2396b",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        480
      ],
      "parameters": {
        "color": 6,
        "width": 432,
        "height": 496,
        "content": "## Enriches a creator profile using their platform and handle.\n\nThe request is designed to be platform-agnostic and returns structured enrichment data (audience, content, and monetization insights) using the influencers.club API."
      },
      "typeVersion": 1
    },
    {
      "id": "eee769b2-70a8-47e5-9c21-17fbcafed1ce",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        576,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 352,
        "height": 496,
        "content": "## Updates the creator data using a SQL database function that only fills missing fields.\n\n\u2714 Safe to re-run\n\u2714 Prevents overwriting existing data\n\u2714 Handles partial enrichment responses\n\nRecommended for production use."
      },
      "typeVersion": 1
    },
    {
      "id": "7bc6f0f9-7030-464d-9298-ef96fee0e11e",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        112,
        288
      ],
      "parameters": {
        "color": 2,
        "width": 816,
        "height": 176,
        "content": "## Alternative update method that writes data \n## directly to the table.\n\n\u26a0\ufe0f This option may overwrite existing data if the workflow is re-run.\nRecommended only for simple or non-production setups.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "ca450adb-3675-4564-b697-509ee3b9b7f7",
      "name": "List Influencers Without Enrichment",
      "type": "n8n-nodes-base.supabase",
      "position": [
        -272,
        768
      ],
      "parameters": {
        "tableId": "leads3",
        "operation": "getAll"
      },
      "credentials": {
        "supabaseApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "1ed48d61-3cc9-4064-afa9-5d4c1c44e106",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -176,
        48
      ],
      "parameters": {
        "color": 5,
        "width": 752,
        "content": "## Get multi social platform data for creators from one social handle - Built for influencer marketing platforms\n**Step by step workflow to enrich influencer data with multi social (Instagram, Tiktok, Youtube, Twitter, Onlyfans, Twitch and more) using the influencer.club API**. [Full explanation](https://influencers.club/creatorbook/cross-platform-data-for-influencer-marketing-platforms/)"
      },
      "typeVersion": 1
    },
    {
      "id": "e530f568-6ede-4fae-9f6e-0502501508fc",
      "name": "Normalize Creator Enrichment Payload",
      "type": "n8n-nodes-base.code",
      "position": [
        416,
        784
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "/**\n * UNIVERSAL ENRICHMENT NORMALIZER\n * Works with ANY platform & ANY payload shape\n * Run Once for Each Item\n */\n\n// Raw API response for THIS item\nconst apiResponse = item.json ?? {};\n\n// Find platform key dynamically\nconst PLATFORM_KEYS = [\n  'instagram',\n  'twitter',\n  'tiktok',\n  'youtube',\n  'linkedin',\n  'facebook',\n  'twitch'\n];\n\nconst platform = PLATFORM_KEYS.find(k => apiResponse[k]) ?? null;\nconst platformData = platform ? apiResponse[platform] : {};\n\n// Match batch item by index\nconst batchItem = $items(\"Process in Batches\", 0)[$itemIndex]?.json ?? {};\n\n// Identifiers\nconst leadId = batchItem.id ?? null;\nconst creatorHandle = batchItem.creator_handle ?? null;\n\n// Posts (platform-agnostic)\nconst postData = Array.isArray(platformData.post_data)\n  ? platformData.post_data\n  : [];\n\n// Engagement calculations (supports IG & TW)\nlet avgLikes = null;\nlet avgComments = null;\nlet engagementRate = null;\n\nconst validPosts = postData.filter(p =>\n  p?.engagement &&\n  (\n    p.engagement.likes !== undefined ||\n    p.engagement.like_count !== undefined\n  )\n);\n\nif (validPosts.length > 0) {\n  const totalLikes = validPosts.reduce(\n    (sum, p) => sum + (p.engagement.likes ?? p.engagement.like_count ?? 0),\n    0\n  );\n\n  const totalComments = validPosts.reduce(\n    (sum, p) => sum + (p.engagement.comments ?? p.engagement.reply_count ?? 0),\n    0\n  );\n\n  avgLikes = Number((totalLikes / validPosts.length).toFixed(2));\n  avgComments = Number((totalComments / validPosts.length).toFixed(2));\n\n  if ((platformData.follower_count ?? 0) > 0) {\n    engagementRate = Number(\n      (((avgLikes + avgComments) / platformData.follower_count) * 100).toFixed(2)\n    );\n  }\n}\n\n// \u2705 FINAL NORMALIZED OUTPUT\nreturn {\n  platform,\n\n  // Identity\n  userid: platformData.userid ?? null,\n  username: platformData.username ?? null,\n  full_name: platformData.full_name ?? null,\n  biography: platformData.biography ?? null,\n  category: platformData.category ?? null,\n\n  // Images\n  profile_picture:\n    platformData.profile_picture_hd ??\n    platformData.profile_picture ??\n    null,\n\n  // Flags\n  exists: platformData.exists ?? null,\n  has_profile_pic: platformData.has_profile_pic ?? null,\n  is_private: platformData.is_private ?? null,\n  is_business_account: platformData.is_business_account ?? null,\n  is_verified: platformData.is_verified ?? null,\n  video_content_creator: platformData.video_content_creator ?? null,\n  uses_link_in_bio:\n    platformData.uses_link_in_bio ??\n    apiResponse.has_link_in_bio ??\n    null,\n\n  // Metrics\n  follower_count: platformData.follower_count ?? null,\n  following_count: platformData.following_count ?? null,\n  media_count:\n    platformData.media_count ??\n    platformData.tweets_count ??\n    null,\n\n  // Arrays / JSONB\n  links_in_bio: platformData.links_in_bio ?? [],\n  post_data: postData,\n\n  // Calculated\n  avg_likes: avgLikes,\n  avg_comments: avgComments,\n  total_posts_analyzed: postData.length,\n  engagement_rate:\n    engagementRate ??\n    platformData.engagement_percent ??\n    null,\n\n  // Raw + meta\n  raw_response: apiResponse,\n  enriched_at: new Date().toISOString(),\n  credits_cost: apiResponse.credits_cost ?? null\n};\n"
      },
      "typeVersion": 2
    },
    {
      "id": "ab94eebe-e47a-43aa-aa08-7de9602ef813",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        480
      ],
      "parameters": {
        "color": 4,
        "width": 192,
        "height": 80,
        "content": "[Click and view the full SQL function on GitHub](https://github.com/GjPetrovski-IC/N8N-Public-Templates)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "8633e30e-a9c1-48de-933b-bf42b7d10e77",
      "name": "Influencers.club - Enrich by Handle (Full)",
      "type": "n8n-nodes-influencersclub.influencersClub",
      "position": [
        208,
        784
      ],
      "parameters": {
        "handle": "={{ $json.creator_handle }}",
        "platform": "={{ $json.platform }}",
        "resource": "creator",
        "operation": "enrichByHandle",
        "tiktokFilters": {},
        "twitchFilters": {},
        "twitterFilters": {},
        "youtubeFilters": {},
        "onlyfansFilters": {},
        "instagramFilters": {},
        "additionalOptions": {}
      },
      "credentials": {
        "influencersClubApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "806e9034-0060-4fe0-b0e4-d73848a5e8fc",
  "connections": {
    "Update a row": {
      "main": [
        [
          {
            "node": "Wait 5 Second",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait 5 Second": {
      "main": [
        [
          {
            "node": "Process in Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process in Batches": {
      "main": [
        [],
        [
          {
            "node": "Influencers.club - Enrich by Handle (Full)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily Refresh Schedule": {
      "main": [
        [
          {
            "node": "List Influencers Without Enrichment",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Null Values Only": {
      "main": [
        [
          {
            "node": "Wait 5 Second",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List Influencers Without Enrichment": {
      "main": [
        [
          {
            "node": "Process in Batches",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Creator Enrichment Payload": {
      "main": [
        [
          {
            "node": "Update Null Values Only",
            "type": "main",
            "index": 0
          },
          {
            "node": "Update a row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Influencers.club - Enrich by Handle (Full)": {
      "main": [
        [
          {
            "node": "Normalize Creator Enrichment Payload",
            "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

How it works:

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

More Data & Sheets workflows → · Browse all categories →

Related workflows

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

Data & Sheets

This workflow solves a common problem with RSS feeds: they often only provide a short summary or snippet of the full article. This template automatically monitors a list of your favorite blog RSS feed

HTTP Request, RSS Feed Read, Supabase
Data & Sheets

This workflow is a multi-system document synchronization pipeline built in n8n, designed to automatically sync and back up files between Microsoft SharePoint, Supabase/Postgres, and Google Drive.

HTTP Request, Supabase, Postgres +1
Data & Sheets

03 - Recordatorio 4h (CON VERIFICACIÓN) ✅. Uses supabase, httpRequest, twilio. Scheduled trigger; 17 nodes.

Supabase, HTTP Request, Twilio
Data & Sheets

02 - Recordatorio 24h antes (CON VERIFICACIÓN) ✅. Uses supabase, httpRequest, twilio. Scheduled trigger; 17 nodes.

Supabase, HTTP Request, Twilio
Data & Sheets

• Fetches IT-related tenders from the French BOAMP API (filter: informatique) • Scores each tender with OpenAI (pertinence, budget, stack, GO/NO-GO) • Routes to Supabase as hot (≥75) or archived • Run

HTTP Request, Supabase