The 2026 State of Internal Communications Email Merging

I used to rely on Word’s mail merge for internal communications. I'd set up an Excel list, click export, and pray my machine didn't go to sleep. It always felt like a high-stakes game of hoping I didn't just send the CEO's bonus data to the intern. I finally accepted reality. Traditional mail merge belongs in a drawer with floppy disks. Power Automate is the only logical replacement.

What Happened to Traditional Excel Mail Merge?

Mail merge didn't technically break. It just stopped fitting the way we work. It was built for printing letters, not pushing data-driven internal emails. It lacks conditional logic. It chokes on attachments. If your local mail spooler hangs, your batch dies in limbo. There is no audit trail.

How Are Teams Using Mail Merge in 2026?

Now, I treat emails like database records. I use Excel as a staging area, Power Automate as the engine, and Outlook for delivery. Because it’s asynchronous, you fire the trigger and walk away. The flow manages the API calls to Exchange and logs every failure. If an email address is malformed, you know exactly which row failed. You aren't babysitting a progress bar. You are managing an automated pipeline.

Step by step guidance

Step 1: Set up your Excel source file

  • Create an Excel file in a SharePoint document library.
  • Insert a table and name it tbl_EmailRecipients.
  • Add these columns: RecipientEmail, FirstName, Status, and SentTimestamp.
  • Add any extra merge fields you need.
  • Populate your data. Leave Status and SentTimestamp empty.

Step 2: Create the flow

  • Go to make.powerautomate.com.
  • Click + Create → Instant cloud flow.
  • Name it, choose Manually trigger a flow, and click Create.

Step 3: Initialize your variables

Do this before adding any loops.

  • Add an Initialize variable action for each field: var_RecipientEmail (String), var_FirstName (String), var_Subject (String), and var_HTMLBody (String).
  • Leave them empty except the subject.

Step 4: Read the Excel rows

  • Add the List rows present in a table action (Excel Online).
  • Point it to your SharePoint file and tbl_EmailRecipients.
  • Under Advanced options, set the Filter Query to: Status eq ''

This ensures you only process unsent rows. If a batch fails halfway, you can safely rerun it.

Step 5: Add an Apply to each loop

  • Add an Apply to each action.
  • Feed it the value output from Step 4.
  • Open the loop settings and set the Degree of Parallelism to 5. Skip this, and Microsoft throttles you for spamming Exchange.

Step 6: Set variables inside the loop

  • Inside the loop, add Set variable actions.
  • Set var_RecipientEmail to items('Apply_to_each')?['RecipientEmail'].
  • Set var_FirstName to items('Apply_to_each')?['FirstName'].

Step 7: Compose the email

  • Add a Compose action inside the loop.
  • Write your HTML. Use your variables as merge fields. Example: <p>Hi @{variables('var_FirstName')},</p>

Step 8: Send the email

  • Add the Send an email (V2) action.
  • Map your To and Subject variables.
  • Drop the Compose output into the Body.
  • Set Is HTML to Yes. Forget this, and your recipients get raw HTML tags.

Step 9: Update Excel

  • Add an Update a row action.
  • Use the same table. For Key Column and Key Value, use the row's @odata.etag.
  • Set Status to Sent and SentTimestamp to utcNow().

Step 10: Error handling

  • Wrap your loop actions (except Compose) in a Scope named Scope_Try.
  • Add a Scope_Catch below it.
  • Configure Scope_Catch to run only if Scope_Try has failed or timed out.
  • Inside Scope_Catch, update the Excel row Status to Failed.

The hidden traps and time sinks

Automating email blasts isn't magic. It is manual labor in a digital wrapper. If you try to fire 5,000 emails through the Outlook connector in a minute, you aren't being efficient. You are being a spam bot. Microsoft will lock your account, and IT will freeze you out. Add a Delay action of at least one second between operations. It’s not slow. It’s survival.

Then there is the data. I used to assume my source files were clean. They rarely are. Power Automate does not care if your Excel table has blank cells. It will happily send a blank value, leaving your recipient with a cold, automated email addressed to no one. Use the coalesce expression—coalesce(item()?['Name'], 'Colleague')—to force a fallback value. Do not blame the platform for bad data hygiene.

Troubleshooting

  • Emails arrive showing raw HTML? You forgot to set Is HTML = Yes.
  • Flow resends to the whole list? You missed the Status eq '' filter query in Step 4.
  • Flow hits a throttle error? Set your loop concurrency to 5.
  • Empty table sends nothing? Confirm your table is named exactly tbl_EmailRecipients and has at least one row with a blank Status.

Frequently Asked Questions

Can I revert to Classic Outlook to keep using mail merge?

You can, and it temporarily restores MAPI compliance. But Microsoft is aggressively killing the classic client. Moving to Power Automate prevents a crisis later.

Is Power Automate free?

Basic capabilities are included in most standard Microsoft 365 Business and Enterprise licenses. You likely already have access to it through your employer.