

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
scheduledUse case type
notificationReal-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.
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.
Optional
Field Mapping
Map these fields between your apps.
| Field | API 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
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'.
- 1Click 'My flows' in the left sidebar
- 2Click '+ New flow' at the top of the page
- 3Select 'Scheduled cloud flow'
- 4Enter a name: 'Gmail Daily Digest to Slack'
- 5Set the start time, repeat frequency (e.g., every 1 day), and click 'Create'
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.
- 1Click the 'Recurrence' trigger block
- 2Set Interval to '1' and Frequency to 'Day'
- 3Click 'Add new parameter'
- 4Select 'At these hours' and enter '9'
- 5Select 'At these minutes' and enter '0'
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.
- 1Click '+ New step'
- 2Type 'Gmail' in the connector search bar
- 3Select the 'Gmail' connector
- 4Choose 'Get emails (V3)' from the action list
- 5Click 'Sign in' if prompted and authenticate with your Google account
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.
- 1Click the 'Search Query' field inside the Get emails (V3) action
- 2Enter your Gmail filter, e.g.: is:unread from:@acmecorp.com newer_than:1d
- 3For label-based filtering, use: label:client-priority is:unread newer_than:1d
- 4Set 'Max Results' to 50
- 5Leave 'Include Attachments' set to No to keep the flow fast
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.
- 1Click '+ New step'
- 2Search for 'Initialize variable' and select it
- 3Set Name to 'DigestBody'
- 4Set Type to 'String'
- 5Set Value to: :envelope: *Gmail Digest*\n
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.
- 1Click '+ New step'
- 2Search for 'Apply to each' and select it
- 3Click in the 'Select an output' field inside the loop
- 4Select 'value' from the Get emails (V3) action in the dynamic content panel
- 5Click 'Add an action' inside the loop to add your first inner action
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.
- 1Click 'Add an action' inside the Apply to each loop
- 2Search for 'Append to string variable' and select it
- 3Set Name to 'DigestBody'
- 4In the Value field, click in the text area and use dynamic content to insert: From, Subject, ReceivedDateTime
- 5Format the line as: • *[Subject]* — from [From] at [ReceivedDateTime]\n
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.
- 1Click '+ New step' after the Apply to each block
- 2Search for 'Condition' and select it
- 3In the left field, open the expression editor and enter: length(variables('DigestBody'))
- 4Set the operator to 'is greater than'
- 5Set the right value to 30 (adjust to match the character length of your header)
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.
- 1Click 'Add an action' inside the Yes branch
- 2Search for 'Slack' and select the Slack connector
- 3Choose 'Post message'
- 4Sign in to Slack if prompted and authorize the connection
- 5Set Channel Name to your target Slack channel (e.g., client-comms)
- 6Click in Message Text and select 'DigestBody' from the dynamic content panel
channel: {{channel}}
ts: {{ts}}
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.
- 1Click 'Save' in the top toolbar
- 2Click 'Test' in the top right corner
- 3Select 'Manually' and click 'Run flow'
- 4Watch each step turn green — click any step to expand its input/output
- 5Check your Slack channel to confirm the digest message appeared
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.
- 1Click 'My flows' in the left sidebar
- 2Locate your 'Gmail Daily Digest to Slack' flow
- 3Confirm the status toggle shows 'On'
- 4Click the three-dot menu and select 'Run history'
- 5After the first scheduled run, expand the run entry to check for errors
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.
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.
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.
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
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.
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.
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 line — Use 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 domain — Add 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 runs — After 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
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