Budget Model
How hours flow from project budget through periods, allocations, and tasks.
Budget Model
PayMe uses a strict top-down budget hierarchy. Hours flow downward through four levels; logged hours flow upward as consumption.
The hierarchy
Project (totalBudgetHours = sum of period budgets)
└── Period (budgetHours — the authoritative slice)
└── Allocation (budgetHours per member+discipline)
└── Task (estimatedHours — consumes allocation budget)Project total budget hours is always derived from the sum of period budgets. Editing a period budget updates the project total; period budgets do not auto-scale each other.
Example
A 120h fixed-price project split into three months:
| Period | Budget | Allocations |
|---|---|---|
| March | 40h | Design: 20h (Anna), Dev: 20h (Marco) |
| April | 50h | Design: 10h (Anna), Dev: 40h (Marco) |
| May | 30h | Dev: 30h (Marco) |
Anna opens tasks totalling 28h under her 30h Design allocation across March+April. The remaining 2h show as "unassigned hours" — budget she has but hasn't scoped yet.
Allocated vs Logged
| Concept | What it is |
|---|---|
| Allocated | Planned hours (budget envelope) |
| Logged | Actual hours worked |
| Remaining | Allocated − Logged (computed on read) |
Tasks hold estimated hours (part of allocated scope) and log actual work via time entries.
Unassigned hours
Unassigned hours = allocation.budgetHours − sum(task.estimatedHours)
If an allocation has 40h budget but tasks only add up to 35h, there are 5h unassigned. This is visible on the allocation card and flagged in the advisor UI. Create explicit tasks to consume the budget — there are no catch-all buckets.
Budget status thresholds
| Status | Condition |
|---|---|
under | Used < 75% |
near | Used 75–90% |
over | Used > 90% |
For fixed projects, burn % is compared to completion % — see Budget Health.