Appearance
Financials & P&L
VERA calculates revenue, cost, and margin live from time entries, rate history, and project metadata. No manual spreadsheet formulas needed on the operational side — the data flows automatically to the reporting sheet.
Revenue by project type
Revenue recognition depends on the project type.
Pro Bono
Revenue = $0Always. Hours are tracked for cost purposes only.
T&M (Time & Materials)
Revenue = hours_logged × billing_rateAccrues per entry. Work should stop when hours_budget is exhausted — logging beyond that point earns no additional revenue and runs at pure cost.
Fixed Price
Revenue = (hours_logged ÷ hours_budget) × contract_value
capped at contract_value (100%)Revenue accrues as a percentage of completion. Logging 50% of the budgeted hours recognises 50% of the contract value. When the hours budget is used up, 100% of the contract value has been recognised.
Retainer
Revenue is the fixed monthly retainer fee — this is not calculated per-entry. Instead, VERA tracks burn rate: whether the agency is delivering the contracted hours and therefore earning the fee. See Retainers.
Agile (Sprint-based)
Revenue per sprint = (hours_logged ÷ hours_budget) × contract_value
capped at contract_value
when sprint status = 'active'Sprints with status = 'planned' recognise $0 — work has not started. Once activated, revenue accrues the same way as Fixed Price but per-sprint.
Cost calculation
Cost = what the agency pays to deliver the work.
Standard calculation:
Cost = hours_logged × hourly_costWhere hourly_cost is the rate effective on the entry's date, looked up from Rate History.
Vendor with liability:
Cost = agreed_amount × LEAST(1, elapsed_days / total_days)Where elapsed_days = today − created_at and total_days = deadline − created_at. The agreed_amount accrues linearly from the liability creation date to the project deadline — cost is not recognised in full on day one. If total_days ≤ 0 (deadline on or before creation date), the full agreed_amount is recognised immediately. A cancelled liability contributes zero cost.
This is the same accrual shape as vendor implied hours — both cost and hours grow at the same rate from creation to deadline.
Vendor implied hours (hours budget)
agreed_amount governs cost. agreed_hours governs the hours budget. Because vendors don't log time, VERA accrues their contracted scope linearly from the liability creation date to the project deadline:
implied_hours = agreed_hours × LEAST(1, elapsed_days / total_days)
implied_cost = agreed_amount × LEAST(1, elapsed_days / total_days)Both figures use the same fraction: elapsed_days = today − created_at, total_days = deadline − created_at. Implied hours are added to the team's logged hours in all burn-down calculations — get_project_status, get_project_health, get_project_info, get_proactive_alerts, and the client dashboard. Implied cost is included in get_project_accrual_basis. A cancelled liability contributes zero in both cases. If the deadline has passed, both are used in full.
Rate History lookup
Rate History is append-only and effective-date versioned. When calculating cost for an entry dated 2026-01-15:
Look up 13. Rate History WHERE user_id = X
Find MAX(effective_from) WHERE effective_from ≤ 2026-01-15
Use that row's hourly_costThis means a salary increase on 2026-03-01 affects costs from that date forward, but leaves all historical entries unchanged.
Margin
Margin = Revenue − Cost
Margin % = Margin ÷ Revenue × 100Shown as:
- Dollar amount to Owners
- Percentage only to Managers
The billing_rate vs. hourly_cost distinction
These are two different rates that are easy to confuse:
billing_rate | hourly_cost | |
|---|---|---|
| What it is | What you charge the client | What the agency pays the team member |
| Used for | Revenue calculation | Cost calculation |
| Where | 22. Projects Master | 13. Rate History |
| Who sees it | Owner | Owner only |
| Typical values | $125–$200/hr | $50–$120/hr |
The gap between them is the gross margin per hour.
Financial access by role
| Data | Owner | Manager | User |
|---|---|---|---|
| Revenue ($) | ✅ | ❌ | ❌ |
| Cost ($) | ✅ | ❌ | ❌ |
| Margin ($) | ✅ | ❌ | ❌ |
| Contract value | ✅ | ❌ | ❌ |
| Billing rate | ✅ | ❌ | ❌ |
| Hourly cost (rates) | ✅ | ❌ | ❌ |
| Budget % used | ✅ | ✅ | ❌ |
| Hours logged | ✅ | ✅ (assigned projects) | ✅ (own only) |
Managers see percentages, not dollars. Users see their own hours only.
Monthly report
generate_monthly_report produces a portfolio view for the current (or specified) month:
- Per-project: hours logged, budget hours, utilisation %, burn status
- Revenue at risk: projects over budget
- Open unresolved items count
- Summary: over budget count, under-utilised count
Available to Owners (with dollar amounts) and Managers (with percentages, own projects only).
Variance
Variance appears in two contexts:
Hour variance (from 22. Projects Master formula columns):
hour_variance = estimated_hours − actual_hoursPositive = under budget. Negative = over budget.
Cost variance:
cost_variance = estimated_cost − actual_labor_costVariance %:
variance_pct = cost_variance ÷ contract_valueThese formula columns (I–O in Projects Master) are user-maintained — VERA writes the source data (cols A–H) but the variance calculations are Google Sheets formulas set up in the reporting sheet.
Further reading
- The Data Is Only Worth Protecting If It's Worth Something — why financial visibility is role-gated, and what each role actually needs to see