Intermediate~15 min setupCommunication & EmailVerified April 2026
Slack logo
Gmail logo

How to Forward Gmail Emails to Slack with Power Automate

Automatically posts matching Gmail messages — filtered by sender, subject, or label — to a designated Slack channel as soon as they arrive.

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 that already use Power Automate and need to surface vendor or customer emails in Slack without leaving their existing automation stack.

Not ideal for

Teams outside the Microsoft ecosystem — Zapier or Make will get this running faster with less credential overhead.

Sync type

real-time

Use case type

notification

Real-World Example

💡

A 12-person e-commerce ops team receives 30-50 vendor shipping delay emails per day to a shared Gmail inbox. Before this flow, someone had to monitor the inbox and manually paste updates into #logistics on Slack — emails sat unseen for 2-3 hours on average. Now, any email from a @vendor-domain.com address tagged with the 'Shipping' label posts to #logistics within 3 minutes, with the sender, subject, and a truncated body visible directly in the Slack message.

What Will This Cost?

Drag the slider to your expected monthly volume.

/mo
505005K50K

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

Skip the setup

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.

Gmail account with messages.readonly OAuth scope granted to Power Automate during the connection setup in Step 3
Slack workspace where you have permission to add apps — requires the channels:write and chat:write bot token scopes
Microsoft account (personal or work/school) with access to make.powerautomate.com — free tier works for this flow
The target Slack channel must already exist and the Power Automate bot must be invited to it before Step 6

Optional

Gmail labels created in advance if you plan to filter by label — Power Automate reads existing labels but cannot create them

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
From (Sender Address)
Subject
Slack Channel
5 optional fields▸ show
Body Preview
Received Time
Label Name
Attachments (Has Attachment flag)
Message ID

Step-by-Step Setup

1

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 with your Microsoft account. In the left sidebar, click 'My flows', then click '+ New flow' in the top bar. Select 'Automated cloud flow' from the dropdown — this is the flow type that fires on an event, not a schedule. Give the flow a clear name like 'Gmail → Slack: Vendor Emails'.

  1. 1Navigate to make.powerautomate.com and sign in
  2. 2Click 'My flows' in the left sidebar
  3. 3Click '+ New flow' in the top-right area
  4. 4Select 'Automated cloud flow' from the menu
  5. 5Enter a flow name and click 'Skip' to open the canvas — you'll choose the trigger manually
What you should see: You should see the Power Automate flow canvas with an empty trigger block labeled 'Choose a trigger'.
Common mistake — Do NOT select 'Instant cloud flow' — that requires manual button clicks to run. You want 'Automated cloud flow' so it fires on incoming email.
2

Flow canvas > Trigger block > Search 'Gmail' > When a new email arrives (V3)

Add the Gmail 'When a new email arrives' trigger

Click the trigger block on the canvas and type 'Gmail' in the connector search bar. Select the Gmail connector from the results. Choose the trigger 'When a new email arrives (V3)' — use V3 specifically, as earlier versions lack label filtering. This trigger polls your Gmail inbox every 1-3 minutes depending on your plan.

  1. 1Click inside the empty trigger block
  2. 2Type 'Gmail' in the search bar
  3. 3Click the Gmail connector icon
  4. 4Select 'When a new email arrives (V3)' from the trigger list
What you should see: A Gmail trigger card appears on the canvas with configuration fields for Label, From, Subject Filter, and Importance.
Common mistake — The V2 trigger does not expose the label filter field. If you see only 'Folder' and 'To' in the trigger card, you selected V2 — go back and pick V3.
Power Automate
+
click +
search apps
Slack
SL
Slack
Add the Gmail 'When a new em…
Slack
SL
module added
3

Gmail trigger card > Sign in > Google OAuth popup

Authenticate your Gmail account

After selecting the trigger, Power Automate will prompt you to sign in to Gmail. Click 'Sign in' and complete the Google OAuth flow in the popup window. You'll need to grant Power Automate permission to read your Gmail messages. Once authenticated, your email address appears in the Connection dropdown at the top of the trigger card.

  1. 1Click 'Sign in' in the Gmail trigger card
  2. 2Select your Google account in the OAuth popup
  3. 3Click 'Allow' on the Google permissions screen
  4. 4Confirm your email address appears in the Connection field on the trigger card
What you should see: The trigger card shows your Gmail address in the Connection field and the configuration options (Label, From, Subject Filter) become editable.
Common mistake — If you're using a Google Workspace account with restricted OAuth apps, your admin may need to allowlist the Power Automate app ID (client ID: 9b1c2d6f-... varies by tenant) in the Google Admin Console before this step works.
4

Gmail trigger card > Label Name / From / Subject Filter fields

Configure Gmail trigger filters

Now set the filter criteria so only relevant emails fire the flow. In the trigger card, set 'Label Name' to the Gmail label you want to monitor (e.g., 'Vendor' or 'INBOX'). Use 'From' to restrict by sender domain (e.g., @supplierco.com) and 'Subject Filter' to match keywords (e.g., 'Urgent' or 'Invoice'). You can leave fields blank to match all — but blank From + blank Subject means every incoming email triggers the flow.

  1. 1Click the 'Label Name' dropdown and select your target label
  2. 2Type a sender address or domain in the 'From' field (optional)
  3. 3Type a subject keyword in the 'Subject Filter' field (optional)
  4. 4Leave 'Importance' as 'Any' unless you want to filter by priority
What you should see: The trigger card shows your selected label and any filter values. The canvas displays a summary like 'When email from @supplierco.com with label Vendor arrives'.
Common mistake — The 'From' field in this trigger does an exact string match, not a domain wildcard. Entering '@supplierco.com' will NOT match — you must enter the full address like '[email protected]'. To handle multiple senders, you'll add a condition in Step 6.
Slack
SL
trigger
filter
Condition
matches criteria?
yes — passes through
no — skipped
Gmail
GM
notified
5

Flow canvas > + New step > Control > Condition

Add a Condition to filter emails in Power Automate

Click '+ New step' below the trigger. Search for 'Condition' and select the built-in Control action. This is where you handle multi-sender filtering or subject keyword logic that the Gmail trigger itself can't cover. In the left field of the condition, click inside and select 'From' from the dynamic content panel. Set the operator to 'contains' and enter your target domain or sender string in the right field.

  1. 1Click '+ New step'
  2. 2Search 'Condition' in the action picker
  3. 3Select 'Condition' under the Control group
  4. 4Click the left field of the condition and choose 'From' from the dynamic content panel
  5. 5Set the operator to 'contains' and type your filter value (e.g., '@supplierco.com')
What you should see: A Condition block appears with 'Yes' and 'No' branches. The left field shows the Gmail 'From' dynamic token and your filter string is in the right field.
Common mistake — Filters are the most common place setups break. Double-check the field name and value exactly match what your app sends — a single capital letter difference will block everything.
6

Condition > Yes branch > Add an action > Slack > Post message (V2)

Build the Slack message in the 'Yes' branch

Inside the 'Yes' branch of the Condition, click 'Add an action'. Search for 'Slack' and select 'Post message (V2)'. This is the correct action for posting to a public or private channel — not 'Send a direct message'. Authenticate your Slack workspace when prompted. Then configure the Channel field and compose the message text using Gmail dynamic content tokens.

  1. 1Click 'Add an action' inside the Yes branch
  2. 2Search 'Slack' and select the Slack connector
  3. 3Choose 'Post message (V2)'
  4. 4Sign in to Slack and authorize Power Automate for your workspace
  5. 5Select your target channel from the Channel dropdown (e.g., #vendor-alerts)
What you should see: A Slack action card appears inside the Yes branch with Channel and Message Text fields ready to configure.
Common mistake — Power Automate's Slack connector uses a bot token scoped to channels it's been invited to. If your target channel doesn't appear in the Channel dropdown, open Slack, go to the channel, and type /invite @Power Automate.
7

Slack action card > Message Text field > Dynamic content panel

Compose the Slack message text with Gmail fields

Click inside the 'Message Text' field of the Slack action. Use the dynamic content panel to insert Gmail fields. A clear format: start with the sender, then subject, then a truncated body. Power Automate does not auto-truncate body text — if you send the full 'Body' field, long emails create wall-of-text Slack messages. Use an expression to cap it at 500 characters.

  1. 1Click inside the Message Text field
  2. 2Type '*From:* ' then select 'From' from the dynamic content panel
  3. 3Press Enter, type '*Subject:* ' then select 'Subject'
  4. 4Press Enter, type '*Preview:* ' then click 'Expression' tab and enter: substring(triggerOutputs()?['body/body'], 0, 500)
What you should see: The Message Text field shows a mix of static labels and dynamic content tokens. The expression for body preview appears as a function chip.
Common mistake — Gmail sends both 'Body' (HTML) and 'Body Preview' (plain text, first 255 chars) fields. Use 'Body Preview' if you want a quick summary without running the substring expression — but it hard-caps at 255 characters with no control over the cutoff.
Slack fields
text
user
channel
ts
thread_ts
available as variables:
1.props.text
1.props.user
1.props.channel
1.props.ts
1.props.thread_ts
8

Slack action card > Show advanced options > Bot Name / Icon URL

Add the email Subject as the Slack message title

In the Slack 'Post message (V2)' action, look for the optional 'Bot Name' and 'Icon URL' fields — expand 'Show advanced options' to reveal them. Set Bot Name to something like 'Gmail Notifier' so Slack users know the message source. You can also set 'Title' by using Slack's mrkdwn format directly in the message body: prefix your subject line with *bold asterisks* to make it stand out.

  1. 1Click 'Show advanced options' at the bottom of the Slack action card
  2. 2Set Bot Name to 'Gmail Notifier' or your team's preferred label
  3. 3Optionally paste a public image URL in the Icon URL field
  4. 4Leave Thread Timestamp blank unless you want threaded replies
What you should see: The Slack action card shows a bot name and the message preview in the canvas reflects your composed text with dynamic tokens.
Common mistake — Map fields using the variable picker — don't type field names manually. Hand-typed variable names often have invisible spacing errors that produce blank output.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
9

Flow canvas > Save > Test > Manually > Trigger the flow

Test the flow with a real email

Click 'Save' in the top bar, then click 'Test' (top right). Select 'Manually' and then send yourself a test email from the sender address you configured in Step 4 with a matching subject. Wait up to 3 minutes for the Gmail trigger to poll. Once the test email is detected, Power Automate runs the flow and shows a green checkmark on each action that succeeded.

  1. 1Click 'Save' in the top bar
  2. 2Click 'Test' in the top-right corner
  3. 3Select 'Manually' and click 'Test'
  4. 4Send a test email to your Gmail from a matching sender address
  5. 5Return to Power Automate and watch the run status update
What you should see: Each step shows a green checkmark and the run detail panel shows the Gmail trigger fired, the Condition evaluated to 'Yes', and the Slack action posted successfully. Check your Slack channel to confirm the message appeared.
Common mistake — If you test immediately after saving, the trigger may not fire because Power Automate's polling hasn't synced yet. Wait 2-3 minutes after sending the test email before assuming it failed.
Power Automate
▶ Test flow
executed
Slack
Gmail
Gmail
🔔 notification
received
10

make.powerautomate.com > My flows > [Your flow name] > Run history

Enable the flow and monitor run history

Once testing passes, the flow is already active — Power Automate enables Automated cloud flows by default after a successful test. Go to 'My flows', find your flow, and confirm the toggle shows 'On'. Click into the flow to see Run History. Each row shows whether the run succeeded, failed, or was skipped. Check this daily for the first week to catch any authentication expiry or Slack channel permission issues.

  1. 1Go to 'My flows' in the left sidebar
  2. 2Locate your flow and confirm the status toggle is 'On'
  3. 3Click the flow name to open the detail page
  4. 4Review Run History — look for any red failure rows
  5. 5Click a failed run to see which step errored and the raw error message
What you should see: The flow detail page shows 'Status: On' and at least one successful run in the Run History table with green status icons.
Common mistake — Gmail OAuth tokens expire if the connected account's password changes or 2FA settings are updated. When this happens, the flow silently stops — you won't get an email alert by default. Set up a 'Flow failure alert' email in Power Automate settings to catch this.

Paste this expression into a 'Compose' action inserted between the Gmail trigger and the Slack action. It strips HTML from the email body, truncates to 500 characters, and appends a direct Gmail link using the message ID — so Slack recipients can open the original email in one click.

JavaScript — Code Step// Add a 'Compose' action after the Gmail trigger.
▸ Show code
// Add a 'Compose' action after the Gmail trigger.
// In the Compose 'Inputs' field, switch to Expression mode and enter:
concat(

... expand to see full code

// Add a 'Compose' action after the Gmail trigger.
// In the Compose 'Inputs' field, switch to Expression mode and enter:

concat(
  '*From:* ', triggerOutputs()?['body/from'], '
',
  '*Subject:* ', triggerOutputs()?['body/subject'], '
',
  '*Received:* ', formatDateTime(triggerOutputs()?['body/receivedDateTime'], 'ddd MMM d, h:mm tt'), '
',
  '*Preview:* ', substring(
    replace(
      replace(triggerOutputs()?['body/body'], '<[^>]+>', ''),
      '&nbsp;', ' '
    ),
    0,
    min(500, length(replace(replace(triggerOutputs()?['body/body'], '<[^>]+>', ''), '&nbsp;', ' ')))
  ), '
',
  '<https://mail.google.com/mail/u/0/#inbox/', triggerOutputs()?['body/id'], '|Open in Gmail>'
)

// Then in the Slack 'Post message' action, set Message Text to:
// outputs('Compose')
// This posts clean plain-text previews with a clickable Gmail deep-link.

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

VerdictWhy n8n for this workflow

Use Power Automate for this if your team is already inside the Microsoft 365 ecosystem. If your Slack workspace is connected to Azure AD, the bot authorization is smoother. If you're managing flows alongside other Power Automate work (SharePoint notifications, Teams alerts, Dataverse updates), keeping Gmail-to-Slack here avoids tool sprawl. The one scenario where you should go elsewhere: if your team has no existing Power Automate usage and you just need this one flow — setup overhead is higher here than on Zapier, where the same workflow takes 6 steps instead of 10.

Cost

Power Automate's free plan gives you 750 cloud flow runs per month. This flow uses one run per matching email. At 25 matching emails per day, you hit 750 runs in exactly 30 days — right at the free tier ceiling. The Power Automate per-user plan costs $15/user/month and gives you 40,000 runs/month, which covers virtually any realistic email forwarding volume. Compare that to Zapier, where the equivalent Starter plan runs $19.99/month for 750 tasks — same ceiling, higher price. Make's free tier gives you 1,000 operations/month, and their Core plan at $10.59/month covers 10,000 operations. For this specific workflow, Make is cheaper at every volume tier above the free plan.

Tradeoffs

Zapier has the fastest setup for this use case — their Gmail + Slack Zap template is pre-built and takes about 8 minutes to configure. The filter step is cleaner than Power Automate's Condition block. Make's scenario handles this well too, with a more visual filter module and better HTML-stripping tools built into its text parsing functions. n8n gives you the most control if you need complex routing logic — a Function node can parse the entire email and route to 10 different channels with conditional formatting. Pipedream's Gmail source fires on real webhooks via Gmail push notifications, not polling, so delivery is faster than any of the above. Power Automate wins if you need this flow to interact with Microsoft services downstream — writing to SharePoint, creating Planner tasks, or triggering Teams messages — because the connectors are native and authentication is shared across your tenant.

Three things you'll hit after go-live. First, the Gmail 'Body' field returns raw HTML — inline styles, div tags, reply chain formatting — and Slack renders none of it. Your messages will look broken until you add the HTML-stripping expression from the pro tip. Second, Google OAuth tokens issued to Power Automate silently expire when users change their passwords or when Google detects unusual access patterns. The flow just stops running with no alert unless you've configured failure notifications. Check run history weekly for the first month. Third, the Gmail trigger's 'From' filter is an exact string match — 'supplierco.com' does not match '[email protected]'. This catches a lot of people and results in the Condition block doing all the filtering work while the trigger passes everything through, which burns more runs than expected.

Ideas for what to build next

  • Route to multiple Slack channels by sender domainAdd a Switch control action after the Gmail trigger to evaluate the sender domain and post to different channels — #finance for billing@, #logistics for orders@, etc. This removes the need for separate flows per channel.
  • Save forwarded emails to a SharePoint list for audit loggingAdd a 'Create item' SharePoint action in the Yes branch alongside the Slack post. Log the sender, subject, timestamp, and Slack channel. This gives you a searchable record of every email that was forwarded — useful for compliance or volume reporting.
  • Add a daily digest instead of real-time postsReplace the Automated cloud flow with a Scheduled cloud flow that runs once per day. Use the Gmail 'Get emails' action with a query filter (e.g., after:yesterday) and loop through results to build a single Slack digest message — reduces Slack noise for lower-urgency email categories.

Related guides

Was this guide helpful?
Slack + Gmail overviewPower Automate profile →