Professional Services Automation (PSA)
The ERP flavour for businesses whose product is people’s time: consultancies, agencies, law firms, engineering practices, IT services, and the services arm of a software company.
Why services needs its own model
In manufacturing, capacity is machines and inventory is goods. In services, capacity is people and inventory is unsold hours — and unsold hours are perishable. An hour not sold on Tuesday is gone forever.
That single fact drives everything: utilisation obsession, bench management, resource forecasting, and the fact that a services business fails from under-selling, not from over-spending.
The services lifecycle
Opportunity ──▶ Estimate ──▶ Proposal ──▶ Contract ──▶ Resourcing
│
┌───────────────────────────────────────┘
▼
Delivery ──▶ Time & expense ──▶ Approval ──▶ Billing ──▶ Revenue recognition
│ │
└──────▶ Project accounting ◀──────────────┘
Contract and billing models
| Model | Revenue | Risk |
|---|---|---|
| Time and materials (T&M) | Hours × rate, billed as incurred | Client bears overrun risk |
| Fixed price | Agreed total, billed on milestones | You bear overrun risk |
| Capped T&M | T&M up to a ceiling | You bear risk above the cap |
| Retainer | Fixed monthly fee for availability or a block of hours | Predictable; watch unused-hour rollover rules |
| Milestone / deliverable | On acceptance of defined outputs | Acceptance disputes |
| Outcome / success fee | Based on results achieved | Highest risk, highest margin |
| Managed service | Fixed fee for an ongoing service | Scope creep |
| Prepaid block of hours | Sold upfront, drawn down | Deferred revenue until consumed |
Most real contracts are hybrid: fixed price for phase 1, T&M for change requests, retainer for support. Your data model must support several billing models on one engagement, or every real contract becomes a workaround.
Rate cards
rate_card(
id, client_id, contract_id, effective_from, effective_to,
currency
)
rate_card_line(
rate_card_id,
role, -- PARTNER | PRINCIPAL | SENIOR_CONSULTANT | CONSULTANT | ANALYST
grade, location,
billing_rate, cost_rate,
overtime_multiplier, weekend_multiplier
)
Rate determination hierarchy, most specific wins:
1. Person + client (a named individual's negotiated rate)
2. Role + client
3. Role + client segment
4. Role + region
5. Standard rate card
Plus: annual rate escalation clauses, volume discounts, blended rates (one average rate for a mixed team), and currency for offshore delivery.
Cost rate vs billing rate: cost rate should be fully loaded (salary + employer costs + benefits + a share of overhead), not just salary. Using bare salary as cost rate overstates every project’s margin by 40–60%.
Resource management
The core operational problem: match people to demand.
resource_assignment(
person_id, project_id, wbs_element_id,
role, start_date, end_date,
allocation_pct or hours_per_week,
assignment_type, -- SOFT (pipeline) | HARD (committed) | ACTUAL
billing_rate, cost_rate,
status
)
Soft vs hard booking is essential: a soft booking reserves someone against an unsigned opportunity (weighted by probability), a hard booking is committed. Without the distinction, either you double-book people or you never plan ahead.
The capacity view
Person: Nabila Rahman, Senior Consultant
Week Capacity Booked Available Utilisation
W12 40 40 0 100%
W13 40 32 8 80%
W14 40 44 (4) 110% ← over-allocated
W15 40 16 24 40% ← bench
W16 32* 0 32 0% ← *8h training
Alerts on both over-allocation and bench time. Bench is expensive; over-allocation is how you burn out your best people and lose them.
Skills and matching
person_skill(person_id, skill_id, proficiency, years_experience,
certified, certification_expiry, last_used)
Used for staffing search, gap analysis against pipeline demand, and training planning. Keep it honest — self-assessed skills matrices decay into fiction unless reviewed.
Utilisation — the defining metric
Billable utilisation = billable hours / available hours
Total utilisation = (billable + productive non-billable) / available hours
Realisation rate = billed amount / (billable hours × standard rate)
Effective rate = billed amount / total hours worked
Nabila, March:
Calendar hours 176
− Leave (16)
− Public holiday (8)
= Available 152
Billable hours 118 → 78% utilisation
Internal/training/sales 26
Bench 8
Billed at standard rate 944,000
Actually billed 873,000 → 92.5% realisation
Realisation is where profit leaks. Hours worked but written off — because the client disputed them, the fixed price was exhausted, or the manager discounted to keep the peace — never appear in utilisation. A team at 85% utilisation and 75% realisation is less profitable than one at 75% utilisation and 98% realisation.
Targets vary: 70–80% for senior consultants, 80–90% for juniors, 30–50% for partners (who sell). A firm-wide target applied to everyone is a management error.
Time and expense capture
The one thing everyone hates and everything depends on.
timesheet(person_id, period_start, period_end, status, submitted_at, approved_by)
timesheet_line(
timesheet_id, date, project_id, wbs_element_id, task_id,
hours, activity_type, billable_flag,
billing_rate, cost_rate,
description, -- appears on the client invoice — quality matters
status -- DRAFT | SUBMITTED | APPROVED | REJECTED | BILLED
)
Design principles:
- Make it fast. Mobile, pre-filled from last week, copy-forward, favourites, timer.
- Daily, not weekly. Memory decays; Friday-afternoon reconstruction is fiction.
- Descriptions matter — they go on the client invoice. “Worked on project” invites a dispute; “Reviewed data migration mapping for customer master, 3 workshops with finance team” does not.
- Approval is a control. The project manager approves before it can be billed.
- Lock after billing. A billed timesheet line cannot change; corrections are adjustments.
- Reconcile against attendance — unbooked time means understated project cost.
Expenses: receipt capture (photo + OCR), per diem rules, mileage rates, policy limits, client-billable flag, markup rules, and VAT recovery. Non-billable expenses must be distinguishable from billable ones at capture, not at invoicing.
Work in progress and billing
WIP = approved, unbilled time and expenses at billing value
Ageing WIP is a problem:
0–30 days normal
31–60 days chase
60+ days likely to be written off
WIP write-off is the quiet killer of services profitability. Time sits unbilled, the client relationship moves on, and eventually someone writes it off. Report WIP ageing by project and by manager, weekly.
Billing run:
1. Select approved, unbilled time and expense in the period
2. Apply the contract's billing model (T&M / milestone / fixed)
3. Apply caps, discounts, and prepaid drawdowns
4. Generate a draft invoice with the detail the client's contract requires
5. Project manager reviews — writes off, adjusts, or defers lines
6. Approve → issue invoice → post to AR
7. Revenue recognition per the contract (may differ from the invoice)
That review step is where write-offs happen. Track them: write-off by reason and by manager is one of the most revealing reports in a services business.
Revenue recognition for services
- T&M — over time, as work is performed. Usually equals what’s billed.
- Fixed price — percentage of completion, usually cost-to-cost. Independent of billing milestones. See Revenue Recognition.
- Retainer — straight-line over the period
- Prepaid hours — contract liability, recognised as consumed
- Success fee — variable consideration, constrained until probable
Subcontractors
Services firms subcontract constantly. Model them as resources with:
- A purchase order or framework agreement
- A cost rate (what you pay) and a billing rate (what the client pays)
- Time approval by your project manager before you accept their invoice
- Self-billing in many arrangements
- Margin visibility — subcontractor margin is usually thinner and must be reported separately, or blended margin hides it
KPIs
| Metric | Meaning |
|---|---|
| Utilisation | Billable hours / available |
| Realisation | Billed / billable at standard rate |
| Effective hourly rate | Revenue / total hours |
| Gross margin by project / client / practice | Where you actually make money |
| Bench % | Unassigned capacity |
| Pipeline coverage | Weighted pipeline / capacity for the next quarter |
| WIP days | Unbilled work in process |
| DSO | Collection |
| Project margin variance | Estimated vs actual — is estimating any good? |
| Attrition | Losing people is losing capacity and client knowledge |
| Revenue per head | The headline productivity number |
Developer notes
- Time entry UX is the most important UI in the system. Invest disproportionately.
- Soft vs hard resource booking — model both.
- Rate determination is a hierarchy with effective dates, like pricing.
- Billing and revenue recognition are separate schedules.
- WIP ageing and write-off tracking — build these reports early; they find money.
- Fully-loaded cost rates, not salary.
- Multiple billing models per engagement must be supported from the start.
- Approved and billed lines are immutable. Adjustments are new records.