What this audit checks
Authentication & access
- OAuth access token still valid (auth on /my/profile.json)
- Refresh token present and not expired
- Default project (bucket) exists and is not archived/trashed
- Findings to-do list exists and is writable in the default project
- Rate-limit headroom > 30% (50 req / 10s per account)
Backlog health
- Open to-do count vs 30-day baseline (sudden growth = drowning signal)
- Oldest open to-do age (>90 days = backlog rot)
- Unassigned to-dos > 5 (work nobody owns)
- Open vs done ratio skew (open growing faster than done = falling behind)
VortexIQ findings lifecycle (the stickiness test)
- Abandoned findings - VortexIQ-created to-dos, completed=false, no updated_at change >14d
- Finding resolution rate over rolling 90d (target >75%, critical <50%)
- Avg time-to-fix for completed finding to-dos
- Findings ticked complete without a close comment (silent dismissals - Basecamp has no Won’t-Do state)
- Regression rate - to-dos re-opened (completion deleted) after being completed
Team capacity
- Assignees with >10 open to-dos (overload signal)
- Assignees with zero completions in 14d (parked work)
- Cycle time degradation > 25% week-over-week
- Scope added to the active findings cadence after it started
Cross-connector signals
- Critical findings from sibling connectors (shopify/bigcommerce/adobe/cybersource) older than 7 days with no Basecamp to-do - coverage gap
- Basecamp to-dos referencing decommissioned/archived integrations - stale work
Severity thresholds
| Signal | Warn | Critical |
|---|---|---|
vortexiq_findings_abandoned | 5 | 15 |
vortexiq_finding_resolution_rate | 75 | 50 |
blocked_tickets | 3 | 8 |
unassigned_tickets | 5 | 20 |
oldest_open_ticket_age_days | 60 | 90 |
cycle_time_change_pct | 25 | 50 |
rate_limit_headroom_pct | 30 | 10 |
Data sources
GET https://3.basecampapi.com/{account_id}/my/profile.json- Token validity + authorising personGET https://3.basecampapi.com/{account_id}/projects.json- Project (bucket) list + active/archived stateGET https://3.basecampapi.com/{account_id}/buckets/{project_id}/todolists/{list_id}/todos.json- Open to-dos - backlog, abandoned, by-assignee, unassigned readsGET https://3.basecampapi.com/{account_id}/buckets/{project_id}/todolists/{list_id}/todos/completed.json- Completed to-dos - throughput, resolution rate, time-to-fixGET https://3.basecampapi.com/{account_id}/projects/{project_id}/people.json- Project members - assignee resolution + capacity calc