{
  "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
          }
        ]
      ]
    }
  }
}