This workflow corresponds to n8n.io template #6463 — we link there as the canonical source.
This workflow follows the Airtable → 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 →
{
"id": "53Zi0qKV30N2PZq9",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Weekly Slack Sales Report (Airtable Edition)",
"tags": [],
"nodes": [
{
"id": "2488c731-3008-4f49-b7a6-e7ef45007927",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-272
],
"parameters": {
"width": 448,
"height": 672,
"content": "## \ud83d\udce9 Weekly Slack Sales Report Automation\n\nSends a weekly pipeline summary to Slack with real sales metrics like open deals, top deal, win rate, weighted pipeline, and total revenue closed.\n\n\ud83d\udc64 Who It\u2019s For\n\nSales managers, founders, and revenue teams who want automatic visibility into deal momentum without checking the CRM.\n\n\u2699\ufe0f How to Set Up\n\t1.\tConnect Airtable and Slack accounts.\n\t2.\tDuplicate this workflow in n8n.\n\t3.\tSet Airtable table + Slack channel in the respective nodes.\n\t4.\tSchedule to run weekly (or trigger manually).\n\n\u2705 Requirements\n\t\u2022\tAirtable sales pipeline table (with \u201cStatus\u201d and \u201cValue\u201d fields)\n\t\u2022\tSlack workspace with webhook or token access\n\t\u2022\tn8n cloud or self-hosted instance\n\n\ud83c\udfa8 How to Customize\n\t\u2022\tChange the Slack formatting to match your brand voice\n\t\u2022\tAdd fields like \u201cDeal Owner\u201d or \u201cClose Date\u201d if needed\n\t\u2022\tModify weighting in Code node if your pipeline uses different stages\n\n**Need Help?**\n\nJoin the [Discord](https://discord.com/invite/XPKeKXeB7d) or ask in the [Forum](https://community.n8n.io/)."
},
"typeVersion": 1
},
{
"id": "9cd0f108-3e28-4039-a8a3-b9bf37a28e53",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-16,
-608
],
"parameters": {
"color": 7,
"width": 624,
"height": 304,
"content": "Workflow Breakdown\n\t1.\tSearch Airtable for deals marked \u201cWon\u201d\n\t2.\tSearch Airtable again for all other open deals\n\t3.\tMerge results into one array\n\t4.\tSplit & summarize in Code Node 1: format Slack message with open/won stats\n\t5.\tDeeper metrics in Code Node 2: weighted pipeline, total revenue\n\t6.\tSend final message to Slack"
},
"typeVersion": 1
},
{
"id": "3d418639-c107-4ee7-b461-6a492f835c92",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
144,
112
],
"parameters": {
"rule": {
"interval": [
{
"field": "weeks",
"triggerAtDay": [
1
],
"triggerAtHour": 9
}
]
}
},
"typeVersion": 1.2
},
{
"id": "6a5fed72-ce8f-41bf-9f26-be81c5011394",
"name": "Search Open Deals",
"type": "n8n-nodes-base.airtable",
"position": [
656,
-80
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appGid2SnQKDjgdhy",
"cachedResultUrl": "https://airtable.com/appGid2SnQKDjgdhy",
"cachedResultName": "Airtable to Slack Weekly Report"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblQq0yUYA7dIZxUr",
"cachedResultUrl": "https://airtable.com/appGid2SnQKDjgdhy/tblQq0yUYA7dIZxUr",
"cachedResultName": "Deals"
},
"options": {},
"operation": "search",
"filterByFormula": "=OR(\n {Status} = \"Qualified\",\n {Status} = \"Proposal Sent\",\n {Status} = \"Negotiation\"\n)"
},
"typeVersion": 2.1
},
{
"id": "a52e60df-e378-40c0-be0a-c3512661b452",
"name": "Search Won Deals",
"type": "n8n-nodes-base.airtable",
"position": [
656,
432
],
"parameters": {
"base": {
"__rl": true,
"mode": "list",
"value": "appGid2SnQKDjgdhy",
"cachedResultUrl": "https://airtable.com/appGid2SnQKDjgdhy",
"cachedResultName": "Airtable to Slack Weekly Report"
},
"table": {
"__rl": true,
"mode": "list",
"value": "tblQq0yUYA7dIZxUr",
"cachedResultUrl": "https://airtable.com/appGid2SnQKDjgdhy/tblQq0yUYA7dIZxUr",
"cachedResultName": "Deals"
},
"options": {},
"operation": "search",
"filterByFormula": "={Status} = \"Won\""
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "49091bc3-1815-407f-bb1e-79a3c0413171",
"name": "Merge Deals",
"type": "n8n-nodes-base.merge",
"position": [
1088,
112
],
"parameters": {},
"typeVersion": 3.2
},
{
"id": "179a3e43-8f0e-4f93-ad58-8f5a8f8b07db",
"name": "Slack Message Summary",
"type": "n8n-nodes-base.code",
"position": [
1296,
112
],
"parameters": {
"jsCode": "// Split input: open deals and closed deals\nconst openDeals = items.filter(item => item.json['Status'] !== 'Won' && item.json['Status'] !== 'Lost');\nconst closedDeals = items.filter(item => item.json['Status'] === 'Won');\n\n// Metrics\nconst pipelineValue = openDeals.reduce((sum, d) => sum + Number(d.json['Value'] || 0), 0);\nconst topDeal = openDeals.sort((a, b) => b.json['Value'] - a.json['Value'])[0];\nconst winRate = closedDeals.length + openDeals.length > 0\n ? (closedDeals.length / (closedDeals.length + openDeals.length)) * 100\n : 0;\n\n// Format\nreturn [\n {\n json: {\n openDeals,\n closedDeals,\n summary: `\ud83d\udcca *Weekly Pipeline Report*`,\n value: `\u2022 Open Deals: *${openDeals.length}* \n\u2022 Pipeline Value: *\u00a3${pipelineValue.toLocaleString()}* \n\u2022 Top Deal: *${topDeal?.json['Deal Name']}* \u2013 \u00a3${topDeal?.json['Value']} \n\u2022 Win Rate: *${winRate.toFixed(1)}%*`\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "7b1c11c7-43ea-4825-94f0-286c8e89a453",
"name": "Advanced Metrics",
"type": "n8n-nodes-base.code",
"position": [
1504,
112
],
"parameters": {
"jsCode": "const openDeals = items[0].json.openDeals;\nconst closedDeals = items[0].json.closedDeals;\n\n// Extract field helper\nconst getField = (record, field) => record.json?.[field] ?? null;\n\nconst totalPipeline = openDeals.reduce((sum, record) => {\n return sum + (parseFloat(getField(record, 'Value')) || 0);\n}, 0);\n\nconst weightedPipeline = openDeals.reduce((sum, record) => {\n const stage = getField(record, 'Stage');\n const value = parseFloat(getField(record, 'Value')) || 0;\n\n const stageWeights = {\n 'Qualified': 0.2,\n 'Proposal Sent': 0.4,\n 'Negotiation': 0.6,\n 'Won': 1,\n 'Lost': 0\n };\n\n const weight = stageWeights[stage] || 0.2;\n return sum + (value * weight);\n}, 0);\n\nconst totalClosed = closedDeals.reduce((sum, record) => {\n return sum + (parseFloat(getField(record, 'Value')) || 0);\n}, 0);\n\nconst winRate = openDeals.length + closedDeals.length > 0\n ? ((closedDeals.length / (openDeals.length + closedDeals.length)) * 100).toFixed(1)\n : 'N/A';\n\nreturn [\n {\n json: {\n totalPipeline: `\u00a3${totalPipeline.toLocaleString()}`,\n weightedPipeline: `\u00a3${weightedPipeline.toLocaleString()}`,\n totalClosed: `\u00a3${totalClosed.toLocaleString()}`,\n winRate: `${winRate}%`,\n openDealsCount: openDeals.length,\n closedDealsCount: closedDeals.length\n }\n }\n];"
},
"typeVersion": 2
},
{
"id": "a3740fd8-0e24-4581-a156-006ffe33b40b",
"name": "Slack Message",
"type": "n8n-nodes-base.slack",
"position": [
1904,
112
],
"parameters": {
"text": "=\ud83d\udcca *Weekly Sales Report* \u2022 \ud83e\uddee *Total Pipeline:* {{ $json.totalPipeline }} \u2022 \u2696\ufe0f *Weighted Pipeline:* {{ $json.weightedPipeline }} \u2022 \ud83c\udfc6 *Total Closed (All Time):* {{ $json.totalClosed }} \u2022 \ud83d\udcc8 *Win Rate:* {{ $json.winRate }} \u2022 \ud83d\udd04 *Open Deals:* {{ $json.openDealsCount }} \u2022 \u2705 *Closed Deals:* {{ $json.closedDealsCount }} _This report was generated automatically using n8n._",
"user": {
"__rl": true,
"mode": "list",
"value": "U096VCG525P",
"cachedResultName": "james"
},
"select": "user",
"otherOptions": {},
"authentication": "oAuth2"
},
"credentials": {
"slackOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 2.3
},
{
"id": "8349a72d-1430-42d3-adde-06a577cb9f3c",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
224
],
"parameters": {
"color": 7,
"width": 416,
"height": 416,
"content": "## Search Open Deals\n[Read more about Airtable node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.airtable/)\n\nThis node fetches all remaining records in the pipeline that are still active (i.e. any Status that isn\u2019t \u201cWon\u201d). These open deals are used to compute total pipeline value, top open deal, and other forward-looking metrics.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "9df9bf18-cc92-4711-b0a8-1b6c7bf94574",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
496,
-272
],
"parameters": {
"color": 7,
"width": 416,
"height": 416,
"content": "## Search Won Deals\n[Read more about the Airtable node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.airtable/)\n\nThis node queries the Airtable deal table for all records where Status is set to \u201cWon\u201d. It returns only the successfully closed deals so the report can calculate win rate and total closed revenue.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "593619f0-bd06-436c-9203-096a6eef52b5",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1760,
-80
],
"parameters": {
"color": 7,
"width": 416,
"height": 416,
"content": "## Send Slack Message\n[Read more about the Slack node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/)\n\nThis node takes the formatted message and posts it to the designated Slack channel. It uses the output from both code nodes to send a single message with all the key sales metrics, helping the team stay aligned on pipeline status.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "0c21cce2-a383-424c-9018-9c04b37b3fd7",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
992,
-80
],
"parameters": {
"color": 7,
"width": 688,
"height": 416,
"content": "## Process & Format Metrics\n[Read more about the Code node](https://www.google.com/search?client=safari&rls=en&q=code+node+n8n&ie=UTF-8&oe=UTF-8)\n\n[Read more about the Merge node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.merge/)\n\nMerges both datasets, splits open vs won deals, calculates total pipeline, weighted pipeline based on stage probabilities, top deal, closed revenue, and win rate, then formats everything into a clean message for Slack.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
},
"typeVersion": 1
},
{
"id": "aebcfa3e-9587-403e-b4f7-0e9c7088fbc5",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
-80
],
"parameters": {
"color": 7,
"width": 416,
"height": 416,
"content": "## Schedule Trigger\n[Read more about Calendly Credentials](https://docs.n8n.io/integrations/builtin/credentials/calendly/)\n\nTriggers the workflow on a recurring schedule. You can set it to run as often as you like.\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "268480a9-a2d7-414d-8efc-d0c716dbbfdb",
"connections": {
"Merge Deals": {
"main": [
[
{
"node": "Slack Message Summary",
"type": "main",
"index": 0
}
]
]
},
"Advanced Metrics": {
"main": [
[
{
"node": "Slack Message",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Search Open Deals",
"type": "main",
"index": 0
},
{
"node": "Search Won Deals",
"type": "main",
"index": 0
}
]
]
},
"Search Won Deals": {
"main": [
[
{
"node": "Merge Deals",
"type": "main",
"index": 1
}
]
]
},
"Search Open Deals": {
"main": [
[
{
"node": "Merge Deals",
"type": "main",
"index": 0
}
]
]
},
"Slack Message Summary": {
"main": [
[
{
"node": "Advanced Metrics",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
airtableTokenApislackOAuth2Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
A schedule trigger starts the workflow (e.g., every Monday). It fetches deal data from Airtable, splits open vs closed deals, calculates all metrics with JavaScript, and formats the output. The message is then sent to Slack using Markdown for readability.
Source: https://n8n.io/workflows/6463/ — 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 weekly workflow automatically identifies new ranked keywords for your domain within Google’s top 10 results without manual SERP monitoring. On each run, the workflow fetches the latest ranking an
This workflow automatically analyzes sales data by product category, compares performance across time periods (daily, weekly or monthly), stores structured results in Airtable and sends a clear summar
This workflow exports every table in a base as its own CSV, saves the files in a time-stamped folder in Amazon S3, pings you on Slack, and optionally prunes older copies. You get an automated weekly b
This template provides a fully automated system for monitoring news on any topic you choose. It leverages Linkup's AI-powered web search to find recent, relevant articles, extracts key information lik