This workflow corresponds to n8n.io template #15877 — we link there as the canonical source.
This workflow follows the HTTP Request → HubSpot 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": "",
"meta": {
"templateCredsSetupCompleted": true
},
"name": "Customer Retention Alert System",
"tags": [],
"nodes": [
{
"id": "dc19fa2b-09fd-4652-9dfa-b31259c89975",
"name": "Mixpanel Webhook",
"type": "n8n-nodes-base.webhook",
"position": [
-1680,
336
],
"parameters": {
"path": "mixpanel/churn-event",
"options": {},
"httpMethod": "POST"
},
"typeVersion": 2
},
{
"id": "83c46f8b-d963-4fe4-b019-7f5659966f8d",
"name": "Parse Mixpanel Payload",
"type": "n8n-nodes-base.code",
"position": [
-1280,
336
],
"parameters": {
"jsCode": "// ================================================\n// MIXPANEL PAYLOAD PARSER & VALIDATOR\n// Supports single events and batch arrays\n// ================================================\n\nconst body = $input.first().json;\n\n// Mixpanel can send array or single event object\nconst rawEvents = Array.isArray(body) ? body : [body];\n\nconst processedItems = [];\n\nfor (const event of rawEvents) {\n const props = event.properties || event;\n\n const email = (props.email || props.$email || '').toLowerCase().trim();\n const userId = props.distinct_id || props.user_id || props.$user_id || '';\n const firstName = props.$first_name || props.first_name || '';\n const lastName = props.$last_name || props.last_name || '';\n const name = props.name || props.$name\n || [firstName, lastName].filter(Boolean).join(' ')\n || 'Unknown User';\n\n // Skip events with no identifying information\n if (!email && !userId) {\n console.log('Skipping: missing email and userId');\n continue;\n }\n\n processedItems.push({\n json: {\n // Event metadata\n eventName: event.event || props.event_name || 'unknown',\n eventTime: props.time\n ? new Date(props.time * 1000).toISOString()\n : new Date().toISOString(),\n processedAt: new Date().toISOString(),\n\n // User identity\n userId,\n email,\n name,\n firstName,\n lastName,\n phone: props.phone || props.$phone || '',\n\n // Account / company\n company: props.company || props.$company || props.account_name || '',\n plan: props.plan || props.subscription_plan || props.pricing_tier || 'Unknown',\n mrr: Number(props.mrr || props.monthly_recurring_revenue || 0),\n accountId: props.account_id || props.company_id || '',\n\n // Churn signals\n inactiveDays: Number(props.inactive_days || props.days_since_last_login || 30),\n lastActiveDate: props.last_active_date || props.last_seen || props.last_login || null,\n lastFeatureUsed:props.last_feature_used || 'N/A',\n totalSessions: Number(props.login_count || props.total_sessions || 0),\n\n // Geographic\n country: props.$country_code || props.country || '',\n region: props.$region || props.region || '',\n city: props.$city || props.city || '',\n\n // CS assignment (if enriched upstream in Mixpanel)\n csmOwner: props.csm_owner || props.account_owner || '',\n csmSlackId: props.csm_slack_id || '',\n\n // Internal\n mixpanelToken: props.token || '',\n insertId: props.$insert_id || '',\n _parseError: false\n }\n });\n}\n\n// If nothing was valid, return a sentinel so the IF node routes to false\nif (processedItems.length === 0) {\n return [{\n json: {\n eventName: 'parse_error',\n email: '',\n userId: '',\n _parseError: true\n }\n }];\n}\n\nreturn processedItems;"
},
"typeVersion": 2
},
{
"id": "4065cfc8-3a6a-41a9-8d7f-f688339eb830",
"name": "Is Churn Event",
"type": "n8n-nodes-base.if",
"position": [
-880,
336
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "check-event-name",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.eventName }}",
"rightValue": "user_inactive_30_days"
},
{
"id": "check-no-error",
"operator": {
"type": "boolean",
"operation": "notEquals"
},
"leftValue": "={{ $json._parseError }}",
"rightValue": true
},
{
"id": "check-has-email",
"operator": {
"type": "string",
"operation": "notEquals"
},
"leftValue": "={{ $json.email }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "a2d44a65-164a-4763-9402-07304ddc3182",
"name": "Enrich User Data",
"type": "n8n-nodes-base.set",
"position": [
-480,
320
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "a-score",
"name": "churnScore",
"type": "string",
"value": "={{ $json.inactiveDays >= 60 ? 'Critical' : $json.inactiveDays >= 45 ? 'High' : 'Medium' }}"
},
{
"id": "a-emoji",
"name": "riskEmoji",
"type": "string",
"value": "={{ $json.inactiveDays >= 60 ? '\ud83d\udd34' : $json.inactiveDays >= 45 ? '\ud83d\udfe0' : '\ud83d\udfe1' }}"
},
{
"id": "a-priority",
"name": "taskPriority",
"type": "number",
"value": "={{ $json.inactiveDays >= 60 ? 1 : $json.inactiveDays >= 45 ? 2 : 3 }}"
},
{
"id": "a-due-iso",
"name": "dueDateISO",
"type": "string",
"value": "={{ $now.plus({days: 1}).toISO() }}"
},
{
"id": "a-due-ms",
"name": "dueDateMs",
"type": "number",
"value": "={{ $now.plus({days: 1}).toMillis() }}"
},
{
"id": "a-followup",
"name": "followUpDateISO",
"type": "string",
"value": "={{ $now.plus({days: 3}).toISO() }}"
},
{
"id": "a-subject",
"name": "alertSubject",
"type": "string",
"value": "=CHURN RISK [{{ $json.inactiveDays >= 60 ? 'CRITICAL' : $json.inactiveDays >= 45 ? 'HIGH' : 'MEDIUM' }}]: {{ $json.name }} \u2014 {{ $json.inactiveDays }}d inactive"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "7c9efc96-b5e3-4e4d-88bc-94d67e455ba7",
"name": "Contact Found",
"type": "n8n-nodes-base.if",
"position": [
0,
320
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "check-contact-id",
"operator": {
"type": "string",
"operation": "notEmpty",
"singleValue": true
},
"leftValue": "={{ $json.id }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2
},
{
"id": "b7f0f775-ab0f-4de7-b94f-239e35b34d0e",
"name": "Deal Exists",
"type": "n8n-nodes-base.if",
"position": [
608,
224
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 1,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "check-deal-id",
"operator": {
"type": "number",
"operation": "gt"
},
"leftValue": "={{ $json.results.length }}",
"rightValue": 0
}
]
}
},
"typeVersion": 2
},
{
"id": "debe56d9-72ec-4b01-9e9c-84bf12f8dd51",
"name": "HubSpot Update Deal",
"type": "n8n-nodes-base.hubspot",
"position": [
848,
128
],
"parameters": {
"dealId": {
"__rl": true,
"mode": "id",
"value": "={{ $json.results[0].toObjectId }}"
},
"resource": "deal",
"operation": "update",
"updateFields": {
"stage": "appointmentscheduled",
"closeDate": "={{ $('Enrich User Data').item.json.followUpDateISO }}"
},
"authentication": "appToken"
},
"credentials": {
"hubspotAppToken": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "aedb48db-a194-4311-8146-fb092eacf174",
"name": "HubSpot Create Deal",
"type": "n8n-nodes-base.hubspot",
"position": [
848,
320
],
"parameters": {
"stage": "appointmentscheduled",
"resource": "deal",
"authentication": "appToken",
"additionalFields": {
"amount": "={{ $('Parse Mixpanel Payload').item.json.mrr * 12 }}",
"dealName": "=\ud83d\udd34 Churn Risk \u2014 {{ $('Parse Mixpanel Payload').item.json.name }} ({{ $('Parse Mixpanel Payload').item.json.company }})",
"pipeline": "default",
"closeDate": "={{ $('Enrich User Data').item.json.followUpDateISO }}",
"associatedVids": "={{ $('HubSpot Find Contact').item.json.id }}"
}
},
"credentials": {
"hubspotAppToken": {
"name": "<your credential>"
}
},
"typeVersion": 2
},
{
"id": "c00a2daa-a53a-4b67-ae3d-73d464108952",
"name": "ClickUp Create Task",
"type": "n8n-nodes-base.clickUp",
"position": [
1504,
224
],
"parameters": {
"list": "YOUR_CLICKUP_LIST_ID",
"name": "={{ $('Enrich User Data').item.json.riskEmoji }} [CHURN RISK] Follow up: {{ $('Parse Mixpanel Payload').item.json.name }} ({{ $('Parse Mixpanel Payload').item.json.company || 'No Company' }}) \u2014 {{ $('Enrich User Data').item.json.churnScore }}",
"team": "YOUR_CLICKUP_TEAM_ID",
"space": "YOUR_CLICKUP_SPACE_ID",
"folderless": true,
"additionalFields": {
"content": "=\ud83d\udea8 Churn Risk \u2014 Immediate CS Action Required\n\nCustomer Details\n\nName : {{ $('Parse Mixpanel Payload').item.json.name }}\nEmail : {{ $('Parse Mixpanel Payload').item.json.email }}\nCompany : {{ $('Parse Mixpanel Payload').item.json.company || 'N/A' }}\nPlan : {{ $('Parse Mixpanel Payload').item.json.plan }}\nMRR : ${{ $('Parse Mixpanel Payload').item.json.mrr }}/month\nAnnual Value : ${{ $('Parse Mixpanel Payload').item.json.mrr * 12 }}\n\n--------------------------------------------------------\n\nChurn Signals\n\nInactive Days : {{ $('Parse Mixpanel Payload').item.json.inactiveDays }} days \nLast Active : {{ $('Parse Mixpanel Payload').item.json.lastActiveDate || 'Unknown' }} \nLast Feature Used : {{ $('Parse Mixpanel Payload').item.json.lastFeatureUsed }} \nTotal Sessions : {{ $('Parse Mixpanel Payload').item.json.totalSessions }} \nRisk Score : {{ $('Enrich User Data').item.json.churnScore }} \n\n--------------------------------------------------------\n\nCRM Links\n- \ud83d\udc64 [HubSpot Contact](https://app.hubspot.com/contacts/{{ $('HubSpot Find Contact').item.json.id }})\n- \ud83d\udcbc [HubSpot Deal](https://app.hubspot.com/deals/{{ $('HubSpot Get Deals').item.json.results[0]?.toObjectId ?? $json.id }})\n\n--------------------------------------------------------\n\nAction Checklist\n- [ ] Reach out via personalised email within 24 hours\n- [ ] Review product usage history in Mixpanel\n- [ ] Schedule a check-in / discovery call\n- [ ] Identify blockers or pain points\n- [ ] Offer relevant resources / upgrade incentive if appropriate\n- [ ] Update HubSpot deal notes after first touch\n- [ ] Set follow-up task if no response in 48h\n- [ ] Escalate to Account Manager if MRR > $500\n\n-----------------------------------------------------------\n_Auto-created by n8n \u00b7 Triggered: {{ $('Parse Mixpanel Payload').item.json.processedAt }}_",
"dueDate": "={{ $('Enrich User Data').item.json.dueDateMs }}",
"priority": "={{ $('Enrich User Data').item.json.taskPriority }}",
"dueDateTime": true
}
},
"credentials": {
"clickUpApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "0eb02430-c8a4-4c54-a823-35c74ae4b1df",
"name": "Slack CS Alert",
"type": "n8n-nodes-base.slack",
"position": [
1696,
224
],
"parameters": {
"text": "=\ud83d\udea8 CHURN RISK DETECTED\n\n{{ $('Enrich User Data').item.json.riskEmoji }} {{ $('Enrich User Data').item.json.churnScore }} Priority \u2014 Immediate CS Action Required\n\n-----------------------------------------------------\n\n\ud83d\udc64 Customer Details\n- Name: {{ $('Parse Mixpanel Payload').item.json.name }}\n- Email: {{ $('Parse Mixpanel Payload').item.json.email }}\n- Phone: {{ $('Parse Mixpanel Payload').item.json.phone || 'N/A' }}\n- Company: {{ $('Parse Mixpanel Payload').item.json.company || 'N/A' }}\n- Location: {{ $('Parse Mixpanel Payload').item.json.city }}, {{ $('Parse Mixpanel Payload').item.json.country }}\n\n\ud83d\udcb0 Revenue Details\n- Plan: {{ $('Parse Mixpanel Payload').item.json.plan }}\n- MRR: ${{ $('Parse Mixpanel Payload').item.json.mrr }}/month\n- Annual Value: ${{ $('Parse Mixpanel Payload').item.json.mrr * 12 }}\n\n\u26a0\ufe0f Churn Signals\n- Inactive Days: {{ $('Parse Mixpanel Payload').item.json.inactiveDays }} days\n- Last Active: {{ $('Parse Mixpanel Payload').item.json.lastActiveDate || 'Unknown' }}\n- Last Feature Used: {{ $('Parse Mixpanel Payload').item.json.lastFeatureUsed }}\n- Total Sessions: {{ $('Parse Mixpanel Payload').item.json.totalSessions }}\n- Risk Score: {{ $('Enrich User Data').item.json.riskEmoji }} {{ $('Enrich User Data').item.json.churnScore }}\n\n\ud83d\udd17 CRM Links\n- \ud83d\udc64 <https://app.hubspot.com/contacts/YOUR_HUBSPOT_PORTAL_ID/record/0-1/{{ $('HubSpot Find Contact').item.json.id }}|View HubSpot Contact>\n- \ud83d\udcbc <https://app.hubspot.com/deals/YOUR_HUBSPOT_PORTAL_ID/record/0-3/{{ $('HubSpot Get Deals').item.json.results[0]?.toObjectId ?? $('HubSpot Create Deal').item.json.id }}|View HubSpot Deal>\n\n\u2705 Action Checklist\n- [ ] Reach out via personalised email within 24 hours\n- [ ] Review product usage history in Mixpanel\n- [ ] Schedule a check-in / discovery call\n- [ ] Identify blockers or pain points\n- [ ] Offer upgrade incentive if MRR > $500\n- [ ] Update HubSpot deal after first touch\n- [ ] Escalate to Account Manager if no response in 48h\n\n----------------------------------------------------------\n_\ud83e\udd16 Auto-created by n8n \u00b7 Triggered: {{ $('Parse Mixpanel Payload').item.json.processedAt }}_",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": ""
},
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "3328d254-e705-4918-b5da-cdf12c7847fc",
"name": "Slack Contact Not Found",
"type": "n8n-nodes-base.slack",
"position": [
192,
352
],
"parameters": {
"text": "=\u26a0\ufe0f Churn event received but no HubSpot contact found for {{ $('Is Churn Event').item.json.email }} \u2014 manual action needed.",
"select": "channel",
"channelId": {
"__rl": true,
"mode": "list",
"value": ""
},
"otherOptions": {
"includeLinkToWorkflow": false
}
},
"credentials": {
"slackApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.2
},
{
"id": "edb7a436-cf8a-4935-9850-a1e9bfb6ff5f",
"name": "HubSpot Get Deals",
"type": "n8n-nodes-base.httpRequest",
"position": [
432,
224
],
"parameters": {
"url": "=https://api.hubapi.com/crm/v4/objects/contacts/{{ $('HubSpot Find Contact').item.json.id }}/associations/deals",
"options": {},
"sendHeaders": true,
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3,
"alwaysOutputData": true
},
{
"id": "ea618832-466d-426a-b156-fec67a9058b0",
"name": "HubSpot Find Contact",
"type": "n8n-nodes-base.hubspot",
"position": [
-176,
320
],
"parameters": {
"limit": 1,
"operation": "search",
"authentication": "appToken",
"filterGroupsUi": {
"filterGroupsValues": [
{
"filtersUi": {
"filterValues": [
{
"value": "={{ $('Parse Mixpanel Payload').item.json.email }}",
"propertyName": "email|string"
}
]
}
}
]
},
"additionalFields": {
"properties": [
"email",
"firstname",
"lastname",
"company",
"lifecyclestage",
"hubspot_owner_id",
"hs_lead_status",
"phone",
"jobtitle",
"associatedcompanyid",
"createdate"
]
}
},
"credentials": {
"hubspotAppToken": {
"name": "<your credential>"
}
},
"typeVersion": 2,
"alwaysOutputData": true
},
{
"id": "22c7baa8-7084-441d-be63-e8c8c90ef7c0",
"name": "HubSpot Log Note",
"type": "n8n-nodes-base.httpRequest",
"position": [
1312,
224
],
"parameters": {
"url": "https://api.hubapi.com/crm/v3/objects/notes",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "properties.hs_note_body",
"value": "=\ud83d\udea8 Churn Risk \u2014 {{ $('Enrich User Data').item.json.churnScore }}\n\nCustomer: {{ $('Parse Mixpanel Payload').item.json.name }}\nEmail: {{ $('Parse Mixpanel Payload').item.json.email }}\nCompany: {{ $('Parse Mixpanel Payload').item.json.company }}\nPlan: {{ $('Parse Mixpanel Payload').item.json.plan }}\nMRR: ${{ $('Parse Mixpanel Payload').item.json.mrr }}/month\nAnnual Value: ${{ $('Parse Mixpanel Payload').item.json.mrr * 12 }}\n\nInactive Days: {{ $('Parse Mixpanel Payload').item.json.inactiveDays }}\nLast Active: {{ $('Parse Mixpanel Payload').item.json.lastActiveDate }}\nLast Feature: {{ $('Parse Mixpanel Payload').item.json.lastFeatureUsed }}\nSessions: {{ $('Parse Mixpanel Payload').item.json.totalSessions }}\n\nAuto-created by n8n \u00b7 {{ $('Parse Mixpanel Payload').item.json.processedAt }}"
},
{
"name": "properties.hs_timestamp",
"value": "={{ $now.toISO() }}"
},
{
"name": "associations[0].to.id",
"value": "={{ $('HubSpot Find Contact').item.json.id }}"
},
{
"name": "associations[0].types[0].associationCategory",
"value": "HUBSPOT_DEFINED"
},
{
"name": "associations[0].types[0].associationTypeId",
"value": "202"
},
{
"name": "associations[1].to.id",
"value": "={{ $json.dealId }}"
},
{
"name": "associations[1].types[0].associationCategory",
"value": "HUBSPOT_DEFINED"
},
{
"name": "associations[1].types[0].associationTypeId",
"value": "214"
}
]
},
"genericAuthType": "httpHeaderAuth",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Bearer YOUR_TOKEN_HERE"
},
{
"name": "Content-Type",
"value": "application/json"
}
]
}
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.3
},
{
"id": "7f8c18b3-e51f-47f0-88a6-b36a94acb968",
"name": "Set Deal ID",
"type": "n8n-nodes-base.set",
"position": [
1120,
224
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "64392840-0f46-4ec2-ae66-273e0ee1b388",
"name": "dealId",
"type": "string",
"value": "={{ $json.dealId }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "77dff1fa-105c-4182-a5de-0d7073b5a5c0",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-2336,
-32
],
"parameters": {
"width": 496,
"height": 592,
"content": "## Customer Retention Alert System\nThis workflow helps to identify customers who are becoming inactive (not using the product). When such a customer is detected, the system automatically takes action. It collects customer details, checks their status, and creates follow-up tasks. It also sends alerts to the team so they can take quick action. This helps businesses reduce customer loss and improve engagement.\n\n### How it Works\n\n\t\u2022\tThe system receives data when a customer becomes inactive.\n\t\u2022\tIt checks and cleans the data to make sure everything is correct.\n\t\u2022\tIt verifies if the event is important (inactive for many days).\n\t\u2022\tIt calculates how serious the situation is (low, medium, or high risk).\n\t\u2022\tIt checks if the customer already exists in the system.\n\t\u2022\tIt creates or updates customer records if needed.\n\t\u2022\tIt creates a task and sends a message to the team for follow-up.\n\n### Setup Steps\n\n\t1.\tConnect the system to receive customer activity data.\n\t2.\tSet rules to detect inactive customers (like 30 days no activity).\n\t3.\tConnect customer database (for checking existing users).\n\t4.\tConnect task management tool and messaging tool.\n\t5.\tActivate the workflow so it runs automatically."
},
"typeVersion": 1
},
{
"id": "dfa910b8-0daf-4b6b-8503-49b4f911a15a",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1808,
-32
],
"parameters": {
"color": 7,
"width": 368,
"height": 592,
"content": "## Step 1: Receive Customer Data\n\nThis step collects information when a customer becomes inactive. It acts like a trigger that starts the whole process. Whenever inactivity is detected, the workflow begins automatically."
},
"typeVersion": 1
},
{
"id": "adc10c52-b1d4-4b31-9fe1-9b1fd3fc0a87",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1408,
-32
],
"parameters": {
"color": 7,
"width": 368,
"height": 592,
"content": "## Step 2: Clean and Understand Data\n\nHere, the system organizes the customer information. It makes sure details like name, email, and activity are correct. If important data is missing, that record is ignored."
},
"typeVersion": 1
},
{
"id": "a2a428d9-d320-4d0a-abfe-7c148f83262b",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1008,
-32
],
"parameters": {
"color": 7,
"width": 368,
"height": 592,
"content": "## Step 3: Check if Action is Needed\n\nThis step checks whether the customer is really inactive. It only continues if the inactivity is serious enough. If not, the process stops to avoid unnecessary work."
},
"typeVersion": 1
},
{
"id": "4819b152-0c95-4848-b954-f4fb8f79bffd",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-608,
-32
],
"parameters": {
"color": 7,
"width": 352,
"height": 592,
"content": "## Step 4: Decide Risk Level\n\nThe system checks how long the customer has been inactive. Based on this, it marks the risk as medium, high, or critical. It also prepares follow-up dates and alerts."
},
"typeVersion": 1
},
{
"id": "6fce5a8b-2b35-4261-bfd0-f740e8046158",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-32
],
"parameters": {
"color": 7,
"width": 576,
"height": 592,
"content": "## Step 5: Find Customer in System\n\nThis step searches if the customer already exists in records.\nIf the customer is not found, a message is sent to the team.\nIf found, the process continues normally."
},
"typeVersion": 1
},
{
"id": "f613fb85-0914-4a2f-be7c-b29663faf9e1",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
384,
-32
],
"parameters": {
"color": 7,
"width": 608,
"height": 592,
"content": "## Step 6: Check or Create Deal\n\nHere, the system checks if there is already a related record.\nIf it exists, it updates it with new information.\nIf not, it creates a new record for tracking."
},
"typeVersion": 1
},
{
"id": "2971783d-b2ee-4d2c-812c-35e4f055900c",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1024,
-32
],
"parameters": {
"color": 7,
"width": 864,
"height": 592,
"content": "## Step 7: Create Task and Notify Team\n\nFinally, a task is created for the team to follow up.\nA message is also sent to notify them immediately.\nThis ensures quick action to save the customer."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "",
"connections": {
"Deal Exists": {
"main": [
[
{
"node": "HubSpot Update Deal",
"type": "main",
"index": 0
}
],
[
{
"node": "HubSpot Create Deal",
"type": "main",
"index": 0
}
]
]
},
"Set Deal ID": {
"main": [
[
{
"node": "HubSpot Log Note",
"type": "main",
"index": 0
}
]
]
},
"Contact Found": {
"main": [
[
{
"node": "HubSpot Get Deals",
"type": "main",
"index": 0
}
],
[
{
"node": "Slack Contact Not Found",
"type": "main",
"index": 0
}
]
]
},
"Is Churn Event": {
"main": [
[
{
"node": "Enrich User Data",
"type": "main",
"index": 0
}
],
[]
]
},
"Enrich User Data": {
"main": [
[
{
"node": "HubSpot Find Contact",
"type": "main",
"index": 0
}
]
]
},
"HubSpot Log Note": {
"main": [
[
{
"node": "ClickUp Create Task",
"type": "main",
"index": 0
}
]
]
},
"Mixpanel Webhook": {
"main": [
[
{
"node": "Parse Mixpanel Payload",
"type": "main",
"index": 0
}
]
]
},
"HubSpot Get Deals": {
"main": [
[
{
"node": "Deal Exists",
"type": "main",
"index": 0
}
]
]
},
"ClickUp Create Task": {
"main": [
[
{
"node": "Slack CS Alert",
"type": "main",
"index": 0
}
]
]
},
"HubSpot Create Deal": {
"main": [
[
{
"node": "Set Deal ID",
"type": "main",
"index": 0
}
]
]
},
"HubSpot Update Deal": {
"main": [
[
{
"node": "Set Deal ID",
"type": "main",
"index": 0
}
]
]
},
"HubSpot Find Contact": {
"main": [
[
{
"node": "Contact Found",
"type": "main",
"index": 0
}
]
]
},
"Parse Mixpanel Payload": {
"main": [
[
{
"node": "Is Churn Event",
"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.
clickUpApihttpHeaderAuthhubspotAppTokenslackApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow automatically detects at-risk customers by listening for inactivity signals from Mixpanel, scoring their churn risk, syncing everything to HubSpot, creating a prioritized ClickUp follow-up task, and alerting the customer success team on Slack — all without any…
Source: https://n8n.io/workflows/15877/ — 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.
🛡️ Jamf Policy Integrity Monitor
Stay ahead of payment disputes with this automated n8n workflow that integrates Stripe, Slack, and ClickUp. Perfect for finance teams, payment ops specialists, and SaaS businesses, this template fetch
File Hash Reputation Checker is a security automation workflow that validates file hashes (MD5, SHA1, SHA256) and checks their reputation using the VirusTotal API. It is designed for SOC teams, securi
Notify_user_in_Slack_of_quarantined_email_and_create_Jira_ticket_if_opened. Uses httpRequest, jira, stickyNote, slack. Webhook trigger; 13 nodes.
This n8n workflow serves as an incident response and notification system for handling potentially malicious emails flagged by Sublime Security. It begins with a Webhook trigger that Sublime Security u