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 →
{
"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.
influencersClubApisupabaseApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
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
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.
03 - Recordatorio 4h (CON VERIFICACIÓN) ✅. Uses supabase, httpRequest, twilio. Scheduled trigger; 17 nodes.
02 - Recordatorio 24h antes (CON VERIFICACIÓN) ✅. Uses supabase, httpRequest, twilio. Scheduled trigger; 17 nodes.
• 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