{
  "id": "nBuvaxvgtOYI2xmk",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "2025 Nov - Slack Slash command - check-linkedin - for publication",
  "tags": [
    {
      "id": "1XLW1DVao1oAC5iT",
      "name": "Customer Success",
      "createdAt": "2025-11-15T17:21:00.676Z",
      "updatedAt": "2025-11-15T17:21:00.676Z"
    },
    {
      "id": "1qjph8VqWHRhXnlO",
      "name": "Published",
      "createdAt": "2025-11-15T18:14:39.908Z",
      "updatedAt": "2025-11-15T18:14:39.908Z"
    },
    {
      "id": "6OaASw2bkjvGJYfM",
      "name": "Experimentation",
      "createdAt": "2025-11-15T18:16:11.694Z",
      "updatedAt": "2025-11-15T18:16:11.694Z"
    },
    {
      "id": "rapjVlcQ0SoPnEXg",
      "name": "AI",
      "createdAt": "2025-11-15T18:14:48.492Z",
      "updatedAt": "2025-11-15T18:14:48.492Z"
    }
  ],
  "nodes": [
    {
      "id": "95f47a65-415c-4915-a9b0-fc272958edb1",
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        0,
        0
      ],
      "parameters": {
        "path": "path-placeholder-to-be-replaced-by-your-webhook",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2.1
    },
    {
      "id": "e9e68ae9-d835-4580-a73f-b11c66aac32b",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        1872,
        -96
      ],
      "parameters": {
        "options": {},
        "fieldsToAggregate": {
          "fieldToAggregate": [
            {
              "fieldToAggregate": "posted_at.date"
            },
            {
              "fieldToAggregate": "text"
            }
          ]
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c8643766-8325-495e-8d2c-a02312585c64",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        2272,
        112
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"title\": \"LinkedInPostsAnalysis\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"latest_post_date\",\n    \"most_recent_posts_summary\",\n    \"posting_frequency\",\n    \"top_topics\",\n    \"recent_highlights\",\n    \"data_quality\",\n    \"notes\"\n  ],\n  \"properties\": {\n    \"latest_post_date\": {\n      \"type\": \"string\",\n      \"format\": \"date\",\n      \"description\": \"Exact date of the most recent post, YYYY-MM-DD.\"\n    },\n    \"most_recent_posts_summary\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"description\": \"2\u20134 sentence overview of the latest posts.\"\n    },\n    \"posting_frequency\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"average_days_between_posts\",\n        \"cadence_label\",\n        \"posts_per_month_estimate\"\n      ],\n      \"properties\": {\n        \"average_days_between_posts\": {\n          \"type\": \"number\",\n          \"minimum\": 0\n        },\n        \"cadence_label\": {\n          \"type\": \"string\",\n          \"enum\": [\n            \"~multiple per week\",\n            \"~weekly\",\n            \"~biweekly\",\n            \"~monthly\",\n            \"~every 1\u20132 months\",\n            \"~sporadic\"\n          ]\n        },\n        \"posts_per_month_estimate\": {\n          \"type\": \"number\",\n          \"minimum\": 0\n        }\n      }\n    },\n    \"top_topics\": {\n      \"type\": \"array\",\n      \"minItems\": 3,\n      \"maxItems\": 3,\n      \"items\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"required\": [\"topic\", \"keywords\", \"rationale\"],\n        \"properties\": {\n          \"topic\": {\n            \"type\": \"string\",\n            \"minLength\": 1\n          },\n          \"keywords\": {\n            \"type\": \"array\",\n            \"minItems\": 2,\n            \"maxItems\": 6,\n            \"items\": {\n              \"type\": \"string\",\n              \"minLength\": 1\n            }\n          },\n          \"rationale\": {\n            \"type\": \"string\",\n            \"minLength\": 1\n          }\n        }\n      }\n    },\n    \"recent_highlights\": {\n      \"type\": \"array\",\n      \"minItems\": 2,\n      \"maxItems\": 5,\n      \"items\": {\n        \"type\": \"object\",\n        \"additionalProperties\": false,\n        \"required\": [\"date\", \"summary\", \"why_it_matters\"],\n        \"properties\": {\n          \"date\": {\n            \"type\": \"string\",\n            \"format\": \"date\"\n          },\n          \"summary\": {\n            \"type\": \"string\",\n            \"minLength\": 1\n          },\n          \"why_it_matters\": {\n            \"type\": \"string\",\n            \"minLength\": 1\n          }\n        }\n      }\n    },\n    \"data_quality\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\"num_posts_detected\", \"num_dates_used\", \"date_range\"],\n      \"properties\": {\n        \"num_posts_detected\": {\n          \"type\": \"integer\",\n          \"minimum\": 0\n        },\n        \"num_dates_used\": {\n          \"type\": \"integer\",\n          \"minimum\": 0\n        },\n        \"date_range\": {\n          \"type\": \"object\",\n          \"additionalProperties\": false,\n          \"required\": [\"start\", \"end\"],\n          \"properties\": {\n            \"start\": {\n              \"type\": \"string\",\n              \"format\": \"date\"\n            },\n            \"end\": {\n              \"type\": \"string\",\n              \"format\": \"date\"\n            }\n          }\n        }\n      }\n    },\n    \"notes\": {\n      \"type\": \"string\",\n      \"description\": \"Assumptions, ambiguities, or caveats; empty string if none.\"\n    }\n  }\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "be2accab-b963-4aed-9280-76d427e93597",
      "name": "Summer McBriefing",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        2080,
        -96
      ],
      "parameters": {
        "text": "=Dates:\n{{ $json.date }}\n\nPosts: \n{{ $json.text }}",
        "options": {
          "systemMessage": "You are an analytical assistant that receives:\n1) A list of dates for a single person\u2019s recent LinkedIn posts, and\n2) One aggregated text block containing the corresponding posts with the most recent first.\n\nYour job is to return a concise, factual analysis with:\n- Latest post exact date\n- Brief summary of the received posts\n- Average posting frequency (numeric average days between posts, a cadence label, and a posts-per-month estimate)\n- Exactly three main topics (with keywords and a one-line rationale each)\n- A few recent highlights (date + why it matters)\n- Data quality stats and any notes\n\nRules:\n- Use only provided dates/text; no outside knowledge.\n- Normalize dates to YYYY-MM-DD. If times exist, ignore time-of-day.\n- Frequency: sort dates desc, compute gaps between consecutive dates, average the gaps. If <3 dates, compute with what\u2019s available and note the limitation.\n- Cadence labels:\n  \u22645 \u2192 \"~multiple per week\"\n  6\u201310 \u2192 \"~weekly\"\n  11\u201320 \u2192 \"~biweekly\"\n  21\u201345 \u2192 \"~monthly\"\n  46\u201390 \u2192 \"~every 1\u20132 months\"\n  >90 \u2192 \"~sporadic\"\n- Topics: detect recurring themes; exactly 3 topics, each with 2\u20136 keywords and a one-line rationale.\n- Highlights: focus on last 3\u20135 posts (by date), each with date + significance.\n- If parsing is uncertain, state assumptions in \"notes\".\n\nOutput:\n- Return **ONLY** valid JSON matching the provided JSON Schema. No prose, no extra fields, no nulls. "
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 3
    },
    {
      "id": "853a0068-09e8-4368-a735-a1e149549fc2",
      "name": "HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        2528,
        -96
      ],
      "parameters": {
        "html": "<!DOCTYPE html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Profile Activity Brief</title>\n    <style>\n        /* Reset and General Styles */\n        body { margin: 0; padding: 0; width: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; background-color: #f4f6f8; font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; }\n        table, td { border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; }\n        \n        /* Typography */\n        h1 { font-size: 20px; font-weight: 700; color: #ffffff; margin: 0; }\n        h2 { font-size: 15px; font-weight: 600; color: #34495e; text-transform: uppercase; letter-spacing: 0.5px; margin: 25px 0 10px 0; border-bottom: 1px solid #e0e0e0; padding-bottom: 5px; }\n        h3 { font-size: 16px; font-weight: 600; color: #2c3e50; margin: 0 0 5px 0; }\n        p { font-size: 14px; line-height: 1.6; color: #555555; margin: 0 0 15px 0; }\n        \n        /* Components */\n        .container { max-width: 600px; margin: 0 auto; background-color: #ffffff; border-radius: 8px; overflow: hidden; box-shadow: 0 2px 8px rgba(0,0,0,0.05); }\n        .header { background-color: #2c3e50; padding: 25px 30px; text-align: center; }\n        .subtitle { color: #bdc3c7; font-size: 13px; margin-top: 5px; display: block; text-transform: uppercase; letter-spacing: 1px;}\n        \n        .content { padding: 30px 40px; }\n        \n        /* Stats Grid */\n        .stat-box { background-color: #f8f9fa; border: 1px solid #e9ecef; border-radius: 6px; padding: 12px; text-align: center; width: 30%; }\n        .stat-label { font-size: 10px; text-transform: uppercase; color: #888888; display: block; margin-bottom: 4px; letter-spacing: 0.5px; }\n        .stat-value { font-size: 14px; font-weight: 700; color: #2c3e50; display: block; }\n        \n        /* Quick Scan Tags */\n        .scan-box { background-color: #eef6fc; border: 1px dashed #3498db; border-radius: 6px; padding: 15px; margin-top: 20px; text-align: center; }\n        .scan-title { font-size: 11px; font-weight: 700; text-transform: uppercase; color: #2980b9; display: block; margin-bottom: 8px; }\n        .theme-pill { display: inline-block; background-color: #ffffff; color: #2c3e50; border: 1px solid #d6eaf8; font-size: 12px; font-weight: 600; padding: 4px 10px; border-radius: 15px; margin: 2px; }\n\n        /* Topic Cards */\n        .topic-card { border-left: 4px solid #2c3e50; background-color: #fbfbfb; padding: 15px; margin-bottom: 20px; border-radius: 0 4px 4px 0; }\n        .keywords-line { font-size: 12px; color: #555; margin-top: 8px; display: block; border-top: 1px solid #eee; padding-top: 8px;}\n        .keywords-label { color: #999; font-size: 10px; text-transform: uppercase; font-weight: 700; margin-right: 4px;}\n\n        .footer { background-color: #f4f6f8; padding: 20px; text-align: center; font-size: 11px; color: #999999; }\n    </style>\n</head>\n<body>\n\n    <table role=\"presentation\" width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n        <tr>\n            <td align=\"center\" style=\"padding: 20px 0;\">\n                \n                <!-- Main Container -->\n                <table role=\"presentation\" class=\"container\" width=\"600\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n                    \n                    <!-- Header with Name -->\n                    <tr>\n                        <td class=\"header\">\n                            <h1>{{ $('Extract firstName and lastName').item.json.output.firstName }} {{ $('Extract firstName and lastName').item.json.output.lastName }}</h1>\n                            <span class=\"subtitle\">Profile Activity Brief</span>\n                        </td>\n                    </tr>\n\n                    <!-- Content Body -->\n                    <tr>\n                        <td class=\"content\">\n                            \n                            <!-- Key Stats Row -->\n                            <table role=\"presentation\" width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n                                <tr>\n                                    <td class=\"stat-box\">\n                                        <span class=\"stat-label\">Latest Post</span>\n                                        <span class=\"stat-value\">{{ $json.output.latest_post_date }}</span>\n                                    </td>\n                                    <td width=\"5%\">&nbsp;</td>\n                                    <td class=\"stat-box\">\n                                        <span class=\"stat-label\">Cadence</span>\n                                        <span class=\"stat-value\">{{ $json.output.posting_frequency.cadence_label }}</span>\n                                    </td>\n                                    <td width=\"5%\">&nbsp;</td>\n                                    <td class=\"stat-box\">\n                                        <span class=\"stat-label\">Est. Monthly</span>\n                                        <span class=\"stat-value\">{{ $json.output.posting_frequency.posts_per_month_estimate }}</span>\n                                    </td>\n                                </tr>\n                            </table>\n\n                            <!-- Quick Scan / Focus Areas (Added per request) -->\n                            <div class=\"scan-box\">\n                                <span class=\"scan-title\">Top Focus Areas</span>\n                                <!-- Displaying just the titles of the top 2 topics for quick context -->\n                                <span class=\"theme-pill\">{{ $json.output.top_topics[0].topic }}</span>\n                                <span class=\"theme-pill\">{{ $json.output.top_topics[1].topic }}</span>\n                            </div>\n\n                            <!-- Executive Summary -->\n                            <h2>Recent Activity Summary</h2>\n                            <p>\n                                {{ $json.output.most_recent_posts_summary }}\n                            </p>\n\n                            <!-- Detailed Topics (Hardcoded for 2 items) -->\n                            <h2>Detailed Analysis</h2>\n                            \n                            <!-- TOPIC 1 -->\n                            <div class=\"topic-card\">\n                                <h3>{{ $json.output.top_topics[0].topic }}</h3>\n                                <p style=\"font-size: 13px; margin-bottom: 5px; color: #666;\">\n                                    {{ $json.output.top_topics[0].rationale }}\n                                </p>\n                                <div class=\"keywords-line\">\n                                    <span class=\"keywords-label\">Keywords:</span> \n                                    <!-- n8n will typically render the array as comma-separated text automatically -->\n                                    {{ $json.output.top_topics[0].keywords }}\n                                </div>\n                            </div>\n\n                            <!-- TOPIC 2 -->\n                            <div class=\"topic-card\">\n                                <h3>{{ $json.output.top_topics[1].topic }}</h3>\n                                <p style=\"font-size: 13px; margin-bottom: 5px; color: #666;\">\n                                    {{ $json.output.top_topics[1].rationale }}\n                                </p>\n                                <div class=\"keywords-line\">\n                                    <span class=\"keywords-label\">Keywords:</span> \n                                    {{ $json.output.top_topics[1].keywords }}\n                                </div>\n                            </div>\n\n                        </td>\n                    </tr>\n\n                    <!-- Footer -->\n                    <tr>\n                        <td class=\"footer\">\n                            Generated on {{ $json.output.latest_post_date }}\n                        </td>\n                    </tr>\n\n                </table>\n                <!-- End Main Container -->\n\n            </td>\n        </tr>\n    </table>\n\n</body>\n</html>"
      },
      "typeVersion": 1.2
    },
    {
      "id": "af48e025-998b-4711-aa79-dd2241234a25",
      "name": "Send report via Email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        2736,
        -96
      ],
      "parameters": {
        "sendTo": "admin@example.com",
        "message": "={{ $json.html }}",
        "options": {},
        "subject": "=Recent LinkedIn Activity about {{ $('Get Linkedin Profile URL').item.json.personName }}"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "1a5ff79c-1fe3-4df6-bd1e-2a4c0057c531",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2960,
        -112
      ],
      "parameters": {
        "width": 320,
        "height": 144,
        "content": "## Questions or Feedback?\n\n\ud83d\udce7 emir.belkahia@gmail.com  \n\ud83d\udcbc [linkedin.com/in/emirbelkahia](https://www.linkedin.com/in/emirbelkahia/)"
      },
      "typeVersion": 1
    },
    {
      "id": "38325b74-a6ad-4113-a296-4de8de4462dc",
      "name": "Tell on slack that no full name was found",
      "type": "n8n-nodes-base.slack",
      "position": [
        640,
        336
      ],
      "parameters": {
        "text": "={{ $json.body.text }} is not a full name. Please send a full name to get information.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $json.body.channel_id }}"
        },
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "78626cb3-6788-42c2-9eba-bea75a2fc638",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        544,
        288
      ],
      "parameters": {
        "color": 3,
        "width": 304,
        "height": 320,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Error handling\nNo full name found in the slack command."
      },
      "typeVersion": 1
    },
    {
      "id": "399b976a-3c5a-4f6f-a79f-b6fb356dd61f",
      "name": "GPT 4.1-mini for classification",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        160,
        192
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {},
        "responsesApiEnabled": false
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "fdcd4e6b-6e08-466c-9c06-d8d8517bb50b",
      "name": "Do we have a full name ?",
      "type": "@n8n/n8n-nodes-langchain.textClassifier",
      "position": [
        208,
        0
      ],
      "parameters": {
        "options": {},
        "inputText": "={{ $json.body.text }}",
        "categories": {
          "categories": [
            {
              "category": "full-name",
              "description": "The input text is a full name of a person"
            },
            {
              "category": "not-full-name",
              "description": "The input text is not a full name of a person"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "95d18f4f-c8ee-43ba-88a9-527829a23061",
      "name": "GPT 4.1-mini to extract firstName + lastName",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        640,
        96
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "cc26d2f5-4377-4f78-8f7b-13cae8edeedb",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -960,
        -288
      ],
      "parameters": {
        "width": 880,
        "height": 832,
        "content": "# Slack Slash Command: LinkedIn Profile Recent Activity Summary\n- Run `/check-linkedin [firstName lastName]` in Slack to get an AI-powered brief on someone's LinkedIn activity.\n- Get instant context before outreach or meetings: recent posts, posting patterns, key topics, and engagement insights delivered straight to your inbox. No manual scrolling through profiles needed.\n\n## How it works\n- Type `/check-linkedin` followed by a person's first and last name in any Slack channel\n- Workflow extracts the name and searches LinkedIn via Apify\n- Fetches profile data and recent posts (up to 20)\n- AI analyzes posting frequency, top topics, and recent highlights\n- Structured summary generated via GPT 4.1 with posting cadence and engagement patterns\n- Formatted HTML report sent to your email with profile link and actionable insights\n\n## Setup steps\n- Create a Slack App with `/check-linkedin` slash command via Slack API console\n- Set the slash command Request URL to your n8n webhook endpoint\n- Connect credentials: Slack (chat:write, commands), Apify, Open AI, Gmail\n- Configure two Apify actors: LinkedIn Profile Lookup and LinkedIn Post Scraper\n- Update email recipient in \"Send report via Email\" node\n- Set your Slack workspace ID in error handling nodes\n\n## Customization\n- Name detection: The workflow expects a full name (ideally \"First Last\") format. For LinkedIn URLs or handles, add a conditional branch to parse differently.\n- Post limit: Currently fetches 20 recent posts. Adjust the limit parameter in \"Get recent posts\" node for more/less context.\n- Analysis depth: Modify the JSON schema in \"Structured Output Parser\" to add fields like company mentions, sentiment, or engagement metrics.\n- Cost control:\n  - ApiFy actors have per-run costs. \n  - The output size can be heavy depending on your parameters, so check it carefully to avoid consuming too many summarization tokens in the following OpenAI node."
      },
      "typeVersion": 1
    },
    {
      "id": "0d1bb4d7-213e-4978-bc30-eb54dfdcaa4b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -32,
        -336
      ],
      "parameters": {
        "color": 7,
        "width": 912,
        "height": 1008,
        "content": "## Slack Intake & Command Parsing\nFrom /check-linkedin trigger to the point where you extract a clear First Name and a clear Last Name"
      },
      "typeVersion": 1
    },
    {
      "id": "a5380069-f6e2-45c8-9054-9f82982c75a4",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        -352
      ],
      "parameters": {
        "color": 7,
        "width": 816,
        "height": 496,
        "content": "## Data Gathering via ApiFy\nThe four ApiFy nodes responsible for fetching LinkedIn data:\n- We get the profile URL from the First Name and Last Name\n- Then we scrap the recent posts of this profile URL\n\n\n\ud83d\udcb0 This zone is cost sensitive and dependent on the ApiFy actors that you select \ud83d\udcb0"
      },
      "typeVersion": 1
    },
    {
      "id": "f2439c0b-f6dc-4d35-829d-ee0946c78002",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1824,
        -352
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 768,
        "content": "## Summarization & Intelligence Layer\nConsolidate the raw data and generate a clean, human-readable summary.\n- Merge JSON\n- GPT 4.1 (LLM summarization)\n- Formatter to get a consistent output format\n\n\ud83d\udcb0 Summarization via GPT 4.1 per-call cost \ud83d\udcb0\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a967607c-de2b-4dce-9571-2cb98d48f4ae",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2480,
        -352
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 768,
        "content": "## HTML Output & Response via Email\nFormat in HTML and send the result back via email to the requester."
      },
      "typeVersion": 1
    },
    {
      "id": "69c0d193-2864-45a0-b053-d9ebccea2561",
      "name": "Extract firstName and lastName",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        560,
        -96
      ],
      "parameters": {
        "text": "={{ $json.body.text }}",
        "options": {},
        "attributes": {
          "attributes": [
            {
              "name": "firstName",
              "required": true,
              "description": "First Name of the person"
            },
            {
              "name": "lastName",
              "required": true,
              "description": "Last Name of the person"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "eeae4a59-1f6a-4227-9329-f15d42dbefa5",
      "name": "Get Linkedin Profile URL",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        1200,
        -96
      ],
      "parameters": {
        "offset": {},
        "resource": "Datasets",
        "datasetId": "={{ $json.defaultDatasetId }}"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "b1e5322d-e8c2-43da-b58a-d300a4615968",
      "name": "Find Linkedin Profile",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        992,
        -96
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "url",
          "value": "https://console.apify.com/actors/FbqC9BRstFBddhUqj/input"
        },
        "timeout": {},
        "customBody": "={\n    \"firstName\": \"{{ $json.output.firstName }}\",\n    \"lastName\": \"{{ $json.output.lastName }}\"\n}"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "f82112e5-7c7e-4a82-b5ab-5291971ea83d",
      "name": "Scrap what this person posted recently",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        1408,
        -96
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "url",
          "value": "https://console.apify.com/actors/r4oNX7IHlW4RQAjKP"
        },
        "timeout": {},
        "customBody": "={\n    \"usernames\": [\n        \"{{ $json.linkedinProfileUrl }}\"\n    ]\n}"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "c43e8ab6-e80f-40f6-9f1d-05578ae31ed4",
      "name": "Structure recent posts",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        1600,
        -96
      ],
      "parameters": {
        "limit": 20,
        "offset": {},
        "resource": "Datasets",
        "datasetId": "={{ $json.defaultDatasetId }}"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "db0f0a46-4a09-493c-ae47-a68de7477131",
      "name": "GPT 4.1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        2000,
        112
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1",
          "cachedResultName": "gpt-4.1"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "644f0556-3a48-4e63-b80b-54c724c30cf4",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -960,
        592
      ],
      "parameters": {
        "color": 6,
        "width": 880,
        "height": 576,
        "content": "# \ud83c\udf99\ufe0f Video Walkthrough\n@[youtube](-4VwNYsOIPc)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a5903b61-eb44-4418-a26b-75e1a3b983a9",
  "connections": {
    "HTML": {
      "main": [
        [
          {
            "node": "Send report via Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GPT 4.1": {
      "ai_languageModel": [
        [
          {
            "node": "Summer McBriefing",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Do we have a full name ?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate": {
      "main": [
        [
          {
            "node": "Summer McBriefing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summer McBriefing": {
      "main": [
        [
          {
            "node": "HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find Linkedin Profile": {
      "main": [
        [
          {
            "node": "Get Linkedin Profile URL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structure recent posts": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Do we have a full name ?": {
      "main": [
        [
          {
            "node": "Extract firstName and lastName",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Tell on slack that no full name was found",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Linkedin Profile URL": {
      "main": [
        [
          {
            "node": "Scrap what this person posted recently",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "Summer McBriefing",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Extract firstName and lastName": {
      "main": [
        [
          {
            "node": "Find Linkedin Profile",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GPT 4.1-mini for classification": {
      "ai_languageModel": [
        [
          {
            "node": "Do we have a full name ?",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Scrap what this person posted recently": {
      "main": [
        [
          {
            "node": "Structure recent posts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GPT 4.1-mini to extract firstName + lastName": {
      "ai_languageModel": [
        [
          {
            "node": "Extract firstName and lastName",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    }
  }
}