Appearance
Projects & Types
Every piece of work in VERA lives inside a project. A project has a type, a client, and a budget. The type determines how VERA calculates revenue.
Project types
VERA supports five project types. The type must always be specified when creating a project — VERA will never assume a default.
Retainer
The client pays a fixed monthly fee for a set number of hours.
- Budget: annual hours (e.g. 480 h/yr = 40 h/month)
- Revenue: fixed monthly fee (not calculated per-entry)
- Billing model: burn rate — VERA tracks monthly pace and flags over/underspend
- Work gate: no hard stop; burn rate alerts warn when pacing over budget
- Use case: ongoing agency relationships with a monthly scope
"Create project Nike Ongoing as Retainer with 480 hours per year"
See Retainers for burn rate details.
T&M (Time & Materials)
Bill as you go. Revenue is calculated from logged hours.
- Budget: total project hours
- Revenue:
hours_logged × billing_rate - Billing model: per-entry accrual
- Work gate: stop work when
hours_budgetis exhausted - Use case: open-scope work where effort is unpredictable
"Create project Nike Campaign as T&M"
Fixed Price
A flat contract for a defined scope. Revenue accrues as work is completed.
- Budget: total project hours (the effort estimate)
- Contract value: the agreed price in dollars
- Revenue:
(hours_logged ÷ hours_budget) × contract_value— capped at 100% - Billing model: percentage-of-completion
- Work gate: stop work when
hours_budgetis exhausted - Use case: scoped deliverables with a negotiated price
"Create project Nike Rebrand as Fixed Price for $50,000 with 200 hour budget"
Pro Bono
Free work. Hours are tracked but no revenue is recognised.
- Budget: total project hours (optional)
- Revenue: always $0
- Billing model: none
- Use case: charity work, community projects, internal initiatives
"Create project Community Website as Pro Bono"
Agile
Sprint-based work. The parent project is a container; each sprint is its own Fixed-Price-style billing unit.
- Parent project: no contract value or budget — it's just a named container
- Sprints: each sprint has its own
contract_valueandhours_budget - Revenue per sprint:
(hours_logged ÷ hours_budget) × contract_valuewhen status =active - Sprint statuses:
planned= $0 revenue |active= revenue accrues - Work gate: stop work when the sprint's
hours_budgetis exhausted; raise a new sprint for additional scope - Use case: iterative delivery where each sprint is separately contracted
"Create project Acme App as Agile" → then offer Sprint 1
See Agile & Sprints.
Project fields
| Field | Description | Who sets it |
|---|---|---|
name | Project name, unique per tenant | Owner |
client | The client this project belongs to | Owner |
type | One of the five types above | Owner |
budget_hours | Total hours cap (or monthly for Retainer) | Owner via set_project_budget |
contract_value | Dollar amount (Fixed Price & Agile sprints) | Owner |
billing_rate | Hourly rate billed to client | Owner (in Projects Master) |
is_billable | Whether hours generate revenue | Auto: false for Pro Bono, true otherwise |
alert_threshold | % budget used before warning fires (default 80%) | Owner/Manager |
deadline | Target delivery date | Owner via set_project_deadline |
pm_user_id | Assigned project manager | Owner via assign_pm |
project_category | client, internal, pto, sick, leave, time_off | Auto-set |
status | active or inactive | Owner |
Project category vs. type
These are two separate fields:
- Type (
T&M,Fixed Price, etc.) governs billing and revenue recognition - Category (
client,internal,time_off, etc.) governs how VERA treats the project in reports and queries
Internal projects (training, admin, hiring) should use the "Internal" client and project_category = "internal". They still have a type (usually T&M or Pro Bono) for tracking purposes.
Protected projects (Out of Office, Sick, Leave) are auto-created with special categories and cannot be deleted.
The two-tier budget model
There are two completely separate budget concepts. Do not confuse them.
Tier 1 — Project total: budget_hours in the Projects sheet. This is the sold or contracted hours for the whole project. Set by Owner only via set_project_budget. Think of it as the pie.
Tier 2 — Envelopes: rows in the Budgets sheet (07. Budgets). This is how Managers slice the pie — each team member gets a per-person envelope. The sum of all envelopes should not exceed Tier 1.
A Manager asking "how do I set the budget?" wants to distribute hours to their team (Tier 2). The overall budget is set by the Owner (Tier 1) and is not the Manager's to change.
See Envelopes for the full picture.
Project lifecycle
Created → Budget set → PM assigned → Tasks enabled → Envelopes created
↓
Team logs time → Alerts fire if approaching budget
↓
Completed / InactiveNo formal state machine enforces this flow — VERA relies on the configured status field and the business rules in its system prompt.
Clients
Every project belongs to a client. If a client doesn't exist yet, VERA creates it automatically when a project is created.
Internal or overhead work belongs to the built-in "Internal" client. VERA creates "Internal" automatically when the first internal project is provisioned.
Financial rollups are client-aware: get_client_summary aggregates hours, budget, and spend across all of a client's projects.
Further reading
- Retainers Without Timely Data Are Just Guesses — how the retainer model forces timeliness as a first-class constraint
- Agile as a Billing Model — why sprint-based revenue recognition made logging accuracy non-negotiable