05 — Pricing Calculator
Audience: AEs (paper version), Engineering (JSON spec for future in-app build) Use: Deterministic quote generation. Same inputs → same number, every time.
Paper calculator (AE-usable today)
Fill in steps in order. Show all working in the proposal.
Step 1 — Cohort inputs
| Input | Your value |
|---|---|
| Number of cohorts | _____ |
| Participants per cohort (avg) | _____ |
| Total participants (cohorts × per cohort) | _____ |
Step 2 — Validate against floors
- Each cohort has ≥15 participants (else: redesign or decline per §04)
- No cohort >30 participants (else: split into more cohorts)
Step 3 — Calculate base price
| Line | Formula | Value |
|---|---|---|
| A. Base engagement fee | Fixed | £18,000 |
| B. Per-participant fee | £900 × total participants | £_____ |
| C. Additional cohort fee | £6,000 × (cohorts - 1) | £_____ |
| Subtotal | A + B + C | £_____ |
Step 4 — Apply ONE complexity uplift (if any)
Pick the highest applicable, never stack:
- Multi-site 3+ locations: +£4,000
- Out-of-hours per cohort: +£3,000 × cohorts
- Bespoke curriculum: +£5,000 (needs Delivery Lead sign-off)
- Welsh/bilingual per cohort: +£4,500 × cohorts
- Extended KPI reporting: +£2,500
| Line | Value |
|---|---|
| D. Complexity uplift | £_____ |
| Subtotal after uplift | A+B+C+D = £_____ |
Step 5 — Apply ONE discount (if any)
Pick the most favourable to client, never stack:
- 3+ cohorts same window: 5% off (B + C only, not A or D)
- 12-month multi-engagement signed: 10% off total (needs Sales Lead sign-off)
- Reference client rights: 5% off total (needs marketing sign-off)
| Line | Value |
|---|---|
| E. Discount | -£_____ |
| Total engagement price | A+B+C+D-E = £_____ |
Step 6 — Floor check
- Total ≥ £31,500 (single cohort minimum) OR
- Total ≥ £25,000 absolute floor
If below floor → escalate per §04 quoting workflow.
Step 7 — Per-participant equivalent (for the proposal)
per_participant_cost = total / total_participants
Show this in the proposal — buyers think in per-head terms.
Worked example sheet (clip into proposals)
Scenario: A UK Local Authority wants to roll out manager mental health training to 75 frontline managers across 3 cohorts, single site, no bespoke needs.
| Step | Calculation | Result |
|---|---|---|
| A. Base | Fixed | £18,000 |
| B. Per-participant | £900 × 75 | £67,500 |
| C. Additional cohorts | £6,000 × 2 | £12,000 |
| D. Complexity | None | £0 |
| Subtotal | A+B+C+D | £97,500 |
| E. Discount (3+ cohorts: 5% off B+C) | -5% × £79,500 | -£3,975 |
| Total | £93,525 | |
| Per participant | £93,525 / 75 | £1,247 |
Frame in proposal: "At £1,247 per manager over 12 weeks, this represents less than 5% of the CIPD-modelled cost of replacing a single frontline manager."
JSON spec (for engineering to build the in-app calculator)
{
"calculator": {
"version": "1.0.0",
"effective_from": "2026-01-01",
"inputs": {
"cohorts": { "type": "integer", "min": 1, "max": 12, "required": true },
"participants_per_cohort": { "type": "integer", "min": 15, "max": 30, "required": true },
"complexity": {
"type": "enum",
"options": ["none", "multi_site", "out_of_hours", "bespoke_curriculum", "welsh_bilingual", "extended_kpi"],
"default": "none"
},
"discount": {
"type": "enum",
"options": ["none", "volume_3plus", "annual_commitment", "reference_client"],
"default": "none"
}
},
"constants": {
"base_engagement_fee": 18000,
"per_participant_fee": 900,
"additional_cohort_fee": 6000,
"complexity_uplifts": {
"none": 0,
"multi_site": 4000,
"out_of_hours_per_cohort": 3000,
"bespoke_curriculum": 5000,
"welsh_bilingual_per_cohort": 4500,
"extended_kpi": 2500
},
"discount_rates": {
"none": { "type": "none", "value": 0 },
"volume_3plus": { "type": "pct_of_variable", "value": 0.05 },
"annual_commitment": { "type": "pct_of_total", "value": 0.10 },
"reference_client": { "type": "pct_of_total", "value": 0.05 }
},
"floors": {
"absolute_minimum": 25000,
"single_cohort_minimum": 31500,
"min_participants_per_cohort": 15,
"max_participants_per_cohort": 30
}
},
"formula": {
"a_base": "constants.base_engagement_fee",
"b_participants": "constants.per_participant_fee * cohorts * participants_per_cohort",
"c_additional_cohorts": "constants.additional_cohort_fee * (cohorts - 1)",
"d_complexity": "complexity_uplift_resolved",
"subtotal": "a + b + c + d",
"e_discount": "resolve_discount(discount, b+c, subtotal)",
"total": "subtotal - e",
"per_participant": "total / (cohorts * participants_per_cohort)"
},
"validation": {
"pre_calc": [
"participants_per_cohort >= floors.min_participants_per_cohort OR fail('Cohort below min size 15')",
"participants_per_cohort <= floors.max_participants_per_cohort OR fail('Split cohorts: max 30')",
"complexity != 'bespoke_curriculum' OR require_signoff('delivery_lead')",
"discount == 'annual_commitment' IMPLIES require_signoff('sales_lead')",
"discount == 'reference_client' IMPLIES require_signoff('marketing')"
],
"post_calc": [
"total >= floors.absolute_minimum OR escalate('below_floor', delivery_lead + sales_lead)",
"cohorts == 1 AND total < floors.single_cohort_minimum OR escalate('below_floor', delivery_lead + sales_lead)"
]
},
"outputs": {
"total": "GBP integer",
"per_participant": "GBP rounded to nearest £",
"breakdown": "object with a, b, c, d, e components",
"warnings": "array of strings",
"signoffs_required": "array of role names"
}
}
}
Engineering implementation notes (for whoever builds the in-app version)
- Server function:
createServerFnatsrc/lib/pricing.functions.ts. - Auth: AE role required (
has_role(auth.uid(), 'staff')). - Store every quote in a
quotestable with: inputs, outputs, breakdown, AE id, timestamp, signoff status. - Re-running the calculator on the same quote ID must return identical output (deterministic).
- UI: form on
/staff/pricing-calculatorrendering output as the proposal-ready table above. - Export: button that copies the worked-example table into clipboard, ready to paste into Proposal §06.
Do not build yet — this lives in this spec until the AE team has used the paper version for 2 quarters and confirmed the formula holds. Premature automation locks in mistakes.
