Fig. 8 Agency operations
Monthly client reports drafted by AI from Asana
A client portal for an operations agency: AI-drafted monthly delivery reports from Asana, live analytics dashboards, and AI agents that act in each client's tools with that client's own access.
- Client
- Australian operations agency
- Industry
- Agency operations
- Region
- Australia
- Discipline
- Custom apps, AI workflows
How it works
Step 01
Work tracked in Asana
Step 02
Month's tasks pulled and deduped
Step 03
AI drafts the summary
Step 04
Staff edit and publish
Step 05
Client reads it in the portal
The problem
The agency runs day-to-day operations for many service businesses, and the real work is tracked in Asana. Monthly updates were typed up by hand. Agents could not safely act for one client without risking another client's accounts.
Built with
- React
- TypeScript
- Supabase
- Deno edge functions
- OpenAI API
- Asana API
- MCP
- OAuth 2.0
- Zod
What I built
- 01Monthly delivery snapshots: the portal pulls the month's Asana tasks, removes repeats, and has OpenAI draft a summary that staff edit and publish. Asana links never reach clients.
- 02An agent server with 17 tools across Gmail, Calendar, Asana, Notion and Slack, each locked to one client's accounts. Tokens stay on the server and refresh themselves.
- 03Separate agency and client Asana connections, migrated without losing a single stored credential.
- 04A waiting-on-you status, so clients answer questions inside the portal and operators see the reply right away.
- 05Analytics dashboards for GA4, Facebook and Instagram that keep working when one source fails, with inline reconnect links.
Build notes
Monthly delivery reports drafted by AI from Asana
Operators no longer type up what got done each month. The portal pulls the month's Asana tasks, removes repeats, and has OpenAI draft a summary that staff edit and publish to the client. Asana links never reach clients.
Agents now use the right Asana: agency or client
When an operator asks an agent to add a task in a client's Asana, it now uses that client's account. Agency and client workspaces became separate connections, and no saved credentials were lost in the switch.
One shared home for the agency's AI operator setup
Operators get the same setup in the browser or command line: look up the client first, use the right skill, draft before sending, and log every session. Adding the next client becomes a configuration step, not a rebuild.
AI agents that act for each client, safely
Agents can now work in each client's Gmail, Calendar, Asana, Notion and Slack through 17 tools, each limited to that client's accounts. Tokens never reach the browser and refresh themselves, so stale connections heal on their own.
A clear waiting-on-you status for client portals
When work stalls on a client's answer, the operator flags it and the request appears in the client's portal. The client replies there, and the operator sees an unread dot the moment it arrives. Shipped overnight.
Client dashboard stays usable when one data source fails
One failed API call used to break the whole client dashboard. Now GA4, Facebook and Instagram sections load on their own, expired connections show an inline reconnect link, and the main dashboard code shrank from 411 to 269 lines.
Next drawing
Clients see their project work without opening Asana