Asana Goals
Asana's Goals API (distinct from Tasks and Projects) is where teams track objectives at the workspace level. PerfCopilot pulls Goals owned by each employee and maps sub-goals to Key Results.
What we pull
- Goals — fetched from
GET /goals?workspace=<workspace_gid>and filtered client-side byowner.gid. Fields pulled: name,html_notes(used as description, capped at 1,000 characters),due_on,start_on,current_status_update.status_type. - Sub-goals as Key Results — for each goal, PerfCopilot fetches
GET /goals/{gid}/subgoalsand upserts matching sub-goals asGoalKeyResultrows.
Status mapping:
| Asana status_type | PerfCopilot |
|---|---|
| achieved, completed, done | completed |
| at_risk, behind, partial | at_risk |
| off_track, missed, dropped | off_track |
| anything else / missing | on_track |
partial maps to at_risk (partially met). dropped maps to off_track.
Connecting
Asana Goals uses a Personal Access Token (not OAuth).
- Go to
/admin?tab=integrations, find the Asana card. - Generate a Personal Access Token in Asana: Profile → My Settings → Apps → Developer Apps → New Access Token.
- Enter the token and your Workspace GID (the numeric ID in your Asana workspace URL, or from the Admin Console → Workspace settings).
- Map each employee's Asana user GID in the unmapped-employees list.
Workspace GID is required. The Asana Goals endpoint requires a
workspaceparameter. If it's missing, the sync errors withGoalsConfigErrorand nothing is pulled.
What hits a review
Goals appear in the [GOALS] block of the review prompt, listing each goal's name, status, and any Key Results.
Troubleshooting
Zero goals after sync: confirm the workspace GID is correct and that the access token has workspace member access. Goals that have no owner set won't appear — the ingester filters by owner.gid client-side after fetching the full workspace goal list.
Sub-goals missing: the sub-goal walk uses GET /goals/{gid}/subgoals. Goals with sub-goals only appear as KRs if the sub-goals are linked via the standard Asana parent-goal relationship, not a custom field.
Sync hits truncated: true: the hard cap is 200 goals per employee per sync. If an employee owns more than 200 goals in the workspace, only the first 200 are pulled.
Privacy notes
html_notes(the goal description) is stored up to 1,000 characters. It may contain internal context. Managers can see it in the Goals tab.- The Personal Access Token has the same permissions as the user who created it. Use a service account token if you don't want a departing employee's token to break the integration.