Slack + Gmail: LinkedIn briefs ready before calls
You’ve got a call in 20 minutes. You open LinkedIn, search the person, scroll their posts, lose the tab, re-open it, then realize you still don’t have anything solid to say besides “saw your recent post.” That’s not prep. That’s panic.
This Slack LinkedIn briefs automation hits Customer Success Managers hardest, but Account Managers and sales leads feel it too. You type one Slack command, and a structured brief lands in Gmail with themes, cadence, and recent highlights you can use immediately.
Below you’ll see how the workflow runs, what it produces, and what you need to set it up so pre-call research stops eating your calendar.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Slack + Gmail: LinkedIn briefs ready before calls
flowchart LR
subgraph sg0["Structured Output Pa Flow"]
direction LR
n0["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/webhook.dark.svg' width='40' height='40' /></div><br/>Webhook"]
n1@{ icon: "mdi:cog", form: "rounded", label: "Aggregate", pos: "b", h: 48 }
n2@{ icon: "mdi:robot", form: "rounded", label: "Structured Output Parser", pos: "b", h: 48 }
n3@{ icon: "mdi:robot", form: "rounded", label: "Summer McBriefing", pos: "b", h: 48 }
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/html.dark.svg' width='40' height='40' /></div><br/>HTML"]
n5@{ icon: "mdi:message-outline", form: "rounded", label: "Send report via Email", pos: "b", h: 48 }
n6["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/slack.svg' width='40' height='40' /></div><br/>Tell on slack that no full n.."]
n7@{ icon: "mdi:brain", form: "rounded", label: "GPT 4.1-mini for classificat..", pos: "b", h: 48 }
n8@{ icon: "mdi:robot", form: "rounded", label: "Do we have a full name ?", pos: "b", h: 48 }
n9@{ icon: "mdi:brain", form: "rounded", label: "GPT 4.1-mini to extract firs..", pos: "b", h: 48 }
n10@{ icon: "mdi:robot", form: "rounded", label: "Extract firstName and lastName", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Get Linkedin Profile URL", pos: "b", h: 48 }
n12@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Find Linkedin Profile", pos: "b", h: 48 }
n13@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Scrap what this person poste..", pos: "b", h: 48 }
n14@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Structure recent posts", pos: "b", h: 48 }
n15@{ icon: "mdi:brain", form: "rounded", label: "GPT 4.1", pos: "b", h: 48 }
n4 --> n5
n15 -.-> n3
n0 --> n8
n1 --> n3
n3 --> n4
n12 --> n11
n14 --> n1
n8 --> n10
n8 --> n6
n11 --> n13
n2 -.-> n3
n10 --> n12
n7 -.-> n8
n13 --> n14
n9 -.-> n10
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n2,n3,n8,n10 ai
class n7,n9,n15 aiModel
class n11,n12,n13,n14 decision
class n0 api
classDef customIcon fill:none,stroke:none
class n0,n4,n6 customIcon
The Problem: Pre-call LinkedIn research is slow and inconsistent
Prepping for calls should be lightweight, but LinkedIn research turns into a time sink fast. You search a name, guess which profile is correct, skim a few posts, then try to remember what stood out while you hop back into your notes. And if the name is common, you can easily end up reading the wrong person’s content. The result is inconsistent prep: some calls get real context, others get generic questions because you ran out of time (or patience, honestly).
The friction compounds. Here’s where it breaks down.
- You spend about 15 minutes per person just finding the right profile and scanning recent posts.
- Notes end up scattered across Slack messages, browser tabs, and half-finished doc bullets.
- It’s easy to miss patterns like posting cadence or recurring themes, which are often the best conversation starters.
- When you’re rushed, your talking points get vague, and the call starts colder than it needs to.
The Solution: A Slack command that emails a ready-to-use brief
This workflow turns a simple Slack slash command into a clean Gmail intelligence brief based on someone’s recent LinkedIn posts. You type /check-linkedin Full Name in Slack, and the workflow first checks that you actually provided a full name (not “John”). Then it searches for the most likely LinkedIn profile, pulls their most recent public posts (up to the last 20), and asks AI to summarize what matters: what they talk about, how often they post, and what’s worth referencing in a call. Finally, it formats everything into an HTML email report and sends it to your inbox, usually within about a minute.
The workflow starts in Slack and enters n8n through a webhook. Apify handles profile discovery plus post scraping, and OpenAI handles the heavy analysis and the “quick check” validation. Gmail delivers the finished brief, so it’s sitting where you already look before meetings.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you have 6 customer check-ins booked on a Thursday. If you spend about 15 minutes per person scanning LinkedIn, that’s roughly 90 minutes of research, plus the mental overhead of switching tabs and taking notes. With this workflow, you run 6 Slack commands in maybe 2 minutes total, then wait for the emails to arrive (usually 30–90 seconds each while you do other work). You walk into every call with the same structure: cadence, themes, and a few recent highlights you can reference naturally.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Slack to run the slash command trigger.
- Apify for LinkedIn profile finding and post scraping.
- OpenAI API key (get it from the OpenAI dashboard).
Skill level: Intermediate. You’ll connect accounts, set a Slack slash command webhook, and paste a few credentials into n8n.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A Slack slash command triggers the run. You type /check-linkedin Full Name, Slack hits your n8n webhook, and the workflow starts immediately. If the input is incomplete, it posts a Slack message asking for a full name.
Name validation and parsing happen early. A lightweight AI check confirms it looks like a real full name, then the workflow extracts given and family names so downstream lookup is cleaner (and less error-prone).
Apify discovers the profile and collects recent posts. The workflow finds the most likely LinkedIn profile URL, then scrapes the last 20 public posts and formats them into a consistent set of fields. That dataset gets aggregated so the analysis isn’t dealing with messy, repetitive raw text.
OpenAI generates the brief and Gmail delivers it. GPT-4.1 analyzes cadence, themes, and highlights, then n8n builds an HTML report and emails it to you. The output is meant to be skimmed fast: quick stats first, then the deeper breakdown if you want it.
You can easily modify the report format to match your team’s call prep template based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Webhook Trigger
Set up the inbound webhook to receive the name input that starts the workflow.
- Add and open Inbound Webhook Entry.
- Set HTTP Method to
POST. - Set Path to
path-placeholder-to-be-replaced-by-your-webhookand replace it with your real endpoint before production. - Save the node and copy the production URL for your source system.
Step 2: Set Up Name Validation and Slack Alerts
Classify the incoming text as a full name, extract first/last names, and notify Slack when the input is invalid.
- Open Validate Full Name and set Input Text to
{{ $json.body.text }}. - Ensure the categories include full-name and not-full-name exactly as configured.
- Open Mini GPT Classifier and confirm the model is
gpt-4.1-mini. - Credential Required: Connect your openAiApi credentials in Mini GPT Classifier.
- Open Extract Given and Family and set Text to
{{ $json.body.text }}. - Open Mini GPT Name Extractor and confirm the model is
gpt-4.1-mini. - Credential Required: Connect your openAiApi credentials in Mini GPT Name Extractor.
- Open Slack Notice Missing Name and set Text to
{{ $json.body.text }} is not a full name. Please send a full name to get information.. - Set Channel to
{{ $json.body.channel_id }}and keep Authentication asoAuth2. - Credential Required: Connect your slackOAuth2Api credentials in Slack Notice Missing Name.
- Confirm the branching: Validate Full Name outputs to both Extract Given and Family and Slack Notice Missing Name in parallel.
Step 3: Connect LinkedIn Discovery and Scraping (Apify)
Use Apify actors to find the LinkedIn profile URL and scrape recent posts.
- Open Lookup LinkedIn Profile and keep Actor ID set to
https://console.apify.com/actors/FbqC9BRstFBddhUqj/input. - Set Custom Body to
{ "firstName": "{{ $json.output.firstName }}", "lastName": "{{ $json.output.lastName }}" }. - Credential Required: Connect your apifyApi credentials in Lookup LinkedIn Profile.
- Open Fetch LinkedIn Profile URL and set Resource to
Datasetsand Dataset ID to{{ $json.defaultDatasetId }}. - Credential Required: Connect your apifyApi credentials in Fetch LinkedIn Profile URL.
- Open Scrape Recent LinkedIn Posts and keep Actor ID set to
https://console.apify.com/actors/r4oNX7IHlW4RQAjKP. - Set Custom Body to
{ "usernames": [ "{{ $json.linkedinProfileUrl }}" ] }. - Credential Required: Connect your apifyApi credentials in Scrape Recent LinkedIn Posts.
- Open Format Recent Posts and set Resource to
Datasets, Dataset ID to{{ $json.defaultDatasetId }}, and Limit to20. - Credential Required: Connect your apifyApi credentials in Format Recent Posts.
Step 4: Aggregate and Analyze Post Content with AI
Aggregate post fields and generate the structured JSON analysis for the report.
- Open Aggregate Post Fields and verify the fields to aggregate include
posted_at.dateandtext. - Open Insight Briefing Agent and set Text to
Dates:\n{{ $json.date }}\n\nPosts: \n{{ $json.text }}. - Ensure Has Output Parser is enabled in Insight Briefing Agent.
- Open Structured JSON Parser and keep Schema Type set to
manualwith the provided JSON schema. - Open GPT 4.1 Summarizer and confirm the model is
gpt-4.1. - Credential Required: Connect your openAiApi credentials in GPT 4.1 Summarizer.
- Confirm the AI wiring: GPT 4.1 Summarizer is connected as the language model for Insight Briefing Agent, and Structured JSON Parser is connected as its output parser.
Step 5: Configure HTML Report and Email Delivery
Render the HTML report and send it to the target email address.
- Open Generate HTML Report and keep the HTML template as provided.
- Confirm the dynamic placeholders reference other nodes, including
{{ $('Extract Given and Family').item.json.output.firstName }}and{{ $json.output.latest_post_date }}. - Open Dispatch Email Report and set Send To to
[YOUR_EMAIL]. - Set Message to
{{ $json.html }}. - Set Subject to
Recent LinkedIn Activity about {{ $('Fetch LinkedIn Profile URL').item.json.personName }}. - Credential Required: Connect your gmailOAuth2 credentials in Dispatch Email Report.
Step 6: Test and Activate Your Workflow
Run a full test to validate each stage and then enable the workflow for production use.
- Use Inbound Webhook Entry’s test URL and send a sample body containing
{"text":"Ada Lovelace","channel_id":"C123456"}. - Verify that Validate Full Name routes a valid name to Extract Given and Family and does not trigger Slack Notice Missing Name.
- Confirm that Apify nodes return a profile URL and recent posts, then that Insight Briefing Agent outputs structured JSON.
- Check the final email from Dispatch Email Report for a complete HTML report and the correct subject line.
- Once verified, toggle the workflow to Active to accept live webhook requests.
Common Gotchas
- Slack slash commands require the exact webhook URL and the right app permissions. If nothing fires, check the Slack app’s Slash Command configuration page first.
- If you’re scraping several profiles back-to-back, Apify runs can take longer and LinkedIn can rate-limit. Space repeated checks on the same profile by a few hours if you see empty post results.
- OpenAI prompts that are left generic will sound generic. Add your brand voice and the kind of “talking points” you want (discovery questions, renewal risk flags, stakeholder mapping) near the analysis step or you will be editing outputs forever.
Frequently Asked Questions
About 15 minutes if your Slack app and accounts are ready.
No. You’ll connect Slack, Gmail, Apify, and OpenAI, then paste a webhook URL into your Slack slash command settings.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs and Apify usage (this workflow estimates about $0.05-0.09 per profile check, depending on actors and volume).
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s a smart upgrade for common names. You can adjust the Slack command input to accept “Full Name + Company,” then update the profile discovery step so Apify (and the AI validation) uses that extra context during lookup. Common customizations include changing how many posts you scrape (10 vs 20), tweaking the brief sections (quick scan only, or deeper analysis), and routing the report to a shared inbox instead of a single recipient.
Usually it’s an app permission or OAuth scope issue, or the slash command is still pointing at an old webhook URL. Recheck the Slack app settings, then confirm the credentials inside n8n still have access to the workspace where the command is installed. If the workflow runs but Slack never gets a response, the missing-name branch may be triggering because the input didn’t parse as a full name.
It depends mostly on your n8n plan and your Apify credits. On n8n Cloud Starter, you’re typically fine for steady day-to-day use, and you can scale up by moving to a higher plan if you’re doing lots of lookups. If you self-host, there’s no execution limit, but your server capacity still matters. Practically, many teams run a handful to a few dozen checks per day, then watch Apify usage because the scrapers are the main cost driver.
Often, yes, because this workflow isn’t just “move data from A to B.” You’re doing conditional logic (missing name handling), multi-step scraping, aggregation, and AI analysis with structured output, which is where n8n tends to be more flexible and less frustrating. The self-hosting option is a big deal if you want unlimited runs without paying per task. Zapier or Make can still be fine if you only want a simple alert when someone posts. Talk to an automation expert if you want help deciding based on volume and budget.
Set it up once, and your call prep becomes a repeatable system instead of a last-minute scramble. The workflow handles the digging so you can focus on the conversation.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.