Skip to content

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 = $0

Always. Hours are tracked for cost purposes only.

T&M (Time & Materials)

Revenue = hours_logged × billing_rate

Accrues 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_cost

Where 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_cost

This 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 × 100

Shown 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_ratehourly_cost
What it isWhat you charge the clientWhat the agency pays the team member
Used forRevenue calculationCost calculation
Where22. Projects Master13. Rate History
Who sees itOwnerOwner only
Typical values$125–$200/hr$50–$120/hr

The gap between them is the gross margin per hour.


Financial access by role

DataOwnerManagerUser
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_hours

Positive = under budget. Negative = over budget.

Cost variance:

cost_variance = estimated_cost − actual_labor_cost

Variance %:

variance_pct = cost_variance ÷ contract_value

These 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

VERA by talktalkmake