Google Calendar to Gmail, sales meeting briefs ready
Showing up to a sales call with only a calendar title and a half-filled attendee list feels… flimsy. You end up scrambling through LinkedIn tabs, guessing what matters, and hoping you don’t miss something obvious.
This meeting brief automation hits Account Executives first. But Sales Managers trying to standardize prep, and agency owners juggling back-to-back client calls, feel it too. The goal is simple: walk into every meeting with a clean, consistent brief already waiting in your inbox.
This workflow pulls today’s meetings from Google Calendar, enriches attendee context, summarizes recent LinkedIn activity with AI, then sends a ready-to-skim brief via Gmail (and WhatsApp). You’ll see what it does, what you need, and how to make it yours.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Calendar to Gmail, sales meeting briefs ready
flowchart LR
subgraph sg0["Schedule Trigger – 5 AM 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/clearbit.svg' width='40' height='40' /></div><br/>Enrich attendee company"]
n1@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger – 5 AM", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Initialize Workflow", pos: "b", h: 48 }
n3@{ icon: "mdi:location-exit", form: "rounded", label: "Fetch Today’s Meetings from ..", pos: "b", h: 48 }
n4@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Attendee Email Domains", pos: "b", h: 48 }
n5@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Through Attendees", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Split Attendee Details", pos: "b", h: 48 }
n7@{ icon: "mdi:cog", form: "rounded", label: "Wait for Company Enrichment", pos: "b", h: 48 }
n8@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Enrichment Status", pos: "b", h: 48 }
n9["<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/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch Latest LinkedIn Posts"]
n10@{ icon: "mdi:swap-vertical", form: "rounded", label: "Extract Key Post Insights", pos: "b", h: 48 }
n11@{ icon: "mdi:swap-vertical", form: "rounded", label: "Summarize Social Activity wi..", pos: "b", h: 48 }
n12["<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/openAi.dark.svg' width='40' height='40' /></div><br/>Format Summary for Email"]
n13["<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/merge.svg' width='40' height='40' /></div><br/>Merge Summary with Context"]
n14@{ icon: "mdi:cog", form: "rounded", label: "Wait Before Sending", pos: "b", h: 48 }
n15["<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/>Generate HTML Email Template"]
n16["<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/whatsapp.svg' width='40' height='40' /></div><br/>Send via WhatsApp"]
n17@{ icon: "mdi:message-outline", form: "rounded", label: "Send via Gmail", pos: "b", h: 48 }
n2 --> n3
n14 --> n15
n5 --> n6
n5 --> n5
n6 --> n0
n8 --> n9
n0 --> n7
n12 --> n13
n10 --> n12
n10 --> n11
n1 --> n2
n13 --> n14
n9 --> n10
n7 --> n8
n15 --> n16
n15 --> n17
n4 --> n5
n11 --> n13
n3 --> n4
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 n1 trigger
class n8 decision
class n9 api
class n13 disabled
classDef customIcon fill:none,stroke:none
class n0,n9,n12,n13,n15,n16 customIcon
The Problem: Sales Prep Turns Into Tab Chaos
Sales meeting prep is supposed to be quick. In reality, it’s a slow drift into browser-tab overload. You open Google Calendar, copy a name, hunt for the right LinkedIn profile, skim posts (or worse, get distracted), then try to turn that into something useful. Multiply that by several meetings a day and you’ve built a daily tax on your attention. And when you’re rushed, you miss context that could have changed the opening minutes of the call: a product launch, a hiring post, a funding mention, or a new initiative.
It adds up fast. Here’s where it breaks down.
- Meeting context lives in too many places, so you start every call from scratch.
- Manual LinkedIn research is inconsistent, which means your “prep” depends on how busy you are.
- Copy-paste notes into emails creates silly mistakes, like mixing up companies or titles.
- Without a standard brief format, managers can’t coach, and teams can’t improve the process.
The Solution: Daily Meeting Briefs Generated Automatically
This n8n workflow runs every morning at 5 AM and builds your meeting prep for you. It starts by pulling today’s meetings from Google Calendar, then extracts attendee email domains to infer company context. For each attendee, it enriches the company profile (so you’re not guessing who they are), checks that enrichment completed, and then fetches recent LinkedIn posts via an HTTP request. Next, OpenAI summarizes the useful parts into a short, readable brief that sounds like a human actually skimmed the page. Finally, it formats everything into an HTML email and sends it through Gmail, with an optional WhatsApp version for quick scanning on your phone.
The workflow begins on a schedule, not when you remember. It loops through attendees, enriches and validates the data, then generates a single combined summary per meeting. You wake up to briefs that are consistent, shareable, and easy to forward internally.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you have 4 sales meetings today with 2 attendees each. Manually, you might spend about 10 minutes per attendee finding the right LinkedIn profile, skimming posts, and writing a short “who/what/why” note, plus another 10 minutes formatting something you can actually reuse, so roughly 90 minutes total. With this workflow, you spend maybe 5 minutes checking the briefs in Gmail and forwarding one to your team, while the rest runs in the background after the 5 AM trigger. Even if enrichment and requests take a bit, your time stays close to zero.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Calendar to fetch today’s scheduled meetings.
- Gmail to send the formatted meeting brief emails.
- LinkedIn data access (API or scraping provider) for recent posts.
- WhatsApp integration to deliver a mobile-friendly summary.
- OpenAI API key (get it from your OpenAI dashboard).
- Company enrichment service (Clearbit in this workflow) for firmographics.
Skill level: Intermediate. You’ll connect credentials, adjust a few fields, and test with a sample meeting.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A scheduled morning trigger kicks it off. At 5 AM, n8n runs automatically and sets initial variables so the rest of the flow stays consistent day to day.
Your calendar becomes the source of truth. The workflow retrieves today’s events from Google Calendar, then pulls attendee details and derives email domains to figure out which companies need enrichment.
Enrichment + LinkedIn context happens per attendee. It loops through the attendee list, enriches company information (then waits and validates the result), and calls an HTTP endpoint to fetch recent LinkedIn posts. Those posts are trimmed down to the key signals you’d actually reference on a call.
AI writes the brief and delivery is automatic. OpenAI generates a concise summary, n8n merges it with the meeting context, builds an HTML email, then sends it via Gmail and WhatsApp.
You can easily modify the trigger time to match your schedule, or swap the LinkedIn source based on your provider. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
This workflow starts every morning to build social briefings from upcoming meetings.
- Add or open Scheduled Morning Trigger and set the rule to trigger at
5(hour). - Connect Scheduled Morning Trigger to Setup Initial Variables.
Step 2: Connect Google Calendar
Pull upcoming meetings so attendee domains can be enriched and analyzed.
- Open Retrieve Calendar Meetings and set Operation to
getAll. - Set Limit to
150. - Set Calendar to
=[YOUR_EMAIL]. - Set Options → timeMin to
={{ $today.minus({ days: 5 }) }}and timeMax to={{ $today.plus({ days: 10 }) }}. - Credential Required: Connect your googleCalendarOAuth2Api credentials.
- Confirm the flow continues from Retrieve Calendar Meetings to Derive Attendee Domains.
Step 3: Set Up Enrichment and LinkedIn Retrieval
This stage extracts attendee domains, enriches company data, and pulls recent LinkedIn posts.
- In Setup Initial Variables, add fields linkedIn_API_Key and emails (leave values for now).
- In Derive Attendee Domains, set domain_name to
={{ $json.attendees.filter(a => !a.organizer).map(a => a.email.split('@').pop()) }}and attend_Emails to={{ $json.attendees.filter(a => !a.organizer).map(a => a.email) }}. - Use Iterate Attendee List to batch attendees, then configure Separate Attendee Fields with Field to Split Out set to
domain_nameand Fields to Include set toattend_Emails, start. - In Enhance Company Profile, set Domain to
{{json.domain_name}}. Credential Required: Connect your clearbitApi credentials. - After enrichment, add a brief pause using Pause for Enrichment, then validate results in Validate Enrichment Result with the condition
={{ $json.linkedin.handle !== null }}. - Configure Request Recent LinkedIn Posts with URL set to
https://fresh-linkedin-profile-data.p.rapidapi.com/get-company-posts, Query Parameters oflinkedin_url==https://www.linkedin.com/{{ $json.linkedin.handle }}andsort_by=recent, and headerX-RapidAPI-Key=={{ $('Setup Initial Variables').item.json.linkedInAPIKey }}.
linkedIn_API_Key, but Request Recent LinkedIn Posts reads linkedInAPIKey. Make sure the field name matches the expression to avoid missing API keys.Step 4: Set Up the AI Summary and Social Context
Here you extract insights, summarize with AI, and prepare message context. Select Key Post Insights outputs to both Generate Email Summary and Prepare Social Summary in parallel.
- In Select Key Post Insights, set linkedin_posts to
={{ $input.item.json.data.slice(0, 10).map(d => { return { text: d.text, likes: d.num_likes, comments: d.num_comments, postedAt: d.posted } } ) }}, name to={{ $('Validate Enrichment Result').item.json.name }}, and meeting to={{ $('Separate Attendee Fields').item.json }}. - Configure Prepare Social Summary to include name, html_linkedin, and set attendeeEmail to
={{ $json.meeting.attendeeEmails.find(a => a.endsWith($json.meeting.domain)) }}, startHour to={{ DateTime.fromISO($json.meeting.start.dateTime).hour }}, and startMinute to={{ DateTime.fromISO($json.meeting.start.dateTime).minute }}. - Open Generate Email Summary and keep Resource as
chatand Chat Model asgpt-4. Credential Required: Connect your openAiApi credentials. - In Combine Summary Context, set Mode to
combineand Combination Mode tomergeByPositionto merge AI output with social summary.
Step 5: Configure Output and Messaging
The final message is built as HTML, then sent via WhatsApp and Gmail in parallel.
- In Delay Before Dispatch, set Amount to
2to introduce a short delay. - In Build HTML Message, keep the HTML template and ensure it references
{{ $json.attendeeEmail }},{{ $json.startHour }},{{ $json.startMinute }},{{ $json.name }}, and{{ $json.message.content }}. - Build HTML Message outputs to both Dispatch WhatsApp Message and Send Email Notice in parallel.
- In Dispatch WhatsApp Message, set Text Body to
={{ $json.html }}, and replace[YOUR_ID]for phoneNumberId and recipientPhoneNumber. Credential Required: Connect your whatsAppApi credentials. - In Send Email Notice, set Send To to
={{ $('Setup Initial Variables').first().json.emails }}, Message to={{ $json.html }}, and Subject to=Latest social activity for: {{ $('Combine Summary Context').item.json.name }}. Credential Required: Connect your gmailOAuth2 credentials.
Step 6: Test and Activate Your Workflow
Validate that meeting data flows through enrichment, AI summarization, and the final messaging outputs.
- Click Execute Workflow to run a manual test starting from Scheduled Morning Trigger.
- Verify that Retrieve Calendar Meetings returns events and that Derive Attendee Domains produces arrays for
domain_nameandattend_Emails. - Check that Select Key Post Insights creates
linkedin_posts, and that Generate Email Summary returns a response used by Build HTML Message. - Confirm that both Dispatch WhatsApp Message and Send Email Notice receive the HTML payload and send successfully.
- When results look correct, toggle the workflow to Active to run automatically each morning.
Common Gotchas
- Google Calendar or Gmail credentials can expire or need specific permissions. If things break, check the n8n Credentials panel and the Google OAuth consent/permissions first.
- If you’re using Wait nodes or external enrichment, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in the OpenAI summarization node are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 45 minutes if your accounts and API access are ready.
No. You’ll connect accounts, paste in API keys, and tweak a few fields and prompts.
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 usage (often a few dollars a month for light use) plus any LinkedIn/enrichment provider costs.
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 you should. You can adjust the tone and structure inside the Generate Email Summary (OpenAI) node, and you can change the final layout in Build HTML Message to match your team’s preferred template. Common tweaks include adding a “talk track” section, inserting account notes from Google Sheets or Odoo, and sending different versions to reps vs. leadership.
Usually it’s expired OAuth access or missing scopes after a Google security update. Reconnect the Google Calendar credential inside n8n, then confirm the same credential is used by the Gmail sending node too. If it still fails, check the event access level (some shared calendars block attendee details) and make sure you’re not pulling from a calendar your account can only “see” but not fully read.
Dozens per day is normal, assuming your LinkedIn/enrichment providers allow that volume.
Often, yes, because this flow has loops, waits, validation checks, and a few “only continue if the data is ready” moments that get clunky (and pricey) elsewhere. n8n handles branching and batching cleanly, which matters when you’re iterating through multiple attendees per meeting. The other big difference is control: you can self-host for unlimited executions and keep data where you want it. Zapier or Make can still be a good fit if you want a very simple “calendar event → email summary” flow with no enrichment, no validation, and minimal customization. If you’re unsure, Talk to an automation expert and get a straight recommendation.
Once this is running, your day starts with meeting briefs instead of mental clutter. Honestly, it’s a calmer way to sell.
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.