Department dashboard
Every number below follows the month you pick. "All periods" shows the whole book of work.
CAS project status (excludes payroll)
Attention required
Workload by staff (selected month)
CAS work by service type
Payroll projects
Book of business (all engagements, independent of month)
Tasks are generated from each client's recurring services. Utilization is only meaningful when a single month is selected; quarter-end months are structurally heavy because quarterly closes land on top of monthly closes.
CAS Status Tracker
Every recurring CAS job: monthly closes, quarterly closes, sales tax, annual returns, advisory. Update Status, Actual Hrs and Blocker as you work.
Payroll Projects
Every payroll run and payroll tax filing, dated individually. Kept separate so payroll noise stays out of the CAS view.
Calendar
Who is doing what, and when. Color is the owner. Red fill means overdue. Click any item to open it.
Clients & engagements
One row per engagement: owner, fee, budgeted hours, engagement letter, bank access and risk. Tasks look up from here, so fix the client once and every task follows.
Automation & integrations
How agents and other systems feed this tracker. Humans update it by hand today. The data contract and agent setup guide live on the Help tab under "For admins and builders".
Agent update mode
Update queue (from agents and connected systems)
Recent activity
Integration roadmap
- Morning brief for the CAS manager: a scheduled agent reads tasks, builds the day's overdue and due-this-week list, and emails it. Read only, safe in any mode.
- Bank statement watcher: when a statement lands, post a task.update to the queue clearing the blocker.
- Payroll calendar sync: push every payroll run date to Google Calendar from tasks where kind is payroll.
- Month rollover: an agent (or the Admin button) copies a month's work forward and resets statuses.
- Practice management link: when the firm adopts a practice management system, engagements become a mirror of its client list via a connector.
Admin
People, lists, capacity, month rollover, backups and the health check. Only admins see this tab.
People & access
Admins manage clients, lists, people and rollover. Staff update tasks. Viewers only look. Agent is for the automation account. New sign-ups from firm email addresses start as the default role below and appear here after their first sign-in.
To add someone: send them the site address. They create an account with their firm email (other domains are refused), answer the welcome prompt, and appear below. You then set their role and initials.
Staff & capacity
Initials are what the tracker uses for Owner. Link each person's account so "My work" finds their tasks automatically.
Month rollover
Copies one month's CAS and payroll work forward to the next month, resets every status to Not Started, clears hours and blockers, and moves dates off weekends (internal deadlines back to Friday, statutory filings forward to Monday). Review the new month in the tables afterwards.
Backups & export
Download a copy any time. The JSON backup holds everything and can be restored by an agent; the CSVs open in Excel.
Lists & rules
One option per line. Changing a list changes the dropdowns everywhere. Risk points add up per engagement: 5 or more is High, 3 to 4 is Medium.
Health check
Runs on every load. Nothing here can break a formula, but data can still drift. Each line says what is off and, where it is mechanical, offers the fix.
Demo data
Every client, fee and task in this tracker is made up. Reset rebuilds the whole book of work around today's date and clears every edit.
Danger zone
These are permanent. Take a JSON backup first.
How to use this tracker
The five-second version, then the details.
The five-second version
- Open Dashboard. Pick the month you care about. Everything updates.
- Go to CAS Tracker or Payroll. Press My work to see only your clients.
- Change Status and Actual Hrs right in the row, or click the client name to open the full card and add a blocker or note.
- That is the whole system. Nothing else needs touching.
Which tab is which
- Dashboard: read-only summary of the month: counts, attention list, workload by staff, service mix, payroll, book of business.
- CAS Tracker: every recurring CAS job. Filter by owner, status, month, service type or flag. Sort by clicking a column heading.
- Payroll: every payroll run and filing, dated individually. "Inferred" cadence means the source list did not state it; confirm those first.
- Calendar: the same work laid out by date, colored by owner.
- Clients: one row per engagement with fee, hours, EL status, bank access and risk. Group by cadence to see monthly, quarterly, annual and special clients.
- Automation: the queue of proposed updates from agents, the change log, and the data contract for anyone building on this.
- Admin (admins only): people and roles, staff capacity, lists, month rollover, backups, health check.
What the colors mean
- Overdue Due date has passed and the work is not marked Complete.
- Due this week Due within 7 days. Upcoming Due within 3 weeks. Scheduled Further out.
- Done Marked Complete. N/A Not applicable this period.
- High risk No signed EL, unassigned, no bank access, large engagement, or a watch-list note on the client.
How risk is scored
Risk is calculated, not opinion. Each engagement on Clients scores points: no signed engagement letter or proposal (2), no owner assigned (3), the firm has no bank access (1), 15 or more budgeted hours a month (1), a note containing a watch-list word such as on hold, offboarding, needs proposal or change order (3). Five or more is High, 3 to 4 is Medium, 0 to 2 is Low. Admins can change the points and the word list on the Admin tab.
Where no signed engagement letter is on record, the engagement shows "Not stated". That means unknown, not confirmed missing, and it still scores the points until someone confirms otherwise.
Adding work
- New client or service: an admin adds the engagement on Clients, then adds its tasks with the Add task button. Risk, budget hours and bank access fill in by themselves.
- New month: an admin runs Month rollover on the Admin tab. Every task is copied forward with Not Started and clean hours.
- Someone leaves or joins: an admin updates Staff & capacity. The dashboard follows.
- Mistake: open the task and press Undo on the change in its history, or ask an admin to do it from Recent activity.
Why this will not break like a spreadsheet
There are no formulas to overwrite. Every calculated column (due month, days to due, flag, risk, budget hours, variance, utilization) is recomputed from the stored inputs every time the page draws. Dropdowns only accept listed values, dates come from a date picker, numbers are checked before they save, and every change is logged with who made it and what it was before. If something looks wrong, the Health check on the Admin tab names it and usually fixes it with one click.
For admins and builders
Everything below is for whoever connects agents or other systems to this tracker. Staff can ignore it.
Data contract
Every record lives in the tracker's Postgres database (Supabase). Any agent or system with an agent login reads and writes it over the REST API; the agent kit in the project folder wraps this in one Python script. Field names are fixed; the app recalculates everything derived (due month, flag, risk, budget hours) on its own, so writers only send inputs. Each table is id + data (the JSON document below).
tasks id = CAS-0001 | PR-0001 one row per task
engagements id = ENG-001 one row per client engagement
inbox proposed updates awaiting review (state: pending | applied | rejected)
activity change log (append only)
settings id = app: lists, staff, capacity, thresholds, mode
profiles one row per login: email, name, initials, role (admin | staff | viewer | agent)
REST (PostgREST): GET {SUPABASE_URL}/rest/v1/tasks?select=id,data&status=neq.Complete
POST {SUPABASE_URL}/rest/v1/inbox body {"id":"…","data":{…}}
POST {SUPABASE_URL}/rest/v1/rpc/task_update body {"p_id":"CAS-0001","p_patch":{…},"p_label":"…","p_source":"agent"}
Headers: apikey: <anon key> Authorization: Bearer <the agent login's access token>
{
"id": "CAS-0001", "kind": "cas" | "payroll",
"engId": "ENG-001", "clientNo": "1001",
"client": "Example Client LLC",
"service": "Monthly Close", "serviceType": "Monthly Close",
"cadence": "", "cadenceSource": "", // payroll only
"owner": "AM", "reviewer": "",
"period": "Aug-26", "due": "2026-09-04", // YYYY-MM-DD
"status": "Not Started", "pct": 0, // 0 to 1
"actualHrs": null, "budgetOverride": null,
"blocker": "", "notes": "",
"updatedAt": "ISO-8601", "updatedBy": "agent:name",
"source": "ui" | "agent"
}
// POST /rest/v1/inbox {"id": "<new id>", "data": { …this… }}
{
"type": "task.update", // or "task.create"
"taskId": "CAS-0001",
"patch": { "status": "Complete", "actualHrs": 10.5,
"notes": "Bank rec tied out 9/4" },
"source": "agent:close-bot",
"reason": "Bank statement received and reconciled",
"ts": "ISO-8601", "state": "pending"
}
// one call does the merge AND writes the activity log entry
POST /rest/v1/rpc/task_update
{ "p_id": "CAS-0001",
"p_patch": { "status": "In Progress", "pct": 0.5, "actualHrs": 4 },
"p_label": "Bank statement received",
"p_source": "agent" }
// the database enforces the role: staff logins can only patch
// status, pct, actualHrs, reviewer, blocker, notes; agent and admin can patch anything
Set up an agent
- Create the agent login. An admin signs up agent@yourfirm.com like any user, then sets its role to Agent on the Admin tab. Agents never use a person's login.
- Install the agent kit from the project folder (agent/): one Python script, no Claude required. Put the site URL, anon key and the agent login in its .env.
- Run it once by hand: python cas_agent.py morning-check. It prints the day's overdue and due-this-week brief and queues housekeeping proposals.
- Schedule it (Windows Task Scheduler, cron, or a GitHub Action) for weekday mornings.
- Optional, with Claude Code: paste the brief below into a Claude Code session or scheduled task; it calls the same REST endpoints with the agent login. Claude is a convenience, not a dependency.
- Keep Review mode on until approvals become a rubber stamp, then switch to Auto.
Assumptions built into the data
- Due dates follow the "week of the month that work is performed" column, placed on that Friday of the month after the period being closed. Sales tax rows use the statutory 20th.
- Where the source list did not state a payroll cadence, Monthly is assumed and the row is marked Inferred.
- Fee frequency is assumed from the service type. Budget hours per occurrence convert monthly hours using occurrences per year.
- Due dates never land on a weekend or firm holiday: internal deadlines move back, statutory deadlines move forward.
- Staff capacity defaults to 140 hours a month; the blended rate is set on the Admin tab.
Built by DataBates · AI systems for accounting firms · support@databates.us
CAS Status Tracker
Connecting to the department database…