PerfCopilot

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 by owner.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}/subgoals and upserts matching sub-goals as GoalKeyResult rows.

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).

  1. Go to /admin?tab=integrations, find the Asana card.
  2. Generate a Personal Access Token in Asana: Profile → My Settings → Apps → Developer Apps → New Access Token.
  3. Enter the token and your Workspace GID (the numeric ID in your Asana workspace URL, or from the Admin Console → Workspace settings).
  4. Map each employee's Asana user GID in the unmapped-employees list.

Workspace GID is required. The Asana Goals endpoint requires a workspace parameter. If it's missing, the sync errors with GoalsConfigError and 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.