Nettoyage automatique des transactions inactives de GoHighLevel vers Slack et Sheets
Ceci est unCRMworkflow d'automatisation du domainecontenant 15 nœuds.Utilise principalement des nœuds comme Code, Slack, Filter, HighLevel, GoogleSheets. Nettoyer automatiquement les transactions inactives dans GoHighLevel vers Slack et Sheets
- •Token Bot Slack ou URL Webhook
- •Informations d'identification Google Sheets API
Nœuds utilisés (15)
Catégorie
{
"id": "FpblHtpWHqFmqzwu",
"meta": {
"instanceId": "8443f10082278c46aa5cf3acf8ff0f70061a2c58bce76efac814b16290845177",
"templateCredsSetupCompleted": true
},
"name": "Automate Inactive Deal Cleanup from GoHighLevel to Slack and Sheets",
"tags": [],
"nodes": [
{
"id": "a30f842e-09db-4524-bb2a-f6fb696cd818",
"name": "Description du workflow",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1408,
-96
],
"parameters": {
"color": 4,
"width": 386,
"height": 400,
"content": "## 🎯 Workflow Overview\n\nThis workflow automatically identifies and archives inactive deals in HighLevel CRM pipelines.\n\n**What it does:**\n- Runs daily to check all opportunities\n- Filters deals with no activity for 10+ days\n- Archives inactive deals automatically\n- Logs all actions to Google Sheets\n- Sends summary report to Slack\n\n**Business Value:**\n- Keeps pipelines clean and focused\n- Prevents lost opportunities from cluttering views\n- Maintains audit trail in Google Sheets\n- Team visibility via Slack notifications"
},
"typeVersion": 1
},
{
"id": "0558197c-899a-470f-93b0-131da334b0f7",
"name": "Configuration de la planification",
"type": "n8n-nodes-base.stickyNote",
"position": [
-992,
-400
],
"parameters": {
"width": 282,
"height": 311,
"content": "## ⏰ Schedule Configuration\n\n**Current:** Runs daily at 9 AM\n\n**To modify:**\n1. Click this node\n2. Adjust cron expression\n3. Common patterns:\n - Every 6 hours: `0 */6 * * *`\n - Twice daily: `0 9,17 * * *`\n - Weekdays only: `0 9 * * 1-5`"
},
"typeVersion": 1
},
{
"id": "86b8ca02-40c9-4f1d-8192-8c076eb62bc6",
"name": "Quotidien à 9h",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-800,
-64
],
"parameters": {
"rule": {
"interval": [
{}
]
}
},
"typeVersion": 1.2
},
{
"id": "860e1aca-04f7-4001-a58b-d2fa695da3e1",
"name": "Configuration HighLevel",
"type": "n8n-nodes-base.stickyNote",
"position": [
-688,
112
],
"parameters": {
"width": 264,
"height": 274,
"content": "## 📊 HighLevel Setup\n\n**Required:**\n- OAuth2 credentials configured\n- Location ID in credential settings\n\n**This fetches:**\n- All opportunities from your account\n- Includes contact data\n- No pagination limit issues"
},
"typeVersion": 1
},
{
"id": "9d54a579-e7b9-4d02-a1cd-58f76ebf4c73",
"name": "Récupérer toutes les opportunités",
"type": "n8n-nodes-base.highLevel",
"position": [
-576,
-64
],
"parameters": {
"filters": {},
"resource": "opportunity",
"operation": "getAll",
"requestOptions": {}
},
"credentials": {
"highLevelOAuth2Api": {
"id": "5QWHSi134dLIBEsC",
"name": "HighLevel account"
}
},
"typeVersion": 2
},
{
"id": "6f31695d-a18d-46c1-aa00-3ce68013db10",
"name": "Logique de filtrage",
"type": "n8n-nodes-base.stickyNote",
"position": [
-496,
-384
],
"parameters": {
"width": 262,
"height": 296,
"content": "## 🔍 Inactivity Filter\n\n**Logic:**\n- Calculates days since last activity\n- Uses `last_activity_at` or `updatedAt`\n- Threshold: **10 days**\n\n**To adjust threshold:**\nChange `10` in the rightValue field\n- 7 days = more aggressive\n- 14 days = more lenient"
},
"typeVersion": 1
},
{
"id": "09134267-b553-4979-9be3-d3e74e263b74",
"name": "Filtrer les deals inactifs 10+ jours",
"type": "n8n-nodes-base.filter",
"position": [
-352,
-64
],
"parameters": {
"options": {},
"conditions": {
"options": {
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ Math.floor((new Date() - new Date($json.lastActionDate || $json.updatedAt)) / (1000 * 60 * 60 * 24)) }}",
"rightValue": 10
}
]
}
},
"typeVersion": 2
},
{
"id": "b9dd983f-bbba-4956-85fd-d3813997f27b",
"name": "Configuration de l'archivage",
"type": "n8n-nodes-base.stickyNote",
"position": [
-192,
112
],
"parameters": {
"width": 254,
"height": 264,
"content": "## 📦 Archive Action\n\n**What happens:**\n- Updates opportunity status\n- Marks as archived/closed\n- Preserves all deal data\n\n**Note:** Configure the `status` field in updateFields to match your HighLevel setup (e.g., \"archived\", \"lost\", \"closed\")"
},
"typeVersion": 1
},
{
"id": "dc7991c7-79ad-48a3-b79d-d8359afa4d8c",
"name": "Archiver le deal inactif",
"type": "n8n-nodes-base.highLevel",
"position": [
-128,
-64
],
"parameters": {
"resource": "opportunity",
"operation": "update",
"updateFields": {
"status": "archived"
},
"opportunityId": "={{ $json.id }}",
"requestOptions": {}
},
"credentials": {
"highLevelOAuth2Api": {
"id": "5QWHSi134dLIBEsC",
"name": "HighLevel account"
}
},
"typeVersion": 2
},
{
"id": "7f905180-3a1a-4b6f-b049-438b49d50929",
"name": "Logique de traitement",
"type": "n8n-nodes-base.stickyNote",
"position": [
48,
-288
],
"parameters": {
"width": 256,
"height": 296,
"content": "## 🧮 Data Processing\n\n**Transforms deal data:**\n- Calculates days inactive\n- Extracts contact info\n- Formats for Google Sheets\n- Adds metadata fields\n\n**Output fields:**\nid, name, contactName, daysSinceActivity, monetaryValue, source, tags"
},
"typeVersion": 1
},
{
"id": "7fe4471f-287d-4319-8ab0-02f245d9c8f2",
"name": "Formater les données du deal",
"type": "n8n-nodes-base.code",
"position": [
112,
32
],
"parameters": {
"jsCode": "// Process and format inactive deal data for logging\nconst formattedData = $input.all().map(item => {\n const opp = item.json;\n const lastActivity = new Date(opp.lastActionDate || opp.updatedAt);\n const daysSinceActivity = Math.floor((Date.now() - lastActivity) / (1000 * 60 * 60 * 24));\n \n return {\n json: {\n id: opp.id,\n name: opp.name,\n pipelineId: opp.pipelineId,\n pipelineStageId: opp.pipelineStageId,\n contactId: opp.contactId,\n contactName: opp.contact?.name || 'N/A',\n lastActionDate: opp.lastActionDate,\n updatedAt: opp.updatedAt,\n daysSinceActivity: daysSinceActivity,\n isInactive: daysSinceActivity > 10,\n monetaryValue: opp.monetaryValue || 0,\n source: opp.source || 'Unknown',\n tags: Array.isArray(opp.contact?.tags) ? opp.contact.tags.join(', ') : '',\n archivedAt: new Date().toISOString()\n }\n };\n});\n\nreturn formattedData;"
},
"typeVersion": 2
},
{
"id": "909dfef7-0703-4893-9465-e806445e492e",
"name": "Configuration Sheets",
"type": "n8n-nodes-base.stickyNote",
"position": [
368,
224
],
"parameters": {
"width": 278,
"height": 346,
"content": "## 📋 Google Sheets Setup\n\n**Required:**\n1. Create Google Sheet\n2. Add sheet named \"Inactive Pipeliner\"\n3. Connect OAuth2 credential\n4. Replace documentId below\n\n**Columns auto-created:**\nid, name, contactName, daysSinceActivity, monetaryValue, source, tags, archivedAt"
},
"typeVersion": 1
},
{
"id": "046731cb-c515-4430-ba58-f75b46797401",
"name": "Journaliser dans Google Sheets",
"type": "n8n-nodes-base.googleSheets",
"position": [
400,
64
],
"parameters": {
"columns": {
"value": {},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"required": false,
"displayName": "id",
"defaultMatch": true,
"canBeUsedToMatch": true
},
{
"id": "name",
"type": "string",
"display": true,
"required": false,
"displayName": "name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "contactName",
"type": "string",
"display": true,
"required": false,
"displayName": "contactName",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "daysSinceActivity",
"type": "string",
"display": true,
"required": false,
"displayName": "daysSinceActivity",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "monetaryValue",
"type": "string",
"display": true,
"required": false,
"displayName": "monetaryValue",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "source",
"type": "string",
"display": true,
"required": false,
"displayName": "source",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "tags",
"type": "string",
"display": true,
"required": false,
"displayName": "tags",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "archivedAt",
"type": "string",
"display": true,
"required": false,
"displayName": "archivedAt",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "autoMapInputData",
"matchingColumns": [
"id"
]
},
"options": {},
"operation": "appendOrUpdate",
"sheetName": {
"__rl": true,
"mode": "list",
"value": "Inactive Pipeliner"
},
"documentId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Description').item.json.sheetId }}"
}
},
"credentials": {
"googleSheetsOAuth2Api": {
"id": "kpPEOLCGn963qpoh",
"name": "automations@techdome.ai"
}
},
"typeVersion": 4.7
},
{
"id": "3a9b90d5-901f-4dd8-a118-cf76b3da61f5",
"name": "Configuration Slack",
"type": "n8n-nodes-base.stickyNote",
"position": [
576,
-304
],
"parameters": {
"width": 246,
"height": 328,
"content": "## 💬 Slack Notification\n\n**Setup:**\n1. Connect Slack OAuth2\n2. Select your channel\n3. Remove hardcoded channel ID\n\n**Message includes:**\n- Total archived count\n- Sum of monetary values\n- List of deal names"
},
"typeVersion": 1
},
{
"id": "e1acc249-b80a-4d7d-aa63-b6265b641170",
"name": "Envoyer le rapport Slack",
"type": "n8n-nodes-base.slack",
"position": [
432,
-128
],
"webhookId": "2ee869d2-6132-4bfe-8cd3-53415ad11fce",
"parameters": {
"text": "=:bookmark_tabs: *Inactive Pipeline Cleaner Report*\n\n*Date:* {{ $now.format('MMMM dd, yyyy') }}\n*Total Deals Archived:* {{ $json.count }}\n*Total Monetary Value:* ${{ $json.totalValue.toLocaleString() }}\n\n*Archived Deals:*\n{{ $json.dealsList.split(',').map((deal, idx) => `${idx + 1}. ${deal.trim()}`).join('\\n') }}",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Workflow Description').item.json.slackChannel }}"
},
"otherOptions": {}
},
"credentials": {
"slackApi": {
"id": "rNqvWj9TfChPVRYY",
"name": "Slack account vivek"
}
},
"typeVersion": 2.1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "5d204940-94de-4c34-8521-884e2f4345f8",
"connections": {
"86b8ca02-40c9-4f1d-8192-8c076eb62bc6": {
"main": [
[
{
"node": "9d54a579-e7b9-4d02-a1cd-58f76ebf4c73",
"type": "main",
"index": 0
}
]
]
},
"7fe4471f-287d-4319-8ab0-02f245d9c8f2": {
"main": [
[
{
"node": "046731cb-c515-4430-ba58-f75b46797401",
"type": "main",
"index": 0
},
{
"node": "e1acc249-b80a-4d7d-aa63-b6265b641170",
"type": "main",
"index": 0
}
]
]
},
"dc7991c7-79ad-48a3-b79d-d8359afa4d8c": {
"main": [
[
{
"node": "7fe4471f-287d-4319-8ab0-02f245d9c8f2",
"type": "main",
"index": 0
}
]
]
},
"9d54a579-e7b9-4d02-a1cd-58f76ebf4c73": {
"main": [
[
{
"node": "09134267-b553-4979-9be3-d3e74e263b74",
"type": "main",
"index": 0
}
]
]
},
"09134267-b553-4979-9be3-d3e74e263b74": {
"main": [
[
{
"node": "dc7991c7-79ad-48a3-b79d-d8359afa4d8c",
"type": "main",
"index": 0
}
]
]
}
}
}Comment utiliser ce workflow ?
Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.
Dans quelles scénarios ce workflow est-il adapté ?
Intermédiaire - CRM
Est-ce payant ?
Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.
Workflows recommandés
Rahul Joshi
@rahul08Rahul Joshi is a seasoned technology leader specializing in the n8n automation tool and AI-driven workflow automation. With deep expertise in building open-source workflow automation and self-hosted automation platforms, he helps organizations eliminate manual processes through intelligent n8n ai agent automation solutions.
Partager ce workflow