{"id":"NYnIAs2SFs1QmYkD","meta":{"instanceId":"c91c5b6efe2709e07c37996245857ac5d863d575d07e0072127351337c204c40","templateCredsSetupCompleted":true},"name":"Intelligent Lost Deal Analyzer + Revival Strategy Engine","tags":[],"nodes":[{"id":"9d139f6c-2be4-423f-95ab-16fd3324e694","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-3248,1680],"parameters":{"width":656,"height":736,"content":"## Intelligent Lost Deal Analyzer + Revival Strategy Engine Workflow\nThis workflow is an automated sales intelligence system that continuously analyzes lost deals, uncovers the real reason behind each loss, and generates realistic, AI-driven revival strategies. It converts raw CRM deal data into actionable re-engagement plans, leadership-ready summaries, and structured records—without any manual analysis or follow-ups.\n\n### How it works\n- Triggers on a scheduled basis to fetch deals from the CRM\n- Filters only Closed–Lost deals and standardizes key deal attributes\n- Uses AI to analyze CRM loss reasons and sales notes\n- Classifies each deal into a single primary loss category with confidence level\n- Generates a brief explanation describing why the deal was lost\n- Feeds loss insights into a second AI model to create a revival strategy\n- Determines ideal re-engagement timing, channel, message angle, incentive, and next sales action\n- Merges original deal data with AI-generated insights into one structured dataset\n- Builds a single consolidated HTML email summarizing all lost deals\n- Sends the summary to sales leadership via Email and Slack\n- Stores every analyzed deal, strategy, and outreach status in Google Sheets\n- Ensures no data loss by explicitly capturing merged data after email delivery\n\n### Setup steps\n1. Connect HubSpot, OpenAI, Gmail, Slack, and Google Sheets credentials\n2. Configure the Schedule Trigger and CRM node to fetch required deal properties\n3. Set up AI nodes for loss classification and revival strategy generation\n4. Use merge and code nodes to combine deal data with AI outputs\n5. Configure Gmail and Slack nodes for automated reporting\n6. Map final structured fields into Google Sheets for tracking and audits\n7. Activate the workflow and validate using historical lost deals"},"typeVersion":1},{"id":"150b9993-aeb0-4c5c-aeb0-d0312f865822","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-2576,1680],"parameters":{"color":7,"width":944,"height":736,"content":"## Step 1: Lost Deal Identification & Data Preparation\nThis step runs on a scheduled trigger to fetch all deals from the CRM, filters only Closed–Lost deals, and standardizes essential fields like deal name, amount, industry, owner, loss reason, and close date. It ensures only clean, relevant lost-deal data moves forward for AI analysis."},"typeVersion":1},{"id":"554d4ba6-6868-4e00-afd3-2efe3c7ae011","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1616,1680],"parameters":{"color":7,"width":1568,"height":736,"content":"## Step 2: AI Loss Analysis & Revival Strategy Generation\nThis step uses AI to analyze each lost deal and determine the primary loss category, confidence level, and a brief explanation based on CRM data and sales notes. The loss insights are then merged back with deal data and passed to a second AI model to generate a realistic re-engagement strategy, including timing, channel, message angle, incentive, and next sales action—ensuring every lost deal has a clear, actionable revival plan."},"typeVersion":1},{"id":"9ed0cfc3-b58a-4211-b696-71c7d4d4d8fc","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-32,1680],"parameters":{"color":7,"width":1040,"height":736,"content":"## Step 3: Multi-Channel Reporting, Audit Logging & Data Persistence\nThis step converts the finalized AI-generated re-engagement strategies into executive-ready outputs by building a consolidated HTML email and a structured Slack summary for sales leadership. After delivery, the workflow safely reconstructs deal data and stores every analyzed deal, strategy, delivery status, and timestamp into Google Sheets, ensuring complete auditability and zero data loss."},"typeVersion":1},{"id":"c985a0b1-1963-47c6-8111-142c4c8a527a","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-2560,2192],"parameters":{"rule":{"interval":[{"triggerAtHour":9}]}},"typeVersion":1.3},{"id":"ec4c262a-4d9e-45e4-9f99-09fcf90bd18f","name":"Get many deals","type":"n8n-nodes-base.hubspot","position":[-2288,2192],"parameters":{"filters":{"properties":["dealname","dealstage","dealtype","description","amount","createdate","closedate","hubspot_owner_id","hs_deal_stage_probability","hs_last_shared_message_create_date","num_associated_contacts"]},"resource":"deal","operation":"getAll","authentication":"appToken"},"typeVersion":2.2},{"id":"639e8742-7d0e-4a25-8688-3797d832cd0f","name":"If","type":"n8n-nodes-base.if","position":[-2032,2192],"parameters":{"options":{},"conditions":{"options":{"version":3,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"2f9f1aab-5daf-4b11-aa4f-7fda503bfa24","operator":{"type":"string","operation":"equals"},"leftValue":"={{ $json.dealStage }}","rightValue":"closedlost"}]}},"typeVersion":2.3},{"id":"ee310990-64b3-4707-850b-c9094b5f316d","name":"Edit Fields","type":"n8n-nodes-base.set","position":[-1824,2096],"parameters":{"options":{},"assignments":{"assignments":[{"id":"cedcbd0b-de1a-40ee-846c-39e7b88953f9","name":"dealName","type":"string","value":"={{ $json.dealName }}"},{"id":"357dab67-5d57-4efc-800f-2c39221059ee","name":"amount","type":"number","value":"={{ $json.amount }}"},{"id":"107e019d-fd97-4693-a6d0-a9c28f20469b","name":"lostReason","type":"string","value":"={{ $json.lostReason }}"},{"id":"9ef3a500-b551-4ed1-abf9-aa84d9448a12","name":"salesNotes","type":"string","value":"={{ $json.salesNotes }}"},{"id":"4e75def8-df28-45e2-bba5-c5910dfddbfa","name":"industry","type":"string","value":"={{ $json.industry }}"},{"id":"ea4cf087-86ff-4ada-bfaa-aeb9c7f9ede8","name":"ownerName","type":"string","value":"={{ $json.ownerName }}"},{"id":"5bf7220a-f7fe-43ef-88a2-529972d9606a","name":"closeDate","type":"string","value":"={{ $json.closeDate }}"}]}},"typeVersion":3.4},{"id":"8b4c2aba-2769-4c0f-822e-bfe0e64d4e69","name":"Code in JavaScript","type":"n8n-nodes-base.code","position":[-1232,1952],"parameters":{"jsCode":"// Simple AI output parser - just extract the AI analysis\n\nconst allItems = $input.all();\n\nreturn allItems.map((currentItem, index) => {\n  let lossCategory = \"\";\n  let confidenceLevel = \"\";\n  let briefExplanation = \"\";\n  \n  try {\n    const aiText = currentItem.json?.output?.[0]?.content?.[0]?.text;\n    if (aiText) {\n      const parsed = JSON.parse(aiText);\n      lossCategory = parsed.lossCategory || \"\";\n      confidenceLevel = parsed.confidenceLevel || \"\";\n      briefExplanation = parsed.briefExplanation || \"\";\n    }\n  } catch (error) {\n    console.log(\"AI parse error:\", error);\n    lossCategory = \"Other\";\n    confidenceLevel = \"Low\";\n    briefExplanation = \"Could not parse AI response\";\n  }\n  \n  return {\n    json: {\n      itemIndex: index,  // Store the index to match later\n      lossCategory,\n      confidenceLevel,\n      briefExplanation\n    }\n  };\n});"},"typeVersion":2},{"id":"8fd2858f-1db0-4eea-a738-b2723d84987e","name":"Code in JavaScript1","type":"n8n-nodes-base.code","position":[-464,1952],"parameters":{"jsCode":"// n8n Code Node\n// Purpose: Merge PREVIOUS deal data + Revival Strategy AI output\n\nconst allItems = $input.all();\n\nreturn allItems.map((item, index) => {\n  // 🔹 Step 1: Get previous deal data from \"Code in JavaScript\" node\n\n  // 🔹 Step 2: Parse AI output (revival strategy)\n  let reengagementTiming = \"\";\n  let recommendedChannel = \"\";\n  let messageAngle = \"\";\n  let suggestedIncentive = \"\";\n  let salesActionStep = \"\";\n\n  try {\n    // Access the AI response - note the structure from your response\n    const aiOutput = item.json?.output?.[0]?.content?.[0];\n    \n    // Get text from either 'text' or 'output_text' field\n    const aiText = aiOutput?.text || aiOutput?.output_text;\n    \n    if (aiText) {\n      const parsed = JSON.parse(aiText);\n      reengagementTiming = parsed.reengagementTiming || \"\";\n      recommendedChannel = parsed.recommendedChannel || \"\";\n      messageAngle = parsed.messageAngle || \"\";\n      suggestedIncentive = parsed.suggestedIncentive || \"\";\n      salesActionStep = parsed.salesActionStep || \"\";\n    }\n  } catch (e) {\n    console.log(\"AI parse error:\", e);\n    // Fallbacks will be applied below\n  }\n\n  // 🔹 Step 3: Fallbacks (never leave empty)\n  if (!reengagementTiming) reengagementTiming = \"30–60 days after loss\";\n  if (!recommendedChannel) recommendedChannel = \"Personalized Email\";\n  if (!messageAngle) messageAngle = `Re-engage focusing on value related to ${lossCategory || \"their needs\"}.`;\n  if (!suggestedIncentive) suggestedIncentive = \"Educational content or limited trial\";\n  if (!salesActionStep) salesActionStep = \"Send a personalized follow-up and track engagement.\";\n\n  // 🔹 Step 4: Return MERGED object\n  return {\n    json: {\n      \n      reengagementTiming,\n      recommendedChannel,\n      messageAngle,\n      suggestedIncentive,\n      salesActionStep\n    }\n  };\n});"},"typeVersion":2},{"id":"077d0e82-382a-4b6f-85d9-41e8c9a45b9a","name":"Send a message1","type":"n8n-nodes-base.slack","position":[336,2192],"webhookId":"93041d64-24c5-4a82-929d-7112f0664d86","parameters":{"text":"={{ $json.slackMessage }}","select":"channel","channelId":{"__rl":true,"mode":"list","value":"C0925HJ9BPU","cachedResultName":"all-devs-workspace"},"otherOptions":{},"authentication":"oAuth2"},"typeVersion":2.4},{"id":"ef931eae-5c8b-4ae0-a1f5-17152772270e","name":"Merge","type":"n8n-nodes-base.merge","position":[-1024,2080],"parameters":{"mode":"combine","options":{},"combineBy":"combineByPosition"},"typeVersion":3.2},{"id":"a0fabf86-c528-4b8a-aa12-8d21b696bba0","name":"Merge1","type":"n8n-nodes-base.merge","position":[-192,2064],"parameters":{"mode":"combine","options":{},"combineBy":"combineByPosition"},"typeVersion":3.2},{"id":"f87cda7f-1b9b-4dd8-827d-33ff13d43e26","name":"Send a message2","type":"n8n-nodes-base.gmail","position":[336,1936],"webhookId":"your-gmail-webhook-id","parameters":{"sendTo":"sales-person-id","message":"={{ $json.emailHtml }}","options":{},"subject":"Lost Deals Re-engagement Strategy Summary"},"typeVersion":2.2},{"id":"d6aa36bb-3318-403c-ac44-0b8f38dae845","name":"Code in JavaScript4","type":"n8n-nodes-base.code","position":[592,2064],"parameters":{"jsCode":"// PURPOSE:\n// This node runs AFTER Gmail\n// Gmail output does NOT contain deal data\n// So we explicitly fetch data from Merge1\n\nconst mergeItems = $items(\"Merge1\");\n\n// Safety check\nif (!mergeItems || mergeItems.length === 0) {\n  throw new Error(\"No data received from Merge1\");\n}\n\nreturn mergeItems.map(item => {\n  const d = item.json || {};\n\n  return {\n    json: {\n      \"Deal Name\": d.dealName || \"\",\n      \"Industry\": d.industry || \"\",\n      \"Owner\": d.ownerName || \"\",\n      \"Loss Category\": d.lossCategory || \"\",\n      \"Lost Reason\": d.lostReason || \"\",\n      \"Amount\": d.amount || \"\",\n      \"Re-engagement Timing\": d.reengagementTiming || \"\",\n      \"Recommended Channel\": d.recommendedChannel || \"\",\n      \"Message Angle\": d.messageAngle || \"\",\n      \"Suggested Incentive\": d.suggestedIncentive || \"\",\n      \"Sales Action Step\": d.salesActionStep || \"\",\n      \"Status\": \"Email Sent\",\n      \"Email Sent Date\": new Date().toISOString(),\n      \"Timestamp\": new Date().toISOString()\n    }\n  };\n});\n"},"typeVersion":2},{"id":"b1930b6a-ffa8-4b2c-8102-5f36aeed9d70","name":"Append or update row in sheet1","type":"n8n-nodes-base.googleSheets","position":[800,2064],"parameters":{"columns":{"value":{"Owner":"={{ $json['Owner'] }}","Amount":"={{ $json['Amount'] }}","Status":"={{ $json['Status'] }}","Industry":"={{ $json['Industry'] }}","Deal Name":"={{ $json['Deal Name'] }}","Timestamp":"={{ $json['Timestamp'] }}","Lost Reason":"={{ $json['Lost Reason'] }}","Loss Category":"={{ $json['Loss Category'] }}","Message Angle":"={{ $json['Message Angle'] }}","Email Sent Date":"={{ $json['Email Sent Date'] }}","Sales Action Step":"={{ $json['Sales Action Step'] }}","Recommended Channel":"={{ $json['Recommended Channel'] }}","Suggested Incentive":"={{ $json['Suggested Incentive'] }}","Re-engagement Timing":"={{ $json['Re-engagement Timing'] }}"},"schema":[{"id":"Deal Name","type":"string","display":true,"required":false,"displayName":"Deal Name","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Industry","type":"string","display":true,"required":false,"displayName":"Industry","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Owner","type":"string","display":true,"required":false,"displayName":"Owner","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Loss Category","type":"string","display":true,"required":false,"displayName":"Loss Category","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Lost Reason","type":"string","display":true,"required":false,"displayName":"Lost Reason","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Amount","type":"string","display":true,"required":false,"displayName":"Amount","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Re-engagement Timing","type":"string","display":true,"required":false,"displayName":"Re-engagement Timing","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Recommended Channel","type":"string","display":true,"required":false,"displayName":"Recommended Channel","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Message Angle","type":"string","display":true,"required":false,"displayName":"Message Angle","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Suggested Incentive","type":"string","display":true,"required":false,"displayName":"Suggested Incentive","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Sales Action Step","type":"string","display":true,"required":false,"displayName":"Sales Action Step","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Email Sent Date","type":"string","display":true,"required":false,"displayName":"Email Sent Date","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Timestamp","type":"string","display":true,"required":false,"displayName":"Timestamp","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[]},"options":{},"operation":"appendOrUpdate","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"your-google-sheet-url","cachedResultName":"your-google-sheet-name"},"documentId":{"__rl":true,"mode":"list","value":"your-google-sheet-value","cachedResultUrl":"your-google-sheet-url","cachedResultName":"your-google-sheet-name"}},"typeVersion":4.7},{"id":"2c004169-4aa4-4f5d-bf15-b85a53384b45","name":"Code in JavaScript7","type":"n8n-nodes-base.code","position":[64,1936],"parameters":{"jsCode":"// Build one consolidated HTML email for all lost deals\n\nconst items = $input.all();\n\nlet rows = \"\";\n\nfor (const i of items) {\n  const d = i.json;\n\n  rows += `\n    <tr>\n      <td>${d.dealName}</td>\n      <td>${d.industry}</td>\n      <td>${d.ownerName}</td>\n      <td>${d.lossCategory}</td>\n      <td>${d.lostReason}</td>\n      <td>${d.amount}</td>\n      <td>${d.reengagementTiming}</td>\n      <td>${d.recommendedChannel}</td>\n      <td>${d.messageAngle}</td>\n      <td>${d.suggestedIncentive}</td>\n      <td>${d.salesActionStep}</td>\n    </tr>\n  `;\n}\n\nconst html = `\n<!DOCTYPE html>\n<html>\n<head>\n  <style>\n    body {\n      font-family: Arial, sans-serif;\n      color: #333;\n      font-size: 13px;\n    }\n    h2 {\n      color: #0b57d0;\n    }\n    table {\n      border-collapse: collapse;\n      width: 100%;\n    }\n    th, td {\n      border: 1px solid #ddd;\n      padding: 8px;\n      vertical-align: top;\n    }\n    th {\n      background-color: #f2f2f2;\n      text-align: left;\n    }\n  </style>\n</head>\n<body>\n\n<h2>📌 Lost Deals – Re-engagement Strategy Summary</h2>\n\n<p>\nThis report consolidates AI-generated re-engagement strategies for recently lost deals.\nEach row includes recommended timing, channel, messaging angle, and next sales action.\n</p>\n\n<table>\n  <tr>\n    <th>Deal Name</th>\n    <th>Industry</th>\n    <th>Owner</th>\n    <th>Loss Category</th>\n    <th>Lost Reason</th>\n    <th>Amount</th>\n    <th>Re-engagement Timing</th>\n    <th>Recommended Channel</th>\n    <th>Message Angle</th>\n    <th>Suggested Incentive</th>\n    <th>Sales Action Step</th>\n  </tr>\n\n  ${rows}\n\n</table>\n\n<p style=\"margin-top:20px;\">\n<strong>Next Step:</strong>  \nPrioritize high-confidence deals and initiate outreach based on the recommended timing.\n</p>\n\n<p>\nRegards,<br/>\n<strong>Sales Intelligence Automation</strong><br/>\nInboxPlus\n</p>\n\n</body>\n</html>\n`;\n\nreturn [\n  {\n    json: {\n      emailHtml: html\n    }\n  }\n];\n"},"typeVersion":2},{"id":"53e71c04-8db2-4b84-aa36-5a1ca84676a3","name":"Code in JavaScript2","type":"n8n-nodes-base.code","position":[64,2192],"parameters":{"jsCode":"const items = $items(\"Merge1\");\n\nlet message = `📌 *Lost Deals – Re-engagement Strategy Summary*\\n\\n`;\nmessage += `Here is the AI-generated re-engagement plan for recently lost deals.\\n\\n`;\nmessage += `--------------------------------------------------\\n`;\n\nfor (const i of items) {\n  const d = i.json;\n\n  message += `*Deal:* ${d.dealName}\\n`;\n  message += `*Industry:* ${d.industry}\\n`;\n  message += `*Owner:* ${d.ownerName}\\n`;\n  message += `*Loss Category:* ${d.lossCategory}\\n`;\n  message += `*Lost Reason:* ${d.lostReason}\\n`;\n  message += `*Amount:* ${d.amount}\\n\\n`;\n\n  message += `🕒 *Re-engagement Timing:* ${d.reengagementTiming}\\n`;\n  message += `📣 *Recommended Channel:* ${d.recommendedChannel}\\n`;\n  message += `🎯 *Message Angle:* ${d.messageAngle}\\n`;\n  message += `🎁 *Suggested Incentive:* ${d.suggestedIncentive}\\n`;\n  message += `➡️ *Next Sales Action:* ${d.salesActionStep}\\n`;\n  message += `--------------------------------------------------\\n`;\n}\n\nmessage += `✅ *Status:* Email Sent\\n`;\nmessage += `📅 *Sent At:* ${new Date().toISOString()}\\n\\n`;\nmessage += `_Generated automatically by Sales Intelligence Automation_`;\n\nreturn [\n  {\n    json: {\n      slackMessage: message\n    }\n  }\n];\n"},"typeVersion":2},{"id":"9e11aaf4-04db-471f-adbd-77d2a8e1c9a1","name":"Brief Explanation Creator","type":"@n8n/n8n-nodes-langchain.openAi","position":[-1584,1952],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4o-mini","cachedResultName":"GPT-4O-MINI"},"options":{},"responses":{"values":[{"role":"system","content":"=You are a senior sales operations analyst specializing in B2B deal loss analysis.\n\nYour task is to analyze lost sales deals and identify the primary reason the deal was lost based on structured and unstructured deal data.\n\nYou must be objective, concise, and consistent in classification.\n"},{"content":"=Analyze the following lost deal and identify the primary loss reason.\n\nDeal Information:\n- Deal Name: {{ $json.dealName }}\n- Deal Amount: {{ $json.amount }}\n- Industry: {{ $json.industry }}\n- Lost Reason (CRM): {{ $json.lostReason }}\n- Sales Notes: {{ $json.salesNotes }}\n\nInstructions:\n1. Determine the single most important reason the deal was lost.\n2. Classify the loss into ONE of the following categories ONLY:\n   - Price\n   - Timing / Budget\n   - Competitor\n   - Feature Gap\n   - Trust / Security\n   - Complexity / Implementation\n   - No Response / Ghosted\n   - Internal Decision / Priority Shift\n3. If information is unclear, choose the closest matching category.\n4. Do NOT invent reasons that are not supported by the data.\n\nOutput Rules:\n- Return ONLY valid JSON\n- Do NOT include explanations or markdown\n\nOutput Format:\n{\n  \"lossCategory\": \"\",\n  \"confidenceLevel\": \"High | Medium | Low\",\n  \"briefExplanation\": \"\"\n}\n"}]},"builtInTools":{}},"typeVersion":2.1},{"id":"982161d6-c0ee-4b6a-9f00-36b2ca5fdfd1","name":"Feedback Creator","type":"@n8n/n8n-nodes-langchain.openAi","position":[-816,1952],"parameters":{"modelId":{"__rl":true,"mode":"list","value":"gpt-4o-mini","cachedResultName":"GPT-4O-MINI"},"options":{},"responses":{"values":[{"role":"system","content":"=You are a senior B2B sales strategist focused on deal recovery and pipeline revival.\n\nYour role is to generate practical, realistic, and ethical re-engagement strategies for lost deals.\nYour recommendations must be actionable and suitable for sales teams.\n"},{"content":"=Create a re-engagement strategy for the following lost deal.\n\nDeal Context:\n- Deal Name: {{ $json.dealName }}\n- Deal Amount: {{ $json.amount }}\n- Industry: {{ $json.industry }}\n- Loss Category: {{ $json.lossCategory }}\n- Loss Pattern: {{ $json.briefExplanation }}\n\nInstructions:\n1. Recommend a realistic follow-up strategy that could reopen this deal.\n2. Specify the ideal wait time before re-engagement.\n3. Suggest the best communication approach (email, call, demo, content).\n4. Include a clear value-based angle (not aggressive discounting unless justified).\n5. Avoid unrealistic or unethical tactics.\n\nOutput Rules:\n- Return ONLY valid JSON\n- Do NOT include explanations or markdown\n\nOutput Format:\n{\n  \"reengagementTiming\": \"\",\n  \"recommendedChannel\": \"\",\n  \"messageAngle\": \"\",\n  \"suggestedIncentive\": \"\",\n  \"salesActionStep\": \"\"\n}\n"}]},"builtInTools":{}},"typeVersion":2.1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"4e26b7ce-7f74-450e-9065-a99d98fa7122","connections":{"If":{"main":[[{"node":"Edit Fields","type":"main","index":0}]]},"Merge":{"main":[[{"node":"Feedback Creator","type":"main","index":0},{"node":"Merge1","type":"main","index":1}]]},"Merge1":{"main":[[{"node":"Code in JavaScript7","type":"main","index":0},{"node":"Code in JavaScript2","type":"main","index":0}]]},"Edit Fields":{"main":[[{"node":"Brief Explanation Creator","type":"main","index":0},{"node":"Merge","type":"main","index":1}]]},"Get many deals":{"main":[[{"node":"If","type":"main","index":0}]]},"Send a message1":{"main":[[{"node":"Code in JavaScript4","type":"main","index":0}]]},"Send a message2":{"main":[[{"node":"Code in JavaScript4","type":"main","index":0}]]},"Feedback Creator":{"main":[[{"node":"Code in JavaScript1","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Get many deals","type":"main","index":0}]]},"Code in JavaScript":{"main":[[{"node":"Merge","type":"main","index":0}]]},"Code in JavaScript1":{"main":[[{"node":"Merge1","type":"main","index":0}]]},"Code in JavaScript2":{"main":[[{"node":"Send a message1","type":"main","index":0}]]},"Code in JavaScript4":{"main":[[{"node":"Append or update row in sheet1","type":"main","index":0}]]},"Code in JavaScript7":{"main":[[{"node":"Send a message2","type":"main","index":0}]]},"Brief Explanation Creator":{"main":[[{"node":"Code in JavaScript","type":"main","index":0}]]}}}