# Make a readable HTML table in a flow email

> For the full documentation index, see https://250highstreet.com/llms.txt

> Turn SharePoint list rows into a clean table in a Power Automate email: pick the columns, rename the headers, add borders, and fix raw tags.

Short answer: use the Create HTML table action to turn a list of rows into a table, then paste that table into the body of a Send an email (V2) action. Two settings matter most. Tick the HTML option in the email action, or the table shows as raw tags. And shape the rows first so the table has only the columns the reader needs, with plain header names. Borders and spacing come from a small style block you add around the table.

This page is the focused build for the table itself. It does not cover how to find the rows or when to send the email. For those, see "[Send a reminder before a due date in a SharePoint list](/guides/send-reminder-before-due-date/)" and "[Late tasks nobody notices: setting up late alerts](/guides/late-tasks-nobody-notices/)".

Menu and action names in Microsoft 365 change from time to time. The exact names may differ on your screen. Microsoft's pages are listed at the end. Where a step is my own advice and not something Microsoft says, I mark it "Our advice, not a Microsoft rule".

## What Microsoft says the action does

Microsoft's page on data operations describes the action in two short sentences: "Use the Data Operation - Create HTML table action to change a JSON array input into an HTML table. Keep the headers visible in the HTML output."

The same page gives one tip for email: "If you plan to send the HTML table via email, remember to select IsHtml in the email action."

That is the whole core of it. The action takes a list of rows and gives back text written in HTML. It does not send anything. A second action has to send it.

## Before you start

You need three things.

- A flow in Power Automate. Open [https://make.powerautomate.com](https://make.powerautomate.com) and sign in with your Microsoft 365 account. Ask your admin if you cannot get in.
- A step that produces rows. In this example it is a SharePoint Get items action that reads a list of open requests.
- An email action. In this example it is Send an email (V2).

For the list, one way to start is a Title column with the request name, a Person column for the owner, a Due date column, and a Status column with numbered choices: 1 Open, 2 Waiting, 3 Done. The Title column is required by default. Our advice, not a Microsoft rule: keep it and use it for the request name, or rename it, or turn off Require in the column settings.

A Get items action returns only 100 rows by default. If your list can have more than that, set Top Count and turn Pagination on. The guide "[Power Automate Get items stops at 100 rows: how to get them all](/guides/power-automate-get-items-only-returns-100/)" covers the settings. Without that, your table may quietly stop at 100 rows.

## Step 1. Add the Create HTML table action

1.  Open your flow in the designer at [https://make.powerautomate.com](https://make.powerautomate.com).
2.  Select the plus sign (+) under the step that returns your rows.
3.  In the search box, type Create HTML table.
4.  Under Data Operation, select Create HTML table.
5.  In the From box, select the lightning bolt and pick the list of rows. For a SharePoint Get items action, that is the value field.

Microsoft's steps for the HTML action point back to its Create CSV table example. In that example, the From box holds a Body token from an earlier step.

## Step 2. Choose the columns

Automatic mode builds one column for every field in each row. A SharePoint item carries many fields, so an automatic table can be wide and full of columns nobody wants, such as internal IDs and links. This is why people look for "custom columns".

One way to start, and my advice, not a Microsoft rule:

1.  Open the advanced options of the Create HTML table action.
2.  Switch Columns from Automatic to Custom.
3.  Add one Header and one Value for each column you want to show.
4.  Type the header as the reader should see it, for example Request, Owner, Due, Status.
5.  For each Value, select the lightning bolt and pick the matching field from the dynamic content list, such as Title, Due date and Status Value.

Keep the table short. Four or five columns is easier to read in an email than ten. If a reader needs the rest, add a link to the list below the table.

## Step 3. Clean up names with a Select action

Raw field names can look odd in a header. Person columns and Choice columns come back as objects, so the table may show text you did not expect.

Microsoft says you use the Select data operation "to change the shape of objects in an array" and adds: "For example, you can add, remove, or rename elements in each object in an array."

Microsoft adds a note: "Although you can add or remove elements by using the select action, you can't change the number of objects in the array."

One way to use this, and my advice, not a Microsoft rule:

1.  Add a Data Operation Select action before the Create HTML table action.
2.  In From, pick the list of rows.
3.  In Map, add one pair for each column you want. The left side is the header word you choose. The right side is the dynamic content for that field.
4.  Point the Create HTML table action at the output of the Select action.
5.  Leave Columns on Automatic, because the Select action already did the shaping.

The result is a table whose headers are the exact words you typed. This also keeps raw internal names out of the email.

## Step 4. Send the table in an email

1.  Add the Office 365 Outlook action Send an email (V2).
2.  In To, enter the address of the person or shared group.
3.  In Subject, write a plain subject, such as the number of open requests.
4.  In Body, type a short line of text first. Then select the lightning bolt and pick the Output of the Create HTML table action.
5.  Tick the HTML option, named IsHtml in Microsoft's tip. In the newer designer it may appear as a different label. Check the advanced options if you do not see it.

Microsoft's page on creating a cloud flow adds a tip about this action: "Use the Send email (V2) action to format email in which you customize the font, use bold, italic, or underline, customize the color and highlight, create lists or links, and more."

Put a sentence above the table. A table alone, with no words, looks like spam. Something like "These 6 requests are open. Please update the Status in the list."

## Step 5. Add borders and spacing

A plain HTML table has no lines and no padding. Rows run together. The Create HTML table action itself gives you the table tags and nothing else, so style has to come from you.

What follows is my advice, not a Microsoft rule. Test it on yourself before you send it to anyone.

One way to start:

1.  Add a Compose action after the Create HTML table action.
2.  In Inputs, type a short style block, then add the table output below it with the lightning bolt.
3.  A style block for a simple table can set a border on the table, cells and header cells, set padding inside each cell, and give the header row a light background color.
4.  In Send an email (V2), put the Compose output in Body instead of the table output.

Keep the style simple. Email programs differ in how much of a style block they honor. Open the email in the program your readers use. If the borders are missing there, check how the table looks and simplify.

## Check the result

1.  Save the flow and select Test.
2.  Run it manually. Wait for the run to finish.
3.  Open the run history and select the Create HTML table action. Look at the output. You should see table tags.
4.  Open the email in your inbox. You should see a table with your headers and one row for each item.
5.  Count the rows against the list. If the list has 130 open items and the table has 100, go back to the Get items action.

## What to avoid

- Do not forget the HTML option in the email action. Microsoft's tip says to select it.
- Do not put every column in the table. Show what the reader needs to act.
- Do not send an empty table. Add a Condition that checks whether the list has any rows before you send. One way to start: check that the length of the rows is greater than 0.
- Do not use real people's names in test data in a shared flow. Use test values such as Member 104 or Client 12.
- Do not leave the Status blank on items. A blank status can hide rows from a table that filters by status. Set a default status on the column.
- Do not trigger the same flow from the list change that your flow makes. If the flow updates the list, see "[Power Automate flow keeps running itself over and over](/guides/power-automate-flow-triggers-itself-infinite-loop/)".
- Do not email a table with private data to a wide group. Views and tables in an email are not security. Anyone who gets the email can read it.

## Honest limits

A table in an email is a snapshot. It will not update after it is sent. If the Status changes at noon, the 8 AM email is already out of date. It also gets harder to read on a phone when it has many columns. If the reader needs to sort or filter, link to the list view and let them use that. If your readers use many different email programs, the styling you see may not match theirs.

## When to get help

You can build all of this yourself in Microsoft 365. If you would rather have it built and tested for your team, I do that. A tracker like this is a fixed price: \$5,000 for one, built in 2 weeks. See "[What a SharePoint tracker costs to build](/guides/what-a-sharepoint-tracker-costs/)". Bring one example of the problem to a free call.

I am Al Davies. I run 250 High Street LLC and build SharePoint trackers and Power Automate flows for operations teams. I work remotely. The first call is free, and I will not try to sell you anything.

See trackers I built: [Tools I built](/portfolio/)

## FAQ

### Why does my email show tags like table and tr instead of a table?

The HTML option in the email action is not selected. Microsoft's tip says to select IsHtml in the email action when you send an HTML table. Select it, save and run the flow again.

### Can I pick which columns appear in the table?

Yes. One way is to set Columns to Custom in the advanced options and add a header and a value for each column. Another way is a Select action before the table. Both are my advice, not a Microsoft rule, and the exact names may differ on your screen.

### Can the Create HTML table action add borders by itself?

Our advice, not a Microsoft rule: plan to add them yourself with a small style block, because the action gives you the table and not its look. Test the email in the program your readers use.

### Why does my table stop at 100 rows?

The Get items action returns 100 items by default. Set Top Count, which Microsoft says you can raise up to 5,000, and turn Pagination on. See the guide on Get items for the full steps.

### Does the same table work in a Teams message?

Our advice, not a Microsoft rule: send a short test to yourself first. Teams and email can show the same HTML in different ways, so check the one your readers use.

## Sources

- [Microsoft Learn, Use data operations in Power Automate](https://learn.microsoft.com/en-us/power-automate/data-operations)
- [Microsoft Learn, Create a cloud flow in Power Automate](https://learn.microsoft.com/en-us/power-automate/get-started-logic-flow)
- [Microsoft Learn, Office 365 Outlook connector reference](https://learn.microsoft.com/en-us/connectors/office365/)

## Related guides

- [Power Automate cannot add a row to my Excel table: causes and fixes](/guides/power-automate-add-row-to-excel-table-fails/)
- [Create a SharePoint list item from an email](/guides/power-automate-create-list-item-from-email/)
- [Add Excel rows to a SharePoint list you already have](/guides/import-excel-into-existing-sharepoint-list/)
- [QR code asset tags that open the SharePoint list row](/guides/qr-code-asset-tags-sharepoint-list/)

Source: https://250highstreet.com/guides/power-automate-create-html-table-formatting/
