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 = liability.agreed_amount (overrides hours × rate entirely)If a liability exists for vendor X on project Y, the liability's agreed_amount becomes the cost for that vendor on that project — regardless of how many hours are logged. The two methods are never mixed for the same vendor/project pair.
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