In today’s fast-paced sales environment, preparing for client meetings can make the difference between closing a deal and missing an opportunity. Imagine entering every sales meeting fully prepared with the latest client interactions, their recent LinkedIn activities, and a personalised meeting agenda, all delivered directly to your WhatsApp moments before the meeting starts.
This isn’t science fiction. It’s what’s possible when you combine n8n’s workflow automation platform with Wassenger’s WhatsApp API and artificial intelligence. Let me show you how to build a sales meeting preparation assistant that delivers comprehensive meeting briefs directly to your WhatsApp, no coding required.
🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥
Why Automate Sales Meeting Prep on WhatsApp?
Sales professionals spend hours each week preparing for meetings, time better spent engaging with prospects or closing deals. By automating this preparation process and delivering insights via WhatsApp, you can:
- Access critical information on the go, right where your conversations already happen
- Receive timely reminders with context about who you’re meeting
- Never miss important details about previous interactions
- Impress clients with your thorough knowledge of their recent activities
WhatsApp is the perfect channel for this automation because of its ubiquity and reliability. With Wassenger’s powerful WhatsApp API integration, you can transform this familiar messaging app into a sophisticated business tool without the friction or approval delays associated with other business messaging platforms.
Building Your Sales Meeting Assistant with n8n and Wassenger
Let’s walk through how to build this powerful sales meeting preparation assistant step by step:
What You’ll Need
Before you start building your sales meeting preparation automation, make sure you have the following prerequisites in place:
- A Wassenger account: Sign up for a 7-day free trial (no credit card required)
- An n8n account (self-hosted). A cloud-hosted version will be released soon within the Wassenger app
- The n8n-nodes-wassenger integration: Install this community node to connect n8n with Wassenger
- A Google Calendar account: To track and monitor your upcoming meetings
- A Gmail account: For accessing email correspondence with attendees
- An APIFY account: For LinkedIn profile scraping (free tier available with 5 USD monthly credit)
- An OpenAI API key: For AI-powered meeting brief generation
- A WhatsApp number: Connected to your Wassenger account for receiving notifications
Step 1: Set Up Your Hourly Meeting Check
Start by adding a Schedule Trigger node to your n8n workflow, configuring it to run hourly. Connect it to a Google Calendar node to fetch upcoming meetings in the next hour. This creates the backbone of your automation — a system that regularly checks for upcoming meetings.
Step 2: Extract Attendee Information
Add an Information Extractor node to parse meeting details and extract attendee information. Set up the schema to capture names, email addresses, and LinkedIn URLs. This transforms raw meeting data into structured attendee information.
🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥
Step 3: Gather Context from Multiple Sources
For each attendee, gather valuable context:
For email correspondence, add a Gmail node to find recent emails from each attendee.
For LinkedIn activity, add an APIFY web scraping node to capture recent posts, comments, and profile updates.
Step 4: Generate AI-Powered Meeting Briefs
Add an OpenAI node to transform all this data into actionable insights. Feed it the meeting details, email correspondence, and LinkedIn activity. The AI will generate a personalised brief highlighting the most relevant points for your upcoming meeting.
Step 5: Deliver Insights via WhatsApp
Add a Wassenger node to deliver this information directly to your WhatsApp. With Wassenger’s reliable WhatsApp API, you’ll receive these insights instantly, with no need for complex WhatsApp Business Account setup or approval processes.
Find the complete workflow below
{ "name": "Meeting Prep with AI", "nodes": [ { "parameters": { "operation": "get", "messageId": "={{ $json.id }}", "simple": false, "options": {} }, "id": "454b7414-9c7a-4122-88bb-94a0fa3e4cd1", "name": "Get Message Contents", "type": "n8n-nodes-base.gmail", "position": [ 2340, 1180 ], "webhookId": "fa1d496f-17fa-4e50-bae9-84ca85ed4502", "typeVersion": 2.1 }, { "parameters": { "assignments": { "assignments": [ { "id": "2006c806-42db-4457-84c2-35f59ed39018", "name": "date", "type": "string", "value": "={{ $json.date }}" }, { "id": "872278d2-b97c-45ba-a9d3-162f154fe7dc", "name": "subject", "type": "string", "value": "={{ $json.subject }}" }, { "id": "282f03e9-1d0f-4a17-b9ed-75b44171d4ee", "name": "text", "type": "string", "value": "={{ $json.text }}" }, { "id": "9421776c-ff53-4490-b0e1-1e610534ba25", "name": "from", "type": "string", "value": "={{ $json.from.value[0].name }} ({{ $json.from.value[0].address }})" }, { "id": "3b6716e8-5582-4da3-ae9d-e8dd1afad530", "name": "to", "type": "string", "value": "={{ $json.to.value[0].name }} ({{ $json.to.value[0].address }})" } ] }, "options": {} }, "id": "59498c7c-e791-4499-b2d4-b394b39d1bf5", "name": "Simplify Emails", "type": "n8n-nodes-base.set", "position": [ 2500, 1180 ], "typeVersion": 3.4 }, { "parameters": { "operation": "getAll", "calendar": { "__rl": true, "mode": "list", "value": "c_5792bdf04bc395cbcbc6f7b754268245a33779d36640cc80a357711aa2f09a0a@group.calendar.google.com", "cachedResultName": "n8n-events" }, "limit": 1, "options": { "timeMin": "={{ $now.toUTC() }}", "timeMax": "={{ $now.toUTC().plus(1, 'hour') }}", "singleEvents": true, "orderBy": "startTime" } }, "id": "95e26e4c-0eb9-468b-af0a-2f033027ed40", "name": "Check For Upcoming Meetings", "type": "n8n-nodes-base.googleCalendar", "position": [ 800, 500 ], "typeVersion": 1.2 }, { "parameters": { "model": "gpt-4o-2024-08-06", "options": {} }, "id": "2bd19c53-327d-460b-9231-61688a2ee6b7", "name": "OpenAI Chat Model2", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 1180, 660 ], "typeVersion": 1 }, { "parameters": { "text": "=start: {{ $json.start.dateTime }}\nmeeting url: {{ $json.hangoutLink }}\nsummary: {{ $json.summary }}\ndescription: {{ $json.description }}\norganiser: {{ $json.organizer.displayName }} ({{ $json.organizer.email }})\nattendees: {{ $json.attendees.filter(item => !item.organizer).map(item => item.email).join(',') }}", "schemaType": "manual", "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"attendees\": {\n \"type\": \"array\",\n \"description\": \"list of attendees excluding the meeting organiser\",\n \"items\": {\n\t\t\t\"type\": \"object\",\n\t\t\t\"properties\": {\n\t\t\t \"name\": { \"type\": \"string\" },\n \"email\": { \"type\": \"string\" },\n \"linkedin_url\": { \"type\": \"string\" }\n\t\t\t}\n }\n\t\t}\n\t}\n}", "options": { "systemPromptTemplate": "You are an expert extraction algorithm. Try to link any information found in the description to help fill in the attendee details.\nIf you do not know the value of an attribute asked to extract, you may omit the attribute's value." } }, "id": "93864a7d-83ca-45ad-adf3-c0cafedcfea7", "name": "Extract Attendee Information", "type": "@n8n/n8n-nodes-langchain.informationExtractor", "position": [ 1180, 500 ], "typeVersion": 1 }, { "parameters": {}, "id": "ec3883e6-6264-45a9-a3c9-38959e801d79", "name": "Execute Workflow Trigger", "type": "n8n-nodes-base.executeWorkflowTrigger", "position": [ 1180, 1260 ], "typeVersion": 1 }, { "parameters": { "model": "gpt-4o-2024-08-06", "options": {} }, "id": "2cd501f3-cd47-4332-9ebe-1dcd37a5b9bb", "name": "OpenAI Chat Model", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 2720, 1320 ], "typeVersion": 1 }, { "parameters": { "operation": "getAll", "limit": 1, "filters": { "sender": "={{ $json.email }}" } }, "id": "2311372f-5eb4-458b-8386-06659b6211dc", "name": "Get Last Correspondence", "type": "n8n-nodes-base.gmail", "position": [ 2000, 1180 ], "webhookId": "b00c960c-3689-4fa1-9f0f-7d6c9479f0c6", "typeVersion": 2.1, "alwaysOutputData": true }, { "parameters": { "model": "gpt-4o-2024-08-06", "options": {} }, "id": "afca4aec-5e18-4037-8fd3-ae5ccde1f344", "name": "OpenAI Chat Model1", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 4280, 2000 ], "typeVersion": 1 }, { "parameters": { "model": "gpt-4o-2024-08-06", "options": {} }, "id": "957b38f1-df4f-46ee-9077-2a5edbfd90ee", "name": "OpenAI Chat Model3", "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi", "position": [ 2980, 660 ], "typeVersion": 1 }, { "parameters": { "content": "## 1. Periodically Search For Upcoming Meetings\n[Read about the Scheduled Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.scheduletrigger)\\n\\nLet's use the Scheduled Trigger node to trigger our Assistant to notify about upcoming meetings. Here, we'll set it for 1 hour intervals to check for meetings scheduled in our Google Calendar. You may need to play with the intervals and frequency depending on how many meetings you typically have.", "height": 449.1424626006906, "width": 616.7897454470152, "color": 7 }, "id": "ece0166e-2ac7-43ab-bae6-41cab0e90574", "name": "Sticky Note", "type": "n8n-nodes-base.stickyNote", "position": [ 440, 280 ], "typeVersion": 1 }, { "parameters": { "rule": { "interval": [ { "field": "hours" } ] } }, "id": "3d46be63-1a03-4641-a901-557f2d258f49", "name": "Schedule Trigger", "type": "n8n-nodes-base.scheduleTrigger", "position": [ 600, 500 ], "typeVersion": 1.2 }, { "parameters": { "content": "## 2. Extract Attendee Details From Invite\n[Learn more about the Information Extractor node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.information-extractor/)\\n\\nOnce we have our upcoming meeting, it'll be nice to prepare for it by reminding the user what the meeting is about and some context with the attendees. This will be the goal this template and of our assistant! However, first we'll need to extract some contact information of the attendees to do so.\n\nFor this demonstration, we'll assume that attendee's email and LinkedIn profile URLs are included in the meeting invite. We'll extract this information for each attendee using the Information Extractor node. This convenient node uses AI to parse and extract which saves us from writing complex pattern matching code otherwise.\n\nIn your own scenario, feel free to use your CRM to get this information instead.", "height": 670.4114154200236, "width": 655.5654775604146, "color": 7 }, "id": "f573e300-c5aa-4511-ab98-e80b567317f5", "name": "Sticky Note1", "type": "n8n-nodes-base.stickyNote", "position": [ 1080, 160 ], "typeVersion": 1 }, { "parameters": { "content": "## 3. Fetch Recent Correspondance & LinkedIn Activity\n[Learn more about the Execute Workflow node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflow)\\n\\nAs both email fetching and LinkedIn scraping actions are quite complex, we'll split them out as subworkflow executions. Doing so (in my honest opinion), helps with development and maintainability of the template. Here, we'll make perform the research for all applicable attendees by making 2 calls to the subworkflow and merging them back into a single node at the end.\n\nHead over to the subworkflow (see below - step 3a) to see how we pull the summaries from Gmail and LinkedIn.", "height": 670.8210817031078, "width": 1020.0959898041108, "color": 7 }, "id": "ea0acab2-4567-4a77-ae20-20c9ab0d9fe5", "name": "Sticky Note2", "type": "n8n-nodes-base.stickyNote", "position": [ 1760, 160 ], "typeVersion": 1 }, { "parameters": { "content": "## 4. Generate Pre-Meeting Notification\n[Read more about the Basic LLM node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm)\\n\\nNow that we have (1) our upcoming meeting details and (2) recent email and/or Linkedin summaries about our attendee, let's feed them into our LLM node to generate the best pre-meeting notification ever seen! Of course, we'll need to keep it short as we intend to send this notification via WhatsApp message but should you choose to use another channel such as email, feel free to adjust the length of the message which suits.", "height": 582.1201380897592, "width": 610.3630186140072, "color": 7 }, "id": "016f625c-38ac-408f-b34a-7cebff1588e3", "name": "Sticky Note3", "type": "n8n-nodes-base.stickyNote", "position": [ 2820, 240 ], "typeVersion": 1 }, { "parameters": { "content": "## 5. Send Notification via WhatsApp\n\nThe [Wassenger](https://wassenger.com/) node is a super convenient way to send messages to WhatsApp which is one of the many messaging apps supported by n8n out of the box.", "height": 454.24485615650235, "width": 466.8967433831988, "color": 7 }, "id": "9e6a6573-7d9f-4696-bb54-7e88a50fe936", "name": "Sticky Note4", "type": "n8n-nodes-base.stickyNote", "position": [ 3440, 320 ], "typeVersion": 1 }, { "parameters": { "content": "## 3.2: Fetch Last Email Correspondance\n[Learn more about Gmail node](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.gmail)\\n\\nFetching our attendee's last email will definitely help the user \"pick up\" from when they last last off. To do this, we'll assume a Gmail user and use the Gmail node to filter messages by the attendee's email address.", "height": 190.5042226526524, "width": 519.1145893777881, "color": 7 }, "id": "e8c34fcb-3d40-4729-a94d-da49d1f72d5f", "name": "Sticky Note5", "type": "n8n-nodes-base.stickyNote", "position": [ 2000, 940 ], "typeVersion": 1 }, { "parameters": { "content": "## 3.4 Scraping LinkedIn With [Apify.com](https://www.apify.com?fpr=414q6)\\n\[Learn more about Apify.com for Web Scraping](https://www.apify.com?fpr=414q6)\\n\\nTo get the attendee's recent LinkedIn activity, we'll need a webscraper capable of rendering the user's LinkedIn profile. We'll use [Apify.com](https://www.apify.com?fpr=414q6) which is a commercial web scraping service but has a very generous monthly free tier ($5/mo).\n\nWhile Apify offers a number of dedicated LinkedIn scrapers, we'll build our own which works by impersonating our own LinkedIn account using our login cookie - this can be obtained by inspecting network requests when logged into Linkedin. **Add your LinkedIn Cookie to the node below!**", "height": 259.7914017217902, "width": 667.8619481635637, "color": 7 }, "id": "470ef445-d0e9-4801-81ad-d6d4cc5727c7", "name": "Sticky Note6", "type": "n8n-nodes-base.stickyNote", "position": [ 2000, 1540 ], "typeVersion": 1 }, { "parameters": { "content": "## 3.1 Attendee Researcher SubWorkflow\n[Learn more about using Execute Workflow Trigger](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.executeworkflowtrigger/)\\n\\nThe Attendee Researcher SubWorkflow's aims to collect and summarize both an attendee's last correspondance with the user (if applicable) and the attendee's LinkedIn profile (if available). It uses the router pattern to handle both branches allowing for shorter execution chains. Using the Switch node, this subworkflow is either triggered to fetch emails or scrape LinkedIn but never both simultaneously.", "height": 231.49547088049098, "width": 572.0305871208889, "color": 7 }, "id": "d4f41204-4913-4b63-a13e-d016b1b17cfb", "name": "Sticky Note7", "type": "n8n-nodes-base.stickyNote", "position": [ 1180, 1000 ], "typeVersion": 1 }, { "parameters": { "assignments": { "assignments": [ { "id": "fc4b63a7-ad4d-49ff-9d42-715760910f6a", "name": "linkedin_summary", "type": "string", "value": "={{ $json.text }}" } ] }, "options": {} }, "id": "91ea20a1-b146-4669-8f1d-b1d8892228ae", "name": "Return LinkedIn Success", "type": "n8n-nodes-base.set", "position": [ 4620, 1860 ], "typeVersion": 3.4 }, { "parameters": { "assignments": { "assignments": [ { "id": "bf5a0781-3bad-4f63-a49c-273b03204747", "name": "linkedin_summary", "type": "string", "value": "No activities found." } ] }, "options": {} }, "id": "a08b2035-3e99-4e50-a0f6-63de9f3a175e", "name": "Return LinkedIn Error", "type": "n8n-nodes-base.set", "position": [ 2640, 2000 ], "typeVersion": 3.4 }, { "parameters": { "assignments": { "assignments": [ { "id": "9a7efc9e-26b0-48c9-83aa-ae989f20b1df", "name": "email_summary", "type": "string", "value": "No correspondance found." } ] }, "options": {} }, "id": "acb984f2-2209-471f-9dcc-baf4b8453b25", "name": "Return Email Error", "type": "n8n-nodes-base.set", "position": [ 2340, 1360 ], "typeVersion": 3.4 }, { "parameters": { "assignments": { "assignments": [ { "id": "fc4b63a7-ad4d-49ff-9d42-715760910f6a", "name": "email_summary", "type": "object", "value": "={{ $json.text }}" } ] }, "options": {} }, "id": "801099f3-cc19-44fd-938a-cc08d3a363b2", "name": "Return Email Success", "type": "n8n-nodes-base.set", "position": [ 3060, 1180 ], "typeVersion": 3.4 }, { "parameters": { "mode": "raw", "jsonOutput": "={{ Object.assign({ \"route\": \"email\" }, $json) }}", "options": {} }, "id": "318ed1cf-6809-44d5-b6d9-48f875262e98", "name": "Set Route Email", "type": "n8n-nodes-base.set", "position": [ 1860, 420 ], "typeVersion": 3.4 }, { "parameters": { "mode": "raw", "jsonOutput": "={{ Object.assign({ \"route\": \"linkedin\" }, $json) }}", "options": {} }, "id": "f79682c9-b475-4ace-9b6c-ab86e2c386c3", "name": "Set Route Linkedin", "type": "n8n-nodes-base.set", "position": [ 1860, 580 ], "typeVersion": 3.4 }, { "parameters": { "rules": { "values": [ { "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "operator": { "type": "string", "operation": "equals" }, "leftValue": "={{ $json.route }}", "rightValue": "email" } ] }, "renameOutput": true, "outputKey": "email" }, { "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "ba71a258-de67-4f61-a24a-33c86bd4c4f5", "operator": { "type": "string", "operation": "equals" }, "leftValue": "={{ $json.route }}", "rightValue": "linkedin" } ] }, "renameOutput": true, "outputKey": "linkedin" } ] }, "options": {} }, "id": "b9d42603-78f9-459b-86a4-4f0bc7c309f5", "name": "Router", "type": "n8n-nodes-base.switch", "position": [ 1360, 1260 ], "typeVersion": 3.2 }, { "parameters": { "assignments": { "assignments": [ { "id": "bf5a0781-3bad-4f63-a49c-273b03204747", "name": "linkedin_summary", "type": "string", "value": "No activities found." } ] }, "options": {} }, "id": "ec3a5121-9a1f-429c-88ba-803831927e8b", "name": "Return LinkedIn Error1", "type": "n8n-nodes-base.set", "position": [ 1700, 1560 ], "typeVersion": 3.4 }, { "parameters": { "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "ff11640a-33e4-4695-a62c-7dcab57f0ae5", "operator": { "type": "object", "operation": "empty", "singleValue": true }, "leftValue": "={{ $json }}", "rightValue": "" } ] }, "options": {} }, "id": "d1e3598e-c8c1-4506-a191-27e59a1da0b0", "name": "Has Emails?", "type": "n8n-nodes-base.if", "position": [ 2160, 1180 ], "typeVersion": 2.2 }, { "parameters": { "assignments": { "assignments": [ { "id": "9a7efc9e-26b0-48c9-83aa-ae989f20b1df", "name": "email_summary", "type": "string", "value": "No correspondance found." } ] }, "options": {} }, "id": "de8b61e5-8560-46a1-9bfd-8b6c9e16e4e1", "name": "Return Email Error1", "type": "n8n-nodes-base.set", "position": [ 1700, 1380 ], "typeVersion": 3.4 }, { "parameters": { "content": "## 3.5: Extract LinkedIn Profile & Recent Activity\n[Learn more about the HTML node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.html)\\n\\nOnce we have our scraped LinkedIn profile, it's just a simple case of parsing and extracting the relevant sections from the page.\nFor the purpose of our workflow, we'll only need the \"About\" and \"Activity\" sections which we'll pull out of the page using a series of HTML nodes. Feel free to extract other sections to suit your needs! Once extracted, we'll combine the about and activities data in preparation of sending it to our LLM.", "height": 219.59936012669806, "width": 682.7350931085596, "color": 7 }, "id": "5bec11a6-8c2a-4ee3-8072-d8d739fe6e4b", "name": "Sticky Note9", "type": "n8n-nodes-base.stickyNote", "position": [ 2820, 1600 ], "typeVersion": 1 }, { "parameters": { "fieldToSplitOut": "sections", "options": { "destinationFieldName": "data" } }, "id": "a1acd083-6402-48e6-81eb-10125215f8dc", "name": "Sections To List", "type": "n8n-nodes-base.splitOut", "position": [ 2980, 1860 ], "typeVersion": 1 }, { "parameters": { "assignments": { "assignments": [ { "id": "b4354c00-cc1a-4a55-8b44-6ba4854cc6ba", "name": "linkedin_profile_url", "type": "string", "value": "={{ $json.linkedin_url }}" }, { "id": "4888db89-2573-4246-8ab9-c106a7fe5f38", "name": "linkedin_cookies", "type": "string", "value": "<COPY_YOUR_LINKEDIN_COOKIES_HERE>" } ] }, "options": {} }, "id": "4658b34f-a814-4bd6-9fe0-9758fbf68b5b", "name": "Set LinkedIn Cookie", "type": "n8n-nodes-base.set", "position": [ 2060, 1860 ], "typeVersion": 3.4 }, { "parameters": { "content": "### Be aware of LinkedIn T&Cs!\nFor production, you may want to consider not using your main Linkedin account if you can help it!", "height": 110.18457997698513, "width": 308.16846950517856, "color": 3 }, "id": "b46460d3-26b9-44d9-b5bf-c9c798f6f2e1", "name": "Sticky Note8", "type": "n8n-nodes-base.stickyNote", "position": [ 1660, 1920 ], "typeVersion": 1 }, { "parameters": { "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n### 🚨 Input Required!\nYou need to add your cuurent linkedIn Cookies here to continue.", "height": 301.5806674338321, "width": 209.84856156501735 }, "id": "72c965a4-949a-4c22-999e-82b235b064bc", "name": "Sticky Note10", "type": "n8n-nodes-base.stickyNote", "position": [ 2080, 1920 ], "typeVersion": 1 }, { "parameters": { "fieldToSplitOut": "output.attendees", "options": {} }, "id": "da03d697-e1ea-4ba7-9ffc-d3047681a4ff", "name": "Attendees to List", "type": "n8n-nodes-base.splitOut", "position": [ 1520, 500 ], "typeVersion": 1 }, { "parameters": { "mode": "raw", "jsonOutput": "={{ Object.assign({}, $('Attendees to List').item.json, $json) }}", "options": {} }, "id": "ffa3c548-751f-443e-9c00-9f58df97c4e6", "name": "Merge Attendee with Summaries", "type": "n8n-nodes-base.set", "position": [ 2420, 500 ], "typeVersion": 3.4 }, { "parameters": { "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "1382e335-bfae-4665-a2ee-a05496a7b463", "operator": { "type": "string", "operation": "exists", "singleValue": true }, "leftValue": "={{ $json.email }}", "rightValue": "" } ] }, "options": {} }, "id": "b05d00fe-e7bb-481d-866e-af55e0dd5a86", "name": "Has Email Address?", "type": "n8n-nodes-base.if", "position": [ 1540, 1260 ], "typeVersion": 2.2 }, { "parameters": { "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "1382e335-bfae-4665-a2ee-a05496a7b463", "operator": { "type": "string", "operation": "exists", "singleValue": true }, "leftValue": "={{ $json.linkedin_url }}", "rightValue": "" } ] }, "options": {} }, "id": "106ce1e1-a305-4f44-b38d-9e2e2facd600", "name": "Has LinkedIn URL?", "type": "n8n-nodes-base.if", "position": [ 1540, 1440 ], "typeVersion": 2.2 }, { "parameters": { "workflowId": { "__rl": true, "mode": "id", "value": "={{ $workflow.id }}" }, "mode": "each", "options": { "waitForSubWorkflow": true } }, "id": "c6bc4002-2767-4757-95c4-60ba4aea8b42", "name": "Get Correspondance", "type": "n8n-nodes-base.executeWorkflow", "position": [ 2040, 420 ], "typeVersion": 1.1, "onError": "continueRegularOutput" }, { "parameters": { "mode": "combine", "combineBy": "combineByPosition", "options": {} }, "id": "d6f18683-9dfb-4462-b4f6-13579557a6c6", "name": "Merge", "type": "n8n-nodes-base.merge", "position": [ 2260, 500 ], "typeVersion": 3 }, { "parameters": { "aggregate": "aggregateAllItemData", "destinationFieldName": "attendees", "options": {} }, "id": "7d719f33-5bcd-4d51-9439-394506d15605", "name": "Aggregate Attendees", "type": "n8n-nodes-base.aggregate", "position": [ 2600, 500 ], "typeVersion": 1 }, { "parameters": { "aggregate": "aggregateAllItemData", "destinationFieldName": "activity", "options": {} }, "id": "e0e0336f-56e4-4f6c-a911-897ccb033ca1", "name": "Activities To Array", "type": "n8n-nodes-base.aggregate", "position": [ 3940, 2040 ], "typeVersion": 1 }, { "parameters": { "operation": "extractHtmlContent", "dataPropertyName": "body", "extractionValues": { "values": [ { "key": "name", "cssSelector": "h1" }, { "key": "tagline", "cssSelector": ".pv-text-details__left-panel--full-width .text-body-medium" }, { "key": "location", "cssSelector": ".pv-text-details__left-panel--full-width + div .text-body-small" }, { "key": "num_connections", "cssSelector": "a[href=\"/mynetwork/invite-connect/connections/\"]" }, { "key": "num_followers", "cssSelector": "a[href=\"https://www.linkedin.com/feed/followers/\\"\]" }, { "key": "sections", "cssSelector": "section[data-view-name]", "returnValue": "html", "returnArray": true } ] }, "options": {} }, "id": "0668e84e-9d83-4a8f-bdb5-79b8a102d9fd", "name": "Extract Profile Metadata", "type": "n8n-nodes-base.html", "position": [ 2820, 1860 ], "typeVersion": 1.2 }, { "parameters": { "fieldToSplitOut": "activity", "options": {} }, "id": "b4254f0c-192d-48f3-837c-31b44b3f0cab", "name": "Activities To List", "type": "n8n-nodes-base.splitOut", "position": [ 3620, 2040 ], "typeVersion": 1 }, { "parameters": { "url": "https://api.apify.com/v2/acts/apify~web-scraper/run-sync-get-dataset-items", "authentication": "genericCredentialType", "genericAuthType": "httpQueryAuth", "sendBody": true, "specifyBody": "json", "jsonBody": "={\n \"startUrls\": [\n {\n \"url\": \"{{ $json.linkedin_profile_url }}\",\n \"method\": \"GET\"\n }\n ],\n \"initialCookies\": [\n {\n \"name\": \"li_at\",\n \"value\": \"{{ $json.linkedin_cookies.match(/li_at=([^;]+)/)[1] }}\",\n \"domain\": \".www.linkedin.com\\"\\n }\n ],\n \"breakpointLocation\": \"NONE\",\n \"browserLog\": false,\n \"closeCookieModals\": false,\n \"debugLog\": false,\n \"downloadCss\": false,\n \"downloadMedia\": false,\n \"excludes\": [\n {\n \"glob\": \"/**/*.{png,jpg,jpeg,pdf}\"\n }\n ],\n \"headless\": true,\n \"ignoreCorsAndCsp\": false,\n \"ignoreSslErrors\": false,\n \n \"injectJQuery\": true,\n \"keepUrlFragments\": false,\n \"linkSelector\": \"a[href]\",\n \"maxCrawlingDepth\": 1,\n \"maxPagesPerCrawl\": 1,\n \"maxRequestRetries\": 1,\n \"maxResultsPerCrawl\": 1,\n \"pageFunction\": \"// The function accepts a single argument: the \\\"context\\\" object.\\n// For a complete list of its properties and functions,\\n// see https://apify.com/apify/web-scraper#page-function \\nasync function pageFunction(context) {\\n\\n await new Promise(res => { setTimeout(res, 6000) });\\n // This statement works as a breakpoint when you're trying to debug your code. Works only with Run mode: DEVELOPMENT!\\n // debugger; \\n\\n // jQuery is handy for finding DOM elements and extracting data from them.\\n // To use it, make sure to enable the \\\"Inject jQuery\\\" option.\\n const $ = context.jQuery;\\n const title = $('title').first().text();\\n\\n // Clone the body to avoid modifying the original content\\n const bodyClone = $('body').clone();\\n bodyClone.find('iframe, img, script, style, object, embed, noscript, svg, video, audio').remove();\\n const body = bodyClone.html();\\n\\n // Return an object with the data extracted from the page.\\n // It will be stored to the resulting dataset.\\n return {\\n url: context.request.url,\\n title,\\n body\\n };\\n}\",\n \"postNavigationHooks\": \"// We need to return array of (possibly async) functions here.\\n// The functions accept a single argument: the \\\"crawlingContext\\\" object.\\n[\\n async (crawlingContext) => {\\n // ...\\n },\\n]\",\n \"preNavigationHooks\": \"// We need to return array of (possibly async) functions here.\\n// The functions accept two arguments: the \\\"crawlingContext\\\" object\\n// and \\\"gotoOptions\\\".\\n[\\n async (crawlingContext, gotoOptions) => {\\n // ...\\n },\\n]\\n\",\n \"proxyConfiguration\": {\n \"useApifyProxy\": true\n },\n \"runMode\": \"PRODUCTION\",\n \n \"useChrome\": false,\n \"waitUntil\": [\n \"domcontentloaded\"\n ],\n \"globs\": [],\n \"pseudoUrls\": [],\n \"proxyRotation\": \"RECOMMENDED\",\n \"maxConcurrency\": 50,\n \"pageLoadTimeoutSecs\": 60,\n \"pageFunctionTimeoutSecs\": 60,\n \"maxScrollHeightPixels\": 5000,\n \"customData\": {}\n}", "options": {} }, "id": "aaec0f15-9ff1-430b-8d86-514a9f61e486", "name": "APIFY Web Scraper", "type": "n8n-nodes-base.httpRequest", "position": [ 2260, 1860 ], "typeVersion": 4.2 }, { "parameters": { "operation": "extractHtmlContent", "dataPropertyName": "activity", "extractionValues": { "values": [ { "key": "header", "cssSelector": ".feed-mini-update-optional-navigation-context-wrapper", "returnValue": "attribute", "attribute": "aria-label" }, { "key": "url", "cssSelector": ".feed-mini-update-optional-navigation-context-wrapper", "returnValue": "attribute", "attribute": "href" }, { "key": "content", "cssSelector": ".inline-show-more-text--is-collapsed" }, { "key": "num_reactions", "cssSelector": ".social-details-social-counts__reactions-count" }, { "key": "num_comments", "cssSelector": ".social-details-social-counts__comments" }, { "key": "num_reposts", "cssSelector": ".social-details-social-counts__item--truncate-text" } ] }, "options": {} }, "id": "3142652e-5447-460f-b1d9-b1434d0c6042", "name": "Get Activity Details", "type": "n8n-nodes-base.html", "position": [ 3780, 2040 ], "typeVersion": 1.2 }, { "parameters": { "operation": "extractHtmlContent", "extractionValues": { "values": [ { "key": "title", "cssSelector": "h2 [aria-hidden=true]" }, { "key": "content", "cssSelector": "*", "returnValue": "html" } ] }, "options": {} }, "id": "5e9d7ca1-8a68-4598-8a17-ffcde1cce1b5", "name": "Get Sections", "type": "n8n-nodes-base.html", "position": [ 3140, 1860 ], "typeVersion": 1.2 }, { "parameters": { "assignments": { "assignments": [ { "id": "79d7943f-45a5-456c-a15b-cef53903409d", "name": "html", "type": "string", "value": "={{\n$input.all()\n .find(input => input.json.title.toLowerCase().trim() === 'about')\n .json\n .content\n}}" } ] }, "options": {} }, "id": "1d28bb03-2fbe-4012-8c35-67640ab0b7b8", "name": "Get About Section", "type": "n8n-nodes-base.set", "position": [ 3300, 1860 ], "executeOnce": true, "typeVersion": 3.4 }, { "parameters": { "assignments": { "assignments": [ { "id": "79d7943f-45a5-456c-a15b-cef53903409d", "name": "html", "type": "string", "value": "={{\n$input.all()\n .find(input => input.json.title.toLowerCase().trim() === 'activity')\n .json\n .content\n}}" } ] }, "options": {} }, "id": "34c21447-9cbe-4786-b65d-a7a58c1133a6", "name": "Get Activity Section", "type": "n8n-nodes-base.set", "position": [ 3300, 2040 ], "executeOnce": true, "typeVersion": 3.4 }, { "parameters": { "operation": "extractHtmlContent", "dataPropertyName": "html", "extractionValues": { "values": [ { "key": "activity", "cssSelector": ".profile-creator-shared-feed-update__mini-container", "returnValue": "html", "returnArray": true } ] }, "options": {} }, "id": "c7d4a9b9-8152-4104-af80-12670c226a47", "name": "Extract Activities", "type": "n8n-nodes-base.html", "position": [ 3460, 2040 ], "typeVersion": 1.2 }, { "parameters": { "mode": "combine", "combineBy": "combineByPosition", "options": {} }, "id": "19b6ff9a-81fe-4339-9d0f-c668a74af496", "name": "Merge1", "type": "n8n-nodes-base.merge", "position": [ 4120, 1860 ], "typeVersion": 3 }, { "parameters": { "conditions": { "options": { "version": 2, "leftValue": "", "caseSensitive": true, "typeValidation": "strict" }, "combinator": "and", "conditions": [ { "id": "3861abc7-7699-4459-b983-0c8b33e090b5", "operator": { "type": "string", "operation": "exists", "singleValue": true }, "leftValue": "={{ $json.body }}", "rightValue": "" } ] }, "options": {} }, "id": "e6be44d7-3f84-48c8-9c3a-6aa2a02989ad", "name": "Is Scrape Successful?", "type": "n8n-nodes-base.if", "position": [ 2440, 1860 ], "typeVersion": 2.2 }, { "parameters": { "operation": "extractHtmlContent", "dataPropertyName": "html", "extractionValues": { "values": [ { "key": "about", "cssSelector": "body" } ] }, "options": {} }, "id": "fd399bbd-af45-45cc-b8b3-add1a1480da1", "name": "Extract About", "type": "n8n-nodes-base.html", "position": [ 3460, 1860 ], "typeVersion": 1.2 }, { "parameters": { "content": "## 3.6 Summarize LinkedIn For Attendee\n[Read more about the Basic LLM node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm)\\n\\nFinally, we'll use the Basic LLM node to summarize our attendee's LinkedIn profile and recent activity. Our goal here is to identify and send back interesting tidbits of information which may be relevant to the meeting as well as inform the user. Should you require different criteria, simply edit the summarizer to get the response you need.", "height": 212.26880753952497, "width": 508.12647286359606, "color": 7 }, "id": "63f4339a-6a65-461b-b050-883d061ff45f", "name": "Sticky Note11", "type": "n8n-nodes-base.stickyNote", "position": [ 4120, 1620 ], "typeVersion": 1 }, { "parameters": { "content": "## 3.3: Summarize Correspondance For Attendee\n[Read more about the Basic LLM node](https://docs.n8n.io/integrations/builtin/cluster-nodes/root-nodes/n8n-nodes-langchain.chainllm)\\n\\nNext, we'll generate a shorter version of the email(s) using the Basic LLM node - useful if the email was part of a large chain. The goal here is, if applicable, to remind the user of the conversion with this attendee and highlight any expectations which might be set before going into the meeting.", "height": 196.6490014749014, "width": 593.8676556715506, "color": 7 }, "id": "0cf66bd5-4d49-444d-aaeb-cca9c666a93d", "name": "Sticky Note12", "type": "n8n-nodes-base.stickyNote", "position": [ 2720, 960 ], "typeVersion": 1 }, { "parameters": { "workflowId": { "__rl": true, "mode": "id", "value": "={{ $workflow.id }}" }, "mode": "each", "options": { "waitForSubWorkflow": true } }, "id": "59fd4254-2a48-4a5e-8c77-7f2f282a179f", "name": "Get LinkedIn Profile & Activity", "type": "n8n-nodes-base.executeWorkflow", "position": [ 2040, 580 ], "typeVersion": 1.1, "onError": "continueRegularOutput" }, { "parameters": { "content": "### This workflow builds an AI meeting assistant who sends information-dense pre-meeting notifications for a user's upcoming meetings. This template is ideal for busy professional who is constantly on the move and wants to save time and make an impression.\n\n### How It Works\n* A scheduled trigger fires hourly and checks for upcoming meetings within the hour.\n* When found, a search for last correspondence and LinkedIn profile + recent activity is performed for each attendee.\n* Using both available correspondance and/or Linkedin profile, an AI/LLM is used to summarize this information and generate a short notification message which should help the user prepare for the meeting.\n* The notification is finally sent to the user's WhatsApp.\n\n### Need Help?\nContact us at [Wassenger](https://wassenger.com/)\\n", "height": 588.3011632094225, "width": 453.4804561790962 }, "id": "0126af39-88f5-41ae-9fef-be22d0b15ef4", "name": "Sticky Note13", "type": "n8n-nodes-base.stickyNote", "position": [ -60, 20 ], "typeVersion": 1 }, { "parameters": { "promptType": "define", "text": "=from: {{ $json.from }}\nto: {{ $json.to }}\ndate: {{ $json.date }}\nsubject: {{ $json.subject }}\ntext:\n{{ $json.text }}", "messages": { "messageValues": [ { "message": "=You are helping the \"to\" user recap the last correspondance they had in this email thread. Summarize succiently what was discussed, changed or agreed to help the user prepare for their upcoming meeting." } ] } }, "id": "6a6b6782-f586-4573-95d9-982c940fb231", "name": "Correspondance Recap Agent", "type": "@n8n/n8n-nodes-langchain.chainLlm", "position": [ 2720, 1180 ], "typeVersion": 1.4 }, { "parameters": { "promptType": "define", "text": "=meeting date: {{ $('Check For Upcoming Meetings').item.json.start.dateTime }}\nmeeting url: {{ $('Check For Upcoming Meetings').item.json.hangoutLink }}\nmeeting summary: {{ $('Check For Upcoming Meetings').first().json.summary }}\nmeeting description: {{ $('Check For Upcoming Meetings').item.json.description }}\nmeeting with: {{ $json.attendees.map(item => item.name).join(',') }}\n---\n{{\n$json.attendees.map(item => {\n return\n`attendee name: ${item.name}\n${item.name}'s last correspondance: ${item.email_summary.replaceAll('\\n', ' ') || `We have not had any correspondance with ${item.name}`}\n${item.name}'s linkedin profile: ${item.linkedin_summary.replaceAll('\\n', ' ') || `We were unable to find the linkedin profile for ${$json.name}`}\n`\n}).join('\\n---\\n')\n}}", "messages": { "messageValues": [ { "message": "=You are a personal meeing assistant.\nYou are helping to remind user of an upcoming meeting with {{ $json.attendees.map(item => item.name).join(',') }} (aka \"the attendee(s)\"}. You will structure your notification using the following guidance:\n1. Start by providing the meeting summary, mentioning the date, with whom and providing the meeting link.\n2. For each attendee, give a short bullet point summary of their last correspondance. Assess if the correspondance has any relevance to the meeting and if so, identify any important todos or items which should be mentioned during the meeting. Additionally, give a short bullet point summary of attendee's recent activity which makes for good talking points. These need not be relevant to the meeting.\n\nWrite your response in a casual tone as if sending a SMS message to the user. USe bullet points where appropriate." } ] } }, "id": "0f93fb3f-76e3-4e53-9f91-6184c0b7a204", "name": "Attendee Research Agent", "type": "@n8n/n8n-nodes-langchain.chainLlm", "position": [ 2980, 500 ], "typeVersion": 1.4 }, { "parameters": { "promptType": "define", "text": "=### name\n{{ $('Extract Profile Metadata').item.json.name }}\n### about\n\"{{ $('Extract Profile Metadata').item.json.tagline }}\"\n{{ $json.about.replaceAll('\\n', ' ')}}\n### recent activity\n{{\n$json.activity.map((item, idx) => {\n return [\n item.header.replace('View full post.', ''),\n `(${item.url})`,\n ' - ',\n item.content.replaceAll('\\n', ' ').replaceAll('…show more', '')\n ].join(' ')\n}).join('\\n---\\n')\n}}", "messages": { "messageValues": [ { "message": "=Summarize briefly the person and their recent activities as seen in the given feed and highlight noteworthy awards or achievements which make for good talking points." } ] } }, "id": "fe3327fd-af86-448a-84d9-5a9ff5a6de40", "name": "LinkedIn Summarizer Agent", "type": "@n8n/n8n-nodes-langchain.chainLlm", "position": [ 4280, 1860 ], "typeVersion": 1.4 }, { "parameters": { "options": {} }, "type": "n8n-nodes-wassenger.wassenger", "typeVersion": 1, "position": [ 3620, 520 ], "id": "92db8662-9357-4481-b36c-ab8e5cac36fd", "name": "Send Notification", "credentials": { "wassengerApiKey": { "id": "9du3UAbFSzEaTSQE", "name": "WhatsApp API key" } } } ], "pinData": { "Send Notification": [ { "json": { "name": "First item", "code": 1 } }, { "json": { "name": "Second item", "code": 2 } } ] }, "connections": { "Merge": { "main": [ [ { "node": "Merge Attendee with Summaries", "type": "main", "index": 0 } ] ] }, "Merge1": { "main": [ [ { "node": "LinkedIn Summarizer Agent", "type": "main", "index": 0 } ] ] }, "Router": { "main": [ [ { "node": "Has Email Address?", "type": "main", "index": 0 } ], [ { "node": "Has LinkedIn URL?", "type": "main", "index": 0 } ] ] }, "Has Emails?": { "main": [ [ { "node": "Get Message Contents", "type": "main", "index": 0 } ], [ { "node": "Return Email Error", "type": "main", "index": 0 } ] ] }, "Get Sections": { "main": [ [ { "node": "Get About Section", "type": "main", "index": 0 }, { "node": "Get Activity Section", "type": "main", "index": 0 } ] ] }, "Extract About": { "main": [ [ { "node": "Merge1", "type": "main", "index": 0 } ] ] }, "Set Route Email": { "main": [ [ { "node": "Get Correspondance", "type": "main", "index": 0 } ] ] }, "Simplify Emails": { "main": [ [ { "node": "Correspondance Recap Agent", "type": "main", "index": 0 } ] ] }, "Schedule Trigger": { "main": [ [ { "node": "Check For Upcoming Meetings", "type": "main", "index": 0 } ] ] }, "Sections To List": { "main": [ [ { "node": "Get Sections", "type": "main", "index": 0 } ] ] }, "APIFY Web Scraper": { "main": [ [ { "node": "Is Scrape Successful?", "type": "main", "index": 0 } ] ] }, "Attendees to List": { "main": [ [ { "node": "Set Route Email", "type": "main", "index": 0 }, { "node": "Set Route Linkedin", "type": "main", "index": 0 } ] ] }, "Get About Section": { "main": [ [ { "node": "Extract About", "type": "main", "index": 0 } ] ] }, "Has LinkedIn URL?": { "main": [ [ { "node": "Set LinkedIn Cookie", "type": "main", "index": 0 } ], [ { "node": "Return LinkedIn Error1", "type": "main", "index": 0 } ] ] }, "OpenAI Chat Model": { "ai_languageModel": [ [ { "node": "Correspondance Recap Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "Activities To List": { "main": [ [ { "node": "Get Activity Details", "type": "main", "index": 0 } ] ] }, "Extract Activities": { "main": [ [ { "node": "Activities To List", "type": "main", "index": 0 } ] ] }, "Get Correspondance": { "main": [ [ { "node": "Merge", "type": "main", "index": 0 } ] ] }, "Has Email Address?": { "main": [ [ { "node": "Get Last Correspondence", "type": "main", "index": 0 } ], [ { "node": "Return Email Error1", "type": "main", "index": 0 } ] ] }, "OpenAI Chat Model1": { "ai_languageModel": [ [ { "node": "LinkedIn Summarizer Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "OpenAI Chat Model2": { "ai_languageModel": [ [ { "node": "Extract Attendee Information", "type": "ai_languageModel", "index": 0 } ] ] }, "OpenAI Chat Model3": { "ai_languageModel": [ [ { "node": "Attendee Research Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "Set Route Linkedin": { "main": [ [ { "node": "Get LinkedIn Profile & Activity", "type": "main", "index": 0 } ] ] }, "Activities To Array": { "main": [ [ { "node": "Merge1", "type": "main", "index": 1 } ] ] }, "Aggregate Attendees": { "main": [ [ { "node": "Attendee Research Agent", "type": "main", "index": 0 } ] ] }, "Set LinkedIn Cookie": { "main": [ [ { "node": "APIFY Web Scraper", "type": "main", "index": 0 } ] ] }, "Get Activity Details": { "main": [ [ { "node": "Activities To Array", "type": "main", "index": 0 } ] ] }, "Get Activity Section": { "main": [ [ { "node": "Extract Activities", "type": "main", "index": 0 } ] ] }, "Get Message Contents": { "main": [ [ { "node": "Simplify Emails", "type": "main", "index": 0 } ] ] }, "Is Scrape Successful?": { "main": [ [ { "node": "Extract Profile Metadata", "type": "main", "index": 0 } ], [ { "node": "Return LinkedIn Error", "type": "main", "index": 0 } ] ] }, "Get Last Correspondence": { "main": [ [ { "node": "Has Emails?", "type": "main", "index": 0 } ] ] }, "Execute Workflow Trigger": { "main": [ [ { "node": "Router", "type": "main", "index": 0 } ] ] }, "Extract Profile Metadata": { "main": [ [ { "node": "Sections To List", "type": "main", "index": 0 } ] ] }, "LinkedIn Summarizer Agent": { "main": [ [ { "node": "Return LinkedIn Success", "type": "main", "index": 0 } ] ] }, "Correspondance Recap Agent": { "main": [ [ { "node": "Return Email Success", "type": "main", "index": 0 } ] ] }, "Check For Upcoming Meetings": { "main": [ [ { "node": "Extract Attendee Information", "type": "main", "index": 0 } ] ] }, "Extract Attendee Information": { "main": [ [ { "node": "Attendees to List", "type": "main", "index": 0 } ] ] }, "Merge Attendee with Summaries": { "main": [ [ { "node": "Aggregate Attendees", "type": "main", "index": 0 } ] ] }, "Get LinkedIn Profile & Activity": { "main": [ [ { "node": "Merge", "type": "main", "index": 1 } ] ] }, "Attendee Research Agent": { "main": [ [ { "node": "Send Notification", "type": "main", "index": 0 } ] ] } } }
Real-World Use Cases
Use Case 1: Preparing for a Demo Meeting
Imagine a prospect replies to you on WhatsApp, saying, “I’d like to book a demo.” Your automated workflow springs into action:
- The meeting is scheduled in your calendar
- An hour before the meeting, the workflow detects the upcoming demo
- It fetches the lead’s company data from your CRM
- It searches for recent email exchanges between you and the prospect
- It checks their LinkedIn profile for recent activities
- The AI summarises all this information into a concise brief
- You receive a WhatsApp message with everything you need to know
Armed with this information, you enter the meeting fully prepared to address their specific needs, dramatically increasing your chances of conversion.
🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥
Use Case 2: Handling Pricing Inquiries
When a prospect asks about pricing via WhatsApp, your workflow can:
- Recognise the pricing inquiry through AI analysis
- Pull relevant company and contact information
- Generate a personalised pricing breakdown
- Send this information via WhatsApp with an invitation to schedule a call
- Before the call, prepare yourself with all relevant context about the prospect
This ensures you’re not just responding with generic pricing information but engaging in a personalised conversation that addresses their specific business needs.
The Benefits of WhatsApp Automation for Sales Teams
- Save Valuable Time: This automation reduces meeting preparation time to nearly zero, freeing you to focus on what matters most — building relationships and closing deals.
- Reduce Human Error: This automated system ensures you never miss critical information about a prospect, eliminating the embarrassment of asking questions that have already been answered.
- Increase Response Rates: WhatsApp messages are typically read within minutes, ensuring you have time to review the information before your meeting.
- Enhance Client Experience: Walking into a meeting fully prepared demonstrates to clients that you value their time and are invested in the relationship.
- Seamless Integration: With Wassenger’s official n8n integration (n8n-nodes-wassenger), you can set up this workflow without any coding knowledge.
The integration provides:
- Real-time message triggers and inbound chat parsing
- Two-way communication capabilities
- AI Copilot & Flow compatibility for codeless automation design
- Reliable delivery and session management
- No WABA setup required
- Perfect fit for sales automation without friction or approval delays
🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥
Get Started with WhatsApp Automation Today
In today’s competitive sales environment, having an edge in meeting preparation can significantly impact your success rate. By combining n8n’s workflow automation with Wassenger’s WhatsApp integration and AI capabilities, you can create a system that ensures you’re always prepared, informed, and ready to impress.
The best part? You don’t need any coding skills to implement this solution. With n8n’s visual workflow builder and Wassenger’s user-friendly API, you can set up this entire system in less than an hour.
🚀 🤖 Try Wassenger free for 7 days and see how easy it is to create an AI chatbot for WhatsApp. For technical questions, explore our comprehensive API documentation or test integration scenarios with our API Tester featuring over 100 examples. 🔥












