PerfCopilot
HomeDocs
Documentation

Everything you need to write a fair review.

From your first connection to a sealed, delivered review. Set up PerfCopilot, connect your tools, and generate your first cited draft.

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.