Internal page. Not linked from the site, not in the sitemap, and marked no-index.
This is the working specification of the estimator’s pricing model, written for the business to check before launch, not for customers. Delete src/app/(site)/quote/model/ once you are happy with the numbers. Nothing else depends on it.
Pricing model specification
Everything the estimator does, in order, with the actual numbers it is using right now. The values below are read live from the admin, so this page always reflects what the tool would charge today. The worked examples are priced by calling the same function the tool calls.
Model code: src/lib/pricing.ts. Rates are edited at /admin/content/quote-estimator.
1Rate card in use
0 of 22 values have been changed from the researched defaults.
1.1 Money values
| Variable | What it prices | Default | In use |
|---|---|---|---|
| minimumVisit | Minimum visit charge | £395 | £395 |
| surveyPerDamper | Survey, per damper | £14 | £14 |
| testBand1Rate | Servicing band 1 rate, per damper | £38 | £38 |
| testBand2Rate | Servicing band 2 rate, per damper | £32 | £32 |
| testBand3Rate | Servicing band 3 rate, per damper | £27 | £27 |
| testBand4Rate | Servicing rate above band 3, per damper | £23 | £23 |
| accessPanel | Fire-rated access panel, supplied and fitted | £145 | £145 |
| damperReplacement | Damper replacement, per unit | £420 | £420 |
| damperInstallation | New damper installation, per unit | £480 | £480 |
| penetration | Fire stopping, per penetration | £55 | £55 |
| fixingsPerDamper | Tek screw remediation, per damper | £38 | £38 |
| mewpHire | Powered access hire, per day | £320 | £320 |
1.2 Servicing volume bands
The band is chosen by the total damper count, and that one rate then applies to every damper on the job. There is no tiering: 100 dampers are all priced at the band 3 rate, not 24 at band 1 then the rest at band 2.
| Band | Condition | Rate per damper |
|---|---|---|
| 1 | dampers ≤ 24 | £38 |
| 2 | dampers ≤ 99 | £32 |
| 3 | dampers ≤ 249 | £27 |
| 4 | anything above | £23 |
1.3 Multipliers
Stored as a factor, so 1.2 means “20% more”. Set any of them to 1 to switch that condition off entirely.
| Variable | Triggered by | Default | In use |
|---|---|---|---|
| accessMixed | access = mixed, or access = unknown | 1.20 | 1.20 |
| accessPoor | access = poor | 1.45 | 1.45 |
| heightTower | height = tower | 1.12 | 1.12 |
| heightMewp | height = mewp | 1.30 | 1.30 |
| hoursEvenings | hours = evenings | 1.25 | 1.25 |
| hoursNights | hours = nights | 1.40 | 1.40 |
| occupiedUplift | occupied = true | 1.10 | 1.10 |
1.4 Values that are in the code, not the admin
These are the only numbers not editable from the admin. Changing them needs a code change.
| Value | Meaning | Set to |
|---|---|---|
| lowFactor (good) | Bottom of the range when access was stated | 0.90 |
| highFactor (good) | Top of the range when access was stated | 1.15 |
| lowFactor (indicative) | Bottom of the range when access is unknown | 0.85 |
| highFactor (indicative) | Top of the range when access is unknown | 1.28 |
| round5 | Range ends are rounded to the nearest £5 | 5 |
| quantity cap | Any entered quantity above this is clamped, to stop nonsense input | 5,000 |
2What the customer enters
Seventeen values in total. Everything else on the page is contact details and does not touch the price.
| Variable | Type / allowed values | Default | What it drives |
|---|---|---|---|
| survey | true / false | false | Adds the survey line, priced on `dampers` |
| servicing | true / false | true | Adds the servicing line, priced on `dampers` via the bands |
| replacement | true / false | false | Unlocks `dampersToReplace` |
| installation | true / false | false | Unlocks `dampersToInstall` |
| fireStopping | true / false | false | Unlocks `penetrations` |
| tekScrews | true / false | false | Unlocks `dampersWithFixings` |
| dampers | whole number, 0 to 5000 | 0 | Survey line and servicing line, and picks the band |
| accessPanels | whole number, 0 to 5000 | 0 | Access panel line. Always available, whatever else is selected |
| dampersToReplace | whole number, 0 to 5000 | 0 | Replacement line |
| dampersToInstall | whole number, 0 to 5000 | 0 | Installation line |
| penetrations | whole number, 0 to 5000 | 0 | Fire stopping line |
| dampersWithFixings | whole number, 0 to 5000 | 0 | Tek screw line |
| access | good | mixed | poor | unknown | unknown | Multiplier, and sets the confidence band |
| height | standard | tower | mewp | standard | Multiplier, and mewp adds the hire line |
| hours | normal | evenings | nights | normal | Multiplier |
| occupied | true / false | false | Multiplier |
3The calculation, step by step
1. REFUSE if no service is selected.
-> "Choose at least one service to estimate."
2. REFUSE if (survey OR servicing) AND dampers = 0.
-> "We need a rough damper count..."
3. BUILD THE LINES. Each is added only if its condition holds.
survey dampers x surveyPerDamper
servicing dampers x bandRate(dampers)
tekScrews AND fixings > 0 dampersWithFixings x fixingsPerDamper
accessPanels > 0 accessPanels x accessPanel
replacement AND qty > 0 dampersToReplace x damperReplacement
installation AND qty > 0 dampersToInstall x damperInstallation
fireStopping AND pens > 0 penetrations x penetration
4. REFUSE if no lines were produced.
-> "Add quantities for the work you selected..."
(this catches e.g. "replacement" ticked with a quantity of 0)
5. IF height = mewp, add the hire line:
mewpHire, flagged pass-through
6. SPLIT the lines:
pricedWork = sum of lines NOT flagged pass-through
passThrough = sum of lines flagged pass-through
7. COLLECT the multipliers, in this fixed order:
access: mixed or unknown -> accessMixed
poor -> accessPoor
height: tower -> heightTower
mewp -> heightMewp
hours: evenings -> hoursEvenings
nights -> hoursNights
occupied: true -> occupiedUplift
8. APPLY them one at a time, recording what each adds:
running = pricedWork
for each m:
adds = running x m - running
running = running x m
multiplier = product of all m
The "adds" figures are what the customer sees. Because each is
measured against the running total, they sum exactly to the
total uplift. Order changes the attribution but not the total.
9. subtotal = running + passThrough
10. IF subtotal < minimumVisit THEN subtotal = minimumVisit
11. confidence = access = unknown ? "indicative" : "good"
good -> low x0.90 high x1.15
indicative -> low x0.85 high x1.28
12. low = round to nearest 5 of (subtotal x lowFactor)
high = round to nearest 5 of (subtotal x highFactor)
13. SHOW low to high, excluding VAT.3.1 Notes on the design
- Multipliers act on the work, not on each line. Poor access slows the whole visit down, so it is applied once to the total rather than being buried in per-unit rates.
- Equipment hire is exempt. A day’s powered-access hire is an invoice we pass on. It sits outside the multipliers, otherwise poor access plus powered access would inflate a £320 hire bill to £603.
- The minimum is applied last. It is a floor on the whole job, so a tiny job in a difficult building still prices at the minimum rather than at the minimum plus uplifts.
- Volume banding replaces the usual “big site, higher rate”. Published pricing tends to quote more per damper on larger sites. That is really access and height, so this model discounts on volume and prices access and height explicitly. The two reconcile: see examples A and E.
- Unknown access is priced as mixed, not as poor. Guessing high to be safe would lose work. Instead the range widens, which is the honest signal.
- Nothing is estimated for remedial work found on the day. There is no contingency in the figure at all.
4Worked examples
Priced live, at the rates in section 1. If you change a rate in the admin, these change with it.
A. Small office. 15 dampers, annual service, good access
Servicing and drop testing
15 dampers at £38 each
= £570
pricedWork = £570
passThrough = £0
site conditions: none, multiplier = 1
subtotal = pricedWork x multiplier + passThrough
= £570 x 1.0000 + £0
= £570
confidence = good (access stated)
low = round5(£570 x 0.9) = £515
high = round5(£570 x 1.15) = £655
SHOWN: £515 to £655 ex VATB. The same job, but the customer does not know the access
Servicing and drop testing
15 dampers at £38 each
= £570
pricedWork = £570
passThrough = £0
site conditions, compounded in order:
x1.20 Access unknown, priced as mixed until surveyed
adds £114
combined multiplier = 1.2000
subtotal = pricedWork x multiplier + passThrough
= £570 x 1.2000 + £0
= £684
confidence = indicative (access unknown)
low = round5(£684 x 0.85) = £580
high = round5(£684 x 1.28) = £875
SHOWN: £580 to £875 ex VATC. Six dampers, good access. The minimum bites
Servicing and drop testing
6 dampers at £38 each
= £228
pricedWork = £228
passThrough = £0
site conditions: none, multiplier = 1
subtotal = pricedWork x multiplier + passThrough
= £228 x 1.0000 + £0
= £228
£228 is below minimumVisit, so
subtotal = £395
confidence = good (access stated)
low = round5(£395 x 0.9) = £355
high = round5(£395 x 1.15) = £455
SHOWN: £355 to £455 ex VATD. Survey and service, 40 dampers, mixed access, tower work
Survey and asset register
40 dampers at £14 each
= £560
Servicing and drop testing
40 dampers at £32 each
= £1,280
pricedWork = £1,840
passThrough = £0
site conditions, compounded in order:
x1.20 Mixed access, some dampers behind obstructions
adds £368
x1.12 Working at height from towers
adds £265
combined multiplier = 1.3440
subtotal = pricedWork x multiplier + passThrough
= £1,840 x 1.3440 + £0
= £2,473
confidence = good (access stated)
low = round5(£2,473 x 0.9) = £2,225
high = round5(£2,473 x 1.15) = £2,845
SHOWN: £2,225 to £2,845 ex VATE. Hospital. 300 dampers, mixed access, nights, occupied wards
Servicing and drop testing
300 dampers at £23 each
= £6,900
pricedWork = £6,900
passThrough = £0
site conditions, compounded in order:
x1.20 Mixed access, some dampers behind obstructions
adds £1,380
x1.40 Night working
adds £3,312
x1.10 Occupied and sensitive areas
adds £1,159
combined multiplier = 1.8480
subtotal = pricedWork x multiplier + passThrough
= £6,900 x 1.8480 + £0
= £12,751
confidence = good (access stated)
low = round5(£12,751 x 0.9) = £11,475
high = round5(£12,751 x 1.15) = £14,665
SHOWN: £11,475 to £14,665 ex VATF. Everything at once, with powered access hire
Survey and asset register
32 dampers at £14 each
= £448
Servicing and drop testing
32 dampers at £32 each
= £1,024
Tek screw and fixing remediation
5 dampers at £38 each
= £190
Fire-rated access panels
3 supplied and fitted at £145 each
= £435
Damper replacement
2 units at £420 each, including making good
= £840
Remedial fire stopping
12 penetrations at £55 each
= £660
[pass-through] Access equipment
Powered access hire, one day
= £320
pricedWork = £3,597
passThrough = £320
site conditions, compounded in order:
x1.45 Poor access, panels missing or pipes and equipment in the way
adds £1,619
x1.30 Working at height requiring powered access
adds £1,565
x1.25 Evening and weekend attendance
adds £1,695
x1.10 Occupied and sensitive areas
adds £848
combined multiplier = 2.5919
subtotal = pricedWork x multiplier + passThrough
= £3,597 x 2.5919 + £320
= £9,643
confidence = good (access stated)
low = round5(£9,643 x 0.9) = £8,680
high = round5(£9,643 x 1.15) = £11,090
SHOWN: £8,680 to £11,090 ex VAT5Where the defaults came from
These are UK market figures from published contractor pricing in 2025/26. They are not Titan’s rates, and they are the thing most in need of review before launch.
- Testing: published ranges of £15 to £50 per damper with a minimum visit charge. One published breakdown gives £20 to £30 per damper on small sites (£300 to £600 total), £25 to £40 on medium sites (£750 to £1,500) and £35 to £50 on large ones (£2,000 and up). Our bands sit inside that, with access and height pulled out as multipliers.
- Damper units: £41 to £200 depending on type and size. Installation labour £30 to £80 per damper. Our replacement and installation rates bundle unit, labour and making good, which is why they sit above the labour-only figures.
- Fire-rated access panels: £26 to £160 in materials alone. Ours includes fitting and making good.
- Fire stopping: roughly one to two hours per five to ten penetrations, which is where the per-penetration rate comes from.
- Sanity check: 15 dampers with good access lands near £570, and 60 dampers with poor access near £2,780. Both fall inside the published bands for those site sizes.
6Things to decide before launch
- Replace every value in section 1 with Titan’s own. The tool is only as right as those numbers.
- Agree the minimum visit charge. It decides every small job, and at £395 it currently catches anything under about 11 dampers on a straightforward site.
- Agree the band thresholds as well as the rates. The jump from £38 to £32 happens at 25 dampers, so a job of 24 prices at £912 and one of 25 at £800, which is less. Widen or narrow the bands if that step is uncomfortable.
- Decide whether the rate card should stay publicly visible. It currently is not shown to customers anywhere: only the resulting figures are.
- Decide whether the ±10/15% range is wide enough to be safe and narrow enough to be useful.