Intermediate~15 min setupAI & CommunicationVerified April 2026
OpenAI logo
Slack logo

How to Clean Up Meeting Notes with Power Automate

Automatically format raw meeting notes pasted in Slack into structured notes with action items using OpenAI.

Steps and UI details are based on platform versions at time of writing β€” check each platform for the latest interface.

Best for

Teams that take messy meeting notes in Slack and need them formatted consistently with clear action items

Not ideal for

Teams that need meeting transcription from audio or want notes stored outside Slack

Sync type

real-time

Use case type

enrichment

Real-World Example

πŸ’‘

A 12-person marketing team pastes raw meeting notes into their #team-updates Slack channel after every standup. The bot detects notes, sends them to OpenAI for formatting, then posts back structured notes with attendees, key decisions, and action items. Before automation, someone spent 10 minutes after each meeting manually formatting notes.

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.

OpenAI API key with GPT-3.5-turbo or GPT-4 access
Slack workspace admin permissions to install apps
Microsoft 365 account with Power Automate license
Designated Slack channel for meeting notes

Field Mapping

Map these fields between your apps.

FieldAPI Name
Required
Message Text
Channel Name
Formatted Content
3 optional fieldsβ–Έ show
User Name
Timestamp
Model Used

Step-by-Step Setup

1

My flows > + New flow > Automated cloud flow

Create automated cloud flow

Go to make.powerautomate.com and sign in with your Microsoft account. Click 'My flows' in the left sidebar, then '+ New flow' at the top. Select 'Automated cloud flow' from the dropdown. Name your flow 'Meeting Notes Cleanup' and search for Slack in the trigger list.

  1. 1Click 'My flows' in the left navigation
  2. 2Click the '+ New flow' button
  3. 3Select 'Automated cloud flow'
  4. 4Enter 'Meeting Notes Cleanup' as the flow name
  5. 5Search for 'Slack' in the trigger search box
βœ“ What you should see: You should see the Slack connector options with triggers like 'When a message is posted to a channel'.
2

Trigger > Slack > When a message is posted to a channel

Configure Slack message trigger

Select 'When a message is posted to a channel' trigger from Slack. You'll need to sign in to your Slack workspace. Choose the specific channel where meeting notes get posted. Set up a condition to only trigger when messages contain specific keywords like 'Meeting:' or 'Attendees:' to avoid processing every message.

  1. 1Click 'When a message is posted to a channel'
  2. 2Click 'Sign in' and authorize Power Automate to access Slack
  3. 3Select your workspace from the dropdown
  4. 4Choose the channel where notes are posted
  5. 5Click 'Show advanced options' and add keyword filters
βœ“ What you should see: The trigger shows 'Connected' status with your selected channel name visible.
⚠
Common mistake β€” The trigger fires on every message in the channel. Without keyword filtering, you'll waste OpenAI credits on random messages.
Power Automate
+
click +
search apps
OpenAI
OP
OpenAI
Configure Slack message trig…
OpenAI
OP
module added
3

Actions > Control > Condition

Add message content condition

Click '+ New step' and search for 'Condition' in the actions. Add a condition that checks if the message text contains your meeting note keywords. Use the 'contains' function with the message text from the Slack trigger. This prevents the flow from running on regular chat messages.

  1. 1Click '+ New step' below the Slack trigger
  2. 2Search for and select 'Condition'
  3. 3Click the left value box and select 'Text' from Slack dynamic content
  4. 4Set the condition to 'contains'
  5. 5Enter 'Meeting:' or your keyword in the right value box
βœ“ What you should see: You see a condition box with 'Yes' and 'No' branches underneath.
⚠
Common mistake β€” Case sensitivity matters. 'Meeting:' won't match 'meeting:' unless you use the toLower() expression.
OpenAI
OP
trigger
filter
Condition
matches criteria?
yes β€” passes through
no β€” skipped
Slack
SL
notified
4

Condition Yes > + Add an action > HTTP

Add OpenAI connection

In the 'Yes' branch of your condition, click '+ Add an action'. Search for 'HTTP' and select the HTTP action since OpenAI doesn't have a native Power Automate connector. You'll make a POST request to the OpenAI API endpoint. Set the method to POST and the URI to 'https://api.openai.com/v1/chat/completions'.

  1. 1Click '+ Add an action' in the Yes branch
  2. 2Search for 'HTTP' and select the HTTP action
  3. 3Set Method to 'POST'
  4. 4Enter 'https://api.openai.com/v1/chat/completions' as URI
  5. 5Click 'Show advanced options'
βœ“ What you should see: You see the HTTP action with Method and URI fields filled in.
⚠
Common mistake β€” Don't use the legacy completions endpoint. The chat/completions endpoint is faster and gives better results for structured formatting.
5

HTTP Action > Headers

Configure OpenAI API headers

In the HTTP action, add the required headers for OpenAI authentication. Add 'Content-Type' with value 'application/json' and 'Authorization' with value 'Bearer YOUR_API_KEY'. Replace YOUR_API_KEY with your actual OpenAI API key from platform.openai.com. Store the API key securely in a variable or use Azure Key Vault.

  1. 1Click 'Add new parameter' and select 'Headers'
  2. 2Add header 'Content-Type' with value 'application/json'
  3. 3Add header 'Authorization' with value 'Bearer sk-your-api-key'
  4. 4Replace 'sk-your-api-key' with your actual OpenAI key
  5. 5Consider using a variable for the API key
βœ“ What you should see: Two headers are visible in the Headers section with correct values.
⚠
Common mistake β€” Never hardcode API keys in flows. Other workspace members can see them in the flow history.
6

HTTP Action > Body

Build OpenAI request body

In the HTTP action Body field, create a JSON payload for OpenAI. Include the model (gpt-3.5-turbo), messages array with your formatting prompt, and the original Slack message text. The prompt should instruct GPT to format messy notes into structured sections with attendees, topics, decisions, and action items.

  1. 1Click in the Body text area
  2. 2Paste the JSON structure for OpenAI chat completion
  3. 3Set model to 'gpt-3.5-turbo'
  4. 4Insert the Slack message text using dynamic content
  5. 5Include clear formatting instructions in the system message
βœ“ What you should see: Body contains valid JSON with your prompt and dynamic Slack message content.
⚠
Common mistake β€” Malformed JSON will cause 400 errors. Test your JSON structure in a validator before deploying.
7

Actions > Data Operations > Parse JSON

Parse OpenAI response

Add a 'Parse JSON' action after the HTTP request to extract the formatted text from OpenAI's response. Click '+ New step', search for 'Parse JSON', and select it. In the Content field, select 'body' from the HTTP action. Generate the schema by using a sample OpenAI response or manually define it.

  1. 1Click '+ New step' after the HTTP action
  2. 2Search for and select 'Parse JSON'
  3. 3Click Content field and select 'body' from HTTP dynamic content
  4. 4Click 'Generate from sample' or enter the schema manually
  5. 5Include choices[0].message.content in your schema
βœ“ What you should see: Parse JSON action shows the schema with OpenAI response structure.
⚠
Common mistake β€” OpenAI responses include usage tokens and metadata. Make sure your schema captures the 'content' field specifically.
8

Actions > Slack > Post message

Post formatted notes to Slack

Add another Slack action to post the cleaned-up notes back to the channel. Search for 'Post message' in Slack actions. Select the same channel as your trigger. In the message field, select the parsed content from OpenAI. Add a prefix like 'Formatted Notes:' to distinguish it from the original message.

  1. 1Click '+ New step' after Parse JSON
  2. 2Search for 'Slack' and select 'Post message'
  3. 3Choose the same channel as your trigger
  4. 4Click in Message field and select parsed content from OpenAI
  5. 5Add a prefix like 'πŸ“ Formatted Notes:' for clarity
βœ“ What you should see: Slack action is configured to post the formatted content to your chosen channel.
⚠
Common mistake β€” Without a clear prefix, users won't know which message is the bot's response versus the original notes.
9

HTTP Action > ... > Settings > Configure run after

Add error handling

Click on the HTTP action and select 'Settings' from the three-dot menu. Enable 'Configure run after' and check 'is failed' and 'has timed out'. Add a Slack message action in the failure branch to notify users when OpenAI is unavailable or returns an error.

  1. 1Click the three dots on the HTTP action
  2. 2Select 'Settings'
  3. 3Click 'Configure run after'
  4. 4Check 'is failed' and 'has timed out'
  5. 5Add a Slack message action for error notifications
βœ“ What you should see: You see red lines connecting failed scenarios to error handling actions.
10

Flow > Save

Test and save the flow

Click 'Save' in the top right to save your flow. Go to your Slack channel and post a test message with meeting notes that match your trigger keywords. Check the flow run history to see if each step executed successfully. Verify the formatted output appears in Slack within 30-60 seconds.

  1. 1Click 'Save' in the top toolbar
  2. 2Navigate to your configured Slack channel
  3. 3Post a test message starting with your keyword
  4. 4Return to Power Automate and check 'Run history'
  5. 5Verify the formatted message appears in Slack
βœ“ What you should see: Your test message triggers the flow and returns formatted notes in Slack.
⚠
Common mistake β€” First runs can take 2-3 minutes as Power Automate establishes connections. Don't assume it's broken if there's a delay.

Add this JSON body structure to your HTTP action for better OpenAI formatting. Paste this in the Body field of your HTTP request to OpenAI.

JavaScript β€” Code Step{
β–Έ Show code
{
  "model": "gpt-3.5-turbo",
  "messages": [

... expand to see full code

{
  "model": "gpt-3.5-turbo",
  "messages": [
    {
      "role": "system",
      "content": "Format messy meeting notes into structured format with sections for Meeting Topic, Date, Attendees, Key Topics, Decisions, and Action Items. Use markdown formatting and bullet points. Be concise but don't lose important details."
    },
    {
      "role": "user",
      "content": "@{triggerBody()?['text']}"
    }
  ],
  "max_tokens": 1500,
  "temperature": 0.3
}
Power Automate
β–Ά Test flow
executed
βœ“
OpenAI
βœ“
Slack
Slack
πŸ”” notification
received

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 Microsoft Power Automate for this if you're already in the Microsoft ecosystem and want native integration with Teams, SharePoint, and other Office apps. The HTTP connector handles OpenAI calls reliably, and you get unlimited runs with most business licenses. Skip Power Automate if you need complex data transformations or your team isn't on Microsoft 365.

Cost

The math works out to roughly $0.004 per meeting note with GPT-3.5-turbo assuming 200-word notes. At 50 notes per month, you're spending $0.20 on OpenAI plus whatever your Power Automate license costs. Make handles the same volume and includes more transformation options, but you'll pay $9-29/month for the platform. Zapier costs $20+ for unlimited runs but has simpler OpenAI integration.

Tradeoffs

Make beats Power Automate on data transformation with built-in text parsing and conditional logic modules. Zapier wins on ease of setup with their native OpenAI app connection. n8n gives you better error handling and retry logic with custom code nodes. Pipedream offers superior debugging with request/response inspection. But Power Automate integrates better with SharePoint for note storage and Planner for action item tracking if you're already using those tools.

You'll hit OpenAI rate limits if multiple people post notes simultaneously. The HTTP connector doesn't handle retries gracefully, so add error handling that waits and retries. Long meeting notes can exceed token limits and get cut off. Slack's webhook reliability varies, so expect occasional missed triggers during Slack maintenance windows.

Ideas for what to build next

  • β†’
    Add meeting summaries to SharePoint β€” Extend the flow to save formatted notes as documents in SharePoint for searchable meeting history.
  • β†’
    Create action item reminders β€” Parse action items from formatted notes and create follow-up reminders in Microsoft To Do or Planner.
  • β†’
    Support multiple note formats β€” Add conditions to detect different meeting note styles and apply appropriate formatting prompts.

Related guides

Was this guide helpful?
← OpenAI + Slack overviewPower Automate profile β†’