---
title: "The state of email merge in 2026"
date: 2026-04-12T00:00:00.000Z
updated: 2026-06-27T11:15:25Z
tags: ["Power Automate", "Automation", "Power Query", "Excel", "Data Transformation"]
canonical: https://bianca.codes/blog/the-state-of-email-merge-in-2026/
---

# The state of email merge in 2026

_It is 2026, and we are still stringing together premium Power Automate connectors just to avoid the Word mail merge wizard._

## 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.
