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

How to Send Gmail Digest Summaries to Slack with Power Automate

A scheduled Power Automate flow queries Gmail for labeled, unread, or domain-filtered emails on a daily or weekly cadence and posts a formatted digest message to a Slack channel.

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 already use Power Automate and want a scheduled Slack digest of priority Gmail activity without building custom code.

Not ideal for

Teams that need real-time email alerts per message — use an event-triggered flow or a dedicated tool like Zapier instead.

Sync type

scheduled

Use case type

notification

Real-World Example

💡

A 20-person agency uses this to post a 9 AM Slack digest to #client-comms every weekday, summarizing all unread emails from client domains received in the last 24 hours. Before this flow, account managers were either checking Gmail constantly or missing client emails until midday. Now the whole team sees priority emails in one place without leaving Slack.

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 IMAP enabled (Google Workspace admins must enable IMAP in Admin Console > Apps > Gmail > End User Access)
Power Automate account with a Microsoft 365 license — the Gmail and Slack connectors are standard connectors available on all paid plans
Slack workspace with permission to add apps — you need 'Manage app installations' permission or workspace admin approval
Target Slack channel already created and the flow-connected Slack user must be a member of that channel

Optional

Gmail labels already created if you plan to filter by label — create them in Gmail Settings > Labels before building the flow

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Email Subject
From Address
Received Date/Time
Slack Channel Name
Digest Message Body (DigestBody variable)
4 optional fields▸ show
Body Preview
Label Names
Is Unread
Message ID

Step-by-Step Setup

1

make.powerautomate.com > My flows > + New flow > Scheduled cloud flow

Create a new Scheduled cloud flow

Go to make.powerautomate.com and sign in with your Microsoft 365 account. In the left sidebar, click 'My flows', then click '+ New flow' at the top. Select 'Scheduled cloud flow' from the dropdown — this is the correct flow type because the digest runs on a timer, not on an event. Name the flow something like 'Gmail Daily Digest to Slack'.

  1. 1Click 'My flows' in the left sidebar
  2. 2Click '+ New flow' at the top of the page
  3. 3Select 'Scheduled cloud flow'
  4. 4Enter a name: 'Gmail Daily Digest to Slack'
  5. 5Set the start time, repeat frequency (e.g., every 1 day), and click 'Create'
What you should see: You land in the flow canvas with a single 'Recurrence' trigger block already placed at the top.
Common mistake — Do not choose 'Automated cloud flow' — that fires per-email in real time. For a digest, you need 'Scheduled cloud flow' so all emails batch together before posting.
2

Flow canvas > Recurrence trigger > Show advanced options

Configure the Recurrence trigger timing

Click the 'Recurrence' block to expand its settings. Set 'Interval' to 1 and 'Frequency' to Day for a daily digest, or 1 Week for a weekly digest. Expand 'Add new parameter' and add 'At these hours' (set to 9 for 9 AM) and 'At these minutes' (set to 0). This ensures the flow fires at a predictable time your team expects.

  1. 1Click the 'Recurrence' trigger block
  2. 2Set Interval to '1' and Frequency to 'Day'
  3. 3Click 'Add new parameter'
  4. 4Select 'At these hours' and enter '9'
  5. 5Select 'At these minutes' and enter '0'
What you should see: The Recurrence block shows 'Every 1 Day at 9:00 AM' in its summary line.
Common mistake — Power Automate schedules in UTC by default. If your team is in EST (UTC-5), set the hour to 14 to hit 9 AM local time.
Power Automate
+
click +
search apps
Slack
SL
Slack
Configure the Recurrence tri…
Slack
SL
module added
3

Flow canvas > + New step > Search: Gmail > Get emails (V3)

Add the Gmail connection

Click '+ New step' below the Recurrence block. In the action search bar, type 'Gmail' and select the Gmail connector. Choose the action 'Get emails (V3)'. If you have not connected Gmail before, Power Automate will prompt you to sign in with your Google account — click 'Sign in' and grant the requested permissions. The connection is saved under your account and reused by future flows.

  1. 1Click '+ New step'
  2. 2Type 'Gmail' in the connector search bar
  3. 3Select the 'Gmail' connector
  4. 4Choose 'Get emails (V3)' from the action list
  5. 5Click 'Sign in' if prompted and authenticate with your Google account
What you should see: The 'Get emails (V3)' action block appears on the canvas with your Gmail address shown in the Connection field.
Common mistake — Power Automate's Gmail connector requires a standard Google account or Google Workspace account with IMAP enabled. If your Workspace admin has disabled IMAP, this connector will fail at the connection step — check Google Workspace Admin > Apps > Gmail > IMAP access.
4

Flow canvas > Get emails (V3) > Search Query field

Filter emails by label, domain, or unread status

Inside the 'Get emails (V3)' action, configure the query fields to target only the emails you want in the digest. Use the 'Search Query' field to write a Gmail search string exactly as you would in the Gmail search bar. To fetch unread emails from a specific domain received in the last day, combine filters. Set 'Max Results' to 50 to cap the batch size.

  1. 1Click the 'Search Query' field inside the Get emails (V3) action
  2. 2Enter your Gmail filter, e.g.: is:unread from:@acmecorp.com newer_than:1d
  3. 3For label-based filtering, use: label:client-priority is:unread newer_than:1d
  4. 4Set 'Max Results' to 50
  5. 5Leave 'Include Attachments' set to No to keep the flow fast
What you should see: The action block shows your search query string and the max results value. No test run output yet — that happens when you save and test.
Common mistake — The 'newer_than:1d' Gmail filter is relative to when the flow runs, not midnight. If your flow fires at 9 AM, it fetches emails from the past 24 hours, which includes some from the previous day. For strict midnight-to-midnight windows, use the 'After' date filter built from a formatDateTime expression instead.
Slack
SL
trigger
filter
Status
matches criteria?
yes — passes through
no — skipped
Gmail
GM
notified
5

Flow canvas > + New step > Search: Initialize variable

Initialize a variable to build the digest message

Click '+ New step' and search for 'Initialize variable'. Add this action before the loop. Name the variable 'DigestBody', set Type to 'String', and set Value to an empty string or a header like ':envelope: *Gmail Digest — [date]*\n'. This variable will accumulate each email summary as you loop through results. Using a variable is the correct approach here — string concatenation inside a loop without one causes flow errors.

  1. 1Click '+ New step'
  2. 2Search for 'Initialize variable' and select it
  3. 3Set Name to 'DigestBody'
  4. 4Set Type to 'String'
  5. 5Set Value to: :envelope: *Gmail Digest*\n
What you should see: An 'Initialize variable' block appears with Name: DigestBody, Type: String, and your header text in the Value field.
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.
6

Flow canvas > + New step > Apply to each > value (from Get emails V3)

Loop through each email result

Click '+ New step' and search for 'Apply to each'. Select it and click inside the 'Select an output from previous steps' field. Choose the 'value' output from the 'Get emails (V3)' action — this is the array of email objects. Everything you add inside this loop runs once per email. You will add two actions inside the loop: one to format the email summary line and one to append it to the DigestBody variable.

  1. 1Click '+ New step'
  2. 2Search for 'Apply to each' and select it
  3. 3Click in the 'Select an output' field inside the loop
  4. 4Select 'value' from the Get emails (V3) action in the dynamic content panel
  5. 5Click 'Add an action' inside the loop to add your first inner action
What you should see: An 'Apply to each' block wraps and shows 'value' from Gmail as its input. The loop body is empty with an 'Add an action' button inside.
Common mistake — Do not add the Slack post action inside this loop. Posting to Slack once per email defeats the purpose of a digest and will hit Slack's rate limit (1 message per second) fast on any meaningful email volume.
7

Flow canvas > Apply to each > Add an action > Append to string variable

Append each email summary to the variable

Inside the 'Apply to each' loop, click 'Add an action' and search for 'Append to string variable'. Select it. Set Name to 'DigestBody'. In the Value field, build a formatted summary line using dynamic content from the email: From, Subject, and a snippet or received date. Use the expression editor to format the date. Each line becomes one entry in the digest.

  1. 1Click 'Add an action' inside the Apply to each loop
  2. 2Search for 'Append to string variable' and select it
  3. 3Set Name to 'DigestBody'
  4. 4In the Value field, click in the text area and use dynamic content to insert: From, Subject, ReceivedDateTime
  5. 5Format the line as: • *[Subject]* — from [From] at [ReceivedDateTime]\n
What you should see: The 'Append to string variable' block shows DigestBody as the target and your formatted email line template in the Value field with dynamic tokens visible.
Common mistake — The ReceivedDateTime field comes through in ISO 8601 format (e.g., 2024-03-15T14:23:00Z). Use the expression formatDateTime(item()?['ReceivedDateTime'], 'MMM d h:mm tt') to make it human-readable before appending.
8

Flow canvas > + New step > Condition

Add a condition to skip empty digests

After the 'Apply to each' loop closes, add a 'Condition' action. Set the left side to the length of DigestBody using the expression: length(variables('DigestBody')). Set the operator to 'is greater than' and the right side to the length of your header text only (e.g., 30 characters if your header is 30 chars). This prevents the flow from posting a Slack message that just says ':envelope: Gmail Digest' with no emails under it.

  1. 1Click '+ New step' after the Apply to each block
  2. 2Search for 'Condition' and select it
  3. 3In the left field, open the expression editor and enter: length(variables('DigestBody'))
  4. 4Set the operator to 'is greater than'
  5. 5Set the right value to 30 (adjust to match the character length of your header)
What you should see: A Condition block appears with a 'Yes' branch and 'No' branch. The Yes branch is where you will place the Slack action.
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.
9

Flow canvas > Condition > Yes branch > Add an action > Slack > Post message

Connect Slack and post the digest message

Inside the 'Yes' branch of the Condition, click 'Add an action' and search for 'Slack'. Select the Slack connector and choose the 'Post message' action. If you have not connected Slack before, click 'Sign in' and authorize Power Automate to post to your workspace. Set Channel Name to your target channel (e.g., #client-comms) and set Message Text to the 'DigestBody' variable from the dynamic content panel.

  1. 1Click 'Add an action' inside the Yes branch
  2. 2Search for 'Slack' and select the Slack connector
  3. 3Choose 'Post message'
  4. 4Sign in to Slack if prompted and authorize the connection
  5. 5Set Channel Name to your target Slack channel (e.g., client-comms)
  6. 6Click in Message Text and select 'DigestBody' from the dynamic content panel
What you should see: The Slack 'Post message' block shows your workspace connection, the target channel name, and DigestBody as the message content.
Common mistake — Power Automate's Slack connector posts as the authenticated user, not a bot. The message will appear to come from a person's name in Slack. If you want it to appear as a bot, you need to use the Slack API directly via an HTTP action with a Bot OAuth token instead.
message template
🔔 New Record: {{text}} {{user}}
channel: {{channel}}
ts: {{ts}}
#sales
🔔 New Record: Jane Smith
Company: Acme Corp
10

Flow canvas > Save > Test > Manually > Run flow

Test the flow with a manual run

Save the flow by clicking the 'Save' button in the top toolbar. Then click 'Test' in the top right, select 'Manually' and click 'Run flow'. Watch the flow run in real time — each action block will show a green checkmark or red X as it executes. Expand the 'Get emails (V3)' block output to confirm your Gmail filter returned emails. Expand the 'Post message' block to confirm the Slack message body looks correct.

  1. 1Click 'Save' in the top toolbar
  2. 2Click 'Test' in the top right corner
  3. 3Select 'Manually' and click 'Run flow'
  4. 4Watch each step turn green — click any step to expand its input/output
  5. 5Check your Slack channel to confirm the digest message appeared
What you should see: All steps show green checkmarks. Your Slack channel shows a new message formatted with bullet-point email summaries and the header line.
Common mistake — If your Gmail query returns 0 emails during the test, you will hit the 'No' branch of the Condition and no Slack message is sent. Temporarily change your filter to 'newer_than:7d' with no other filters to confirm emails are being returned before re-applying your production filter.
Power Automate
▶ Test flow
executed
Slack
Gmail
Gmail
🔔 notification
received
11

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

Turn on the flow and verify the schedule

After a successful test, confirm the flow is turned on by checking the toggle on the 'My flows' page — it should read 'On'. Navigate to 'My flows', find your flow, and click the three-dot menu to select 'Run history'. Confirm the next scheduled run shows the correct time. Check the run history after the first scheduled execution to verify no errors occurred in production.

  1. 1Click 'My flows' in the left sidebar
  2. 2Locate your 'Gmail Daily Digest to Slack' flow
  3. 3Confirm the status toggle shows 'On'
  4. 4Click the three-dot menu and select 'Run history'
  5. 5After the first scheduled run, expand the run entry to check for errors
What you should see: The flow status shows 'On' with a next run timestamp. After the first scheduled execution, Run history shows a 'Succeeded' entry.
Common mistake — Confirm your workflow timezone matches your business timezone — n8n uses the instance timezone by default. Also verify the workflow is saved and set to Active, since Schedule Triggers won't fire on inactive workflows.

Paste this expression into the Value field of the 'Append to string variable' action inside the Apply to each loop in Power Automate. Open the expression editor (the 'fx' icon) and enter the full expression — it formats the date, truncates the body preview to 120 characters, and builds a clean digest line without any raw ISO strings or runaway long previews.

JavaScript — Code Stepconcat(
▸ Show code
concat(
  '• *',
  item()?['Subject'],

... expand to see full code

concat(
  '• *',
  item()?['Subject'],
  '* — from ',
  item()?['From'],
  ' at ',
  formatDateTime(item()?['ReceivedDateTime'], 'MMM d, h:mm tt'),
  if(
    greater(length(item()?['BodyPreview']), 0),
    concat('\n   _', substring(item()?['BodyPreview'], 0, min(120, length(item()?['BodyPreview']))), '..._'),
    ''
  ),
  '\n'
)

Scaling Beyond 50+ emails matching the filter per digest run+ Records

If your volume exceeds 50+ emails matching the filter per digest run records, apply these adjustments.

1

Tighten your Gmail search filter first

Before hitting 50 emails per day, the problem is usually an overly broad filter. Add sender domain restrictions (from:@specificdomain.com), label requirements, or priority markers (is:important) to reduce the result count. A digest with 15 focused emails is more useful than 50 unfiltered ones.

2

Split by category into multiple flows

Run separate scheduled flows for different email categories — one for client emails, one for billing, one for internal. Each posts to a different Slack channel. This keeps each digest focused and avoids the 30-minute flow timeout that can occur when looping through 100+ emails in a single run.

3

Watch for the 30-minute flow timeout

Power Automate scheduled flows have a hard 30-minute execution limit. An Apply to each loop processing 100 emails with multiple actions per iteration can breach this. If runs are timing out, check the run history duration, reduce Max Results to 25, and simplify the per-email formatting logic to a single Append action.

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 organization already runs on Microsoft 365 and your team's Slack workspace is connected to that same ecosystem. The Gmail and Slack connectors are both standard connectors — no premium license required — which matters when you're comparing this against building the same flow in Make or Zapier where premium connectors add per-task costs. Power Automate also handles the Scheduled cloud flow pattern well: the recurrence trigger is reliable, timezone configuration is explicit, and the Apply to each loop with string variable accumulation is a pattern Power Automate handles without external workarounds. If your team doesn't use Microsoft 365 at all and you'd prefer a visual, node-based builder, pick Make instead — Power Automate's canvas gets cluttered fast with condition branches.

Cost

The cost math here is straightforward. Power Automate's standard connectors (Gmail, Slack) are included in the Microsoft 365 Business Basic plan ($6/user/month). There are no per-run or per-task charges for standard connector flows — only premium connector flows count against Power Platform request limits. A daily digest flow running once per day with 50 emails processed costs $0 in execution fees beyond your existing M365 license. Compare that to Zapier: the Gmail + Slack multi-step Zap with a scheduled trigger requires a paid Zapier plan starting at $19.99/month, and each email processed in the loop counts as a task — 50 emails/day = 1,500 tasks/month, which puts you at or near the Starter plan's 750-task limit. Make charges per operation: a flow processing 50 emails daily = 1,500+ operations/month, which fits in Make's free tier (1,000 ops) only on a weekly cadence. Power Automate is the cheapest option here if you already have M365.

Tradeoffs

Make handles the conditional message routing better — its Router module lets you branch email categories to different Slack channels in a cleaner visual layout than Power Automate's nested Condition blocks. Zapier's 'Digest by Zapier' native action is purpose-built for this pattern and requires zero variable management — it batches items automatically, which is genuinely simpler for non-technical users. n8n gives you the most control: you can write a Code node that processes the entire email array in JavaScript, formats every line, and posts a single Slack API call using Block Kit for rich message formatting with buttons and sections — something Power Automate can't match without a custom HTTP action. Pipedream lets you do the same with async/await and native npm packages. Power Automate is still the right call when your IT department controls the tooling, your M365 licenses are already paid for, and you need an audit trail in the Microsoft ecosystem — not because it's technically superior for this specific workflow.

Three things you will hit after setup. First, the Gmail OAuth token silently expires — Google revokes Power Automate's access if the authenticating account has a security event (password change, new device login) and the flow starts returning 'Invalid credentials' with no email notification unless you've enabled failure alerts. Check run history weekly for the first month. Second, Slack's Power Automate connector posts as a user, not a bot — if that user account is offboarded, the flow stops posting entirely. Set up the connection under a shared service account or document clearly which account owns the connection. Third, the newer_than:1d Gmail filter uses a 24-hour rolling window relative to flow execution time, not calendar day boundaries — if your flow runs at 9 AM and an email arrived at 8:45 AM yesterday, it shows up in today's digest AND would have shown up in yesterday's if the filter was evaluated then. For teams that care about strict day boundaries, use explicit date range filters built from Power Automate's utcNow() expression instead.

Ideas for what to build next

  • Add a direct Gmail link to each digest lineUse the email's Message ID to construct a direct Gmail URL (https://mail.google.com/mail/u/0/#all/[messageId]) and include it as a hyperlink in the Slack message so team members can jump straight to the email in one click.
  • Route digest to different Slack channels by domainAdd a Switch or nested Condition action inside the Apply to each loop that checks the sender's domain and appends to different variables — then post each variable to a different Slack channel (e.g., client emails to #client-comms, billing emails to #finance).
  • Auto-label processed emails in Gmail after the digest runsAfter the Slack post succeeds, add a Gmail 'Modify email labels' action inside the Yes branch to apply a 'Digested' label to each email — this lets you change the search filter to exclude already-digested emails and prevent duplicates across runs.

Related guides

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