Wöchentlicher Slack-Verkaufsbericht (Airtable-Version)

Fortgeschritten

Dies ist ein CRM-Bereich Automatisierungsworkflow mit 14 Nodes. Hauptsächlich werden Code, Merge, Slack, Airtable, ScheduleTrigger und andere Nodes verwendet. Verwenden Sie Airtable, um dynamische Verkaufsrohrmetriken für Slack zu generieren

Voraussetzungen
  • Slack Bot Token oder Webhook URL
  • Airtable API Key
Workflow-Vorschau
Visualisierung der Node-Verbindungen, mit Zoom und Pan
Workflow exportieren
Kopieren Sie die folgende JSON-Konfiguration und importieren Sie sie in n8n
{
  "id": "53Zi0qKV30N2PZq9",
  "meta": {
    "instanceId": "e854ccd1d846d48f876ea4ce7613a148e39ed800c748cb59061b490defde7afd",
    "templateCredsSetupCompleted": true
  },
  "name": "Weekly Slack Sales Report (Airtable Edition)",
  "tags": [],
  "nodes": [
    {
      "id": "2488c731-3008-4f49-b7a6-e7ef45007927",
      "name": "Notiz",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        -272
      ],
      "parameters": {
        "width": 448,
        "height": 672,
        "content": "## 📩 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👤 Who It’s For\n\nSales managers, founders, and revenue teams who want automatic visibility into deal momentum without checking the CRM.\n\n⚙️ 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✅ Requirements\n\t•\tAirtable sales pipeline table (with “Status” and “Value” fields)\n\t•\tSlack workspace with webhook or token access\n\t•\tn8n cloud or self-hosted instance\n\n🎨 How to Customize\n\t•\tChange the Slack formatting to match your brand voice\n\t•\tAdd fields like “Deal Owner” or “Close Date” if needed\n\t•\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": "Notiz1",
      "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 “Won”\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": "Zeitplan-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": "Offene Deals suchen",
      "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": "Gewonnene Deals suchen",
      "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": {
          "id": "TYjnodYUe5IcQGV2",
          "name": "Airtable Personal Access Token account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "49091bc3-1815-407f-bb1e-79a3c0413171",
      "name": "Deals zusammenführen",
      "type": "n8n-nodes-base.merge",
      "position": [
        1088,
        112
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "179a3e43-8f0e-4f93-ad58-8f5a8f8b07db",
      "name": "Slack Nachrichtenzusammenfassung",
      "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: `📊 *Weekly Pipeline Report*`,\n      value: `• Open Deals: *${openDeals.length}*  \n• Pipeline Value: *£${pipelineValue.toLocaleString()}*  \n• Top Deal: *${topDeal?.json['Deal Name']}* – £${topDeal?.json['Value']}  \n• Win Rate: *${winRate.toFixed(1)}%*`\n    }\n  }\n];"
      },
      "typeVersion": 2
    },
    {
      "id": "7b1c11c7-43ea-4825-94f0-286c8e89a453",
      "name": "Erweiterte Metriken",
      "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: `£${totalPipeline.toLocaleString()}`,\n      weightedPipeline: `£${weightedPipeline.toLocaleString()}`,\n      totalClosed: `£${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 Nachricht",
      "type": "n8n-nodes-base.slack",
      "position": [
        1904,
        112
      ],
      "webhookId": "8c2a1c87-c10d-4c14-b4c9-c31474da3b95",
      "parameters": {
        "text": "=📊 *Weekly Sales Report*  • 🧮 *Total Pipeline:* {{ $json.totalPipeline }} • ⚖️ *Weighted Pipeline:* {{ $json.weightedPipeline }} • 🏆 *Total Closed (All Time):* {{ $json.totalClosed }} • 📈 *Win Rate:* {{ $json.winRate }}  • 🔄 *Open Deals:* {{ $json.openDealsCount }} • ✅ *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": {
          "id": "edcCpymx9IvKgibG",
          "name": "Slack account"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "8349a72d-1430-42d3-adde-06a577cb9f3c",
      "name": "Notiz3",
      "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’t “Won”). 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": "Notiz4",
      "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 “Won”. 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": "Notiz5",
      "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": "Notiz6",
      "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": "Notiz7",
      "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,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "268480a9-a2d7-414d-8efc-d0c716dbbfdb",
  "connections": {
    "49091bc3-1815-407f-bb1e-79a3c0413171": {
      "main": [
        [
          {
            "node": "179a3e43-8f0e-4f93-ad58-8f5a8f8b07db",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7b1c11c7-43ea-4825-94f0-286c8e89a453": {
      "main": [
        [
          {
            "node": "a3740fd8-0e24-4581-a156-006ffe33b40b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3d418639-c107-4ee7-b461-6a492f835c92": {
      "main": [
        [
          {
            "node": "6a5fed72-ce8f-41bf-9f26-be81c5011394",
            "type": "main",
            "index": 0
          },
          {
            "node": "a52e60df-e378-40c0-be0a-c3512661b452",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a52e60df-e378-40c0-be0a-c3512661b452": {
      "main": [
        [
          {
            "node": "49091bc3-1815-407f-bb1e-79a3c0413171",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "6a5fed72-ce8f-41bf-9f26-be81c5011394": {
      "main": [
        [
          {
            "node": "49091bc3-1815-407f-bb1e-79a3c0413171",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "179a3e43-8f0e-4f93-ad58-8f5a8f8b07db": {
      "main": [
        [
          {
            "node": "7b1c11c7-43ea-4825-94f0-286c8e89a453",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Häufig gestellte Fragen

Wie verwende ich diesen Workflow?

Kopieren Sie den obigen JSON-Code, erstellen Sie einen neuen Workflow in Ihrer n8n-Instanz und wählen Sie "Aus JSON importieren". Fügen Sie die Konfiguration ein und passen Sie die Anmeldedaten nach Bedarf an.

Für welche Szenarien ist dieser Workflow geeignet?

Fortgeschritten - Kundenbeziehungsmanagement

Ist es kostenpflichtig?

Dieser Workflow ist völlig kostenlos. Beachten Sie jedoch, dass Drittanbieterdienste (wie OpenAI API), die im Workflow verwendet werden, möglicherweise kostenpflichtig sind.

Workflow-Informationen
Schwierigkeitsgrad
Fortgeschritten
Anzahl der Nodes14
Kategorie1
Node-Typen6
Schwierigkeitsbeschreibung

Für erfahrene Benutzer, mittelkomplexe Workflows mit 6-15 Nodes

Autor
James Carter

James Carter

@arioloop

Automation engineer | 10+ years streamlining Sales & Marketing. Use my link to book an initial consultation for custom n8n work.

Externe Links
Auf n8n.io ansehen

Diesen Workflow teilen

Kategorien

Kategorien: 34