Mail Merge from Excel: Send Personalized Emails Automatically

Excel table, Apply to each, Outlook: how Power Automate sends a personal email to every row of your list.

An Excel list with fifty addresses and the plan to send every recipient a personally addressed email still ends, in many teams, with manually copying names into a new Outlook window. Power Automate takes over exactly this work: a flow reads the rows of an Excel file formatted as a table, runs through them one by one, and sends one email per row with a salutation, subject, and content from the respective columns.

This article shows the complete setup of such a mail merge automation with the Excel Online (Business) connector and the Office 365 Outlook connector, including the pitfalls with larger recipient lists. As of: July 2026.

How is a mail merge automation from Excel basically structured?

The flow consists of three building blocks that build on each other: a trigger, the action List rows present in a table from the Excel Online (Business) connector, and an Apply to each loop, in which one email per row is sent via Send an email (V2). These three steps are enough for the entire use case, without any additional add-in in Excel or Outlook.

  • Trigger: Trigger manually, on a schedule (for example daily), or by an event such as a new row.
  • Data source: The action List rows present in a table returns all rows of the Excel table as an array.
  • Sending: The Apply to each loop takes this array and runs the action Send an email (V2) from the Office 365 Outlook connector for each row.

Two of the most important building blocks for this, the interplay of table rows and conditions as well as the Apply to each action itself, are described in detail by Microsoft in the official documentation on Retrieving and filtering table rows and on the Apply to each action.

How does the Excel table need to be prepared?

Power Automate reads only real tables via the Excel Online (Business) connector, not simple cell ranges. So mark your data in Excel with Ctrl+T, which turns it into a formatted table with a header row, and store the file in OneDrive for Business or a SharePoint library. The connector cannot access a file that is stored purely locally on a hard drive.

  • Header row: Every column needs a unique name, for example first name, last name, email, company, and subject line addition.
  • Email column: Make sure the addresses are valid and complete, with no leading or trailing spaces, otherwise sending will fail for individual rows.
  • Storage location: OneDrive for Business or SharePoint Online, not a local folder or a personal OneDrive account.

How do you set up the action for retrieving the Excel rows?

Add a new step in the flow designer, search for rows and select under Excel Online (Business) the action List rows present in a table. Then set Location, Document Library, File and Table, exactly as the Microsoft documentation on Working with table rows in conditions shows step by step. The result of this action is an array called value, which contains each row of your table as an individual object.

If you don't want to write to all rows but only to specific ones, for example only to rows with the status Active, you can extend the action with a Filter Query or narrow down the selection later using a Condition inside the loop.

How do you build the loop and the sending per row?

After the row query, add the control Apply to each and select the token value from the previous action as the input, which keeps you in control of how much data is actually processed. Inside the loop, add the action Send an email (V2) from the Office 365 Outlook connector.

  • To: dynamic value from the Email column of the current row.
  • Subject: Text combined with a column, such as company or subject line addition.
  • Body: Rich text editor with static text and inserted column values such as first name for the personal salutation.

Since all fields are inside the loop, the dynamic content menu automatically shows the columns of the current row, so you don't have to write expressions by hand. How emails can be filled this way with dynamic content from previous steps, including an example screenshot, is described by Microsoft in the Top email flow scenarios.

Office 365 Outlook or Outlook.com: which connector is the right one?

For the mail merge automation, two similar connectors are available, and the choice depends solely on the type of your account. According to the Overview of Outlook and Power Automate, the rule is: if you use a work or school account, you use the Office 365 Outlook connector. With a personal Microsoft account, you use the Outlook.com connector instead. Both offer comparable actions for sending, so the rest of the flow doesn't change no matter which of the two you choose.

What should you watch out for with larger recipient lists?

An Apply to each loop processes the rows one after another by default, which is not a problem with a few dozen recipients but noticeably increases the flow's runtime with several hundred. So test the flow first with a small test table of two or three rows before you run it on the full list.

  • Test run first: Copy a few test rows with your own address into a separate table before applying the flow to the real recipient list.
  • Keep an eye on action limits: Each row consumes at least two actions; with very long lists you can hit your license's daily action limit.
  • Catch faulty rows: An empty or invalid email address in a single row does not automatically abort the entire run, but the run history shows you which iteration of the loop failed.
  • Check the sender identity: The flow sends the emails through the account with which the Outlook connection was established, so check in advance whether that is the desired sender address.

Anyone who wants to use a mail merge automation permanently for customer newsletters, offers, or appointment series, and wants to plan cleanly around license limits, DLP policies, and multiple linked flows, gets the technical setup from NordFlux as part of the Power Automate consulting at a fixed price, including handover of the finished configuration.

Frequently asked questions

Do I need to create a separate action in the flow for each row?

No, that's exactly what the Apply to each loop takes care of. You add the action Send an email (V2) exactly once inside the loop; Power Automate then automatically runs it individually for each row of the Excel table.

Does the automation also work with a personal Outlook.com account?

Yes, to do that you simply swap the Office 365 Outlook connector for the Outlook.com connector in the flow. Both offer comparable actions for sending emails, and the rest of the setup with Excel rows and the loop remains unchanged.

How do I prevent a row from being accidentally emailed twice?

Add your own status column to the Excel table, for example Sent, and filter the row query on it, or add an action inside the loop that updates the status in the table after a successful send. This way, the next run reliably skips rows that have already been emailed.

Can I send different attachments per recipient?

Yes, if the file name or path is in its own column of the Excel table, you can dynamically insert that value inside the loop into an upstream action for retrieving the file, and pass the result as an attachment to the email action.

Is my regular Microsoft 365 license enough for this flow?

For Excel Online (Business) and the Office 365 Outlook connector, the Power Automate usage included in a Microsoft 365 subscription is usually sufficient, as long as you don't use premium connectors. With very large recipient lists, it's still worth checking your license's daily action limits so the flow isn't throttled in the middle of a run.

About NordFlux

NordFlux UG (haftungsbeschränkt)

NordFlux builds digital employees for organisations: automations and AI agents that take over repetitive work. You stay in control.

More about us
Free initial analysis

Concrete questions about automation or AI?

In a free initial analysis we discuss your case directly. No strings attached.

Mail Merge from Excel: Send Emails Automatically