What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

In a Power Automate cloud flow, use Data Operation – Create HTML table. Give it an array of JSON objects, choose automatic or custom columns, and pass its HTML output to the next action. If the source is a JSON string, parse it first; if you are sending an email, enable IsHtml in the email action.

What Power Automate converts

The cloud-flow Create HTML table action transforms an array of JSON objects into an HTML table. The array can come from an HTTP request, a connector, a variable, or any earlier action. The result is HTML text that later actions can consume, such as an email, a file operation, or another HTTP request.

The reliable pattern is:

  1. Get or build an array.
  2. Optionally use Parse JSON, Select, or Filter array to make the data usable.
  3. Add Create HTML table.
  4. Set From to the array.
  5. Use the action output in a later step. For email, set IsHtml to true or Yes.

Step-by-step: create an HTML table in a cloud flow

1. Identify the array

Open the trigger and earlier actions and find the value containing multiple records. A valid input is an array whose items are objects, for example:

[ { "Name": "Ada", "Department": "Engineering", "Active": true }, { "Name": "Lin", "Department": "Support", "Active": false } ]

Dynamic content may display this value as a body, value, or list. What matters is that the runtime value is an array, not one object and not a quoted JSON string.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

2. Add Create HTML table

In the flow designer, select New step, search for Create HTML table, and choose the Data Operation action. Set From to the array from the previous step. You can select its dynamic-content token or enter an expression that returns an array.

For a quick conversion, leave the column setting on Automatic. Power Automate uses the object properties as table columns and creates rows from the array items.

3. Choose automatic or custom columns

Column mode When to use it What you control
Automatic You need a quick table and the source property names are acceptable as headers. Very little; the action derives columns from the objects.
Custom You need stable headers, a selected subset of fields, or values assembled from expressions. Each header and each row value. Use an expression such as item()?['PropertyName'] for a property.

To configure custom columns, change the columns option to Custom, add a column for each field, type the header users should see, and provide the value expression. For example, a header of Employee can use item()?['Name'], while a header of Team can use item()?['Department'].

4. Use the output

The action returns an HTML table string. In a following action, select the table output from dynamic content. If you are using an email action, select or set IsHtml; otherwise the recipient may see markup characters instead of a rendered table.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

When the source is a JSON string

Connectors and HTTP actions do not always expose a structured array. Sometimes the body is text containing JSON. In that case, add Parse JSON before the table action.

  1. Add Parse JSON after the action that supplies the text.
  2. Set Content to that response body.
  3. Generate or provide a schema matching the array and its object properties.
  4. Use the parsed array as the From value in Create HTML table.

Parsing gives the designer friendly property tokens and makes expressions easier to validate. If the payload contains an outer object, select the property that actually contains the array, or use an expression that returns that nested array.

Shape or filter the data before conversion

Use Select to rename and reduce fields

Add Select when the source contains fields you do not want to publish or when the headers need clearer names. Map each output property to an expression from the current item, then send the Select output to Create HTML table. This keeps the HTML action focused on presentation rather than data cleanup.

Use Filter array to limit rows

Add Filter array when only matching records belong in the table, such as active users or items from one department. Pass the filtered result to Create HTML table. If no records match, test the flow and decide whether an empty table is acceptable for your destination.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Combine both operations

A common sequence is Parse JSON → Filter array → Select → Create HTML table. Parsing exposes fields, filtering chooses rows, Select defines the public shape, and the final action renders that shape as HTML.

Complete example: JSON response to an HTML email

Assume an HTTP action returns this array in its response body:

[ { "Name": "Ada", "Department": "Engineering", "Active": true }, { "Name": "Lin", "Department": "Support", "Active": false } ]
  1. Add Parse JSON and use the response body as Content. Define a schema that describes an array of objects with Name, Department, and Active properties.
  2. Add Filter array if the email should contain only active people. Compare each item’s Active property with true.
  3. Add Select if you want display labels such as Employee and Team, mapping them to the source properties.
  4. Add Create HTML table. Set From to the output of Select, or to Filter array when Select is not needed.
  5. Add your email action. Insert the Create HTML table output into the message body and enable IsHtml.

Run the flow once and open the run details. Inspect the input to Create HTML table to confirm that it is an array, then inspect its output to confirm that the expected headers and rows were produced.

Automatic versus custom columns: a practical decision

  • Choose Automatic when the source is already clean, every property should be shown, and changing property names is acceptable.
  • Choose Custom when you need reader-friendly headers, a fixed column order, selected fields only, or expressions that calculate a displayed value.
  • Use Select before the table when you want to create a deliberate presentation model that can be reused by more than one destination.

Troubleshooting common failures

“From” will not accept the value

The value is probably an object or string rather than an array. Inspect the preceding action’s run output. If it is JSON text, add Parse JSON. If it is an object containing the list, select the property that holds the list. If it is one record, wrap or redesign the source so the action receives an array of objects.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The table has unexpected columns

Automatic mode reflects the properties exposed by the input objects. Use Select to remove unwanted fields or switch Create HTML table to Custom columns and define the headers and expressions explicitly.

Values are blank

Check the property spelling and nesting in the expression. A custom value such as item()?['PropertyName'] must match the property available on each current item. Inspect the parsed or reshaped array before the table action to find naming or nesting differences.

The email shows HTML tags

Set IsHtml in the email action. Without that setting, the message can be treated as plain text even though Create HTML table returned valid markup.

Line breaks appear incorrectly

Related Microsoft data-operation guidance notes that incorrectly formatted output can occur when row line breaks are missing and demonstrates replacing CRLF characters with <br/> as one possible fix. Treat this as a troubleshooting technique rather than a default transformation: first inspect the actual flow output, then apply a replacement only where the source text requires it.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

The flow succeeds but the table is empty

Check each stage separately: parsed array length, Filter array conditions, Select output, and the final table input. A filter that matches no records legitimately produces no rows. Also confirm that the array is not nested under a property you accidentally passed instead of the property containing the records.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Cloud flow versus Power Automate for desktop

These are different actions. In a cloud flow, Data Operation – Create HTML table converts an array of JSON objects into an HTML table. Power Automate for desktop has a separate Create HTML content action that generates authored HTML content into a text variable. Use the desktop action when you are composing rich HTML yourself; use Create HTML table when the input is a cloud-flow array of records.

Validation and maintenance checklist

  • Confirm the value supplied to From is an array of objects.
  • Parse JSON when the source is a string.
  • Filter rows before presentation when the recipient should see only a subset.
  • Use Select or custom columns to control exposed fields and headers.
  • Run the flow with empty, one-row, and multi-row inputs.
  • Inspect run history after schema or expression changes.
  • Enable IsHtml for email delivery.

Or skip the browser setup

If your next step is capturing the rendered result as an image or PDF, ScreenshotNeo can fetch a page with one request instead of requiring you to configure a browser. Before capture it accepts cookie or consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be turned off. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed, and each response identifies the result with X-Page-Verdict and X-Billed headers. It also provides an MCP server for Claude, Cursor, and other MCP clients, with take_screenshot, get_page_info, and capture_pdf tools.

Here is the one-call cURL example (see the ScreenshotNeo documentation for parameters and response details):

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python:

import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)

Node.js:

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);

Every feature is included on every plan. The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. Create a free ScreenshotNeo account to try it without a card.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.