This workflow corresponds to n8n.io template #16056 — we link there as the canonical source.
This workflow follows the Agent → Google Sheets 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": "4o0Ibg1iWEKbFOzM",
"meta": {
"builderVariant": "mcp",
"aiBuilderAssisted": true
},
"name": "BizQuest Daily Alert System | Automate search to buy an established SMB",
"tags": [],
"nodes": [
{
"id": "46624ce6-0e95-4973-ad51-5093f461f3ad",
"name": "Sticky Note 0cdc8d5b",
"type": "n8n-nodes-base.stickyNote",
"position": [
-3408,
-64
],
"parameters": {
"width": 736,
"height": 704,
"content": "## Personalized BizQuest Deals (Apify + Claude Haiku & Sonnet)\n\n### How it works\n\n1. Scrapes BizQuest via Apify daily at 5am (local timezone) using filters defined in your buy box.\n2. Normalizes the listings and ranks them by SDE.\n3. Loops one listing at a time, skipping any already in the master Google Sheet.\n4. Scores each new listing 1\u20135 for buyer fit using Claude Haiku (1 is low, 5 is high).\n5. Drafts a 3\u20135 sentence personalized message to the broker using Sonnet, only for listings that fit.\n6. Appends every scored listing to the Sheet and posts the 4+ score listings to Slack with the outreach in a code block.\n\n-> Basically, you get a shortlist of relevant deals with a copy/paste personalized broker message.\n\n### Who this is for\n1. Business buyers\n2. Business owners\n3. Investors\n4. Entrepreneurs\n\n### Setup steps\n\n- [ ] Create a 16-column Google Sheet (cols: Title | Source | Keyword | Location | Asking Price | Revenue | SDE | SDE Estimated | Listed Date | Link | First Seen | Stage | Fit Rationale | Fit Score | Fit Confidence | Broker Message)\n- [ ] In \"Scrape BizQuest\", replace the Apify task URL with your own link.\n- [ ] In \"Define Buy Box\", edit all five fields \u2014 buyBox (free-text profile), keyword, cashFlowMin, priceMax, listingAgeDays. Every downstream node reads from here.\n- [ ] Wire additional credentials: Anthropic, Google Sheets (OAuth2), Slack (OAuth). \n- [ ] Select your Google Sheet and your Slack DM/channel.\n- [ ] Test with a manual run, confirm, then toggle Active.\n\nThe Apify scraper used in this workflow is here: https://apify.com/memo23/bizquest-scraper\n\n## More at SMB Excel \u2014 smbexcel.com"
},
"typeVersion": 1
},
{
"id": "62dfc324-410a-42bb-b6f4-fdea66495853",
"name": "Sticky Note 0e7e5357",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2640,
-64
],
"parameters": {
"color": 7,
"width": 816,
"height": 544,
"content": "## Schedule scrape and set buy box.\n\nRuns the Apify scrape at the cron interval (default: 5am daily local timezone) Normalizes the returned listings into a common shape and imputes SDE at 10% of revenue when missing (flagged sdeEstimated:true downstream).\n\nUser MUST edit (a) Apify API url and (b) buy-box details"
},
"typeVersion": 1
},
{
"id": "041f50d3-2aa4-4d5a-941c-40aec374d244",
"name": "Sticky Note ff9563f1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1792,
-64
],
"parameters": {
"color": 7,
"width": 880,
"height": 544,
"content": "## Rank, loop, and dedupe\n\nRanks the day's batch by SDE and caps at the top 100. Loops one listing at a time and skips any already saved in the master google sheet \u2014 uses the canonicalized BizQuest listing URL as the unique id. "
},
"typeVersion": 1
},
{
"id": "b6dc4a2a-d601-4415-bc2b-140243794cf2",
"name": "Sticky Note 0164ca4f",
"type": "n8n-nodes-base.stickyNote",
"position": [
-880,
-64
],
"parameters": {
"color": 7,
"width": 820,
"height": 544,
"content": "## Score buyer fit\n\nHaiku 4.5 scores buyer fit 1\u20135 against your buy box text via a Structured Output Parser. Output: {rationale, score, confidence}. Every scored listing gets logged to the Sheet for audit. Only score 4 or 5 listings continue to Sonnet outreach + Slack alert."
},
"typeVersion": 1
},
{
"id": "f71414bf-b1ea-4988-ab58-f3c624e21b44",
"name": "Sticky Note 20739a71",
"type": "n8n-nodes-base.stickyNote",
"position": [
-32,
-320
],
"parameters": {
"color": 7,
"width": 432,
"height": 496,
"content": "## Draft broker outreach\n\nSonnet 4.6 drafts a 3\u20135 sentence broker outreach specific to the listing. Pulls the broker's first name from the listing when present, otherwise leaves \"[Broker name]\" as a placeholder for you to fill. \n"
},
"typeVersion": 1
},
{
"id": "1216efd0-3d84-4569-b133-e184987510a6",
"name": "Sticky Note c833cdaa",
"type": "n8n-nodes-base.stickyNote",
"position": [
416,
-320
],
"parameters": {
"color": 7,
"width": 672,
"height": 800,
"content": "## Log and post to Slack\n\nAppends winners to google sheet with broker message. Then posts everything you need to your Slack DMs. "
},
"typeVersion": 1
},
{
"id": "fb5fb483-bee1-4d86-a630-6ebc4f40ca24",
"name": "Sticky Note 5ada18c2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-32,
192
],
"parameters": {
"color": 7,
"width": 432,
"height": 288,
"content": "## Log low-score listings\n\nScore 1\u20133 listings are appended to the Sheet for audit review \u2014 no Slack ping, no Sonnet call (saves tokens; lets you spot scoring drift over time by reviewing the Sheet)."
},
"typeVersion": 1
},
{
"id": "b8aa3fb0-7c44-4947-8eff-294a2f1a46da",
"name": "When Schedule Triggers Daily",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-2592,
144
],
"parameters": {
"rule": {
"interval": [
{
"field": "cronExpression",
"expression": "0 5 * * *"
}
]
}
},
"typeVersion": 1.2
},
{
"id": "c3c58bc8-fbfe-4cd0-ac6a-e23ed761e6be",
"name": "Scrape BizQuest",
"type": "n8n-nodes-base.httpRequest",
"position": [
-2176,
144
],
"parameters": {
"url": "https://api.apify.com/v2/actor-tasks/...",
"method": "POST",
"options": {
"timeout": 600000
},
"jsonBody": "={\"filterKeyword\": \"{{ $('Define Buy Box').item.json.keyword }}\", \"filterCashFlowMin\": {{ $('Define Buy Box').item.json.cashFlowMin }}, \"filterPriceMax\": {{ $('Define Buy Box').item.json.priceMax }}, \"filterListingAgeDays\": {{ $('Define Buy Box').item.json.listingAgeDays }}, \"includeListingDetails\": true, \"maxItems\": 1000, \"proxy\": {\"useApifyProxy\": true, \"apifyProxyGroups\": [\"RESIDENTIAL\"]}}",
"sendBody": true,
"specifyBody": "json"
},
"typeVersion": 4.2
},
{
"id": "56dee21f-0c42-4c52-8ec3-dec71cb8213c",
"name": "Normalize BizQuest",
"type": "n8n-nodes-base.code",
"position": [
-1968,
144
],
"parameters": {
"jsCode": "const parseNum = (v) => {\n if (typeof v === 'number') return v;\n if (!v) return 0;\n const m = String(v).replace(/[,$\\s]/g, '').match(/(\\d+(?:\\.\\d+)?)([kKmM]?)/);\n if (!m) return 0;\n const n = parseFloat(m[1]);\n const suf = (m[2] || '').toLowerCase();\n return suf === 'm' ? n * 1000000 : suf === 'k' ? n * 1000 : n;\n};\n\nconst canonicalize = (url) => {\n if (!url) return '';\n try {\n const u = new URL(url);\n u.search = '';\n u.hash = '';\n return u.toString().replace(/\\/$/, '');\n } catch (e) { return url; }\n};\n\nconst out = [];\nfor (const item of $input.all()) {\n const j = item.json || {};\n\n const title = j.title || j.header || j.name || '';\n const link = canonicalize(j.url || j.listingUrl || j.urlStub || '');\n\n const city = j.city || '';\n const state = j.state || j.region || '';\n const location = city && state ? (city + ', ' + state) : (j.location || state || city || '');\n\n const askingPrice = parseNum(j.askingPrice || j.price);\n const revenue = parseNum(j.grossIncome || j.revenue || j.grossRevenue);\n\n let sde = parseNum(j.cashFlow);\n if (sde === 0) sde = parseNum(j.ebitda);\n\n if (sde > 0 && sde < 10000 && revenue > 500000) {\n sde = sde * 1000;\n }\n\n if (revenue > 100000 && sde > 0 && sde < Math.max(10000, revenue * 0.01)) {\n sde = 0;\n }\n\n const description = j.description || j.summary || j.adLine || '';\n const industry = j.industry || '';\n const yearEstablished = j.yearEstablished || '';\n const employees = j.employees || '';\n const brokerName = j.brokerName || '';\n const brokerPhone = j.brokerPhone || '';\n\n let sdeEstimated = false;\n if (sde === 0 && revenue > 0) {\n sde = Math.round(revenue * 0.10);\n sdeEstimated = true;\n }\n\n if (!title || !link) continue;\n\n out.push({\n json: { title, source: 'BizQuest', industry, location, askingPrice, revenue, sde, sdeEstimated, listedDate: '', link, description, yearEstablished, numberOfEmployees: employees, reasonForSelling: '', brokerName, brokerPhone, scrapedAt: new Date().toISOString() },\n });\n}\nreturn out;"
},
"typeVersion": 2
},
{
"id": "918b8b48-9568-4def-bd59-3daf62db7708",
"name": "Look Up Link in Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
-1296,
112
],
"parameters": {
"options": {},
"filtersUI": {
"values": [
{
"lookupValue": "={{ $json.link }}",
"lookupColumn": "Link"
}
]
},
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEET_ID",
"cachedResultName": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5,
"alwaysOutputData": true
},
{
"id": "e9802403-a5d2-4b91-a3f0-35e63f00c14c",
"name": "If Link Is New",
"type": "n8n-nodes-base.if",
"position": [
-1072,
112
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "cond-isnew",
"operator": {
"type": "string",
"operation": "empty",
"singleValue": true
},
"leftValue": "={{ $json.Link }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "4f65cf6d-145b-4fb4-b840-5c0c77a18dbf",
"name": "Score with Claude",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
-704,
96
],
"parameters": {
"text": "=Industry: {{ $(\"Loop Over Listings\").item.json.industry }}\nTitle: {{ $(\"Loop Over Listings\").item.json.title }}\nLocation: {{ $(\"Loop Over Listings\").item.json.location }}\nAsking: {{ $(\"Loop Over Listings\").item.json.askingPrice }}\nRevenue: {{ $(\"Loop Over Listings\").item.json.revenue }}\nSDE: {{ $(\"Loop Over Listings\").item.json.sde }}\nYear Established: {{ $(\"Loop Over Listings\").item.json.yearEstablished }}\nEmployees: {{ $(\"Loop Over Listings\").item.json.numberOfEmployees }}\nDescription: {{ $(\"Loop Over Listings\").item.json.description }}\nLink: {{ $(\"Loop Over Listings\").item.json.link }}",
"options": {
"systemMessage": "=You are an acquisition analyst pre-screening business-for-sale listings for a buyer.\n\n=== BUY BOX ===\n{{ $('Define Buy Box').item.json.buyBox }}\n=== END BUY BOX ===\n\nNote: listings have already passed the buy-box filters at the scrape level. Your job is to assess business buyer FIT given the buy box above, not size.\n\n=== YOUR TASK ===\nGiven a listing (with description body), output a JSON object with exactly three fields:\n- rationale: ONE sentence, max 25 words, concrete, referencing a specific number or fact from the listing or description. No hedging. If SDE is flagged as estimated, mention it.\n- score: integer 1\u20135 where 1 = poor fit, 3 = plausible, 5 = strong fit. When SDE is estimated, lean conservative \u2014 drop one point.\n- confidence: 'low', 'med', or 'high'. Confidence reflects how sure you are in your own assessment (a confident rejection is valid). SDE estimated \u2192 rarely above 'med'.\n\nExample output:\n{\"rationale\":\"Texas HVAC with $1.2M revenue, recurring commercial maintenance contracts mentioned in description, fits cleanly.\",\"score\":4,\"confidence\":\"high\"}"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "65d3614f-19d4-46e1-b7dc-83601074b62a",
"name": "Anthropic Chat Model",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
-768,
288
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-haiku-4-5-20251001",
"cachedResultName": "Claude Haiku 4.5"
},
"options": {
"temperature": 0
}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.5
},
{
"id": "1eadf313-4c24-4e8c-9f8b-e60d6ccfa695",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
-496,
288
],
"parameters": {
"jsonSchemaExample": "{\"rationale\":\"Texas HVAC with $1.2M revenue, recurring commercial maintenance contracts, fits cleanly.\",\"score\":4,\"confidence\":\"high\"}"
},
"typeVersion": 1.3
},
{
"id": "f85d75d4-829f-478a-b48e-69985e0d903e",
"name": "If Fit Score Above Three",
"type": "n8n-nodes-base.if",
"position": [
-304,
96
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "cond-score-gte-4",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.output.score }}",
"rightValue": 4
}
]
}
},
"typeVersion": 2.2
},
{
"id": "81b2c207-0f37-4485-af4e-360a359657c5",
"name": "Generate Broker Message",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
80,
-192
],
"parameters": {
"text": "=Title: {{ $(\"Loop Over Listings\").item.json.title }}\nIndustry: {{ $(\"Loop Over Listings\").item.json.industry }}\nLocation: {{ $(\"Loop Over Listings\").item.json.location }}\nBroker: {{ $(\"Loop Over Listings\").item.json.brokerName }}\nAsking: {{ $(\"Loop Over Listings\").item.json.askingPrice }}\nRevenue: {{ $(\"Loop Over Listings\").item.json.revenue }}\nSDE: {{ $(\"Loop Over Listings\").item.json.sde }}\nYear Established: {{ $(\"Loop Over Listings\").item.json.yearEstablished }}\nEmployees: {{ $(\"Loop Over Listings\").item.json.numberOfEmployees }}\nLink: {{ $(\"Loop Over Listings\").item.json.link }}\nBuyer fit score: {{ $(\"Score with Claude\").item.json.output.score }}/5 ({{ $(\"Score with Claude\").item.json.output.confidence }} confidence)\nScore rationale: {{ $(\"Score with Claude\").item.json.output.rationale }}\nFull description: {{ $(\"Loop Over Listings\").item.json.description }}",
"options": {
"systemMessage": "=You are an acquisition analyst drafting an outreach message to a business broker on behalf of a self-funded searcher who is interested in a listed business.\n\n=== BUY BOX ===\n{{ $('Define Buy Box').item.json.buyBox }}\n=== END BUY BOX ===\n\n=== YOUR TASK ===\nDraft a 3\u20135 sentence broker outreach message. The message must be:\n- Conversational and direct, like a serious buyer (not breathless, not overly formal)\n- Specific to THIS listing \u2014 reference at least one concrete fact, number, or phrase from the description that proves you read it\n- MUST include one substantive question that demonstrates real engagement (about financials, customer mix, operations, transition, etc. \u2014 not a generic 'tell me more')\n- Ends with '[Your name]' as a placeholder for the searcher's signature\n\nTone: treat the broker as a peer. Signal serious-buyer behavior through specificity, not enthusiasm.\n\n=== OUTPUT RULES ===\n- The 'brokerMessage' field in your output JSON must contain ONLY the message text \u2014 starting with 'Hi {broker first name},' if a Broker name is provided (e.g. 'Hi Kenneth,'), otherwise 'Hi [Broker name],' as placeholder\n- End with '[Your name]'\n- NO preamble, NO commentary, NO subject line, NO explanation before or after\n- NO Markdown formatting, code blocks, headings, or quote blocks \u2014 plain text only, paste-ready\n- 3\u20135 sentences total in the body of the message"
},
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 3.1
},
{
"id": "b6923206-4f72-4ab6-95ca-973e30f0a576",
"name": "Anthropic Chat Model for Outreach",
"type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
"position": [
48,
0
],
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "claude-sonnet-4-6",
"cachedResultName": "Claude Sonnet 4.6"
},
"options": {
"temperature": 0.7
}
},
"credentials": {
"anthropicApi": {
"name": "<your credential>"
}
},
"typeVersion": 1.5
},
{
"id": "69c5da3d-3d4e-4b2a-9a84-39d7b172c42f",
"name": "Broker Message Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
256,
0
],
"parameters": {
"jsonSchemaExample": "{\"brokerMessage\":\"Hi Kenneth, I came across the listing in Austin and the recurring commercial maintenance contracts caught my eye. Could you share the customer concentration? Thanks, [Your name]\"}"
},
"typeVersion": 1.3
},
{
"id": "877bf2a6-9eb8-4f53-8e0e-71d3e72f8ba1",
"name": "Append Green Score to Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
512,
64
],
"parameters": {
"columns": {
"value": {
"SDE": "={{ $(\"Loop Over Listings\").item.json.sde }}",
"Link": "={{ $(\"Loop Over Listings\").item.json.link }}",
"Stage": "New",
"Title": "={{ $(\"Loop Over Listings\").item.json.title }}",
"Source": "={{ $(\"Loop Over Listings\").item.json.source }}",
"Keyword": "={{ $(\"Define Buy Box\").item.json.keyword }}",
"Revenue": "={{ $(\"Loop Over Listings\").item.json.revenue }}",
"Location": "={{ $(\"Loop Over Listings\").item.json.location }}",
"Fit Score": "={{ $(\"Score with Claude\").item.json.output.score }}",
"First Seen": "={{ $now.toISO() }}",
"Listed Date": "={{ $(\"Loop Over Listings\").item.json.listedDate }}",
"Asking Price": "={{ $(\"Loop Over Listings\").item.json.askingPrice }}",
"Fit Rationale": "={{ $(\"Score with Claude\").item.json.output.rationale }}",
"SDE Estimated": "={{ $(\"Loop Over Listings\").item.json.sdeEstimated }}",
"Broker Message": "={{ $(\"Generate Broker Message\").item.json.output.brokerMessage }}",
"Fit Confidence": "={{ $(\"Score with Claude\").item.json.output.confidence }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEET_ID",
"cachedResultName": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "762ab1ae-3528-4b0a-8d93-c53c52e60765",
"name": "Build Slack Blocks",
"type": "n8n-nodes-base.code",
"position": [
736,
64
],
"parameters": {
"jsCode": "const out = [];\nfor (const item of $input.all()) {\n const listing = $('Loop Over Listings').item.json || {};\n const scoreCtx = ($('Score with Claude').item.json || {}).output || {};\n const brokerCtx = ($('Generate Broker Message').item.json || {}).output || {};\n const broker = (brokerCtx.brokerMessage || '[no broker message generated]').trim();\n\n const fmtUSD = (n) => (typeof n === 'number' && n > 0) ? '$' + n.toLocaleString('en-US') : '\u2014';\n const score = scoreCtx.score || 0;\n const conf = scoreCtx.confidence || 'low';\n const rationale = scoreCtx.rationale || '';\n const scoreEmoji = score >= 4 ? ':large_green_circle:' : ':large_yellow_circle:';\n\n const buyBoxJson = (($('Define Buy Box').first() || {}).json) || {};\n const keyword = buyBoxJson.keyword || 'deal';\n\n const title = listing.title || 'Listing';\n const titleLink = listing.link ? ('<' + listing.link + '|' + title + '>') : title;\n\n const stats = '*Asking:* ' + fmtUSD(listing.askingPrice) + ' | *Revenue:* ' + fmtUSD(listing.revenue) + ' | *SDE:* ' + fmtUSD(listing.sde) + (listing.sdeEstimated ? ' _(est.)_' : '');\n\n const slackText = scoreEmoji + ' *Score ' + score + '/5 (' + conf + ' confidence) \u2014 ' + keyword + '*\\n'\n + '_' + rationale + '_\\n\\n'\n + '*' + titleLink + '*\\n'\n + ':round_pushpin: ' + (listing.location || '') + '\\n\\n'\n + stats + '\\n\\n'\n + '*Drafted broker outreach \u2014 hover the code block, click the copy icon:*\\n'\n + '```' + broker + '```';\n\n out.push({ json: { brokerMessage: broker, slackText } });\n}\nreturn out;"
},
"typeVersion": 2
},
{
"id": "334481ff-d20f-4338-a8a7-ce9d0f428c8e",
"name": "Send Deal Alert to Slack",
"type": "n8n-nodes-base.slack",
"position": [
944,
320
],
"parameters": {
"text": "={{ $json.slackText }}",
"user": {
"__rl": true,
"mode": "list",
"value": "YOUR_SLACK_USER_OR_CHANNEL_ID",
"cachedResultName": ""
},
"select": "user",
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "edfdbfe4-5b9c-49a5-9e43-fe297cfd4587",
"name": "Loop Over Listings",
"type": "n8n-nodes-base.splitInBatches",
"position": [
-1520,
112
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "179ca5a9-b534-4d9f-ba96-73734944415a",
"name": "Append Low Score to Sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
112,
320
],
"parameters": {
"columns": {
"value": {
"SDE": "={{ $(\"Loop Over Listings\").item.json.sde }}",
"Link": "={{ $(\"Loop Over Listings\").item.json.link }}",
"Stage": "New",
"Title": "={{ $(\"Loop Over Listings\").item.json.title }}",
"Source": "={{ $(\"Loop Over Listings\").item.json.source }}",
"Keyword": "={{ $(\"Define Buy Box\").item.json.keyword }}",
"Revenue": "={{ $(\"Loop Over Listings\").item.json.revenue }}",
"Location": "={{ $(\"Loop Over Listings\").item.json.location }}",
"Fit Score": "={{ $(\"Score with Claude\").item.json.output.score }}",
"First Seen": "={{ $now.toISO() }}",
"Listed Date": "={{ $(\"Loop Over Listings\").item.json.listedDate }}",
"Asking Price": "={{ $(\"Loop Over Listings\").item.json.askingPrice }}",
"Fit Rationale": "={{ $(\"Score with Claude\").item.json.output.rationale }}",
"SDE Estimated": "={{ $(\"Loop Over Listings\").item.json.sdeEstimated }}",
"Broker Message": "",
"Fit Confidence": "={{ $(\"Score with Claude\").item.json.output.confidence }}"
},
"schema": [],
"mappingMode": "defineBelow",
"matchingColumns": []
},
"options": {},
"operation": "append",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "gid=0",
"cachedResultName": "Sheet1"
},
"documentId": {
"__rl": true,
"mode": "list",
"value": "YOUR_GOOGLE_SHEET_ID",
"cachedResultName": ""
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 4.5
},
{
"id": "48374109-ff7d-4d01-9df1-eca2c2c4051b",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2432,
80
],
"parameters": {
"width": 416,
"height": 256,
"content": "### Edit these"
},
"typeVersion": 1
},
{
"id": "323165dc-862d-42ea-9c3b-af80331ac5a1",
"name": "Define Buy Box",
"type": "n8n-nodes-base.set",
"position": [
-2384,
144
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "6aa1788b-7e89-4fa8-8dd7-a6d4fdc61673",
"name": "buyBox",
"type": "string",
"value": "==== BUY BOX ===\n\n(CONFIGURE THIS \u2014 replace the example below with a few paragraphs about who you are and what you are looking for)\n\nI am a [self-funded / sponsored / part-time] searcher based in [YOUR CITY, STATE], looking to acquire a [INDUSTRY] business. My background is [RELEVANT EXPERIENCE], and I have [RELEVANT OPERATING CONTEXT].\n\nI am [full-time / part-time] on the search and plan to close within [TIMELINE]. Target deal size: [SDE RANGE], asking price [ASKING RANGE], [EBITDA MARGIN MINIMUM]+ margins, [RECURRING REVENUE / CUSTOMER MIX REQUIREMENTS], [YEARS IN BUSINESS MINIMUM]+ years in business, owner-operator transitioning out.\n\nVerticals I want: [LIST INDUSTRIES YOU'D ACQUIRE IN].\n\nVerticals I avoid: [LIST WHAT YOU WON'T BUY AND WHY].\n\nStrategy: [HOLD AND OPERATE / ROLL-UP / FLIP].\n\nGeography: [REGIONS YOU'LL OPERATE IN].\n\n=== END BUY BOX ==="
},
{
"id": "b2c3d4e5-1111-2222-3333-444455556601",
"name": "keyword",
"type": "string",
"value": "Manufacturing"
},
{
"id": "b2c3d4e5-1111-2222-3333-444455556602",
"name": "cashFlowMin",
"type": "number",
"value": 100000
},
{
"id": "b2c3d4e5-1111-2222-3333-444455556603",
"name": "priceMax",
"type": "number",
"value": 5000000
},
{
"id": "b2c3d4e5-1111-2222-3333-444455556604",
"name": "listingAgeDays",
"type": "number",
"value": 90
}
]
}
},
"typeVersion": 3.4
},
{
"id": "a7751f36-5005-4f45-87de-f6a3b5898cf4",
"name": "Sort & Take Top 100",
"type": "n8n-nodes-base.code",
"position": [
-1744,
144
],
"parameters": {
"jsCode": "const items = $input.all();\nconst ranked = items\n .map(item => ({ json: item.json, _rank: (item.json.sde || 0) }))\n .sort((a, b) => b._rank - a._rank)\n .slice(0, 100)\n .map(({ json }) => ({ json }));\nreturn ranked;"
},
"typeVersion": 2
}
],
"active": false,
"settings": {
"binaryMode": "separate",
"callerPolicy": "workflowsFromSameOwner",
"timeSavedMode": "fixed",
"availableInMCP": true,
"executionOrder": "v1",
"executionTimeout": 300,
"timeSavedPerExecution": 30
},
"versionId": "70520d17-8a0a-4ed5-a7e9-38418b97ed0c",
"connections": {
"Define Buy Box": {
"main": [
[
{
"node": "Scrape BizQuest",
"type": "main",
"index": 0
}
]
]
},
"If Link Is New": {
"main": [
[
{
"node": "Score with Claude",
"type": "main",
"index": 0
}
],
[
{
"node": "Loop Over Listings",
"type": "main",
"index": 0
}
]
]
},
"Scrape BizQuest": {
"main": [
[
{
"node": "Normalize BizQuest",
"type": "main",
"index": 0
}
]
]
},
"Score with Claude": {
"main": [
[
{
"node": "If Fit Score Above Three",
"type": "main",
"index": 0
}
]
]
},
"Build Slack Blocks": {
"main": [
[
{
"node": "Send Deal Alert to Slack",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Listings": {
"main": [
[],
[
{
"node": "Look Up Link in Sheets",
"type": "main",
"index": 0
}
]
]
},
"Normalize BizQuest": {
"main": [
[
{
"node": "Sort & Take Top 100",
"type": "main",
"index": 0
}
]
]
},
"Sort & Take Top 100": {
"main": [
[
{
"node": "Loop Over Listings",
"type": "main",
"index": 0
}
]
]
},
"Anthropic Chat Model": {
"ai_languageModel": [
[
{
"node": "Score with Claude",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Look Up Link in Sheets": {
"main": [
[
{
"node": "If Link Is New",
"type": "main",
"index": 0
}
]
]
},
"Generate Broker Message": {
"main": [
[
{
"node": "Append Green Score to Sheet",
"type": "main",
"index": 0
}
]
]
},
"If Fit Score Above Three": {
"main": [
[
{
"node": "Generate Broker Message",
"type": "main",
"index": 0
}
],
[
{
"node": "Append Low Score to Sheet",
"type": "main",
"index": 0
}
]
]
},
"Send Deal Alert to Slack": {
"main": [
[
{
"node": "Loop Over Listings",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "Score with Claude",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"Append Low Score to Sheet": {
"main": [
[
{
"node": "Loop Over Listings",
"type": "main",
"index": 0
}
]
]
},
"Append Green Score to Sheet": {
"main": [
[
{
"node": "Build Slack Blocks",
"type": "main",
"index": 0
}
]
]
},
"Broker Message Output Parser": {
"ai_outputParser": [
[
{
"node": "Generate Broker Message",
"type": "ai_outputParser",
"index": 0
}
]
]
},
"When Schedule Triggers Daily": {
"main": [
[
{
"node": "Define Buy Box",
"type": "main",
"index": 0
}
]
]
},
"Anthropic Chat Model for Outreach": {
"ai_languageModel": [
[
{
"node": "Generate Broker Message",
"type": "ai_languageModel",
"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.
anthropicApigoogleSheetsOAuth2ApislackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This scheduled workflow scrapes BizQuest listings via an Apify API, deduplicates them against a Google Sheet, scores buyer fit with Anthropic Claude, and for high-fit deals generates broker outreach copy and sends a formatted alert to Slack while logging all scored listings to…
Source: https://n8n.io/workflows/16056/ — 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.
**Content engine that ships fresh, SEO-ready articles every single day. **
Created by: Peyton Leveillee Last updated: October 2025
Fully automates your service order pipeline from incoming booking to supplier confirmation — with built-in SLA enforcement and automatic escalation if a supplier goes silent. 📥 Receives orders via web
📺 Full walkthrough video: https://youtu.be/03mZE9tvELU
This workflow automates end-to-end ESG (Environmental, Social, and Governance) sustainability reporting for enterprise sustainability teams, compliance officers, and green governance leads. It solves