{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "2beef53a-ddec-402a-9970-1f8934b48166",
      "name": "Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1056,
        -336
      ],
      "parameters": {
        "color": 4,
        "width": 524,
        "height": 1236,
        "content": "## Webinar Recording to Salesforce Lead Follow-Up Email Generator \u2014 WayinVideo Summarization + GPT-4o-mini + Salesforce + Gmail + Sheets\n\nFor marketing teams, sales teams, and agencies who run webinars and want to automatically send a personalized follow-up email to every registered Salesforce lead within minutes of the webinar ending \u2014 referencing specific content covered \u2014 instead of sending a generic broadcast. Submit the webinar recording URL via the form. WayinVideo Summarization API generates a structured summary with numbered highlights and tags. GPT-4o-mini writes a personalized email per lead \u2014 addressing them by first name, referencing their role and company, and citing 2\u20133 specific highlights from the webinar. Gmail sends each email. Salesforce logs a completed Task activity on each lead record. Google Sheets logs every send with the Salesforce Task ID.\n\n## How it works\n- **1. Form \u2014 Webinar URL + Details** collects the recording URL, webinar title, host name, company name, webinar date, and CTA link\n- **2. WayinVideo \u2014 Submit Summarization** submits the URL to the Summarization API\n- **3. Wait \u2014 90 Seconds** gives the API initial processing time\n- **4. WayinVideo \u2014 Get Summary Results** polls the summaries results endpoint\n- **5. IF \u2014 Summary Complete?** checks for SUCCEEDED \u2014 if not, retries via 30-second wait\n- **7. Code \u2014 Extract Summary Data** extracts summary, numbered highlights, and all form fields into a clean object\n- **8. Salesforce \u2014 Query Registered Leads** runs SOQL to fetch all leads where Webinar_Name__c matches the webinar title, limit 500\n- **9. AI Agent \u2014 Write Personalized Email** uses GPT-4o-mini to write a 150\u2013200 word personalized email per lead with subject line, personalized intro, and full body\n- **11. Code \u2014 Parse Email Output** extracts 3 labeled sections via regex and assembles all lead and webinar fields\n- **12. Gmail \u2014 Send Follow-Up Email** sends the personalized email to each lead's email address\n- **13. Salesforce \u2014 Log Email as Activity** creates a completed Task on each lead record with WhoId association\n- **14. Google Sheets \u2014 Log Follow-Up** logs all 10 fields including Salesforce Task ID\n\n## Set up steps\n1. In **2** and **4** \u2014 replace `YOUR_WAYINVIDEO_API_KEY`\n2. In **10. OpenAI \u2014 GPT-4o-mini Model** \u2014 connect your OpenAI credential\n3. In **8** and **13** \u2014 connect your Salesforce OAuth2 credential\n4. In **12** \u2014 connect your Gmail OAuth2 credential\n5. In **14** \u2014 connect your Google Sheets OAuth2 credential and replace `YOUR_GOOGLE_SHEET_ID`\n6. In your Salesforce org \u2014 ensure the Lead object has a custom field `Webinar_Name__c` populated at registration. If your field name is different, edit the SOQL query in node 8\n7. Create a Google Sheet tab named Follow-up Log with columns: Webinar Title, Lead Email, Lead Name, Lead Company, Email Subject, Personalized Intro, Salesforce Lead ID, Salesforce Task ID, Sent Status, Sent On"
      },
      "typeVersion": 1
    },
    {
      "id": "4e580dee-4281-41c6-bf4f-a626e9d7dd32",
      "name": "Section \u2014 Form Input",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -528,
        -80
      ],
      "parameters": {
        "color": 5,
        "width": 372,
        "height": 356,
        "content": "## Form Input\nMarketing team submits webinar recording URL, webinar title, host name, company name, webinar date, and CTA link. All six fields feed into summary extraction and the AI personalization prompt."
      },
      "typeVersion": 1
    },
    {
      "id": "c79bc7c4-25b1-4022-a4ed-434eaac05608",
      "name": "Section \u2014 WayinVideo Summarization Submit and Poll",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -144,
        -80
      ],
      "parameters": {
        "color": 6,
        "width": 724,
        "height": 356,
        "content": "## WayinVideo Summarization Submit and Poll\nSubmits the webinar URL to the Summarization API. Waits 90 seconds for initial processing. Polls the results endpoint until status equals SUCCEEDED."
      },
      "typeVersion": 1
    },
    {
      "id": "4f1ee529-8e5d-4ec9-8fb5-fc94e80a0aae",
      "name": "Section \u2014 Summary Status Check and Retry Loop",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        608,
        -240
      ],
      "parameters": {
        "color": 6,
        "width": 308,
        "height": 880,
        "content": "## Summary Status Check and Retry Loop\nIF checks for SUCCEEDED status. TRUE proceeds to summary extraction. FALSE waits 30 seconds and polls again. Loop continues until summary is ready."
      },
      "typeVersion": 1
    },
    {
      "id": "fa7c55ac-77fc-4890-8044-9cdb78413fcc",
      "name": "Section \u2014 Summary Extraction and Salesforce Lead Query",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        -112
      ],
      "parameters": {
        "color": 6,
        "width": 420,
        "height": 484,
        "content": "## Summary Extraction and Salesforce Lead Query\nCode node formats summary text, numbered highlights, and all form fields into one clean object. Salesforce SOQL query fetches up to 500 unconverted leads where Webinar_Name__c matches the title."
      },
      "typeVersion": 1
    },
    {
      "id": "8cae0076-4115-4ef6-81c6-0d40dbc166b2",
      "name": "Section \u2014 Per-Lead AI Email Writing",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1424,
        -192
      ],
      "parameters": {
        "color": 6,
        "width": 308,
        "height": 764,
        "content": "## Per-Lead AI Email Writing\nGPT-4o-mini writes a personalized 150\u2013200 word follow-up email per lead \u2014 addressing them by first name, referencing their role and company, and citing 2\u20133 specific webinar highlights."
      },
      "typeVersion": 1
    },
    {
      "id": "638094aa-b097-443b-a400-cb4215fbddfc",
      "name": "Section \u2014 Email Parse, Gmail Send, Salesforce Task Log, and Sheet Log",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1744,
        -64
      ],
      "parameters": {
        "color": 4,
        "width": 964,
        "height": 436,
        "content": "## Email Parse, Gmail Send, Salesforce Task Log, and Sheet Log\nRegex extracts 3 sections. Gmail sends the personalized email. Salesforce creates a completed Task activity on the lead record with WhoId. Google Sheets logs all fields including the Salesforce Task ID."
      },
      "typeVersion": 1
    },
    {
      "id": "e2d0e819-1d71-4740-ac51-e67222ed82af",
      "name": "1. Form \u2014 Webinar URL + Details",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -384,
        80
      ],
      "parameters": {
        "options": {},
        "formTitle": "Webinar Follow-Up Email Generator",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Webinar Recording URL",
              "placeholder": "https://zoom.us/rec/xxxxxxx or YouTube/Vimeo link",
              "requiredField": true
            },
            {
              "fieldLabel": "Webinar Title",
              "placeholder": "e.g. Advanced SEO Strategies for 2025",
              "requiredField": true
            },
            {
              "fieldLabel": "Host / Speaker Name",
              "placeholder": "e.g. John Smith",
              "requiredField": true
            },
            {
              "fieldLabel": "Company / Brand Name",
              "placeholder": "e.g. Incrementors, Acme Corp",
              "requiredField": true
            },
            {
              "fieldLabel": "Webinar Date",
              "placeholder": "e.g. 2025-04-29",
              "requiredField": true
            },
            {
              "fieldLabel": "CTA Link",
              "placeholder": "e.g. https://yoursite.com/book-a-call or https://yoursite.com/course",
              "requiredField": true
            }
          ]
        },
        "formDescription": "Paste your webinar recording URL. AI will summarize the session and automatically send a personalized follow-up email to every registered lead in Salesforce."
      },
      "typeVersion": 2.2
    },
    {
      "id": "821b1ebf-c226-48fa-9d38-ccb950fd4581",
      "name": "2. WayinVideo \u2014 Submit Summarization",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -80,
        80
      ],
      "parameters": {
        "url": "https://wayinvideo-api.wayin.ai/api/v2/summaries",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"video_url\": \"{{ $json['Webinar Recording URL'] }}\",\n  \"target_lang\": \"en\"\n}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "x-wayinvideo-api-version",
              "value": "v2"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "838cbc20-ed3d-4b8c-9426-16286acbbda5",
      "name": "3. Wait \u2014 90 Seconds",
      "type": "n8n-nodes-base.wait",
      "position": [
        176,
        80
      ],
      "parameters": {
        "amount": 90
      },
      "typeVersion": 1.1
    },
    {
      "id": "4fc26272-e812-4c67-aab7-756a711d1831",
      "name": "4. WayinVideo \u2014 Get Summary Results",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        432,
        80
      ],
      "parameters": {
        "url": "=https://wayinvideo-api.wayin.ai/api/v2/summaries/results/{{ $('2. WayinVideo \u2014 Submit Summarization').item.json.data.id }}",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_TOKEN_HERE"
            },
            {
              "name": "x-wayinvideo-api-version",
              "value": "v2"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "3eb4bebb-e378-4e4d-b75a-54582e81c9df",
      "name": "5. IF \u2014 Summary Complete?",
      "type": "n8n-nodes-base.if",
      "position": [
        688,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "status-check",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data.status }}",
              "rightValue": "SUCCEEDED"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "d42bd2ba-dd1f-4563-bed6-7c942ee76a15",
      "name": "6. Wait \u2014 30 Seconds Retry",
      "type": "n8n-nodes-base.wait",
      "position": [
        704,
        336
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "95e82089-f79b-475a-9136-3c6482748327",
      "name": "7. Code \u2014 Extract Summary Data",
      "type": "n8n-nodes-base.code",
      "position": [
        992,
        80
      ],
      "parameters": {
        "jsCode": "// Extract summary data from WayinVideo\nconst summaryData = $('4. WayinVideo \u2014 Get Summary Results').item.json.data;\n\nconst summary = summaryData.summary || '';\nconst highlights = Array.isArray(summaryData.highlights)\n  ? summaryData.highlights.map((h, i) => `${i + 1}. ${h.desc}`).join('\\n')\n  : '';\nconst tags = Array.isArray(summaryData.tags)\n  ? summaryData.tags.join(', ')\n  : '';\n\n// Get form data\nconst webinarTitle = $('1. Form \u2014 Webinar URL + Details').item.json['Webinar Title'];\nconst hostName = $('1. Form \u2014 Webinar URL + Details').item.json['Host / Speaker Name'];\nconst companyName = $('1. Form \u2014 Webinar URL + Details').item.json['Company / Brand Name'];\nconst webinarDate = $('1. Form \u2014 Webinar URL + Details').item.json['Webinar Date'];\nconst ctaLink = $('1. Form \u2014 Webinar URL + Details').item.json['CTA Link'];\nconst recordingUrl = $('1. Form \u2014 Webinar URL + Details').item.json['Webinar Recording URL'];\n\nreturn [{\n  json: {\n    summary,\n    highlights,\n    tags,\n    webinarTitle,\n    hostName,\n    companyName,\n    webinarDate,\n    ctaLink,\n    recordingUrl\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "dbca6458-8621-455b-9ff7-0a593e89fb70",
      "name": "8. Salesforce \u2014 Query Registered Leads",
      "type": "n8n-nodes-base.salesforce",
      "position": [
        1232,
        80
      ],
      "parameters": {
        "operation": "query"
      },
      "typeVersion": 1
    },
    {
      "id": "7adf24b6-39b5-49d4-b62c-4a249d592f60",
      "name": "9. AI Agent \u2014 Write Personalized Email",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1472,
        80
      ],
      "parameters": {
        "text": "=Write a personalized follow-up email for this lead who attended our webinar.\n\nLead Details:\n- First Name: {{ $json.FirstName }}\n- Last Name: {{ $json.LastName }}\n- Email: {{ $json.Email }}\n- Company: {{ $json.Company }}\n- Job Title: {{ $json.Title || 'N/A' }}\n\nWebinar Details:\n- Webinar Title: {{ $('7. Code \u2014 Extract Summary Data').item.json.webinarTitle }}\n- Host: {{ $('7. Code \u2014 Extract Summary Data').item.json.hostName }}\n- Company: {{ $('7. Code \u2014 Extract Summary Data').item.json.companyName }}\n- Date: {{ $('7. Code \u2014 Extract Summary Data').item.json.webinarDate }}\n- CTA Link: {{ $('7. Code \u2014 Extract Summary Data').item.json.ctaLink }}\n- Recording URL: {{ $('7. Code \u2014 Extract Summary Data').item.json.recordingUrl }}\n\nWebinar Summary:\n{{ $('7. Code \u2014 Extract Summary Data').item.json.summary }}\n\nKey Highlights Covered:\n{{ $('7. Code \u2014 Extract Summary Data').item.json.highlights }}\n\n---\n\nWrite a personalized follow-up email following these rules:\n\n1. Address the lead by their first name\n2. Reference 2-3 specific things from the webinar highlights that are relevant to someone in their role or industry\n3. Keep it conversational and warm \u2014 not salesy\n4. Include a clear next step with the CTA link\n5. Include the recording URL so they can rewatch\n6. Total length: 150-200 words \u2014 short and easy to read\n7. End with the host's name as signature\n\nReturn in this exact format:\n\nSUBJECT_LINE:\n[Write subject line \u2014 45-55 chars \u2014 reference the webinar topic]\n\nPERSONALIZED_INTRO:\n[Write 1-2 sentence personalized opening that references their role or company]\n\nEMAIL_BODY:\n[Write the full email body \u2014 150-200 words \u2014 no subject line \u2014 starts with Hi [FirstName],]",
        "options": {},
        "promptType": "define"
      },
      "typeVersion": 3.1
    },
    {
      "id": "cde1f291-2400-4e4c-903f-202b1654b9f4",
      "name": "10. OpenAI \u2014 GPT-4o-mini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1472,
        288
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "typeVersion": 1.3
    },
    {
      "id": "c46582eb-8a20-46f8-acb6-b7fc5dd6a68c",
      "name": "11. Code \u2014 Parse Email Output",
      "type": "n8n-nodes-base.code",
      "position": [
        1792,
        80
      ],
      "parameters": {
        "jsCode": "// Parse AI email output\nconst output = $input.first().json.output || '';\n\n// Extract subject line\nconst subjectMatch = output.match(/SUBJECT_LINE:\\s*([\\s\\S]*?)(?=\\nPERSONALIZED_INTRO:|$)/);\nconst introMatch = output.match(/PERSONALIZED_INTRO:\\s*([\\s\\S]*?)(?=\\nEMAIL_BODY:|$)/);\nconst bodyMatch = output.match(/EMAIL_BODY:\\s*([\\s\\S]*)$/);\n\nconst subjectLine = subjectMatch ? subjectMatch[1].trim() : `Re: ${$('7. Code \u2014 Extract Summary Data').item.json.webinarTitle}`;\nconst personalizedIntro = introMatch ? introMatch[1].trim() : '';\nconst emailBody = bodyMatch ? bodyMatch[1].trim() : output;\n\n// Get lead data\nconst leadId = $('8. Salesforce \u2014 Query Registered Leads').item.json.Id;\nconst leadEmail = $('8. Salesforce \u2014 Query Registered Leads').item.json.Email;\nconst leadFirstName = $('8. Salesforce \u2014 Query Registered Leads').item.json.FirstName;\nconst leadLastName = $('8. Salesforce \u2014 Query Registered Leads').item.json.LastName;\nconst leadCompany = $('8. Salesforce \u2014 Query Registered Leads').item.json.Company;\n\n// Get webinar data\nconst webinarTitle = $('7. Code \u2014 Extract Summary Data').item.json.webinarTitle;\nconst companyName = $('7. Code \u2014 Extract Summary Data').item.json.companyName;\n\nreturn [{\n  json: {\n    subjectLine,\n    personalizedIntro,\n    emailBody,\n    leadId,\n    leadEmail,\n    leadFirstName,\n    leadLastName,\n    leadCompany,\n    webinarTitle,\n    companyName\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "ab398ef0-5332-41fb-b00e-d4a067d220ef",
      "name": "12. Gmail \u2014 Send Follow-Up Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2032,
        80
      ],
      "parameters": {
        "sendTo": "={{ $json.leadEmail }}",
        "message": "={{ $json.emailBody }}",
        "options": {
          "senderName": "={{ $json.companyName }}"
        },
        "subject": "={{ $json.subjectLine }}"
      },
      "typeVersion": 2.1
    },
    {
      "id": "6e604604-3836-4caa-b26c-be282ec1366d",
      "name": "13. Salesforce \u2014 Log Email as Activity",
      "type": "n8n-nodes-base.salesforce",
      "position": [
        2272,
        80
      ],
      "parameters": {
        "additionalFields": {
          "customFieldsUi": {
            "customFieldsValues": [
              {
                "value": "=Webinar Follow-Up Email Sent \u2014 {{ $('11. Code \u2014 Parse Email Output').item.json.webinarTitle }}",
                "fieldId": "Subject"
              },
              {
                "value": "Completed",
                "fieldId": "Status"
              },
              {
                "value": "Normal",
                "fieldId": "Priority"
              },
              {
                "value": "={{ $now.toFormat('yyyy-MM-dd') }}",
                "fieldId": "ActivityDate"
              },
              {
                "value": "=Automated follow-up email sent after webinar: {{ $('11. Code \u2014 Parse Email Output').item.json.webinarTitle }}\\n\\nEmail Subject: {{ $('11. Code \u2014 Parse Email Output').item.json.subjectLine }}\\n\\nSent to: {{ $('11. Code \u2014 Parse Email Output').item.json.leadEmail }}",
                "fieldId": "Description"
              },
              {
                "value": "={{ $('11. Code \u2014 Parse Email Output').item.json.leadId }}",
                "fieldId": "WhoId"
              }
            ]
          }
        }
      },
      "typeVersion": 1
    },
    {
      "id": "8d244d63-cbc1-4610-bd8c-b2d3665c2725",
      "name": "14. Google Sheets \u2014 Log Follow-Up",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2512,
        80
      ],
      "parameters": {
        "columns": {
          "value": {
            "Sent On": "={{ $now.toFormat('dd MMMM yyyy HH:mm') }}",
            "Lead Name": "={{ $('11. Code \u2014 Parse Email Output').item.json.leadFirstName }} {{ $('11. Code \u2014 Parse Email Output').item.json.leadLastName }}",
            "Lead Email": "={{ $('11. Code \u2014 Parse Email Output').item.json.leadEmail }}",
            "Sent Status": "Sent",
            "Lead Company": "={{ $('11. Code \u2014 Parse Email Output').item.json.leadCompany }}",
            "Email Subject": "={{ $('11. Code \u2014 Parse Email Output').item.json.subjectLine }}",
            "Webinar Title": "={{ $('11. Code \u2014 Parse Email Output').item.json.webinarTitle }}",
            "Personalized Intro": "={{ $('11. Code \u2014 Parse Email Output').item.json.personalizedIntro }}",
            "Salesforce Lead ID": "={{ $('11. Code \u2014 Parse Email Output').item.json.leadId }}",
            "Salesforce Task ID": "={{ $json.id }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": []
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "Follow-up Log"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "YOUR_GOOGLE_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    }
  ],
  "connections": {
    "3. Wait \u2014 90 Seconds": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Summary Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5. IF \u2014 Summary Complete?": {
      "main": [
        [
          {
            "node": "7. Code \u2014 Extract Summary Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "6. Wait \u2014 30 Seconds Retry",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6. Wait \u2014 30 Seconds Retry": {
      "main": [
        [
          {
            "node": "4. WayinVideo \u2014 Get Summary Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "11. Code \u2014 Parse Email Output": {
      "main": [
        [
          {
            "node": "12. Gmail \u2014 Send Follow-Up Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "10. OpenAI \u2014 GPT-4o-mini Model": {
      "ai_languageModel": [
        [
          {
            "node": "9. AI Agent \u2014 Write Personalized Email",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "7. Code \u2014 Extract Summary Data": {
      "main": [
        [
          {
            "node": "8. Salesforce \u2014 Query Registered Leads",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1. Form \u2014 Webinar URL + Details": {
      "main": [
        [
          {
            "node": "2. WayinVideo \u2014 Submit Summarization",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "12. Gmail \u2014 Send Follow-Up Email": {
      "main": [
        [
          {
            "node": "13. Salesforce \u2014 Log Email as Activity",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "4. WayinVideo \u2014 Get Summary Results": {
      "main": [
        [
          {
            "node": "5. IF \u2014 Summary Complete?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2. WayinVideo \u2014 Submit Summarization": {
      "main": [
        [
          {
            "node": "3. Wait \u2014 90 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "13. Salesforce \u2014 Log Email as Activity": {
      "main": [
        [
          {
            "node": "14. Google Sheets \u2014 Log Follow-Up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8. Salesforce \u2014 Query Registered Leads": {
      "main": [
        [
          {
            "node": "9. AI Agent \u2014 Write Personalized Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9. AI Agent \u2014 Write Personalized Email": {
      "main": [
        [
          {
            "node": "11. Code \u2014 Parse Email Output",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}