Build an Asana Portfolio Report in Google Sheets

Give stakeholders one current view across projects without manually combining exports.

Why a portfolio report needs its own approach

An Asana portfolio is a container of projects, not a project itself, and neither Asana's native Google Sheets export nor a plain per-project pull produces a combined view on its own. Asana's GET /portfolios and GET /portfolios/{gid}/items endpoints return the member projects, but each project's tasks still have to be fetched separately with its own GET /projects/{gid}/tasks call and then stitched together, since there's no single "give me every task across this portfolio" endpoint. That stitching step, plus reconciling each project's own custom fields, is the actual work in a portfolio report; pulling one project's tasks is comparatively easy and covered in how to export Asana to Google Sheets.

Define a common reporting schema

Portfolio reporting works when projects share a small set of fields. Agree on owner, status, due date, priority, and the custom fields used for programme reporting before you pull anything, since a field that only exists on three of your ten projects will show up blank everywhere else. Keep project name and task permalink in every row: project name is what lets the reporting tab group or filter by project, and permalink is what lets a stakeholder click through to the real task instead of trusting the spreadsheet's own account of its status.

Separate source data from presentation

Use one raw export tab per portfolio pull and one reporting tab. In the reporting tab, build filters or pivots for overdue work, unassigned tasks, status by project, and due dates by week. This separation lets the source refresh safely: a scheduled refresh replacing the raw tab's contents never breaks a pivot or chart built against it, because the pivot references the tab and its headers, not specific cell positions that a refresh could shift.

Worked example: a three-project delivery portfolio

A portfolio of three projects, each contributing rows to one raw tab:

ProjectTaskStatusDue
Website relaunchMigrate DNSOverdue2026-08-22
Mobile app v2App Store reviewIn progress2026-09-01
Q3 campaignFinalize creativeIn progress2026-09-03

On the reporting tab, a single =QUERY(RawExport!A:D, "select A, count(B) where D < date '2026-08-30' group by A", 1)-style formula rolls up overdue task counts per project for a leadership summary, and a pivot table on the Status column gives the same breakdown without writing a formula by hand.

Schedule for the decision cadence

A daily refresh is usually enough for a leadership report; hourly is useful for active delivery reviews where stakeholders are watching status change through the day. Check that the connected Asana account can see every portfolio project before you rely on the report, because API results follow that user's own permissions: a project the connected account isn't a member of simply won't appear, with no error telling you it was skipped.

Troubleshooting

A project is missing from the combined report

Confirm the connected account is actually a member of that project, not just the portfolio. Portfolio membership and project membership are separate in Asana; being able to see a project listed inside a portfolio doesn't guarantee API access to its tasks.

The same task appears twice

Check whether the task is multi-homed into more than one project in the same portfolio. That's correct behavior, the task genuinely belongs to both projects, but a report that expects one row per task needs to decide how to de-duplicate or intentionally keep both rows with their per-project context.

A custom field is blank for some projects but not others

Custom fields are defined per project in Asana, not portfolio-wide. A field used in one project's schema simply doesn't exist on tasks in a project that never added it.

Related gaps in the native export

Portfolio-level combining isn't the only thing Asana's own Google Sheets export leaves out. See does Asana have a Google Sheets integration for the plan gate, row cap, and one-way limits that apply to a single project export too.

Keep the portfolio sheet current

Asana Exporter can save a portfolio export with custom fields and refresh it hourly, daily, or weekly, on any Asana plan.

See Asana Exporter