What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
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:
- Get or build an array.
- Optionally use Parse JSON, Select, or Filter array to make the data usable.
- Add Create HTML table.
- Set From to the array.
- 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.
Recommended Free Tools
#1 Best Overall
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.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Rank #2
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.
- Add Parse JSON after the action that supplies the text.
- Set Content to that response body.
- Generate or provide a schema matching the array and its object properties.
- 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.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallCrashes, No Sound, or Screen Glitches?
Random freezes, missing sound and display glitches usually trace back to one bad driver. Find and replace yours safely.Free scan · under a minuteRank #3
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 } ]
- Add Parse JSON and use the response body as Content. Define a schema that describes an array of objects with
Name,Department, andActiveproperties. - Add Filter array if the email should contain only active people. Compare each item’s
Activeproperty withtrue. - Add Select if you want display labels such as
EmployeeandTeam, mapping them to the source properties. - Add Create HTML table. Set From to the output of Select, or to Filter array when Select is not needed.
- 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.
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.
Best Value
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.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):
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.
Quick Recap
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.

