{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "5a367261-b56f-49f7-a447-43f82af7c428",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -832,
        144
      ],
      "parameters": {
        "color": 7,
        "width": 696,
        "height": 917,
        "content": "## Research meeting attendees and prepare daily agenda in Slack\n\nThis workflow automatically researches your meeting attendees every morning and sends you a comprehensive brief in Slack with context about who you're meeting, their company, and key talking points.\n\n### Who's it for\n- Sales professionals who need quick context before meetings\n- Executives with packed calendars who need meeting preparation\n- Customer success teams managing multiple client relationships\n- Anyone who wants to be better prepared for their daily meetings\n\n### How it works\n1. **Daily Trigger**: Runs every weekday morning at 6 AM to analyze your calendar\n2. **Calendar Analysis**: Fetches all meetings for the day from Google Calendar\n3. **Attendee Research**: For each external meeting:\n   - Searches your CRM (Attio) for existing contact information\n   - Uses AI to research attendees via web search, Gmail history, and past meetings\n   - Searches company information via Apollo.io\n   - Creates new CRM records if contacts don't exist\n4. **Brief Generation**: Compiles all research into a scannable meeting brief\n5. **Slack Delivery**: Sends formatted brief to your designated Slack channel\n\n### Setup Requirements\n- Google Calendar access (OAuth2)\n- Slack workspace with bot permissions\n- Attio CRM account (optional - for contact management)\n- Apollo.io API access (optional - for company research)\n- OpenRouter API key for AI processing\n- Gmail access for email history search\n\n### How to customize\n1. **Adjust Schedule**: Change the Schedule Trigger to your preferred time\n2. **Modify Research Tools**: Add or remove research sources based on your needs\n3. **Customize Output Format**: Edit the formatting prompt in \"Format Daily Meeting Brief\"\n4. **Change Delivery Method**: Replace Slack with email, Teams, or another channel"
      },
      "typeVersion": 1
    },
    {
      "id": "2409b8bd-2305-41fa-82f1-a97e68d9df43",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "notes": "Runs Monday-Friday at 6 AM",
      "position": [
        192,
        576
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 6 * * 1-5"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 1.2
    },
    {
      "id": "19c5762b-ed9e-47db-80d7-0806c772a2a2",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        304,
        352
      ],
      "parameters": {
        "width": 383.52941176470586,
        "height": 145.88235294117646,
        "content": "### Step 1: Calendar Integration\nFetches today's meetings from your Google Calendar. The workflow filters for external meetings (those with attendees other than yourself)."
      },
      "typeVersion": 1
    },
    {
      "id": "edb6a777-cc4d-4326-9418-6b311a69e3dd",
      "name": "Filter External Meetings",
      "type": "n8n-nodes-base.filter",
      "notes": "Keep only events with attendees",
      "position": [
        640,
        576
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "filter-external",
              "operator": {
                "type": "array",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.attendees }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2,
      "alwaysOutputData": true
    },
    {
      "id": "2f8d687c-ce54-4a8b-93d9-86ca545fcdd7",
      "name": "Has External Meetings?",
      "type": "n8n-nodes-base.if",
      "position": [
        864,
        576
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "has-meetings",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "a9b3151a-62f3-4b74-b590-62ce0381c755",
      "name": "No Meetings Message",
      "type": "n8n-nodes-base.slack",
      "position": [
        1072,
        768
      ],
      "parameters": {
        "text": "Good morning! No external meetings scheduled for today. Enjoy your focus time!",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "="
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "9404e80f-e34f-4160-bbad-b96e8526d0b1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1184,
        192
      ],
      "parameters": {
        "width": 612.3529411764707,
        "height": 232.94117647058826,
        "content": "### Step 2: AI Research\nFor each meeting, the AI agent researches attendees using multiple sources:\n- Web search for recent news\n- Gmail history for past interactions\n- Calendar for previous meetings\n- CRM for existing contact info\n- Apollo.io for company data"
      },
      "typeVersion": 1
    },
    {
      "id": "001125d5-7aac-4aa3-a3d3-42b1f660b557",
      "name": "Split Events for Individual Processing",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1088,
        480
      ],
      "parameters": {
        "include": "allOtherFields",
        "options": {},
        "fieldToSplitOut": "id"
      },
      "typeVersion": 1
    },
    {
      "id": "f815d71c-0f8b-4221-a980-da233b22eb79",
      "name": "AI Agent - Meeting Research",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1568,
        496
      ],
      "parameters": {
        "text": "=You are a meeting preparation assistant. Analyze this meeting and prepare comprehensive research:\n\nMeeting Details:\n- Summary: {{ $json.summary }}\n- Start: {{ $json.start.dateTime }}\n- End: {{ $json.end.dateTime }}\n- Attendees: {{ $json.attendees.filter(a => a.email !== $('User Configuration').item.json.user_email).map(a => a.email).join(', ') }}\n\nYour tasks:\n1. Research each attendee using the available tools\n2. Identify the company they work for and research the company\n3. Find any previous interactions or context\n4. Prepare key talking points and questions\n5. Identify potential goals and outcomes for this meeting\n\nProvide a comprehensive meeting preparation report.",
        "options": {
          "systemMessage": "You are an expert meeting preparation assistant with access to CRM, email, calendar, and company research tools. Your goal is to help the user be fully prepared for their upcoming meetings by providing comprehensive research and context."
        },
        "promptType": "define"
      },
      "typeVersion": 2.2
    },
    {
      "id": "9fcd10f0-3300-4a7a-8f94-21b0a237db87",
      "name": "OpenRouter Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        1312,
        720
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "42f7e6c1-6b51-42b6-af8c-cf46c4d91d94",
      "name": "Search Gmail History",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        1568,
        720
      ],
      "parameters": {
        "simple": "={{ $fromAI('Simplify', '', 'boolean') }}",
        "filters": {
          "q": "={{ $fromAI('Search', '', 'string') }}"
        },
        "options": {},
        "operation": "getAll",
        "returnAll": "={{ $fromAI('Return_All', '', 'boolean') }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "be673ca9-f382-4b12-b7ec-ff562dcebde7",
      "name": "Web Search Tool",
      "type": "n8n-nodes-base.httpRequestTool",
      "onError": "continueRegularOutput",
      "position": [
        1696,
        720
      ],
      "parameters": {
        "url": "https://api.anthropic.com/v1/messages",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $fromAI('JSON', '{\"model\": \"claude-sonnet-4-20250514\", \"max_tokens\": 1024, \"messages\": [{\"role\": \"user\", \"content\": \"{web_search_question}\"}], \"tools\": [{\"type\": \"web_search_20250305\", \"name\": \"web_search\", \"max_uses\": 5}]}', 'json') }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "toolDescription": "Searches the internet for current information. Use for finding recent news, press releases, blog posts, and other public information about the company or person.",
        "headerParameters": {
          "parameters": [
            {
              "name": "anthropic-version",
              "value": "2023-06-01"
            },
            {
              "name": "content-type",
              "value": "application/json"
            }
          ]
        },
        "nodeCredentialType": "anthropicApi"
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "832369d1-242f-4a81-bc94-0de71425ed2e",
      "name": "Search Attio CRM",
      "type": "n8n-nodes-base.httpRequestTool",
      "position": [
        1824,
        720
      ],
      "parameters": {
        "url": "https://api.attio.com/v2/objects/people/records/query",
        "method": "POST",
        "options": {},
        "jsonBody": "={\"filter\": {\"email_addresses\": \"{{ $fromAI('single_email_address', 'Email address to find', 'string') }}\"}, \"limit\": 1, \"offset\": 0}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "toolDescription": "Search CRM for information on a person by email address",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "31aeddca-5379-4b25-8393-84258b49e3bc",
      "name": "Search Apollo Company Data",
      "type": "n8n-nodes-base.httpRequestTool",
      "onError": "continueRegularOutput",
      "position": [
        1952,
        720
      ],
      "parameters": {
        "url": "https://api.apollo.io/api/v1/mixed_companies/search",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $fromAI('JSON', '', 'json') }}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "toolDescription": "Retrieves company data including industry, employee count, revenue, and technologies used",
        "headerParameters": {
          "parameters": [
            {
              "name": "Cache-Control",
              "value": "no-cache"
            },
            {
              "name": "accept",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "182e4b7c-0b87-4ee3-9d17-85751bb71c0d",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2400,
        144
      ],
      "parameters": {
        "width": 370.58823529411774,
        "height": 176.47058823529412,
        "content": "### Step 3: CRM Integration\nFor each attendee:\n- Check if they exist in your CRM\n- Create new contact records if needed\n- Add meeting preparation notes to their profile"
      },
      "typeVersion": 1
    },
    {
      "id": "a052e367-d9c3-412a-be03-2ec28f0bafe6",
      "name": "Clean Meeting Research Content",
      "type": "n8n-nodes-base.code",
      "position": [
        2160,
        496
      ],
      "parameters": {
        "jsCode": "const items = $input.all();\n\nreturn items.map((item, index) => {\n  let content = item.json.markdown_content || item.json.output || item.json.content || '';\n  \n  content = content.replace(/\"/g, '');\n  content = content.replace(/'/g, '');\n  content = content.replace(/\\r\\n/g, '\\n');\n  content = content.replace(/\\r/g, '\\n');\n  content = content.trim();\n  content = content.split(/\\n/).map(line => line.trim()).join('\\n');\n  content = content.replace(/\\n\\s*\\n\\s*\\n/g, '\\n\\n');\n  \n  return {\n    json: {\n      ...item.json,\n      cleaned_content: content\n    },\n    pairedItem: { item: index }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "62579c3f-9b3d-4345-b96b-8a13e31690f8",
      "name": "Extract External Attendees",
      "type": "n8n-nodes-base.set",
      "position": [
        2384,
        336
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "22f8e8d1-b14f-47f5-ab45-4cfad5d27bbc",
              "name": "attendees",
              "type": "array",
              "value": "={{ $('Split Events for Individual Processing').item.json.attendees.filter(a => a.email !== $('User Configuration').item.json.user_email) }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "b237a783-5952-42be-9773-5941d837d556",
      "name": "Split Attendees for CRM Check",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        2672,
        336
      ],
      "parameters": {
        "include": "allOtherFields",
        "options": {},
        "fieldToSplitOut": "attendees"
      },
      "typeVersion": 1
    },
    {
      "id": "2d9f8608-8a4a-473f-b55f-c7fa191d162b",
      "name": "Find Person in Attio",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2960,
        336
      ],
      "parameters": {
        "url": "https://api.attio.com/v2/objects/people/records/query",
        "method": "POST",
        "options": {},
        "jsonBody": "={\"filter\": {\"email_addresses\": \"{{ $json.attendees.email }}\"}, \"limit\": 1, \"offset\": 0}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "4222a379-96ff-4e54-ad0d-b65431964300",
      "name": "Person Exists in CRM?",
      "type": "n8n-nodes-base.if",
      "position": [
        3184,
        336
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "person-exists",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.data[0].id.record_id }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "562e986a-6880-4c91-88c5-aa48947d72ef",
      "name": "Create Person Record",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3408,
        416
      ],
      "parameters": {
        "url": "https://api.attio.com/v2/objects/people/records",
        "method": "POST",
        "options": {},
        "jsonBody": "={\"data\": {\"values\": {\"email_addresses\": [{\"email_address\": \"{{ $json.attendees.email }}\"}]}}}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "2f21cf2b-dda2-4cba-a364-d0a85d0c2532",
      "name": "Merge CRM Results",
      "type": "n8n-nodes-base.merge",
      "position": [
        3632,
        336
      ],
      "parameters": {},
      "typeVersion": 3.2
    },
    {
      "id": "f368504d-7fd3-4cef-af4b-5bb5bd80e4b1",
      "name": "Create Note on Person",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3856,
        336
      ],
      "parameters": {
        "url": "https://api.attio.com/v2/notes",
        "method": "POST",
        "options": {},
        "jsonBody": "={\"data\": {\"parent_object\": \"people\", \"parent_record_id\": \"{{ $json.data[0].id.record_id }}\", \"title\": \"Meeting Prep\", \"content\": \"{{ $('Clean Meeting Research Content').item.json.cleaned_content.replaceAll('\\n','\\\\n') }}\", \"format\": \"markdown\"}}",
        "sendBody": true,
        "sendHeaders": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "222c778d-75e7-469e-8fd8-482f644726e5",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2848,
        800
      ],
      "parameters": {
        "width": 370.58823529411774,
        "height": 137.6470588235294,
        "content": "### Step 4: Brief Generation & Delivery\nAll research is compiled into a formatted meeting brief and sent to your Slack channel"
      },
      "typeVersion": 1
    },
    {
      "id": "5cb71809-ea9b-49e4-a031-e151edf05981",
      "name": "Aggregate Research Results",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        2384,
        640
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "output"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "87e79d10-28e4-46a4-8e77-c13d4f034af2",
      "name": "Format Daily Meeting Brief",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        2608,
        640
      ],
      "parameters": {
        "text": "=Create a scannable meeting brief for my meetings today. I have {{ $json.output.length }} meetings.\n\nFor EACH meeting, use this EXACT format:\n\n*[TIME] Meeting Title*\n*Who:* [Name, Company/Role]\n*Purpose:* [2-5 sentences - why this meeting matters]\n*Key Context:* [1-2 critical facts about them/company]\n*Action:* [Your main goal for this meeting]\n*Watch For:* [One thing to pay attention to]\n\nRules:\n- Focus only on actionable intelligence\n- Be extremely concise\n- No introductions or conclusions\n\nMeeting data:\n{{ $json.output.map((m, i) => `\\n========== MEETING ${i + 1} ==========\\n${JSON.stringify(m, null, 2)}\\n========== END MEETING ${i + 1} ==========\\n`).join('\\n\\n') }}",
        "batching": {},
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "2c5ecb97-be42-4747-8389-27c58c0426f6",
      "name": "OpenRouter Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
      "position": [
        2688,
        864
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openRouterApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "049bb3cf-26ac-4c2e-88cf-60f0f5de1111",
      "name": "Send Daily Brief to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        2960,
        640
      ],
      "parameters": {
        "text": "={{ $json.text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "="
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "4c574d01-0175-442b-8dd2-292d03831a4f",
      "name": "Get many events",
      "type": "n8n-nodes-base.googleCalendar",
      "position": [
        400,
        576
      ],
      "parameters": {
        "options": {},
        "timeMax": "={{ $today.plus({ day: 1 }) }}",
        "timeMin": "={{ $today }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "user@example.com",
          "cachedResultName": "OneTwo Growth Studio"
        },
        "operation": "getAll"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "87459aa2-afa3-4597-939c-97b30a0aa2f8",
      "name": "Get many events in Google Calendar",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        1440,
        800
      ],
      "parameters": {
        "limit": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Limit', ``, 'number') }}",
        "options": {},
        "timeMax": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Before', ``, 'string') }}",
        "timeMin": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('After', ``, 'string') }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "operation": "getAll"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    }
  ],
  "connections": {
    "Get many events": {
      "main": [
        [
          {
            "node": "Filter External Meetings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Web Search Tool": {
      "ai_tool": [
        [
          {
            "node": "AI Agent - Meeting Research",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get many events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Attio CRM": {
      "ai_tool": [
        [
          {
            "node": "AI Agent - Meeting Research",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Merge CRM Results": {
      "main": [
        [
          {
            "node": "Create Note on Person",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Person Record": {
      "main": [
        [
          {
            "node": "Merge CRM Results",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Find Person in Attio": {
      "main": [
        [
          {
            "node": "Person Exists in CRM?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Gmail History": {
      "ai_tool": [
        [
          {
            "node": "AI Agent - Meeting Research",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent - Meeting Research",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Person Exists in CRM?": {
      "main": [
        [
          {
            "node": "Merge CRM Results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Create Person Record",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has External Meetings?": {
      "main": [
        [
          {
            "node": "Split Events for Individual Processing",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Meetings Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenRouter Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Format Daily Meeting Brief",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Filter External Meetings": {
      "main": [
        [
          {
            "node": "Has External Meetings?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Research Results": {
      "main": [
        [
          {
            "node": "Format Daily Meeting Brief",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract External Attendees": {
      "main": [
        [
          {
            "node": "Split Attendees for CRM Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Daily Meeting Brief": {
      "main": [
        [
          {
            "node": "Send Daily Brief to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search Apollo Company Data": {
      "ai_tool": [
        [
          {
            "node": "AI Agent - Meeting Research",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent - Meeting Research": {
      "main": [
        [
          {
            "node": "Clean Meeting Research Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Attendees for CRM Check": {
      "main": [
        [
          {
            "node": "Find Person in Attio",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clean Meeting Research Content": {
      "main": [
        [
          {
            "node": "Extract External Attendees",
            "type": "main",
            "index": 0
          },
          {
            "node": "Aggregate Research Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many events in Google Calendar": {
      "ai_tool": [
        [
          {
            "node": "AI Agent - Meeting Research",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Split Events for Individual Processing": {
      "main": [
        [
          {
            "node": "AI Agent - Meeting Research",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}