

How to Forward Gmail Meeting Notes to Slack with Power Automate
Monitors Gmail for emails containing meeting notes or action items and forwards them to the appropriate Slack channel so your team stays informed without being CC'd.
Steps and UI details are based on platform versions at time of writing — check each platform for the latest interface.
Best for
Microsoft 365 teams who receive external meeting confirmations and notes via Gmail and need those updates visible in Slack without manual forwarding.
Not ideal for
Teams using Outlook instead of Gmail — use the Outlook connector in Power Automate instead, which has native webhook support and fires faster.
Sync type
real-timeUse case type
notificationReal-World Example
A 20-person consulting firm receives external meeting recaps from clients via Gmail — project managers were manually copying notes into Slack channels, which took 5-10 minutes per email and often happened hours late. After this flow, any email tagged 'meeting-notes' hits #project-updates in under 3 minutes with the sender, subject, and body snippet included. The team stopped missing action items buried in inboxes.
What Will This Cost?
Drag the slider to your expected monthly volume.
Each platform counts differently — Zapier: 1 task per trigger. Make: 1 operation per module per record. n8n: 1 execution per run.





Prices shown for annual billing. Based on published pricing as of April 2026.
Estimated ROI
1000
min saved/mo
$583
labor value/mo
Free
no platform cost
Based on ~2 min manual effort per operation at $35/hr fully loaded labor cost.
Implementation
Import this workflow directly into Power Automate
Copy the pre-built Power Automate blueprint and paste it straight into Power Automate. All modules, filters, and field mappings are already configured — you just need to connect your accounts.
Before You Start
Make sure you have everything ready.
Field Mapping
Map these fields between your apps.
| Field | API Name | |
|---|---|---|
| Required | ||
| Message ID | ||
| Subject | ||
| From | ||
| Received Time | ||
| Body Preview | ||
| Slack Channel Name | ||
| Compose Output (formatted message) | ||
1 optional field▸ show
| To |
Step-by-Step Setup
make.powerautomate.com > My flows > + New flow > Automated cloud flow
Open Power Automate and create a new Automated cloud flow
Go to make.powerautomate.com and sign in. In the left sidebar, click 'My flows', then click '+ New flow' at the top. Select 'Automated cloud flow' from the dropdown — this is what lets Gmail trigger the flow when a new email arrives. Give the flow a name like 'Gmail Meeting Notes to Slack' so it's easy to find later.
- 1Sign in at make.powerautomate.com
- 2Click 'My flows' in the left sidebar
- 3Click '+ New flow' at the top of the page
- 4Select 'Automated cloud flow' from the dropdown
- 5Enter a flow name and click 'Skip' on the trigger picker to set it manually
Flow Designer > Trigger block > Search 'Gmail' > When a new email arrives (V3)
Add the Gmail trigger for new emails
Click the empty trigger block and type 'Gmail' in the connector search bar. Select the Gmail connector from the results. Choose the trigger 'When a new email arrives (V3)' — this is the most current version and supports label and subject filters. Power Automate polls Gmail on a schedule; the minimum interval on most plans is 1 minute.
- 1Click the trigger block labeled 'Choose a trigger'
- 2Type 'Gmail' in the search bar
- 3Select the Gmail connector
- 4Click 'When a new email arrives (V3)'
Trigger config panel > Sign in > Google OAuth popup
Connect your Gmail account
After selecting the trigger, Power Automate will prompt you to sign in to Gmail. Click 'Sign in' and complete Google's OAuth flow in the popup window. If your Google Workspace enforces OAuth app restrictions, you may need an admin to whitelist Power Automate's app ID before this step works. Once connected, the connection will appear under 'Connections' in the left sidebar for reuse.
- 1Click 'Sign in' in the Gmail trigger config panel
- 2Select your Google account in the popup
- 3Click 'Allow' to grant Power Automate access to Gmail
- 4Return to the flow designer — the trigger panel should now show your email address
Flow Designer > Gmail trigger config panel > Label / Subject Filter / Include Attachments / Fetch Only Unread
Configure Gmail trigger filters
In the trigger config panel, set 'Label' to a Gmail label you use for meeting notes (e.g., 'meeting-notes') or leave it as 'INBOX' to catch all incoming mail. Set 'Subject Filter' to a keyword like 'meeting' or 'action items' — Power Automate checks if the subject contains this string. Set 'Include Attachments' to No unless you need to forward files. Set 'Fetch Only Unread Emails' to Yes to avoid reprocessing old messages.
- 1Set 'Label' to 'meeting-notes' or 'INBOX'
- 2Enter a subject keyword like 'meeting' in the Subject Filter field
- 3Set 'Include Attachments' to No
- 4Set 'Fetch Only Unread Emails' to Yes
- 5Set 'Importance' to Any
Flow Designer > + New step > Control > Condition
Add a Condition to validate meeting-related content
Click '+ New step' below the trigger. Search for 'Condition' and select it under the Control category. This lets you add a second filter on top of the Gmail trigger — specifically checking the email body for keywords like 'action item', 'follow-up', or 'recap'. This prevents generic emails that happen to mention 'meeting' in the subject from flooding your Slack channel.
- 1Click '+ New step' below the Gmail trigger
- 2Type 'Condition' in the search bar
- 3Select 'Condition' under the Control connector
- 4In the left value field, click inside and select 'Body' from the Gmail dynamic content panel
- 5Set the operator to 'contains'
- 6Type 'action item' in the right value field
Flow Designer > Condition > Yes branch > + Add an action > Data Operation > Compose
Add a Compose action to build the Slack message
Inside the 'Yes' branch of the Condition, click '+ Add an action' and search for 'Compose'. Select 'Compose' under the Data Operation connector. Use this step to build a clean, formatted message string before it hits Slack. Reference dynamic content from the Gmail trigger: Subject, From, Body Preview, and Received Time. Keeping this in a Compose step makes debugging much easier — you can see the formatted output in the run history.
- 1Click '+ Add an action' inside the Yes branch
- 2Search for 'Compose' and select it under Data Operation
- 3Click in the Inputs field
- 4Type: '📅 *Meeting Follow-up* | ' then insert the Subject dynamic token
- 5Press Enter and type 'From: ' then insert the From dynamic token
- 6Press Enter and type 'Received: ' then insert the Received Time dynamic token
- 7Press Enter and type 'Preview: ' then insert the Body Preview dynamic token
channel: {{channel}}
ts: {{ts}}
Flow Designer > Yes branch > + Add an action > Slack > Post message (V2)
Add the Slack action to post the message
Below the Compose step, click '+ Add an action' and search for 'Slack'. Select the Slack connector and choose the action 'Post message (V2)'. Connect your Slack workspace when prompted via OAuth. In the 'Channel Name' field, enter the target channel (e.g., '#meeting-followups' or '#project-updates'). In the 'Message Text' field, select the 'Outputs' dynamic token from the Compose step above.
- 1Click '+ Add an action' below the Compose step
- 2Search for 'Slack' and select the Slack connector
- 3Choose 'Post message (V2)'
- 4Click 'Sign in' and authorize Power Automate in your Slack workspace
- 5Set 'Channel Name' to your target channel (e.g., meeting-followups)
- 6Click in 'Message Text' and select 'Outputs' from the Compose step in the dynamic content panel
Flow Designer > + New step > Control > Scope > Configure run after
Add error handling with a Scope and Configure Run After
Wrap your Compose and Slack actions inside a Scope block for clean error handling. Click '+ New step' before the Compose action, search for 'Scope', and drag your existing actions inside it. Then add a second Scope below the first. Right-click the second Scope, select 'Configure run after', and check 'has failed' and 'has timed out'. Inside this error scope, add a 'Send an email (V2)' or 'Post message' action to alert you when the flow breaks.
- 1Click '+ New step' and add a Scope block (Control > Scope)
- 2Drag the Compose and Slack actions inside the first Scope
- 3Add a second Scope block below the first
- 4Right-click the second Scope's header and select 'Configure run after'
- 5Check 'has failed' and 'has timed out', then click Done
- 6Inside the second Scope, add a Gmail 'Send email (V2)' action to notify yourself of failures
Flow Designer > Save > Test > Manually > Trigger now
Test the flow with a real Gmail message
Click 'Save' in the top right, then click 'Test' and select 'Manually' to trigger an immediate test run. Send yourself a Gmail email with your configured subject keyword and body text (include 'action item' in the body so the Condition passes). Within 1-3 minutes, Power Automate should detect the email and post to Slack. Click 'Flow checker' before testing to catch any configuration errors.
- 1Click 'Save' in the top right corner
- 2Click 'Test' next to the Save button
- 3Select 'Manually' and click 'Test'
- 4Send a test Gmail to yourself with 'meeting' in the subject and 'action item' in the body
- 5Return to Power Automate and click 'Run flow'
- 6Watch the run history — green checkmarks indicate success on each step
Flow Designer > Yes branch > After Slack action > + Add an action > Gmail > Mark email as read
Mark processed emails to prevent duplicates
Add a final action after the Slack post: use the Gmail 'Mark email as read' action, passing in the Message ID dynamic token from the trigger. This prevents the same email from triggering the flow again on the next poll cycle. The trigger is set to 'Fetch Only Unread Emails', so marking as read is your deduplication mechanism.
- 1Click '+ Add an action' after the Slack Post message step
- 2Search for 'Gmail' and select 'Mark email as read'
- 3In the 'Message Id' field, select the Message ID dynamic token from the Gmail trigger
- 4Click Save
make.powerautomate.com > My flows > [Your flow] > 28 day run history
Turn on the flow and monitor the first 24 hours
Go to 'My flows' and confirm the flow toggle is set to On. Click into the flow and open the '28 day run history' panel to monitor for errors. For the first day, check after each known meeting to confirm emails are hitting Slack. If any runs show 'Failed', click into the run to see exactly which step broke and what error message appeared.
- 1Go to My flows and verify the flow status shows 'On'
- 2Click into the flow to open the detail page
- 3Open the '28 day run history' panel on the right
- 4After your next real meeting email arrives, check the run history for a new entry
- 5Click any run to expand the step-by-step execution log
Paste this expression into the Inputs field of a Compose action placed immediately after the Gmail trigger. It extracts the sender's domain, formats the received timestamp into a readable date, and lowercases the subject for consistent keyword matching in your Condition step. Use the outputs of this Compose as input tokens throughout the rest of the flow.
JavaScript — Code Step// Power Automate expressions — paste each into a Compose action's Inputs field▸ Show code
// Power Automate expressions — paste each into a Compose action's Inputs field // or reference them directly in field value boxes // 1. Extract sender domain from From field (e.g. 'acmecorp.com' from '[email protected]')
... expand to see full code
// Power Automate expressions — paste each into a Compose action's Inputs field // or reference them directly in field value boxes // 1. Extract sender domain from From field (e.g. 'acmecorp.com' from '[email protected]') last(split(triggerOutputs()?['body/from'], '@')) // 2. Format received timestamp to readable date-time (e.g. '14 Nov 2024, 2:32 PM') formatDateTime(triggerOutputs()?['body/receivedDateTime'], 'dd MMM yyyy, h:mm tt') // 3. Lowercase subject for case-insensitive keyword matching in Condition tolower(triggerOutputs()?['body/subject']) // 4. Strip HTML tags from body using replace (basic — use Content Conversion for full HTML) replace(replace(triggerOutputs()?['body/body'], '<br>', ' '), '<div>', '') // 5. Build full formatted Slack message in one Compose concat( '📅 *', triggerOutputs()?['body/subject'], '*', ' | From: ', triggerOutputs()?['body/from'], ' | ', formatDateTime(triggerOutputs()?['body/receivedDateTime'], 'dd MMM yyyy h:mm tt'), ' ', triggerOutputs()?['body/bodyPreview'] )
Going live
Production Checklist
Before you turn this on for real, confirm each item.
Troubleshooting
Common errors and how to fix them.
Frequently Asked Questions
Common questions about this workflow.
Analysis
Use Power Automate for this if your team already runs on Microsoft 365. The Gmail and Slack connectors are both first-class in Power Automate, the Condition block handles keyword filtering without code, and your IT department already manages Power Automate licenses. If your company uses Outlook instead of Gmail, drop Gmail entirely and use the Outlook connector — it supports push triggers (not polling), which means sub-30-second delivery instead of 1-3 minutes. If your team doesn't have any Microsoft licenses, use Zapier instead: the setup is faster and the Gmail trigger works the same way.
The cost math is straightforward. Each meeting email that flows through uses roughly 5 API calls (poll, condition, compose, Slack post, mark as read). Power Automate's free tier gives 750 API calls per month — that's 150 meeting emails before you hit the cap. A team receiving 10 meeting follow-ups per day (300/month) needs Plan 1 at $15/user/month, which gives 40,000 calls. Zapier's equivalent would cost $29.99/month for the Starter plan and handles the same volume with a simpler per-task model. Make's free tier gives 1,000 operations/month — enough for 200 meeting emails — and the Core plan at $9/month handles 10,000 operations. Make is cheaper for this specific workload. Power Automate only wins on cost if you're already paying for a Microsoft 365 Business plan, where Power Automate Plan 1 is included.
Zapier handles this workflow in 5 steps and fires within 1 minute of email arrival — its Gmail trigger is more reliable than Power Automate's polling in practice. Make's Router module lets you split emails to multiple Slack channels in one flow without nested conditions, which is cleaner than Power Automate's Switch block. n8n gives you full control over HTML parsing with a Code node, so stripping email HTML before posting to Slack is trivial — Power Automate's HTML-to-text workaround is clunky. Pipedream runs this as a Node.js function with zero polling delay using Gmail push notifications via Google Pub/Sub. Power Automate is still the right call when your org already has it licensed, your IT team manages connectors centrally, and you need this flow auditable in the Microsoft ecosystem — the run history and admin center integration are genuinely better than competitors for enterprise compliance.
Three things you'll hit post-setup. First, the Slack bot silently fails on private channels — it posts fine to public channels but returns 'channel_not_found' on private ones unless explicitly invited. Run /invite @Power Automate before your first real email arrives. Second, Gmail's 'Body' field is HTML. If you build your Slack message from Body instead of Body Preview, your #meeting-followups channel will fill up with raw div tags and inline styles. Use Body Preview or add the Content Conversion HTML-to-text step. Third, Google OAuth tokens tied to a personal account expire or break when that person changes their password or leaves the company. For production use, create a dedicated Google service account or shared Gmail account and authorize the Power Automate connection from that account — not someone's personal login.
Ideas for what to build next
- →Route emails to different Slack channels by sender domain — Add a Switch control block after the Condition step. Use the sender domain expression (last(split(from, '@'))) to route emails from acmecorp.com to #acme-meetings and emails from riverdalemedia.com to #riverdale-meetings. This replaces one generic channel with targeted channel routing.
- →Create a daily Slack digest instead of per-email posts — Switch from an Automated flow to a Scheduled flow that runs at 5pm daily. Use the Gmail 'Get emails (V3)' action with a date filter for today's messages, loop through results with an Apply to each block, and post a single compiled Slack message. This cuts Slack noise from 10 individual posts to one summary.
- →Log meeting follow-ups to a SharePoint list or Excel table — After the Slack post step, add a SharePoint 'Create item' action or an Excel 'Add a row into a table' action. Map Subject, From, Received Time, and Body Preview to columns. You get a searchable archive of all meeting follow-ups that doesn't live only in Slack where it gets buried.
Related guides
How to Share Notion Meeting Notes to Slack with Pipedream
~15 min setup
How to Share Notion Meeting Notes to Slack with Power Automate
~15 min setup
How to Share Notion Meeting Notes to Slack with n8n
~20 min setup
How to Send Notion Meeting Notes to Slack with Zapier
~8 min setup
How to Share Notion Meeting Notes to Slack with Make
~12 min setup
How to Create Notion Tasks from Slack with Pipedream
~15 min setup