This workflow corresponds to n8n.io template #15460 — 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 →
{
"id": "GuvmMG7ssyd4Gy4z",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Ecommerce Leads Finder & Contact Extraction",
"tags": [],
"nodes": [
{
"id": "4ecda2bf-d244-421f-be72-91a4012cdc97",
"name": "When clicking \u2018Execute workflow\u2019",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-3184,
2032
],
"parameters": {},
"typeVersion": 1
},
{
"id": "7323cbbc-bf44-49aa-ba21-f61bcb4072a7",
"name": "Check Cached Product Detail Result",
"type": "n8n-nodes-base.code",
"position": [
-2080,
2032
],
"parameters": {
"jsCode": "const raw_data = $input.all();\n\nconst cutoffTime = new Date();\ncutoffTime.setHours(1, 30, 0, 0);\n\n// Process a single item\nasync function processItem(data) {\n const item = data.json;\n console.log(\"item\", item)\n const url = item.Url;\n console.log(\"url\", url)\n const scraperId = \"1780b8cb-747e-46b8-8d0d-b0168aeea930\";\n\n const response = await this.helpers.httpRequest({\n method: 'GET',\n url: `https://api.app.mrscraper.com/api/v1/results?filters[url]=${encodeURIComponent(url)}&page=1&pageSize=1&sort=createdAt&sortOrder=DESC&filters[scraperId]=${scraperId}`,\n headers: {\n 'accept': 'application/json',\n 'x-api-token': '',\n },\n });\n console.log(\"response\", response)\n let found = false;\n let cur_result = null;\n let last_scraped_at = null;\n\n const results = response?.data || [];\n for (let result of results) {\n\n // Handle \"too large data\" case\n if (result?.data?.message === \"Data is too large to display, check dataPath for more details\") {\n const response_detail = await this.helpers.httpRequest({\n method: 'GET',\n url: `https://api.app.mrscraper.com/api/v1/results/${result.id}`,\n headers: {\n 'accept': 'application/json',\n 'x-api-token': '',\n },\n });\n\n result = response_detail?.data || results;\n }\n console.log(\"result\", result)\n const createdAt = new Date(result.createdAt);\n\n const title = result?.data?.Detail_product?.title;\n\n if (title) {\n found = true;\n cur_result = result;\n break;\n }\n\n // track last scraped date\n if (!last_scraped_at || createdAt > new Date(last_scraped_at)) {\n last_scraped_at = createdAt.toISOString().split('T')[0];\n }\n }\n\n // If the item is new, return the original item from previous node\n return {\n is_new: !found,\n data: found ? cur_result.data : item, // <-- use item when new\n };\n}\n\n// Process with parallel workers\nconst WORKERS = 10;\nlet output = [];\n\nfor (let i = 0; i < raw_data.length; i += WORKERS) {\n const chunk = raw_data.slice(i, i + WORKERS);\n\n const results = await Promise.all(\n chunk.map(data => processItem.call(this, data))\n );\n\n output.push(...results);\n}\n\nreturn output;"
},
"retryOnFail": true,
"typeVersion": 2,
"waitBetweenTries": 5000
},
{
"id": "fde2dc17-d766-4a4d-bf02-1f74d04b6290",
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
144,
544
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "ee381b2c-ca25-45ef-a1e6-01c54d00386a",
"name": "Check Cached Result Contact Detail1",
"type": "n8n-nodes-base.code",
"position": [
224,
-384
],
"parameters": {
"jsCode": "const raw_data = $input.all();\n\nconst cutoffTime = new Date();\ncutoffTime.setHours(1, 30, 0, 0);\n\n// Process a single item\nasync function processItem(data) {\n const item = data.json;\n const url = item.contact_url;\n\n if (!url) {\n return {\n is_new: true,\n data: item,\n };\n }\n\n const scraperId = \"66e9c8ad-9d8a-47a2-b855-20aa13e64c66\";\n\n const response = await this.helpers.httpRequest({\n method: 'GET',\n url: `https://api.app.mrscraper.com/api/v1/results?filters[url]=${encodeURIComponent(url)}&page=1&pageSize=1&sort=createdAt&sortOrder=DESC&filters[scraperId]=${scraperId}`,\n headers: {\n 'accept': 'application/json',\n 'x-api-token': 'YOUR_MRSCRAPER_API_TOKEN',\n },\n });\n\n let found = false;\n let cur_result = null;\n let last_scraped_at = null;\n\n const results = response?.data || [];\n\n for (let result of results) {\n\n if (result?.data?.message === \"Data is too large to display, check dataPath for more details\") {\n const response_detail = await this.helpers.httpRequest({\n method: 'GET',\n url: `https://api.app.mrscraper.com/api/v1/results/${result.id}`,\n headers: {\n 'accept': 'application/json',\n 'x-api-token': 'YOUR_MRSCRAPER_API_TOKEN',\n },\n });\n\n result = response_detail?.data || result;\n }\n\n const createdAt = new Date(result.createdAt);\n\n const dataResult = result?.data?.data ?? result?.data;\n const email = dataResult?.emails;\n\n if (email) {\n found = true;\n cur_result = dataResult;\n break;\n }\n\n // track last scraped date\n if (!last_scraped_at || createdAt > new Date(last_scraped_at)) {\n last_scraped_at = createdAt.toISOString().split('T')[0];\n }\n }\n\n return {\n is_new: !found,\n data: found ? cur_result : item,\n };\n}\n\n// Process with parallel workers\nconst WORKERS = 10;\nlet output = [];\n\nfor (let i = 0; i < raw_data.length; i += WORKERS) {\n const chunk = raw_data.slice(i, i + WORKERS);\n\n const results = await Promise.all(\n chunk.map(data => processItem.call(this, data))\n );\n\n output.push(...results);\n}\n\nreturn output;"
},
"retryOnFail": true,
"typeVersion": 2,
"waitBetweenTries": 5000
},
{
"id": "5622e7af-df68-4cc5-bd78-e216f3837d42",
"name": "Run if only one execution exists",
"type": "n8n-nodes-base.if",
"position": [
-2736,
2032
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "16029302-62e1-4ccd-8e66-6c7ac00bee3d",
"operator": {
"type": "number",
"operation": "equals"
},
"leftValue": "={{ $json.runningCount }}",
"rightValue": 1
}
]
}
},
"typeVersion": 2.3
},
{
"id": "bc8d3041-30e8-40d9-bffc-8108b1c489e9",
"name": "Get Product url",
"type": "n8n-nodes-base.googleSheets",
"position": [
-2528,
2032
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupColumn": "status"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_PRODUCT_URL_SHEET_ID/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_PRODUCT_URL_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_PRODUCT_URL_SHEET_ID/edit?usp=drivesdk",
"cachedResultName": "Spedire Detail Url"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "30d01806-ddda-4bda-bc8d-07eb1e672a7e",
"name": "Loop Over Product Url",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-2304,
2032
],
"parameters": {
"options": {},
"batchSize": 100
},
"typeVersion": 3
},
{
"id": "aeba7e42-54a6-4ebb-bca1-d08630803809",
"name": "Check is New or Cached is available",
"type": "n8n-nodes-base.if",
"position": [
-1856,
2032
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "2f1ef202-e090-478d-9cc3-2d57d3571bd1",
"operator": {
"type": "boolean",
"operation": "true",
"singleValue": true
},
"leftValue": "={{ $json.is_new }}",
"rightValue": {}
}
]
}
},
"typeVersion": 2.3
},
{
"id": "eae8669d-3fcb-4fe0-8e0d-ccfe1656df5f",
"name": "Run Detail Product Scraper",
"type": "n8n-nodes-mrscraper.mrscraper",
"onError": "continueRegularOutput",
"position": [
-1632,
1952
],
"parameters": {
"url": "={{ $json.data.Url ?? $json.data.Detail_product.url }}",
"scraperId": "YOUR SCRAPER ID",
"requestOptions": {
"timeout": 120000
}
},
"credentials": {
"mrscraperApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.1
},
{
"id": "4f7c8c24-2735-4f1f-82d7-5561a3835a33",
"name": "Merge Product Detail Data",
"type": "n8n-nodes-base.merge",
"position": [
-1408,
2032
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "1721297c-50cf-4cf4-98b9-60a5f29ba8ea",
"name": "Formatting Data",
"type": "n8n-nodes-base.code",
"position": [
-1120,
2016
],
"parameters": {
"jsCode": "const items = $input.all();\n\nreturn items.map((item) => {\n const raw = item.json ?? {};\n\n // support both structures\n // data 1 => raw.data.data\n // data 2 => raw.data\n const root =\n raw?.data?.data ||\n raw?.data ||\n {};\n\n const product =\n root?.Detail_product ??\n null;\n\n const seller =\n root?.Detail_seller?.data ??\n root?.Detail_seller ??\n null;\n\n return {\n json: {\n // PRODUCT\n url: product?.url ?? null,\n\n productTitle: product?.title ?? null,\n productSummary: product?.aiSummary ?? null,\n productDescription: product?.description ?? null,\n\n favoritesCount: product?.favoritesCount ?? null,\n\n // SPECIFICATIONS\n specEra:\n product?.specifications?.Era ?? null,\n\n specBrand:\n product?.specifications?.Brand ?? null,\n\n specModel:\n product?.specifications?.Model ||\n product?.specifications?.[\"Model/name\"] ||\n null,\n\n specArtist:\n product?.specifications?.Artist ?? null,\n\n specDesigner:\n product?.specifications?.[\"Designer/artist/maker\"] ?? null,\n\n specManufacturer:\n product?.specifications?.[\"Manufacturer/brand\"] ?? null,\n\n specCountryOrigin:\n product?.specifications?.[\"Country of origin\"] ?? null,\n\n specMaterial:\n product?.specifications?.Material ?? null,\n\n specStyle:\n product?.specifications?.Style ?? null,\n\n specColour:\n product?.specifications?.Colour ?? null,\n\n specCondition:\n product?.specifications?.Condition ?? null,\n\n specPeriod:\n product?.specifications?.Period ?? null,\n\n specYear:\n product?.specifications?.Year ?? null,\n\n specTechnique:\n product?.specifications?.Technique ?? null,\n\n specSignature:\n product?.specifications?.Signature ?? null,\n\n specEdition:\n product?.specifications?.Edition ?? null,\n\n specSoldBy:\n product?.specifications?.[\"Sold by\"] ?? null,\n\n specSoldWithFrame:\n product?.specifications?.[\"Sold with frame\"] ?? null,\n\n specTitleArtwork:\n product?.specifications?.[\"Title of artwork\"] ?? null,\n\n specEstPeriod:\n product?.specifications?.[\"Estimated period\"] ?? null,\n\n specHeight:\n product?.specifications?.Height ?? null,\n\n specWidth:\n product?.specifications?.Width ?? null,\n\n specDepth:\n product?.specifications?.Depth ?? null,\n\n specSeatingHeight:\n product?.specifications?.[\"Seating height\"] ?? null,\n\n specNumObjects:\n product?.specifications?.[\"Number of objects\"] ?? null,\n\n // SHIPPING\n shippingDestination:\n product?.shipping?.destination ?? null,\n\n shippingCost:\n product?.shipping?.cost ?? null,\n\n pickupLocation:\n product?.shipping?.pickupLocation ?? null,\n\n // IMAGES\n imageUrls: (product?.images ?? [])\n .map(img => img?.url)\n .filter(Boolean)\n .join(\" | \") || null,\n\n imageAlts: (product?.images ?? [])\n .map(img => img?.alt)\n .filter(Boolean)\n .join(\" | \") || null,\n\n // SELLER (FROM PRODUCT)\n sellerName:\n product?.seller?.name ?? null,\n\n sellerProfileUrl:\n product?.seller?.profileUrl ?? null,\n\n sellerCountry: seller?.country ??\n product?.seller?.country ?? null,\n\n sellerVerified:\n product?.seller?.verified ?? null,\n\n sellerType:\n product?.seller?.type ?? null,\n\n sellerObjectsSold:\n product?.seller?.stats?.[\"Objects sold\"] ?? null,\n\n sellerReviews:\n product?.seller?.stats?.[\"Reviews\"] ?? null,\n\n sellerPositiveScore:\n product?.seller?.stats?.[\"100%\"] ?? null,\n\n // SELLER DETAIL\n sellerId:\n seller?.sellerId ?? null,\n\n seller_page_url:\n seller?.sellerUrl ?? null,\n\n sellerCanonicalUrl:\n seller?.canonicalUrl ?? null,\n\n sellerDetailCountry:\n seller?.country ?? null,\n\n business_name:\n seller?.businessName ?? null,\n\n business_address:\n seller?.businessAddress ?? null,\n\n business_license_number:\n seller?.businessRegNumber ?? null,\n\n sellerReviewCount:\n seller?.reviewCount ?? null,\n\n sellerObjectsSoldDetail:\n seller?.objectsSold ?? null,\n\n sellerPositiveScoreDetail:\n seller?.positiveScore ?? null,\n\n reviewsUrl:\n seller?.reviewsUrl ?? null,\n\n sellerTags: (seller?.tags ?? [])\n .filter(Boolean)\n .join(\" | \") || null,\n\n sellerLotLabels: (seller?.lots ?? [])\n .map(l => l?.label)\n .filter(Boolean)\n .join(\" | \") || null,\n\n sellerLotCounts: (seller?.lots ?? [])\n .map(l => l?.count)\n .filter(v => v !== undefined && v !== null)\n .join(\" | \") || null,\n\n sellerLotUrls: (seller?.lots ?? [])\n .map(l => l?.url)\n .filter(Boolean)\n .join(\" | \") || null,\n },\n };\n});"
},
"typeVersion": 2
},
{
"id": "055b6927-38e2-4e44-b3e4-205ab04766da",
"name": "Append or update Product Detail in Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
-928,
2016
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "contact_url",
"type": "string",
"display": true,
"required": false,
"displayName": "contact_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company_url",
"type": "string",
"display": true,
"required": false,
"displayName": "company_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productTitle",
"type": "string",
"display": true,
"required": false,
"displayName": "productTitle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productSummary",
"type": "string",
"display": true,
"required": false,
"displayName": "productSummary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productDescription",
"type": "string",
"display": true,
"required": false,
"displayName": "productDescription",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "favoritesCount",
"type": "string",
"display": true,
"required": false,
"displayName": "favoritesCount",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specEra",
"type": "string",
"display": true,
"required": false,
"displayName": "specEra",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specModel",
"type": "string",
"display": true,
"required": false,
"displayName": "specModel",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specDesigner",
"type": "string",
"display": true,
"required": false,
"displayName": "specDesigner",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specManufacturer",
"type": "string",
"display": true,
"required": false,
"displayName": "specManufacturer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specCountryOrigin",
"type": "string",
"display": true,
"required": false,
"displayName": "specCountryOrigin",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specMaterial",
"type": "string",
"display": true,
"required": false,
"displayName": "specMaterial",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specStyle",
"type": "string",
"display": true,
"required": false,
"displayName": "specStyle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specColour",
"type": "string",
"display": true,
"required": false,
"displayName": "specColour",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specCondition",
"type": "string",
"display": true,
"required": false,
"displayName": "specCondition",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specEstPeriod",
"type": "string",
"display": true,
"required": false,
"displayName": "specEstPeriod",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specHeight",
"type": "string",
"display": true,
"required": false,
"displayName": "specHeight",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specWidth",
"type": "string",
"display": true,
"required": false,
"displayName": "specWidth",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specDepth",
"type": "string",
"display": true,
"required": false,
"displayName": "specDepth",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specSeatingHeight",
"type": "string",
"display": true,
"required": false,
"displayName": "specSeatingHeight",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specNumObjects",
"type": "string",
"display": true,
"required": false,
"displayName": "specNumObjects",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "shippingDestination",
"type": "string",
"display": true,
"required": false,
"displayName": "shippingDestination",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "shippingCost",
"type": "string",
"display": true,
"required": false,
"displayName": "shippingCost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "pickupLocation",
"type": "string",
"display": true,
"required": false,
"displayName": "pickupLocation",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "imageUrls",
"type": "string",
"display": true,
"required": false,
"displayName": "imageUrls",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "imageAlts",
"type": "string",
"display": true,
"required": false,
"displayName": "imageAlts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerName",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "seller_page_url",
"type": "string",
"display": true,
"required": false,
"displayName": "seller_page_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "business_name",
"type": "string",
"display": true,
"required": false,
"displayName": "business_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "business_address",
"type": "string",
"display": true,
"required": false,
"displayName": "business_address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "business_license_number",
"type": "string",
"display": true,
"required": false,
"displayName": "business_license_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerProfileUrl",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerProfileUrl",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerCountry",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerCountry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerVerified",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerVerified",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerType",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerType",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerObjectsSold",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerObjectsSold",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerReviews",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerReviews",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerDetailCountry",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerDetailCountry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerLotLabels",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerLotLabels",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerLotCounts",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerLotCounts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerLotUrls",
"type": "string",
"display": true,
"required": false,
"displayName": "sellerLotUrls",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "emails",
"type": "string",
"display": true,
"required": false,
"displayName": "emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "phones",
"type": "string",
"display": true,
"required": false,
"displayName": "phones",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"url"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_LEADS_SHEET_ID/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_LEADS_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_LEADS_SHEET_ID/edit?usp=drivesdk",
"cachedResultName": "Spedire Leads"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "9b4ca6ab-a0af-4a18-a4c2-557a4535920b",
"name": "Append or update url's scraped status",
"type": "n8n-nodes-base.googleSheets",
"onError": "continueRegularOutput",
"position": [
-736,
2016
],
"parameters": {
"columns": {
"value": {
"Url": "={{ $json.url }}",
"status": "finished"
},
"schema": [
{
"id": "Url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "Url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "status",
"type": "string",
"display": true,
"required": false,
"displayName": "status",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"Url"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_PRODUCT_URL_SHEET_ID/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_PRODUCT_URL_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_PRODUCT_URL_SHEET_ID/edit?usp=drivesdk",
"cachedResultName": "Spedire Detail Url"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "a8565e90-2853-48e5-8832-01a6608e0e73",
"name": "Loop SERP Company URL by Seller Detail",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-1680,
1248
],
"parameters": {
"options": {},
"batchSize": 500
},
"typeVersion": 3
},
{
"id": "9338b2e3-7bc4-4c8e-b856-6780abc9d71b",
"name": "Get sellerDetail filter by Seller Country",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1904,
1248
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "Italy",
"lookupColumn": "sellerCountry"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_LEADS_SHEET_ID/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_LEADS_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_LEADS_SHEET_ID/edit?usp=drivesdk",
"cachedResultName": "Spedire Leads"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"executeOnce": true,
"typeVersion": 4.7
},
{
"id": "b7eab9b1-6f1d-46e7-99cb-0e1986ed788e",
"name": "request SERP API",
"type": "n8n-nodes-base.httpRequest",
"onError": "continueRegularOutput",
"position": [
-1232,
1168
],
"parameters": {
"url": "https://sync.scraper.mrscraper.com/api/google/serp/sync",
"method": "POST",
"options": {
"redirect": {
"redirect": {}
}
},
"jsonBody": "={\n \"url\": \"https://www.google.com/search?q={{ $json.business_name ?? $json.sellerName }}+{{ $json.sellerCountry }}\",\n \"raw\": true\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "Cookie",
"value": "sl-session=YOUR_SESSION_COOKIE;"
},
{
"name": "cookie",
"value": "sl-session=YOUR_SESSION_COOKIE;"
}
]
}
},
"typeVersion": 4.4
},
{
"id": "16e2c689-dbf8-430f-a3a5-77086e29f222",
"name": "Filter Legit Company Profile Url",
"type": "n8n-nodes-base.code",
"position": [
-1008,
1168
],
"parameters": {
"jsCode": "const allInputs = $input.all();\nconst allScraperItems = $('Filter License Exists & Company URL Not Yet Available').all(0) ?? null;\nconsole.log(\"allScraperItems\", allScraperItems)\n\nconst BLACKLIST = [\n 'facebook.com','instagram.com','linkedin.com','twitter.com','x.com',\n 'youtube.com','tiktok.com','reddit.com','pinterest.com','threads.net',\n 'amazon.com','amazon.it','amazon.co.uk','amazon.de',\n 'ebay.com','ebay.it','etsy.com','aliexpress.com','alibaba.com',\n 'catawiki.com','vinted.com','subito.it','yelp.com','tripadvisor.com',\n 'trustpilot.com','wikipedia.org','google.com','bing.com','crunchbase.com'\n];\n\nconst CONFIDENCE_THRESHOLD = 2.5;\n\n\nfunction normalize(text) {\n return (text || '')\n .toLowerCase()\n .replace(/[^a-z0-9\\s]+/g, ' ');\n}\n\nfunction tokenize(name) {\n const stopwords = new Set([\n \"the\",\"and\",\"of\",\"di\",\"e\",\"srl\",\"sas\",\"spa\",\"sa\",\"ltd\",\"llc\",\n \"inc\",\"co\",\"company\",\"corp\",\"group\",\"holding\",\"holdings\"\n ]);\n\n return normalize(name)\n .split(/\\s+/)\n .filter(t => t && !stopwords.has(t) && t.length > 1);\n}\n\nfunction extractDomain(url) {\n let d = url.replace(/^https?:\\/\\//i, '');\n d = d.replace(/^www\\./i, '');\n return d.split('/')[0].toLowerCase();\n}\n\nfunction registrableDomain(host) {\n host = host.replace(/^www\\./, '');\n const parts = host.split('.');\n if (parts.length <= 2) return host;\n return parts.slice(-2).join('.');\n}\n\nfunction isBlacklisted(url) {\n const d = extractDomain(url);\n return BLACKLIST.some(b => d === b || d.endsWith('.' + b));\n}\n\nfunction scoreCandidate(item, tokens, country) {\n let score = 0;\n\n const url = item.url;\n const title = item.title || '';\n const snippet = item.snippet || '';\n const rank = item.rank ?? 0;\n\n const parsedDomain = extractDomain(url);\n const domain = registrableDomain(parsedDomain);\n\n const domainCore = domain.split('.')[0];\n const domainCompact = domainCore.replace(/[^a-z0-9]/g, '');\n\n const tokenSet = new Set(tokens);\n const domainTokens = domainCore.split(/[^a-z0-9]+/).filter(Boolean);\n\n // 1. DOMAIN TOKEN MATCH (3.0)\n const domainHits = domainTokens.filter(t => tokenSet.has(t)).length;\n score += 3.0 * domainHits;\n\n // 2. SUBSTRING MATCH (1.5)\n let substringHits = 0;\n for (const t of tokens) {\n if (t.length >= 3 && domainCompact.includes(t)) substringHits++;\n }\n score += 1.5 * Math.max(0, substringHits - domainHits);\n\n // 3. FULL NAME MATCH (2.0)\n const joined = tokens.join('');\n if (joined && domainCompact.includes(joined)) {\n score += 2.0;\n }\n\n // 4. TITLE + SNIPPET MATCH (0.4)\n const haystack = normalize(title + ' ' + snippet);\n let textHits = 0;\n for (const t of tokenSet) {\n if (haystack.includes(t)) textHits++;\n }\n score += 0.4 * textHits;\n\n // 5. HOMEPAGE BONUS (0.5)\n const path = url.split(parsedDomain)[1] || '';\n if (!path || path === '/') score += 0.5;\n else if (path.split('/').length > 3) score -= 0.3;\n\n // 6. RANK BONUS (0.3 decay)\n score += Math.max(0, 0.3 - 0.03 * rank);\n\n // 7. BLOG / BUILDER PENALTY (-1.5)\n if (\n parsedDomain.includes('blogspot') ||\n parsedDomain.includes('wordpress') ||\n parsedDomain.includes('wixsite') ||\n parsedDomain.includes('weebly')\n ) {\n score -= 1.5;\n }\n\n return score;\n}\n\nfunction process(inputItem, scraperItem) {\n const inputJson = inputItem?.json ?? null;\n const scraperJson = scraperItem?.json ?? null;\n\n const searchResults = Array.isArray(inputJson)\n ? (inputJson[0]?.data ?? inputJson)\n : (inputJson?.data ?? []);\n\n const filtered = searchResults.filter(r => !isBlacklisted(r.url || ''));\n\n const businessName =\n scraperJson?.business_name ||\n scraperJson?.data?.name ||\n '';\n console.log(\"businessName\", businessName)\n const tokens = tokenize(businessName);\n\n let bestScore = -Infinity;\n let bestUrl = null;\n\n const scored = filtered.map(r => {\n const score = scoreCandidate(r, tokens);\n return { ...r, score };\n });\n\n for (const r of scored) {\n if (r.score > bestScore) {\n bestScore = r.score;\n bestUrl = r.url;\n }\n }\n\n return {\n bestUrl: bestScore >= CONFIDENCE_THRESHOLD ? bestUrl : null,\n score: bestScore,\n threshold: CONFIDENCE_THRESHOLD,\n passed: bestScore >= CONFIDENCE_THRESHOLD,\n businessName,\n ranked: scored.sort((a,b) => b.score - a.score)\n };\n}\n\n// Main Code\nreturn allInputs.map((inputItem, i) => {\n const scraperItem = allScraperItems[i] ?? allScraperItems.at(-1);\n return { json: process(inputItem, scraperItem) };\n});"
},
"typeVersion": 2
},
{
"id": "f74ad874-a135-4b6b-bd3f-e3202ccdd59b",
"name": "Append or update company Url",
"type": "n8n-nodes-base.googleSheets",
"position": [
-784,
1168
],
"parameters": {
"columns": {
"value": {
"url": "={{ $('Filter License Exists & Company URL Not Yet Available').item.json.url }}",
"company_url": "={{ $json.bestUrl }}"
},
"schema": [
{
"id": "url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "contact_url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "contact_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company_url",
"type": "string",
"display": true,
"required": false,
"displayName": "company_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productTitle",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "productTitle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productSummary",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "productSummary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productDescription",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "productDescription",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "favoritesCount",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "favoritesCount",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specEra",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specEra",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specModel",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specModel",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specDesigner",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specDesigner",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specManufacturer",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specManufacturer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specCountryOrigin",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specCountryOrigin",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specMaterial",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specMaterial",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specStyle",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specStyle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specColour",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specColour",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specCondition",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specCondition",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specEstPeriod",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specEstPeriod",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specHeight",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specHeight",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specWidth",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specWidth",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specDepth",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specDepth",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specSeatingHeight",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specSeatingHeight",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specNumObjects",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specNumObjects",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "shippingDestination",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "shippingDestination",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "shippingCost",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "shippingCost",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "pickupLocation",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "pickupLocation",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "imageUrls",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "imageUrls",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "imageAlts",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "imageAlts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerName",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "seller_page_url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "seller_page_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "business_name",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "business_name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "business_address",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "business_address",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "business_license_number",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "business_license_number",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerProfileUrl",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerProfileUrl",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerCountry",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerCountry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerVerified",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerVerified",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerType",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerType",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerObjectsSold",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerObjectsSold",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerReviews",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerReviews",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerDetailCountry",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerDetailCountry",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerLotLabels",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerLotLabels",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerLotCounts",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerLotCounts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "sellerLotUrls",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "sellerLotUrls",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "emails",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "emails",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "phones",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "phones",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"url"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_LEADS_SHEET_ID/edit#gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_LEADS_SHEET_ID",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/YOUR_LEADS_SHEET_ID/edit?usp=drivesdk",
"cachedResultName": "Spedire Leads"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.7
},
{
"id": "5a2e1900-ffe0-4670-9308-f33c52913bb3",
"name": "Merge Serp Result",
"type": "n8n-nodes-base.merge",
"onError": "continueRegularOutput",
"position": [
-544,
1248
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "ceab6bbc-1920-4d76-9e46-fa8ac6259e47",
"name": "Append or update row in Contact Url",
"type": "n8n-nodes-base.googleSheets",
"onError": "continueRegularOutput",
"position": [
-80,
464
],
"parameters": {
"columns": {
"value": {
"url": "={{ $('Filter Company Url Exists & Contact Url Not Yet Available').item.json.url }}",
"contact_url": "={{ $json.url }}"
},
"schema": [
{
"id": "url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "contact_url",
"type": "string",
"display": true,
"removed": false,
"required": false,
"displayName": "contact_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "company_url",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "company_url",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productTitle",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "productTitle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productSummary",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "productSummary",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "productDescription",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "productDescription",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "favoritesCount",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "favoritesCount",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specEra",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specEra",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specModel",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specModel",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specDesigner",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specDesigner",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specManufacturer",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specManufacturer",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specCountryOrigin",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specCountryOrigin",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specMaterial",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specMaterial",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specStyle",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specStyle",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specColour",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayName": "specColour",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "specCondition",
"type": "string",
"display": true,
"removed": true,
"required": false,
"displayNam
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.
googleSheetsOAuth2ApimrscraperApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
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 emails and phone numbers.
Source: https://n8n.io/workflows/15460/ — 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 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
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
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
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
This n8n workflow is a sophisticated B2B Lead Generation Scraper. It automates the entire journey from discovering businesses on Google Maps to extracting, scoring, and saving high-quality contact ema