Draft a weekly Asana project status update for stakeholders

Fridays: what got done in your Asana project this week, what is due next week and what is at risk, written as an update stakeholders can read.

Runs
Fridays at 14:00
Uses
Asana
Posts
Report card

From your apps to your board

How the skill works: your agent reads week's tasks from Asana; asana project from What you tell it, fridays at 14:00, and gives you report card and the report in the chat.

Reads

  • AsanaWeek's tasks
  • What you tell itAsana project
reads
Your agentClaude Code, Codex, Cursor or GeminiFridays at 14:00
posts

You get

  • Report cardOn your board, updated in place every run
  • The report in the chatEvery run, with or without Briefkin

What you get

  • Overall status: on track, at risk or off track, and why in one line.
  • Done this week: the tasks that closed.
  • Next week: what is due, with owners.
  • At risk: each task with the reason and what would unblock it.
  • Milestones and whether their dates hold.

The card on the right is a sample. Yours shows your own numbers and updates in place every run.

What lands on your board

acme-webAsana weekly project status update · Claude Code

At risk: launch holds if copy is approved by Tuesday

12 tasks done, 9 due next week, 2 at risk. The Nov 3 launch holds if the pricing page copy is approved by Tuesday.

At risk12 done this week9 due next week
  1. Design approvedOct 2
  2. Build pagesOct 14
  3. Copy reviewDue Oct 20; 3 of 7 pages approved
  4. QA and redirectsStarts Oct 22
  5. LaunchNov 3
At riskOwnerDueWhy
Pricing page copyPriyaOct 20No update for 8 days
301 redirect mapSamOct 151 day overdue, waiting on the URL list
Done
An example with made-up numbers. Your agent posts your real ones.

What it does

Writing the Friday status update means scrolling the project, remembering what closed, guessing what is at risk and turning it into prose a stakeholder will read. It takes long enough that it gets skipped in exactly the weeks it matters.

The agent reads the project's tasks and milestones, sorts the week into done, next and at risk, and drafts the update with owners and dates. You check it, change a word and post it, or let the agent post it as an Asana status update once you have read it.

How it works

  1. 1Pull the week's tasks

    Call GET /tasks?project={project_gid}&completed_since={7 days ago}&opt_fields=name,completed,completed_at,assignee.name,due_on,modified_at,resource_subtype,custom_fields. With completed_since, Asana returns open tasks plus those completed since that time.

  2. 2

    2Sort into done, next and at risk

    Done: completed in the last 7 days. Next: open and due in the coming 7 days. At risk: overdue, or due within 3 days with no change in a week (modified_at), or flagged in a status custom field.

  3. 3Check the milestones

    Tasks with resource_subtype: milestone are the dates stakeholders care about. Note each one's due date and whether the open tasks ahead of it are on time.

  4. 4

    4Draft the update

    An overall status (on track, at risk, off track), then what was done, what is next with owners, and each risk with what would fix it.

  5. 5Post it if asked

    Only after the person approves, create it with POST /status_updates: parent set to the project gid, status_type of on_track, at_risk or off_track, a title and the text.

  6. Post it to the board

    With BRIEFKIN_TOKEN set, the agent sends the result as one card that updates in place every run. Without it, you get the report in the chat.

Install and run it

Pick your agent, where the data comes from and how to schedule it; the commands below follow.

Agent
Data
Schedule
  1. Install the skill

    One command. It puts the SKILL.md in ~/.claude/skills and in ~/.agents/skills, which Codex, Cursor, Gemini CLI, Copilot CLI and OpenCode read too.

    shellcurl -fsSL https://briefkin.dev/skills/asana-weekly-project-status/install | sh
  2. Run it

    Ask Claude Code:

    promptRun the asana-weekly-project-status skill

    Or paste the prompt instead of installing:

    promptDraft this week's status update for my Asana project (read only unless I approve posting). List the project's tasks with completed_since set to 7 days ago. Sort them into done (completed in the last 7 days), next (open and due in the next 7 days, with owners) and at risk (overdue, or due within 3 days and unchanged for a week, or flagged at risk). Check the milestones and whether their dates hold. Write a short update for stakeholders: an overall status of on track, at risk or off track with one line of why, then done, next, risks with what would fix each, and milestones. Ask me before posting it as an Asana status update.
  3. Put it on a schedule

    Fridays at 14:00, from cron on any machine where Claude Code is signed in:

    crontab0 14 * * 5 claude -p "Run the asana-weekly-project-status skill"

    Add it with crontab -e. A laptop asleep at that time runs it when it wakes if you use launchd or Task Scheduler instead; GitHub Actions works for the API route.

  4. Send it to your board

    Connect Briefkin once with curl -fsSL https://briefkin.dev/install | sh and every run lands on your board as a report card. How setup works

View the SKILL.mdRaw file
SKILL.md---
name: asana-weekly-project-status
description: "Fridays: what got done in your Asana project this week, what is due next week and what is at risk, written as an update stakeholders can read. Use when the user asks for this, or when it runs on a schedule."
---

# Asana weekly project status update

Fridays: what got done in your Asana project this week, what is due next week and what is at risk, written as an update stakeholders can read.

Writing the Friday status update means scrolling the project, remembering what closed, guessing what is at risk and turning it into prose a stakeholder will read. It takes long enough that it gets skipped in exactly the weeks it matters.

The agent reads the project's tasks and milestones, sorts the week into done, next and at risk, and drafts the update with owners and dates. You check it, change a word and post it, or let the agent post it as an Asana status update once you have read it.

## Two ways to get the data

Use the API or MCP route when you have an MCP server, a CLI or an API token for the app. Otherwise, if you can drive a browser the user is signed in to (Claude in Chrome, a Playwright or Chrome DevTools MCP server), use the browser route. Say which one you used.

## Route A: API or MCP server

### What you need

- Access to the Asana project through the Asana MCP server or connector, or a personal access token in `ASANA_ACCESS_TOKEN`.
- Permission to post status updates on the project, only if you want the agent to publish the update you approve.

If something is missing, say what and stop; do not invent numbers.

### Steps

1. **Pull the week's tasks** (Asana): Call `GET /tasks?project={project_gid}&completed_since={7 days ago}&opt_fields=name,completed,completed_at,assignee.name,due_on,modified_at,resource_subtype,custom_fields`. With `completed_since`, Asana returns open tasks plus those completed since that time.
2. **Sort into done, next and at risk**: Done: completed in the last 7 days. Next: open and due in the coming 7 days. At risk: overdue, or due within 3 days with no change in a week (`modified_at`), or flagged in a status custom field.
3. **Check the milestones** (Asana): Tasks with `resource_subtype: milestone` are the dates stakeholders care about. Note each one's due date and whether the open tasks ahead of it are on time.
4. **Draft the update**: An overall status (on track, at risk, off track), then what was done, what is next with owners, and each risk with what would fix it.
5. **Post it if asked** (Asana): Only after the person approves, create it with `POST /status_updates`: `parent` set to the project gid, `status_type` of `on_track`, `at_risk` or `off_track`, a `title` and the `text`.

## Route B: the browser

### What you need

- Signed in to Asana as a project member; posting a status update needs membership of the project, and comment-only members can read but not post.

If something is missing, say what and stop; do not invent numbers.

### Steps

Start at https://app.asana.com/. The user is signed in already; never type passwords or codes, and ask if a sign-in page appears.

1. **Read what closed this week**: Open the project and its **List** tab. Click **Filter** and set it to **Completed tasks**, then sort by **Completion date** (or show the **Completed on** column) and read every task completed in the last 7 days with its assignee.
2. **Read what is due next**: Change the filter to **Incomplete tasks**, sort by **Due date**, and read tasks due in the coming 7 days with owners, plus anything already overdue. Show the **Last modified** column (the **+** at the right of the header) to spot tasks due within 3 days that have not changed in a week, and read your status custom field column if the project has one.
3. **Check milestones and the current status**: Open the **Overview** tab: the **Milestones** section lists each milestone's date, and the status log shows the last update and its color. Note whether the open tasks ahead of each milestone are on time.
4. **Draft, then post only if asked**: Write the update: overall status, done, next with owners, risks with what would fix each, milestones. If the person approves, click **Update status** on the Overview tab, pick **On track**, **At risk** or **Off track**, paste the text and click **Post**.

Note: Column names in the List view depend on the project; add Completed on and Last modified through the + button at the right of the header if they are hidden. The Overview tab also shows the status history, which is a quick way to see what last week's update promised.

## The report

- **Overall status**: on track, at risk or off track, and why in one line.
- **Done this week**: the tasks that closed.
- **Next week**: what is due, with owners.
- **At risk**: each task with the reason and what would unblock it.
- **Milestones** and whether their dates hold.

## Post it to Briefkin

When `BRIEFKIN_TOKEN` is set, or `~/.config/briefkin/env` exists (the installer from https://briefkin.dev/docs writes it), also send the result to the user's Briefkin board as one card. Keep the `item_key` the same on every run so the card updates in place, use a new `event_id` per run, and put today's real numbers in place of the example ones. If the request fails, say so once and carry on.

```bash
[ -n "${BRIEFKIN_TOKEN:-}" ] || . ~/.config/briefkin/env
curl -sS -X POST "${BRIEFKIN_URL:-https://briefkin.dev}/v1/events" \
  -H "authorization: Bearer $BRIEFKIN_TOKEN" \
  -H "content-type: application/json" \
  -d @- <<'JSON'
{
  "v": 1,
  "event_id": "asana-weekly-project-status/<date of this run, e.g. 2026-10-16>",
  "item_key": "asana-weekly-project-status",
  "project": "acme-web",
  "source": "Asana weekly project status update skill",
  "kind": "update",
  "title": "At risk: launch holds if copy is approved by Tuesday",
  "summary": "**12** tasks done, **9** due next week, **2** at risk. The Nov 3 launch holds if the pricing page copy is approved by Tuesday.",
  "widget": [
    {
      "type": "Badges",
      "props": {
        "items": [
          {
            "label": "At risk",
            "tone": "warn"
          },
          {
            "label": "12 done this week",
            "tone": "ok"
          },
          {
            "label": "9 due next week",
            "tone": "info"
          }
        ]
      }
    },
    {
      "type": "Steps",
      "props": {
        "items": [
          {
            "label": "Design approved",
            "state": "done",
            "note": "Oct 2"
          },
          {
            "label": "Build pages",
            "state": "done",
            "note": "Oct 14"
          },
          {
            "label": "Copy review",
            "state": "active",
            "note": "Due Oct 20; 3 of 7 pages approved"
          },
          {
            "label": "QA and redirects",
            "state": "pending",
            "note": "Starts Oct 22"
          },
          {
            "label": "Launch",
            "state": "pending",
            "note": "Nov 3"
          }
        ]
      }
    },
    {
      "type": "Table",
      "props": {
        "columns": [
          "At risk",
          "Owner",
          "Due",
          "Why"
        ],
        "rows": [
          [
            "Pricing page copy",
            "Priya",
            "Oct 20",
            "No update for 8 days"
          ],
          [
            "301 redirect map",
            "Sam",
            "Oct 15",
            "1 day overdue, waiting on the URL list"
          ]
        ]
      }
    }
  ]
}
JSON
```

Widgets come from the Briefkin catalog (https://briefkin.dev/v1/catalog). Without a token, just give the user the report.

## Run it on a schedule

Suggested: Fridays at 14:00 (`0 14 * * 5`). From cron, with the agent signed in on that machine:

```bash
0 14 * * 5 claude -p "Run the asana-weekly-project-status skill"
# Codex: codex exec, Gemini CLI: gemini -p, Copilot CLI: copilot -p, OpenCode: opencode run
```

Or use the agent's own scheduler (Claude Code routines, Codex automations, Claude or ChatGPT scheduled tasks): https://briefkin.dev/skills/asana-weekly-project-status#schedule

Source: https://briefkin.dev/skills/asana-weekly-project-status

What your agent needs

  • Access to the Asana project through the Asana MCP server or connector, or a personal access token in ASANA_ACCESS_TOKEN.

  • Permission to post status updates on the project, only if you want the agent to publish the update you approve.

Connecting Asana

  1. Asana MCP server, Asana's official remote server at https://mcp.asana.com/v2/mcp, signed in with OAuth. Asana also offers an Asana app for Claude; the older beta endpoint (/sse) is deprecated (docs).
  2. API with a personal access token. Create one in the Asana developer console, store it in ASANA_ACCESS_TOKEN with ASANA_WORKSPACE_GID, and send it as a Bearer token.
  3. OAuth app. For a shared or unattended setup, an OAuth app can request narrower scopes such as tasks:read and projects:read.

A personal access token carries all of your Asana permissions, so for scheduled runs use read-scoped OAuth or a separate account with comment-only access to the projects in the report.

Questions

Can it post the update in Asana itself?

Yes, once you have read it. It creates a status update on the project with POST /status_updates, so it shows on the project's Overview and notifies members the way a manual update does. Without your go-ahead it only drafts.

How does it decide a task is at risk?

Three signals: the task is overdue, it is due within three days with no change for a week, or your team set a status custom field to at risk. Tell the agent your field name and values if they differ, and it reads them through custom_fields.

Do I need Briefkin to use the Asana weekly project status update skill?

No. The skill runs with your own agent and gives you the report in the chat. With a Briefkin token set, each run also posts it to your board as a report card, so you can glance at it instead of asking again.

Which agents can run it?

Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot CLI, OpenCode, Windsurf and Amp all read SKILL.md files. The install command puts it in ~/.claude/skills and ~/.agents/skills, where they look. ChatGPT, the Claude app and Grok take the prompt instead. Pick your agent under "Install and run it" and the commands change to match.

Can it work without an API or MCP server, from my browser?

Yes. Switch the data source to "Your browser" and the steps change to the Asana pages themselves: the agent opens app.asana.com in a browser you are signed in to and reads the numbers off the page. Claude Code, Codex, Cursor, Claude app and ChatGPT can drive a browser out of the box; Gemini CLI, Copilot CLI and OpenCode need a Playwright or Chrome DevTools MCP server first. It is slower than the API and needs you signed in, so it suits a report you run by hand or from a scheduler on your own computer.

Read this report on your board, not in a chat log

Skills are free to use with any agent. Briefkin is where their results land: one board for every report, number and question your agents send, with a ping when something needs you.

Free during the open beta. No card.