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 = 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_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