VG Ops · Operations · 2026-06-08

Actualsboard How to run, read, and maintain the QB expense dashboard

Audience Randall / VG Ops
Updated 2026-06-08
Source workspaces/actualsboard/
The actualsboard pulls live expense data from QuickBooks Online and generates an HTML report showing actuals and budget variance across all active VG properties. No CSV exports, no spreadsheet edits — one command produces a fresh report.
§ 01
How to Run the Report
01
Open Terminal and navigate to the vg/ directory
cd "/Users/mac/My Drive (randall@opsstrategypro.com)/RWP/02_active/vg"
02
Run the build script
python3 workspaces/actualsboard/scripts/build_report.py
03
Open the output file
published/reports/actualsboard-{construction|non-construction}-YYYY-MM-DD.html
§ 02
What the Report Shows
SectionWhat it ContainsWhich Properties
Active Construction panelActuals + approved budget + variance per WO code. Red OVER badge when actual exceeds budget.status: active-construction only
All Properties panelTotal actuals + WO category breakdown in a compact table.All include: true properties
Overruns queueWO codes where actual spend exceeds the approved budget.Active construction only
Budget Gaps queueWO codes with real spend but no budget amount set in budgets.yaml.Active construction only
Unmapped Items queueQB line items whose Product/Service name is not in cost_code_mapping.yaml. These are not counted in any WO total until mapped.All properties
§ 03
Re-Authorizing QuickBooks (First Time or After Token Expiry)
01
Delete the existing token file (if present)
rm ~/.config/vg/qb_token.json
02
Run the auth script — it will print a URL
python3 workspaces/actualsboard/scripts/qb_auth.py
03
Open the printed URL in your browser and click Connect in QuickBooks
Browser redirects to opsstrategypro.com/qb-callback — page may not load, that is fine
04
Copy the full redirect URL from the browser address bar and paste it back into the terminal prompt
Starts with: https://opsstrategypro.com/qb-callback?code=...
05
Terminal prints: Token saved. Run build_report.py normally.
Token stored at ~/.config/vg/qb_token.json — auto-refreshes on subsequent runs
§ 04
Config Files — What to Edit and When
FileEdit WhenKey Fields
config/properties.yamlAdding a new property or changing a property's statusshort_name, qb_custom_field_value (must match QB CustomerRef), status, include
config/budgets.yamlApproving a new WO budget or updating an existing budget amountKeyed by property short_name → WO code → dollar amount
config/cost_code_mapping.yamlA QB Product/Service item appears in the Unmapped Items queueQB item name (exact string) → VG WO code
§ 05
Clearing the Unmapped Items Queue
Steps
Open the report and scroll to the Unmapped Items exception table at the bottom
Each row is a QB line item whose Product/Service name has no mapping
For each item name, find the matching VG WO code using reference/cost-codes/Cost Code Unified.csv
The CSV has every QB item name and its parent WO code in column A and B
Add a line to config/cost_code_mapping.yaml: "QB Item Name": WO_CODE
Exact string match required — copy the item name directly from the report
Re-run build_report.py and verify the item no longer appears in the queue
§ 06
File Locations
workspaces/actualsboard/
├── config/
│ ├── properties.yaml ← property list + QB match values
│ ├── budgets.yaml ← approved WO budgets per property
│ └── cost_code_mapping.yaml ← QB item name → VG WO code
├── scripts/
│ ├── qb_auth.py ← OAuth token (run once to authorize)
│ ├── qb_client.py ← fetches Bills + Purchases from QB
│ ├── cost_code_mapper.py ← maps item names to WO codes
│ └── build_report.py ← main entry point
└── templates/
└── report.html.j2 ← report layout and styling
published/reports/
├── actualsboard-construction-YYYY-MM-DD.html ← today's run
└── actualsboard-non-construction-YYYY-MM-DD.html ← today's run
published/_archive/reports/
└── actualsboard-*.html ← older runs auto-pruned here on next build
§ 07
QB Credentials

Client ID and Client Secret are stored in RWP/.env as QUICKBOOKS_CLIENT_ID and QUICKBOOKS_CLIENT_SECRET. These are the Production keys from the Intuit Developer portal (developer.intuit.com → your app → Keys & OAuth → Production tab).

The OAuth token (access + refresh) is stored at ~/.config/vg/qb_token.json and auto-refreshes on each report run. If the refresh fails (e.g. after a long gap), delete the token file and re-authorize using the steps above.