Skip to main content

How to Return a Table from a Flow to Power Apps as JSON in Power Automate

· 5 min read
Jagdish Kumawat
Founder @ Dewiride

Respond to a Power App or flow has outputs for text, yes or no, files, emails, numbers and dates, but none for a list. To send a table, shape the rows with Select, turn the array into JSON text with string(), and return it as a Text output. The app turns the text back into a table with ParseJSON.

The example is Get Waiting Approvals, a flow of the Overtime Timesheet app. It returns the overtime entries waiting for an approver, one row per entry, and the app shows them in a gallery.

Prerequisites​

Step 1: Shape the Rows with Select​

Before the response, use Select to build one small object per row, with only the fields the app needs. In the example, Waiting entries keeps seven: id, employee, department, startTime, endTime, breakMinutes and savedOn (How to Keep Several Fields from Each Item with Select in Power Automate).

Its output is an array: one object per entry, with those seven keys.

Step 2: Return the Array as Text​

In the response, add a Text output. I named it entries, and set its value with an expression:

Respond to the app → entries
string(body('Waiting_entries'))

The Respond to the app pane with one Text output named entries, whose value is the expression token string(...)

body('Waiting_entries') is the array Select built. Microsoft's functions reference says string() returns the string version for a value: here, the array written out as JSON text. When nothing matches, it's an empty array:

entries when nothing is waiting
[]

That was the output of my own test run, because I approve no department.

Step 3: Turn It Back into a Table in the App​

In the app, ParseJSON reads the text, and ForAll builds a typed record from each element (How to Turn JSON Text into a Table with ParseJSON in Power Apps):

In the app
ForAll(
ParseJSON(GetWaitingApprovals.Run().entries),
{
ID: Value(ThisRecord.id),
Employee: Text(ThisRecord.employee),
Department: Text(ThisRecord.department),
StartTime: DateTimeValue(ThisRecord.startTime),
EndTime: DateTimeValue(ThisRecord.endTime),
BreakMinutes: Value(ThisRecord.breakMinutes),
SavedOn: DateTimeValue(ThisRecord.savedOn)
}
)

The keys in the app, such as ThisRecord.startTime, are the keys from Select, spelled the same way. The ParseJSON reference says that reading a field that isn't there returns blank.

The Result​

For an approver with two entries waiting, the gallery shows both rows that came through the text output:

The Waiting for approval screen saying 2 entries are waiting for your decision, with two cards for Admin User: Thu 29/10/2026, 18:00 to 20:00, 2.00 hours, Emergency Department, and Sun 08/11/2026, 08:00 to 11:00, 3.00 hours, Emergency Department

Why Not Return Whole SharePoint Items?​

The text carries every field you put in it to the app, and so to the person's device. Returning only what the screen shows keeps everything else, such as other columns of the list, in SharePoint. It also keeps the text short.

Common Mistakes​

MistakeWhat happensDo this instead
Returning body('Get_items')Every column of every item reaches the appSelect the fields first
Reading a key spelled differently in the appA field that isn't in the JSON is blankUse the keys exactly as in Select
Several outputs, one per rowAn output count can't follow the dataOne Text output with JSON
Using a date without DateTimeValueIt stays textDateTimeValue(ThisRecord.startTime)

Troubleshooting​

SymptomLikely causeFix
The app doesn't see a change to the outputThe app has the flow's old definitionRefresh the flow in the app
A column is blankThe key is spelled differentlyMatch the key in Select
ParseJSON failsThe output isn't JSONReturn string(body('Select')), not text you built by hand

FAQ​

How many rows should the flow return?​

Only those the screen needs, filtered in the flow. Every row travels to the device, and the flow must respond within 120 seconds (How to Send Values Back to Power Apps from a Flow in Power Automate).

Can the app filter the table further?​

Yes. Once ForAll has built it, it's an ordinary table in the app, which can be filtered, sorted or counted.

Conclusion​

To return a table from a flow to Power Apps, Select the fields, return string(body('Select')) as a Text output, and rebuild the table in the app with ParseJSON and ForAll.

Additional Resources​