AutomationFlowsData & Sheets › Automate Customer Retention with AI Risk Prediction, Stripe Coupons &…

Automate Customer Retention with AI Risk Prediction, Stripe Coupons &…

Original n8n title: Automate Customer Retention with AI Risk Prediction, Stripe Coupons & Personalized Gmail

ByHayatoFujita/藤田隼人 @hayatofujita on n8n.io

This workflow is designed for Customer Success Managers, Growth Teams, and SaaS Business Owners who want to proactively reduce churn using AI. It automates the analysis of customer health and the delivery of personalized retention offers without manual intervention.

Cron / scheduled trigger★★★★☆ complexityAI-powered27 nodesHTTP RequestPostgresOpenAIGmailGoogle Sheets
Data & Sheets Trigger: Cron / scheduled Nodes: 27 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #11977 — we link there as the canonical source.

This workflow follows the Gmail → Google Sheets 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 →

Download .json
{
  "id": "xBlDjGZwvbjWKlsA",
  "name": "Predict churn risk from customer data and send retention emails via OpenAI",
  "tags": [],
  "nodes": [
    {
      "id": "c6be714c-7c14-4390-a237-fbb53776b807",
      "name": "Workflow Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        0
      ],
      "parameters": {
        "width": 636,
        "height": 568,
        "content": "# \ud83d\udcc9 Churn Risk Prediction & Retention Automation\n\nThis workflow acts as an intelligent retention system by connecting your data, AI, and communication channels. It proactively identifies at-risk customers and sends personalized offers.\n\n## \ud83d\ude80 What it does\n1. **Aggregates Data**: Pulls customer profiles from CRM, support tickets, and PostgreSQL usage logs.\n2. **Predicts Risk**: Uses OpenAI to calculate a \"Churn Risk Score\" based on behavior.\n3. **Automates Action**: Generates dynamic Stripe coupons and sends personalized emails via Gmail to high-risk users.\n4. **Tracks Results**: Monitors email opens (SendGrid) and 30-day retention status.\n\n## \u2699\ufe0f Setup Steps\n1. **Credentials**: Configure OpenAI, Stripe, Gmail, SendGrid, Postgres, and Google Sheets.\n2. **Google Sheet**: Create a sheet with columns: `customer_id`, `risk_score`, `offer_type`, `email_status`, `retention_result`, etc.\n3. **Configuration**: Update API URLs in HTTP nodes and the SQL query in the Postgres node.\n4. **Activate**: Turn on the Schedule Trigger."
      },
      "typeVersion": 1
    },
    {
      "id": "362566c2-b855-4e8e-b587-9df91232ebd4",
      "name": "Schedule Trigger - \u6bce\u65e503:00\u5b9f\u884c",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        864,
        784
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 3
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "fefc8b12-23ce-42b4-a5f8-5c2bcdc3a885",
      "name": "Note - Schedule",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1024,
        512
      ],
      "parameters": {
        "color": 7,
        "width": 1114,
        "height": 564,
        "content": "## 1\ufe0f\u20e3 Data Aggregation\nCombines data from multiple sources to build a 360\u00b0 customer profile.\n- **CRM**: Basic info & billing status.\n- **Support**: Ticket volume & sentiment.\n- **Postgres**: Product usage depth & login frequency.\n\n\ud83d\udca1 **Tip**: Adjust the SQL query in the Postgres node to match your table schema."
      },
      "typeVersion": 1
    },
    {
      "id": "8afa0a02-5798-4c7b-9d63-80b4cb53ff2a",
      "name": "\u5bfe\u8c61\u9867\u5ba2\u30ea\u30b9\u30c8\u53d6\u5f97 (CRM)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1088,
        784
      ],
      "parameters": {
        "url": "https://api.your-crm.com/v1/customers",
        "options": {},
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "status",
              "value": "active"
            },
            {
              "name": "last_billing_days",
              "value": "30"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3675add7-bcd4-40d6-aa98-24378fad8614",
      "name": "\u30b5\u30dd\u30fc\u30c8\u30c1\u30b1\u30c3\u30c8\u60c5\u5831\u53d6\u5f97",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1312,
        784
      ],
      "parameters": {
        "url": "={{ 'https://api.support-tool.com/v1/tickets?customer_id=' + $json.customer_id }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "c3cf6f1a-0f2f-4bfc-ab1e-7d5eca3c8139",
      "name": "\u30b5\u30dd\u30fc\u30c8\u6307\u6a19\u96c6\u8a08",
      "type": "n8n-nodes-base.code",
      "position": [
        1536,
        784
      ],
      "parameters": {
        "jsCode": "// \u30b5\u30dd\u30fc\u30c8\u30c1\u30b1\u30c3\u30c8\u96c6\u8a08\nfor (const item of $input.all()) {\n  const tickets = item.json.tickets || [];\n  \n  const now = new Date();\n  const thirtyDaysAgo = new Date(now - 30 * 24 * 60 * 60 * 1000);\n  \n  const recentTickets = tickets.filter(t => new Date(t.created_at) > thirtyDaysAgo);\n  const openTickets = tickets.filter(t => t.status === 'open');\n  \n  item.json.ticket_count_last_30d = recentTickets.length;\n  item.json.open_ticket_count = openTickets.length;\n  item.json.avg_csatscore = tickets.length > 0 ? \n    tickets.reduce((sum, t) => sum + (t.csat_score || 0), 0) / tickets.length : 0;\n  item.json.avg_first_response_time = tickets.length > 0 ?\n    tickets.reduce((sum, t) => sum + (t.first_response_hours || 0), 0) / tickets.length : 0;\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "76c16aed-d85f-4238-b42d-94172be38718",
      "name": "\u88fd\u54c1\u5229\u7528\u30ed\u30b0\u53d6\u5f97",
      "type": "n8n-nodes-base.postgres",
      "position": [
        1760,
        880
      ],
      "parameters": {
        "query": "SELECT customer_id, \n       COUNT(DISTINCT DATE(event_date)) as login_days_last_30d,\n       COUNT(CASE WHEN feature = 'feature_a' THEN 1 END) as feature_a_usage_count,\n       COUNT(CASE WHEN feature = 'feature_b' THEN 1 END) as feature_b_usage_count,\n       MAX(event_date) as last_active_date,\n       AVG(session_duration_sec) as session_avg_duration\nFROM product_events\nWHERE customer_id IN ({{ $json.customer_id }})\n  AND event_date >= NOW() - INTERVAL '30 days'\nGROUP BY customer_id",
        "options": {},
        "operation": "executeQuery"
      },
      "typeVersion": 2.5
    },
    {
      "id": "2c0fda3b-345e-4a5f-8003-1193e0ad8100",
      "name": "\u30c7\u30fc\u30bf\u7d71\u5408 (CRM+\u30b5\u30dd\u30fc\u30c8)",
      "type": "n8n-nodes-base.merge",
      "position": [
        1760,
        688
      ],
      "parameters": {
        "mode": "combine",
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "0597dc99-a10b-4314-aa91-b958f71dd59c",
      "name": "\u30c7\u30fc\u30bf\u7d71\u5408 (\u5168\u30c7\u30fc\u30bf)",
      "type": "n8n-nodes-base.merge",
      "position": [
        1984,
        784
      ],
      "parameters": {
        "mode": "combine",
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "de98a118-193f-4367-8d79-643cb1f7c9f0",
      "name": "AI\u89e3\u7d04\u30ea\u30b9\u30af\u4e88\u6e2c",
      "type": "n8n-nodes-base.openAi",
      "position": [
        2208,
        784
      ],
      "parameters": {
        "resource": "chatCompletion",
        "requestOptions": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "c2fac4bf-2a58-4428-8396-425e12143ba1",
      "name": "\u9ad8\u30ea\u30b9\u30af\u9867\u5ba2\u30d5\u30a3\u30eb\u30bf",
      "type": "n8n-nodes-base.if",
      "position": [
        2432,
        784
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.churn_risk_score }}",
              "rightValue": 0.7
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "8f582aa8-f7b0-44d5-bab3-c568d92273ab",
      "name": "\u7279\u5225\u30aa\u30d5\u30a1\u30fc\u751f\u6210",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2656,
        688
      ],
      "parameters": {
        "url": "https://api.stripe.com/v1/coupons",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "percent_off",
              "value": "={{ $json.mrr > 10000 ? 20 : 10 }}"
            },
            {
              "name": "duration",
              "value": "repeating"
            },
            {
              "name": "duration_in_months",
              "value": "3"
            },
            {
              "name": "id",
              "value": "={{ 'RETAIN_' + $json.customer_id + '_' + Date.now() }}"
            }
          ]
        },
        "nodeCredentialType": "stripeApi"
      },
      "typeVersion": 4.2
    },
    {
      "id": "c0c9b403-9f18-4a23-bead-43545b633379",
      "name": "\u30aa\u30d5\u30a1\u30fc\u5185\u5bb9\u6c7a\u5b9a",
      "type": "n8n-nodes-base.code",
      "position": [
        2880,
        688
      ],
      "parameters": {
        "jsCode": "// \u30aa\u30d5\u30a1\u30fc\u30bf\u30a4\u30d7\u306e\u6c7a\u5b9a\nfor (const item of $input.all()) {\n  const mrr = item.json.mrr || 0;\n  const ticketCount = item.json.open_ticket_count || 0;\n  const loginDays = item.json.login_days_last_30d || 0;\n  \n  let offerType, offerValue;\n  \n  if (mrr > 10000) {\n    offerType = 'premium_package';\n    offerValue = '20% OFF + \u512a\u5148\u30b5\u30dd\u30fc\u30c8 + \u7121\u6599\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9';\n  } else if (ticketCount > 5) {\n    offerType = 'support_upgrade';\n    offerValue = '\u512a\u5148\u30b5\u30dd\u30fc\u30c8 + 10% OFF';\n  } else if (loginDays < 5) {\n    offerType = 'engagement_boost';\n    offerValue = '\u500b\u5225\u30aa\u30f3\u30dc\u30fc\u30c7\u30a3\u30f3\u30b0 + 15% OFF';\n  } else {\n    offerType = 'standard_discount';\n    offerValue = '10% OFF for 3 months';\n  }\n  \n  item.json.offer_type = offerType;\n  item.json.offer_value = offerValue;\n  item.json.offer_expire_at = new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toISOString();\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "61b76572-c497-493e-b08d-b127a0cd9afd",
      "name": "\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u30e1\u30fc\u30eb\u751f\u6210",
      "type": "n8n-nodes-base.openAi",
      "position": [
        3104,
        688
      ],
      "parameters": {
        "resource": "chatCompletion",
        "requestOptions": {}
      },
      "typeVersion": 1.1
    },
    {
      "id": "43fb7ea5-bae2-40ee-be1c-788113aa8437",
      "name": "\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u30e1\u30fc\u30eb\u9001\u4fe1",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3328,
        688
      ],
      "parameters": {
        "message": "={{ $json.email_body_html }}",
        "options": {
          "bccList": "user@example.com",
          "replyTo": "user@example.com"
        },
        "subject": "={{ $json.email_subject }}"
      },
      "typeVersion": 2.1
    },
    {
      "id": "ff37bbde-5d0e-447a-b0d2-5da483d8bc68",
      "name": "\u65bd\u7b56\u30ed\u30b0\u4fdd\u5b58",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3552,
        688
      ],
      "parameters": {
        "operation": "appendPage",
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "468ea94d-69f8-4e39-ab8f-61d793fab544",
      "name": "\u672a\u66f4\u65b0\u30ed\u30b0\u53d6\u5f97",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2656,
        880
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "09bdea50-c62f-4c8f-9752-b76e4b78ef32",
      "name": "\u30e1\u30fc\u30eb\u958b\u5c01\u72b6\u6cc1\u53d6\u5f97",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2880,
        880
      ],
      "parameters": {
        "url": "={{ 'https://api.sendgrid.com/v3/messages?msg_id=' + $json.email_provider_message_id }}",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "sendGridApi"
      },
      "typeVersion": 4.2
    },
    {
      "id": "d64e0cf7-1324-4797-adcb-00b664bdaec1",
      "name": "\u958b\u5c01\u30c7\u30fc\u30bf\u51e6\u7406",
      "type": "n8n-nodes-base.code",
      "position": [
        3104,
        880
      ],
      "parameters": {
        "jsCode": "// \u30e1\u30fc\u30eb\u52b9\u679c\u6e2c\u5b9a\u30c7\u30fc\u30bf\u306e\u51e6\u7406\nfor (const item of $input.all()) {\n  const events = item.json.events || [];\n  \n  item.json.email_opened = events.some(e => e.event === 'open');\n  item.json.email_clicked = events.some(e => e.event === 'click');\n  item.json.delivery_status = events.some(e => e.event === 'bounce') ? 'failed' : 'delivered';\n  item.json.metrics_status = 'updated';\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "6fc33072-8a3e-4608-b6a7-1b96a35b50da",
      "name": "\u52b9\u679c\u6e2c\u5b9a\u30c7\u30fc\u30bf\u66f4\u65b0",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3328,
        880
      ],
      "parameters": {
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "fb362f24-190f-43a4-93d2-a1dad8675e71",
      "name": "30\u65e5\u7d4c\u904e\u30ec\u30b3\u30fc\u30c9\u53d6\u5f97",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3552,
        880
      ],
      "parameters": {
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "3d7735d3-93f4-4b78-a502-0df3e9ba76eb",
      "name": "\u9867\u5ba2\u30b9\u30c6\u30fc\u30bf\u30b9\u78ba\u8a8d",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3776,
        880
      ],
      "parameters": {
        "url": "={{ 'https://api.your-crm.com/v1/customers/' + $json.customer_id + '/status' }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "d962495a-3066-47b6-b842-39c852c01fd1",
      "name": "\u7d99\u7d9a\u72b6\u6cc1\u5224\u5b9a",
      "type": "n8n-nodes-base.code",
      "position": [
        4000,
        880
      ],
      "parameters": {
        "jsCode": "// \u89e3\u7d04\u30fb\u7d99\u7d9a\u30fb\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u5224\u5b9a\nfor (const item of $input.all()) {\n  const currentStatus = item.json.status;\n  const currentMrr = item.json.current_mrr || 0;\n  const originalMrr = item.json.mrr || 0;\n  \n  if (currentStatus === 'cancelled' || currentStatus === 'churned') {\n    item.json.churned = true;\n    item.json.retained = false;\n    item.json.upgraded = false;\n  } else if (currentMrr > originalMrr) {\n    item.json.churned = false;\n    item.json.retained = true;\n    item.json.upgraded = true;\n  } else {\n    item.json.churned = false;\n    item.json.retained = true;\n    item.json.upgraded = false;\n  }\n  \n  item.json.followup_status = 'done';\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "8def677b-25fb-4c06-9bae-58638da7cfda",
      "name": "\u6700\u7d42\u7d50\u679c\u66f4\u65b0",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        4224,
        880
      ],
      "parameters": {
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "2601c627-89f7-4925-b5c6-f3af17d94f35",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2160,
        528
      ],
      "parameters": {
        "color": 7,
        "width": 432,
        "height": 464,
        "content": "## 2\ufe0f\u20e3 AI Risk Analysis\nOpenAI analyzes the aggregated data to predict the likelihood of churn (0.0 - 1.0).\n- **Filter**: Only customers with a risk score **> 0.7** proceed to the retention flow."
      },
      "typeVersion": 1
    },
    {
      "id": "b5da0a9d-d20c-4dae-91c3-36ab21a627b5",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2640,
        512
      ],
      "parameters": {
        "color": 7,
        "width": 576,
        "height": 576,
        "content": "## 3\ufe0f\u20e3 Personalized Retention Action\n- **Stripe**: Generates a unique coupon code (discount varies by MRR).\n- **OpenAI**: Drafts a highly personalized email based on the user's specific pain points.\n- **Gmail**: Sends the retention offer.\n- **Logging**: Records the attempt in Google Sheets."
      },
      "typeVersion": 1
    },
    {
      "id": "78b48631-1c20-4385-8f6b-9cba6beb212a",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3232,
        544
      ],
      "parameters": {
        "color": 7,
        "width": 1136,
        "height": 480,
        "content": "## 4\ufe0f\u20e3 Campaign Tracking & Feedback Loop\nThis section measures the ROI of your retention efforts.\n- **Engagement**: Checks email open/click rates via SendGrid API.\n- **Outcome**: Verifies if the customer is still active 30 days after the email was sent.\n- **Update**: Syncs final results back to Google Sheets."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "d0c81515-2e02-4a96-8d4a-f9c3cb673e9c",
  "connections": {
    "\u7d99\u7d9a\u72b6\u6cc1\u5224\u5b9a": {
      "main": [
        [
          {
            "node": "\u6700\u7d42\u7d50\u679c\u66f4\u65b0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u672a\u66f4\u65b0\u30ed\u30b0\u53d6\u5f97": {
      "main": [
        [
          {
            "node": "\u30e1\u30fc\u30eb\u958b\u5c01\u72b6\u6cc1\u53d6\u5f97",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u958b\u5c01\u30c7\u30fc\u30bf\u51e6\u7406": {
      "main": [
        [
          {
            "node": "\u52b9\u679c\u6e2c\u5b9a\u30c7\u30fc\u30bf\u66f4\u65b0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI\u89e3\u7d04\u30ea\u30b9\u30af\u4e88\u6e2c": {
      "main": [
        [
          {
            "node": "\u9ad8\u30ea\u30b9\u30af\u9867\u5ba2\u30d5\u30a3\u30eb\u30bf",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u30aa\u30d5\u30a1\u30fc\u5185\u5bb9\u6c7a\u5b9a": {
      "main": [
        [
          {
            "node": "\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u30e1\u30fc\u30eb\u751f\u6210",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u30b5\u30dd\u30fc\u30c8\u6307\u6a19\u96c6\u8a08": {
      "main": [
        [
          {
            "node": "\u88fd\u54c1\u5229\u7528\u30ed\u30b0\u53d6\u5f97",
            "type": "main",
            "index": 0
          },
          {
            "node": "\u30c7\u30fc\u30bf\u7d71\u5408 (CRM+\u30b5\u30dd\u30fc\u30c8)",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\u7279\u5225\u30aa\u30d5\u30a1\u30fc\u751f\u6210": {
      "main": [
        [
          {
            "node": "\u30aa\u30d5\u30a1\u30fc\u5185\u5bb9\u6c7a\u5b9a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u88fd\u54c1\u5229\u7528\u30ed\u30b0\u53d6\u5f97": {
      "main": [
        [
          {
            "node": "\u30c7\u30fc\u30bf\u7d71\u5408 (\u5168\u30c7\u30fc\u30bf)",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "\u30e1\u30fc\u30eb\u958b\u5c01\u72b6\u6cc1\u53d6\u5f97": {
      "main": [
        [
          {
            "node": "\u958b\u5c01\u30c7\u30fc\u30bf\u51e6\u7406",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u52b9\u679c\u6e2c\u5b9a\u30c7\u30fc\u30bf\u66f4\u65b0": {
      "main": [
        [
          {
            "node": "30\u65e5\u7d4c\u904e\u30ec\u30b3\u30fc\u30c9\u53d6\u5f97",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u9867\u5ba2\u30b9\u30c6\u30fc\u30bf\u30b9\u78ba\u8a8d": {
      "main": [
        [
          {
            "node": "\u7d99\u7d9a\u72b6\u6cc1\u5224\u5b9a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "30\u65e5\u7d4c\u904e\u30ec\u30b3\u30fc\u30c9\u53d6\u5f97": {
      "main": [
        [
          {
            "node": "\u9867\u5ba2\u30b9\u30c6\u30fc\u30bf\u30b9\u78ba\u8a8d",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u30c7\u30fc\u30bf\u7d71\u5408 (\u5168\u30c7\u30fc\u30bf)": {
      "main": [
        [
          {
            "node": "AI\u89e3\u7d04\u30ea\u30b9\u30af\u4e88\u6e2c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u9ad8\u30ea\u30b9\u30af\u9867\u5ba2\u30d5\u30a3\u30eb\u30bf": {
      "main": [
        [
          {
            "node": "\u7279\u5225\u30aa\u30d5\u30a1\u30fc\u751f\u6210",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\u672a\u66f4\u65b0\u30ed\u30b0\u53d6\u5f97",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u30e1\u30fc\u30eb\u751f\u6210": {
      "main": [
        [
          {
            "node": "\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u30e1\u30fc\u30eb\u9001\u4fe1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u30ea\u30c6\u30f3\u30b7\u30e7\u30f3\u30e1\u30fc\u30eb\u9001\u4fe1": {
      "main": [
        [
          {
            "node": "\u65bd\u7b56\u30ed\u30b0\u4fdd\u5b58",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u5bfe\u8c61\u9867\u5ba2\u30ea\u30b9\u30c8\u53d6\u5f97 (CRM)": {
      "main": [
        [
          {
            "node": "\u30b5\u30dd\u30fc\u30c8\u30c1\u30b1\u30c3\u30c8\u60c5\u5831\u53d6\u5f97",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u30c7\u30fc\u30bf\u7d71\u5408 (CRM+\u30b5\u30dd\u30fc\u30c8)": {
      "main": [
        [
          {
            "node": "\u30c7\u30fc\u30bf\u7d71\u5408 (\u5168\u30c7\u30fc\u30bf)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger - \u6bce\u65e503:00\u5b9f\u884c": {
      "main": [
        [
          {
            "node": "\u5bfe\u8c61\u9867\u5ba2\u30ea\u30b9\u30c8\u53d6\u5f97 (CRM)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u30b5\u30dd\u30fc\u30c8\u30c1\u30b1\u30c3\u30c8\u60c5\u5831\u53d6\u5f97": {
      "main": [
        [
          {
            "node": "\u30b5\u30dd\u30fc\u30c8\u6307\u6a19\u96c6\u8a08",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow is designed for Customer Success Managers, Growth Teams, and SaaS Business Owners who want to proactively reduce churn using AI. It automates the analysis of customer health and the delivery of personalized retention offers without manual intervention.

Source: https://n8n.io/workflows/11977/ — original creator credit. Request a take-down →

More Data & Sheets workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Data & Sheets

Scheduled processes retrieve customer feedback from multiple channels. The system performs sentiment analysis to classify tone, then uses OpenAI models to extract themes, topics, and urgency indicator

HTTP Request, Lm Chat Azure Open Ai, Sentiment Analysis +5
Data & Sheets

This workflow functions as an automated "Chief Wellness Officer," helping HR teams and managers prevent employee burnout before it happens. It aggregates data from communication channels and work tool

HTTP Request, Slack, OpenAI +2
Data & Sheets

This workflow monitors customer health by combining payment behavior, complaint signals, and AI-driven feedback analysis. It runs on daily and weekly schedules to evaluate risk levels, escalate high-r

Google Sheets, HTTP Request, Gmail +2
Data & Sheets

Continuous monitoring: Real-time surveillance of supplier performance, financial health, and operational status Risk scoring: AI-powered assessment of supplier risks across multiple dimensions (financ

Postgres, HTTP Request, Gmail +1
Data & Sheets

Regulatory monitoring: Continuously tracks changes in laws, regulations, and compliance requirements across multiple jurisdictions Contract analysis: AI-powered review of existing contracts to identif

HTTP Request, Postgres, Gmail +1