This workflow corresponds to n8n.io template #14058 — we link there as the canonical source.
This workflow follows the HTTP Request → Slack 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 →
{
"name": "Scrape Shopify store leads and deliver new contacts to Slack via ScraperCity",
"tags": [],
"nodes": [
{
"id": "d62ab14b-207f-4fc0-bbbe-7ee3934169c1",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-560,
352
],
"parameters": {
"width": 480,
"height": 896,
"content": "## Scrape Shopify store leads and deliver new contacts to Slack via ScraperCity\n\n### How it works\n\n1. The workflow is triggered manually and search parameters (platform, country, lead count, email inclusion) are configured.\n2. A scrape job is submitted to the ScraperCity API, and the returned run ID is stored for later reference.\n3. A polling loop waits 60 seconds between each status check, querying the ScraperCity API until the scrape job is marked complete.\n4. Once complete, the lead results CSV is downloaded from ScraperCity and parsed into structured lead objects.\n5. Duplicate leads are removed, and each unique lead is posted as a message to the configured Slack channel.\n\n### Setup steps\n\n- [ ] Create a ScraperCity account and obtain your API key from the dashboard\n- [ ] Add your ScraperCity API key as an n8n credential (HTTP Header Auth) and attach it to the HTTP Request nodes\n- [ ] Configure the Slack node with a valid Slack OAuth credential and set the target channel name\n- [ ] Open 'Configure Search Parameters' and set your desired platform, countryCode, totalLeads, and includeEmails values\n- [ ] Open 'Store Run ID' and confirm the slackChannel value matches your intended Slack channel\n- [ ] Run the workflow manually and verify leads appear in Slack\n\n### Customization\n\nAdjust the wait duration in 'Wait 60 Seconds' for faster or slower polling based on typical scrape completion times. Modify 'Configure Search Parameters' to target different countries or lead volumes without touching any other node. Extend 'Parse CSV and Format Leads' to map additional CSV fields into the Slack message for richer notifications."
},
"typeVersion": 1
},
{
"id": "9702c96f-72f4-4487-aaea-c351562b1c46",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
368
],
"parameters": {
"color": 7,
"width": 448,
"height": 320,
"content": "## Trigger and search setup\n\nManual trigger that kicks off the workflow and a configuration node that sets the scrape parameters (platform, country, lead count, email flag)."
},
"typeVersion": 1
},
{
"id": "2273329b-8c6f-40d4-bc37-31d2a13d7c1c",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
352
],
"parameters": {
"color": 7,
"width": 448,
"height": 336,
"content": "## Scrape job submission\n\nSends the scrape request to the ScraperCity API and stores the returned run ID along with the target Slack channel for use throughout the rest of the workflow."
},
"typeVersion": 1
},
{
"id": "3348f282-9d28-4b37-9fde-c0141263c4e5",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
992,
400
],
"parameters": {
"color": 7,
"width": 944,
"height": 304,
"content": "## Scrape status polling loop\n\nRepeatedly waits 60 seconds, checks the job status via the ScraperCity API, and loops back if the scrape is not yet complete, advancing only when the job finishes."
},
"typeVersion": 1
},
{
"id": "6d324085-e134-4fbf-a5a3-2cc4940eaea1",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
2000,
368
],
"parameters": {
"color": 7,
"width": 448,
"height": 320,
"content": "## Lead download and parsing\n\nDownloads the completed CSV result file from ScraperCity and parses it into structured lead objects ready for deduplication."
},
"typeVersion": 1
},
{
"id": "cd6bbefe-a0c9-471d-b864-a66e1a89856f",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
2496,
368
],
"parameters": {
"color": 7,
"width": 448,
"height": 320,
"content": "## Dedup and Slack delivery\n\nRemoves any duplicate leads from the parsed results and posts each unique lead as a message to the configured Slack channel."
},
"typeVersion": 1
},
{
"id": "44a19673-3bdc-40ae-962b-79c69be8db87",
"name": "When clicking 'Execute workflow'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
48,
528
],
"parameters": {},
"typeVersion": 1
},
{
"id": "1aae2c10-5b2d-480f-89b4-18bcb9a733b9",
"name": "Configure Search Parameters",
"type": "n8n-nodes-base.set",
"position": [
304,
528
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "cfg-001",
"name": "platform",
"type": "string",
"value": "shopify"
},
{
"id": "cfg-002",
"name": "countryCode",
"type": "string",
"value": "US"
},
{
"id": "cfg-003",
"name": "totalLeads",
"type": "number",
"value": 500
},
{
"id": "cfg-004",
"name": "includeEmails",
"type": "boolean",
"value": true
},
{
"id": "cfg-005",
"name": "includePhones",
"type": "boolean",
"value": true
},
{
"id": "cfg-006",
"name": "slackChannel",
"type": "string",
"value": "#shopify-leads"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "0a6af119-235a-4ac4-9746-ddf59b426292",
"name": "Start Shopify Lead Scrape",
"type": "n8n-nodes-base.httpRequest",
"position": [
544,
528
],
"parameters": {
"url": "https://app.scrapercity.com/api/v1/scrape/store-leads",
"method": "POST",
"options": {},
"jsonBody": "={\n \"platform\": \"{{ $json.platform }}\",\n \"countryCode\": \"{{ $json.countryCode }}\",\n \"emails\": {{ $json.includeEmails }},\n \"phones\": {{ $json.includePhones }},\n \"totalLeads\": {{ $json.totalLeads }}\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "41a39753-bc8f-4a54-8e86-8b3128fd6ade",
"name": "Store Run ID",
"type": "n8n-nodes-base.set",
"position": [
800,
528
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "rid-001",
"name": "runId",
"type": "string",
"value": "={{ $json.runId }}"
},
{
"id": "rid-002",
"name": "slackChannel",
"type": "string",
"value": "={{ $('Configure Search Parameters').item.json.slackChannel }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "cedbce6f-355c-421f-8f40-07ba99025a61",
"name": "Poll Loop Controller",
"type": "n8n-nodes-base.splitInBatches",
"position": [
1040,
528
],
"parameters": {
"options": {
"reset": false
}
},
"typeVersion": 3
},
{
"id": "1ec6bcb6-08ba-4f3b-b43c-e7de8930cc8c",
"name": "Wait 60 Seconds",
"type": "n8n-nodes-base.wait",
"position": [
1296,
528
],
"parameters": {
"amount": 60
},
"typeVersion": 1.1
},
{
"id": "ce6bc0b6-e192-46f3-bb99-5a22a654f796",
"name": "Check Scrape Status",
"type": "n8n-nodes-base.httpRequest",
"position": [
1552,
528
],
"parameters": {
"url": "=https://app.scrapercity.com/api/v1/scrape/status/{{ $('Store Run ID').item.json.runId }}",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "7980ab02-30b6-41a9-a756-ac3a36075825",
"name": "Is Scrape Complete?",
"type": "n8n-nodes-base.if",
"position": [
1792,
528
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-001",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.status }}",
"rightValue": "SUCCEEDED"
}
]
}
},
"typeVersion": 2.2
},
{
"id": "11126753-ee8d-41d3-8bba-569bbe9bfb16",
"name": "Download Lead Results",
"type": "n8n-nodes-base.httpRequest",
"position": [
2048,
528
],
"parameters": {
"url": "=https://app.scrapercity.com/api/downloads/{{ $('Store Run ID').item.json.runId }}",
"options": {
"response": {
"response": {
"responseFormat": "text"
}
}
},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"typeVersion": 4.2
},
{
"id": "27602325-1879-4bba-8a7f-540aea611d83",
"name": "Parse CSV and Format Leads",
"type": "n8n-nodes-base.code",
"position": [
2304,
528
],
"parameters": {
"jsCode": "// Parse CSV text into lead objects\nconst csvText = $input.first().json.data || $input.first().json.body || '';\n\nif (!csvText || typeof csvText !== 'string') {\n return [];\n}\n\nconst lines = csvText.trim().split('\\n');\nif (lines.length < 2) return [];\n\n// Parse a single CSV line respecting quoted fields\nfunction parseLine(line) {\n const result = [];\n let current = '';\n let inQuotes = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') {\n inQuotes = !inQuotes;\n } else if (ch === ',' && !inQuotes) {\n result.push(current.trim());\n current = '';\n } else {\n current += ch;\n }\n }\n result.push(current.trim());\n return result;\n}\n\nconst headers = parseLine(lines[0]).map(h => h.toLowerCase().replace(/\\s+/g, '_'));\nconst leads = [];\n\nfor (let i = 1; i < lines.length; i++) {\n if (!lines[i].trim()) continue;\n const values = parseLine(lines[i]);\n const lead = {};\n headers.forEach((h, idx) => {\n lead[h] = values[idx] || '';\n });\n\n // Normalize common column name variants\n const email = lead.email || lead.email_address || lead.contact_email || '';\n if (!email) continue; // skip rows with no email\n\n leads.push({\n json: {\n storeName: lead.store_name || lead.name || lead.shop_name || lead.domain || 'Unknown Store',\n email: email.toLowerCase().trim(),\n phone: lead.phone || lead.phone_number || lead.contact_phone || '',\n website: lead.website || lead.domain || lead.url || '',\n instagram: lead.instagram || lead.instagram_url || '',\n facebook: lead.facebook || lead.facebook_url || '',\n twitter: lead.twitter || lead.twitter_url || '',\n country: lead.country || lead.country_code || ''\n }\n });\n}\n\nreturn leads;"
},
"typeVersion": 2
},
{
"id": "f88ddcc3-4e5b-4d33-befc-c465768c45f4",
"name": "Remove Duplicate Leads",
"type": "n8n-nodes-base.removeDuplicates",
"position": [
2544,
528
],
"parameters": {
"compare": "selectedFields",
"options": {},
"fieldsToCompare": {
"fields": [
{
"fieldName": "email"
}
]
}
},
"typeVersion": 2
},
{
"id": "80550a8f-2aa5-454e-bc4f-b4514afddafb",
"name": "Post Lead to Slack",
"type": "n8n-nodes-base.slack",
"position": [
2800,
528
],
"parameters": {
"select": "channel",
"blocksUi": {
"blocksValues": [
{
"type": "section",
"textUi": {
"text": "=*New Shopify Lead: {{ $json.storeName }}*\n\n*Email:* {{ $json.email }}\n*Phone:* {{ $json.phone || '_not available_' }}\n*Website:* {{ $json.website || '_not available_' }}\n*Country:* {{ $json.country || '_not available_' }}\n*Instagram:* {{ $json.instagram || '_not available_' }}\n*Facebook:* {{ $json.facebook || '_not available_' }}\n*Twitter:* {{ $json.twitter || '_not available_' }}"
}
}
]
},
"channelId": {
"__rl": true,
"mode": "name",
"value": "={{ $('Store Run ID').item.json.slackChannel }}"
},
"messageType": "block",
"otherOptions": {
"unfurl_links": false
}
},
"typeVersion": 2.3
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "",
"connections": {
"Store Run ID": {
"main": [
[
{
"node": "Poll Loop Controller",
"type": "main",
"index": 0
}
]
]
},
"Wait 60 Seconds": {
"main": [
[
{
"node": "Check Scrape Status",
"type": "main",
"index": 0
}
]
]
},
"Check Scrape Status": {
"main": [
[
{
"node": "Is Scrape Complete?",
"type": "main",
"index": 0
}
]
]
},
"Is Scrape Complete?": {
"main": [
[
{
"node": "Download Lead Results",
"type": "main",
"index": 0
}
],
[
{
"node": "Poll Loop Controller",
"type": "main",
"index": 0
}
]
]
},
"Poll Loop Controller": {
"main": [
[
{
"node": "Wait 60 Seconds",
"type": "main",
"index": 0
}
]
]
},
"Download Lead Results": {
"main": [
[
{
"node": "Parse CSV and Format Leads",
"type": "main",
"index": 0
}
]
]
},
"Remove Duplicate Leads": {
"main": [
[
{
"node": "Post Lead to Slack",
"type": "main",
"index": 0
}
]
]
},
"Start Shopify Lead Scrape": {
"main": [
[
{
"node": "Store Run ID",
"type": "main",
"index": 0
}
]
]
},
"Parse CSV and Format Leads": {
"main": [
[
{
"node": "Remove Duplicate Leads",
"type": "main",
"index": 0
}
]
]
},
"Configure Search Parameters": {
"main": [
[
{
"node": "Start Shopify Lead Scrape",
"type": "main",
"index": 0
}
]
]
},
"When clicking 'Execute workflow'": {
"main": [
[
{
"node": "Configure Search Parameters",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow is for sales teams, growth hackers, and lead generation agencies who want to build a targeted list of Shopify store owners -- complete with emails, phone numbers, and social profiles -- and receive those contacts directly in Slack for immediate follow-up. A manual…
Source: https://n8n.io/workflows/14058/ — 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 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
Find companies similar to your best clients using PredictLeads, enrich each with news, hiring, and tech signals, then score them 0–100 for outreach priority.
As soon as a new lead fills out your form through facebook ads, the data gets sent to n8n immediately and saved to Supabase. Then an outbound call gets triggered instantly to qualify the lead and book
Stop manually digging through endless Google Ads search term reports! 📊 This workflow puts your brand campaign analysis on autopilot, acting as an AI-powered performance marketer that works for you 24
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