This workflow follows the Agent → OpenAI Chat 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": "Build an AI sales research agent with Bounce Watch and Slack",
"nodes": [
{
"parameters": {
"width": 520,
"height": 980,
"content": "## Build an AI sales research agent with Bounce Watch and Slack\n\nBounce Watch tells you what just happened at a company and when - funding rounds, senior hires, new offices, customer wins and partnerships, each carrying its own date. What the API covers: bouncewatch.com/products/data-enrichment-api\n\nA weekly list of every company that moved is too long to read. This workflow hands that list to an agent, lets it dig into the ones worth digging into, and posts a short briefing your team will actually read on Monday morning.\n\n### How it works\n\nEvery Monday the workflow asks Bounce Watch for the companies that produced a signal in the last week. The agent receives that list and has two Bounce Watch tools of its own: one returns a company profile, the other returns that company's dated history. It decides which companies deserve the extra lookup, then writes one paragraph per account and posts the result to Slack.\n\nThe system message carries the two rules that matter. Dates are reported as dates, and where a signal records when we measured a change rather than when it happened, the agent says so. It is also told never to read a short signal list as evidence that a company has stopped moving.\n\n### Setup\n\n1. Get an API key at bouncewatch.com/register/api. It is free, no card, and every new account starts with 2,500 credits. Paste it into the Bounce Watch credential on all three Bounce Watch nodes.\n2. Add your OpenAI credential to the model node.\n3. Connect Slack and pick the channel.\n4. Set how many days back to look on the search node, and add a Country Code filter if you want one country."
},
"id": "bwStickyNote",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-380,
-120
]
},
{
"parameters": {
"width": 680,
"height": 300,
"content": "## The week's list\n\nOne call returns every company that moved this week, with its signals nested underneath. Aggregate puts them in a single item so the agent sees the whole set at once.",
"color": 7
},
"id": "bwSection1",
"name": "Section 1",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
150,
-170
]
},
{
"parameters": {
"width": 500,
"height": 300,
"content": "## Tools, not hard-coded steps\n\nThe agent decides which companies need a profile or a full timeline. Only the lookups it actually makes are paid for.",
"color": 7
},
"id": "bwSection2",
"name": "Section 2",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
870,
-170
]
},
{
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 8
}
]
}
},
"id": "bw0201-0000-4000-8000-000000000201",
"name": "Every Monday morning",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.3,
"position": [
220,
0
],
"notes": "Once a week. The briefing is a Monday habit, not a feed."
},
{
"parameters": {
"resource": "signal",
"operation": "search",
"splitSignals": false,
"filters": {
"days": 7,
"limit": 40,
"sort": "most_recent"
}
},
"id": "bw0202-0000-4000-8000-000000000202",
"name": "What moved this week",
"type": "n8n-nodes-bouncewatch.bounceWatch",
"typeVersion": 1,
"position": [
460,
0
],
"credentials": {
"bounceWatchApi": {
"name": "<your credential>"
}
},
"notes": "Set your own country code and window. One item per company."
},
{
"parameters": {
"options": {},
"aggregate": "aggregateAllItemData",
"destinationFieldName": "companies"
},
"id": "bw0203-0000-4000-8000-000000000203",
"name": "Gather the week into one item",
"type": "n8n-nodes-base.aggregate",
"typeVersion": 1,
"position": [
700,
0
],
"notes": "The agent should see the whole set, not one company at a time."
},
{
"parameters": {
"text": "={{ JSON.stringify($json.companies) }}",
"options": {
"systemMessage": "=You are a sales researcher briefing an account team.\n\nBelow are the companies that produced a signal in the last week, each with the signal label and the date it carries. Pick the five that most deserve a rep's time and write one short paragraph on each: what happened, when, and the opening it creates.\n\nUse your tools when a company needs more than the signal line gives you. The profile tool returns headcount, location and founding year. The timeline tool returns that company's dated history.\n\nRules:\n- Report dates as dates. Some signals record the date a change was measured rather than the date it happened; where a signal says so, write \"picked up on\" rather than \"on\".\n- A short signal list is not evidence that a company has stopped moving. It can mean we have not been watching that one closely, not that nothing happened. Never write the second as if it were the first.\n- No preamble, no closing summary. Five paragraphs and nothing else."
},
"promptType": "define"
},
"id": "bw0204-0000-4000-8000-000000000204",
"name": "Write the account briefing",
"type": "@n8n/n8n-nodes-langchain.agent",
"typeVersion": 1.7,
"position": [
940,
0
],
"notes": "The rules about dates and about empty signal lists live in the system message."
},
{
"parameters": {
"model": {
"__rl": true,
"mode": "list",
"value": "gpt-4.1-mini",
"cachedResultName": "gpt-4.1-mini"
},
"options": {}
},
"id": "bw0205-0000-4000-8000-000000000205",
"name": "The model that writes it",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
"typeVersion": 1.3,
"position": [
860,
240
],
"notes": "Any chat model works. A small one is enough for a briefing."
},
{
"parameters": {
"descriptionType": "auto",
"resource": "company",
"operation": "get",
"domain": "={{ $fromAI('domain', 'The company website domain, for example stripe.com', 'string') }}"
},
"id": "bw0206-0000-4000-8000-000000000206",
"name": "Look up a company profile",
"type": "n8n-nodes-bouncewatch.bounceWatchTool",
"typeVersion": 1,
"position": [
1020,
240
],
"credentials": {
"bounceWatchApi": {
"name": "<your credential>"
}
},
"notes": "Headcount, location, founding year. The agent calls it only when it needs it."
},
{
"parameters": {
"descriptionType": "auto",
"resource": "signal",
"operation": "getForCompany",
"domain": "={{ $fromAI('domain', 'The company website domain, for example stripe.com', 'string') }}"
},
"id": "bw0207-0000-4000-8000-000000000207",
"name": "Look up a company timeline",
"type": "n8n-nodes-bouncewatch.bounceWatchTool",
"typeVersion": 1,
"position": [
1180,
240
],
"credentials": {
"bounceWatchApi": {
"name": "<your credential>"
}
},
"notes": "The dated history for one company, when a single signal is not enough context."
},
{
"parameters": {
"select": "channel",
"channelId": {
"__rl": true,
"value": "",
"mode": "name",
"cachedResultName": ""
},
"text": "=*This week's accounts*\n\n{{ $json.output }}",
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"id": "bw0208-0000-4000-8000-000000000208",
"name": "Post the briefing",
"type": "n8n-nodes-base.slack",
"typeVersion": 2.2,
"position": [
1240,
0
],
"notes": "Pick your channel here."
}
],
"connections": {
"Every Monday morning": {
"main": [
[
{
"node": "What moved this week",
"type": "main",
"index": 0
}
]
]
},
"What moved this week": {
"main": [
[
{
"node": "Gather the week into one item",
"type": "main",
"index": 0
}
]
]
},
"Gather the week into one item": {
"main": [
[
{
"node": "Write the account briefing",
"type": "main",
"index": 0
}
]
]
},
"Write the account briefing": {
"main": [
[
{
"node": "Post the briefing",
"type": "main",
"index": 0
}
]
]
},
"The model that writes it": {
"ai_languageModel": [
[
{
"node": "Write the account briefing",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Look up a company profile": {
"ai_tool": [
[
{
"node": "Write the account briefing",
"type": "ai_tool",
"index": 0
}
]
]
},
"Look up a company timeline": {
"ai_tool": [
[
{
"node": "Write the account briefing",
"type": "ai_tool",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": true
}
}
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.
bounceWatchApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Build an AI sales research agent with Bounce Watch and Slack. Uses n8n-nodes-bouncewatch, agent, lmChatOpenAi, slack. Scheduled trigger; 11 nodes.
Source: https://github.com/bouncewatch/n8n-nodes-bouncewatch/blob/main/templates/build-an-ai-sales-research-agent-with-bounce-watch-and-slack.json — 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.
Created by: Peyton Leveillee Last updated: October 2025
This n8n-powered workflow automates the entire lifecycle of real estate lead intake, qualification, routing, assignment, and reporting across multiple channels. It brings WhatsApp inquiries and websit
Runs automatically every Monday morning at 8 AM Collects your Google Search Console from the last month and the month before that for a given url (date range is configurable) Formats the data, aggrega
This workflow automates end-to-end sustainability lifecycle management for corporate sustainability teams, ESG governance officers, and circular economy programme leads. It addresses the challenge of
Marketing, content, and enablement teams that need a quick, human-readable summary of every new video published by the YouTube channels they care about—without leaving Slack.