Why the figure in your job system is usually too kind
Ask most job systems for first-time fix and you get a count of jobs closed with one visit. That is easy to produce and it flatters almost everyone. When an engineer fixes a boiler on Monday and the same boiler locks out again nine days later, the office raises a new job. Both jobs close with a single visit, so the job count scores two first-time fixes for one fault that took two trips.
The same count can also be unfair. A job where the engineer could not get in on Tuesday and fixed it on Thursday shows two visits and scores as a failure, although nobody touched the asset before the fix.
So the measure has to be built from job, visit and asset data together, with written rules for what counts. This page sets out the method: the revisit window, what counts as a revisit, the awkward cases, and which jobs belong in the denominator.
The formula and the four decisions inside it
The textbook version is short. IBM's explainer on first-time fix rate describes it as the share of jobs completed on the first visit without follow-up visits, supplementary parts or external support, calculated as jobs completed on the first visit divided by total jobs completed.
That sentence hides four choices you have to make before anyone can calculate it from data:
- Which visit is "first". We use the first attended visit: the first time an engineer was on site with access to the asset. A no-access attempt is a scheduling failure, and it belongs in a different measure.
- What counts as a revisit. Any further visit on the same job to finish the repair, plus any new job for the same fault on the same asset within N days of the fix.
- How long N is. We use 28 days in the example. Pick a window, write it down and keep it fixed, because changing it moves the number.
- What is in the denominator. Reactive jobs with an attended fix attempt. Surveys, quote visits and jobs never attended are left out.
If your customer contract defines first-time fix, its wording wins for contract reporting. Some contracts excuse a planned return to fit parts; others do not. Keep that as a second view, not a replacement, so you can still see how often vans are missing the part.
The data model
Fields you need
| Record | Fields used | Why |
|---|---|---|
| Job (work order) | job ref, job type, fault or problem code, asset ref, site, created date, closed date, status, linked or parent job | Groups visits, identifies the fault and the asset |
| Visit (appointment) | job ref, engineer, start and end, outcome code (fixed, no access, needs parts, needs second engineer) | Finds the first attended visit and why it did not finish |
| Asset | asset ref, site, asset type, parent asset | Repeat jobs are matched on the asset, not the site |
| Repeat job cause | cause code on the later job (customer-caused, vandalism, different fault) | Separates your failures from things you could not prevent |
| Parts order (optional) | job ref, part, ordered date, delivered date | Shows whether the return was for a part a van should carry |
Most of these exist in any job system, though not always under these names. On ServiceMax Core, PTC's data dictionary lists the Work Order fields SVMXC__Component__c (Component, a lookup to Installed Product), SVMXC__Top_Level__c, SVMXC__Order_Type__c, SVMXC__Completed_Date_Time__c, SVMXC__Root_Cause__c and SVMXC__How_Fixed__c, and visits on the ServiceMax Event object carry a SVMXC__Service_Order__c lookup back to the work order. There is also a Primary Work Order lookup (SVMXC__Related_Work_Order__c), but its description in the dictionary appears to have been copied from another field, so check how your own org fills it before you rely on it. The ServiceMax integration page covers getting that data out.
Joins
| From | To | Key | Watch for |
|---|---|---|---|
| Visit | Job | job ref | Visits held on two calendar objects need reading from both |
| Job | Asset | asset ref | Jobs logged against the site, not the asset, can't be checked for repeats |
| Job | Later job | same asset ref, later created date, within N days of the fix | The office rarely links them; match on asset and fault, not on a link field |
| Later job | Fault | fault or problem code | Free-text faults need mapping to a short code list first |
| Job | Parts order | job ref | Parts ordered before the first visit mean the return was planned |
Formulas
| Measure | Formula |
|---|---|
| Fix date | date of the visit with outcome "fixed" |
| Repeat | a later job on the same asset, same fault code, not coded customer-caused, created ≤ N days after the fix date |
| First-time fix | first attended visit outcome = fixed and no repeat |
| First-time fix rate | first-time fixes ÷ reactive jobs with an attended fix attempt in the period |
| Parts-excused view | (first-time fixes + parts returns with no repeat) ÷ the same denominator |
| Period is final when | period end + N days ≤ report date |
Edge cases, and what we count them as
| Case | Counts as | Reason |
|---|---|---|
| No access, then fixed at the first attended visit | First-time fix | The engineer fixed it the first time they could reach the asset. Report no-access attempts separately |
| No access, then cancelled | Excluded | No fix was attempted |
| Return to fit a part | Miss (excused in the parts view) | The customer still waited for a second visit |
| Second engineer or specialist needed | Miss | Same reason; the cause code tells you whether it was skills or a two-person task |
| Same fault, same asset, inside N days | Miss | The fix did not hold |
| Different fault, same asset | Not a miss | A filter alarm after a fan repair is a new problem. Flag assets with three or more jobs instead |
| Repeat coded customer-caused | Not a miss | Only if someone checks the code; an unchecked code becomes a way to hide misses |
| Same fault after N days | Not a miss | Outside the window by definition. Watch these in an asset reliability report |
| Survey or quote visit | Excluded | Nobody was trying to fix anything on that visit |
Two things make this fair in practice. Fault codes must be short and consistent, because "Not cooling" and "no cooling, unit iced" have to match. And the customer-caused code needs an owner who reviews it each week.
Grouping weeks and waiting for the window
Group jobs by the date of the first attended visit, not by the date they closed. A job attended on 30 September and finished on 9 October after a parts return belongs to the week it was first attended, which is when the fix failed.
Then accept that recent weeks are not finished. A repair done last Friday has had three days to fail, so its week will look better than it really is. Mark any week whose last day plus N is after the report date as provisional, show it differently, and do not compare it with final weeks. The chart below does exactly that, and the last four weeks sit higher than most of the eight before them for no reason other than time.
Run 2 November 2026 · 28-day revisit window
First-time fix rate · Ostlecombe Building Services (fictional)
76.7% fixed first time,
not the 81.4% the job count shows.
Reactive jobs over the 8 weeks whose 28-day window has closed. A job counts only if the first attended visit fixed it and no job for the same fault on the same asset followed.
- First-time fix rate
- 76.7%
- 332 of 433 jobs
- Parts returns excused
- 87.1%
- If a contract allows it
- Single-visit job count
- 81.4%
- 372 of 457 closed jobs
- Repeat faults caught
- 32
- Logged as new jobs
Weekly trend, three ways of counting
- Method (this page)
- Parts returns excused
- Single-visit job count
Weekly figures
| Week from | Method | Parts excused | Single-visit count | Status |
|---|---|---|---|---|
| 10 Aug | 82.5% 47/57 | 91.2% | 88.7% 47/53 | Final |
| 17 Aug | 73.5% 36/49 | 87.8% | 77.2% 44/57 | Final |
| 24 Aug | 69.6% 39/56 | 85.7% | 80.0% 44/55 | Final |
| 31 Aug | 75.5% 40/53 | 86.8% | 75.0% 45/60 | Final |
| 7 Sept | 75.0% 39/52 | 86.5% | 73.7% 42/57 | Final |
| 14 Sept | 83.6% 46/55 | 87.3% | 85.5% 53/62 | Final |
| 21 Sept | 78.2% 43/55 | 85.5% | 87.3% 48/55 | Final |
| 28 Sept | 75.0% 42/56 | 85.7% | 84.5% 49/58 | Final |
| 5 Oct | 84.0% 42/50 | 88.0% | 81.1% 43/53 | Provisional |
| 12 Oct | 84.1% 53/63 | 88.9% | 86.4% 57/66 | Provisional |
| 19 Oct | 91.1% 51/56 | 91.1% | 88.9% 56/63 | Provisional |
| 26 Oct | 94.0% 47/50 | 96.0% | 94.0% 47/50 | Provisional |
Why first visits missed (8 final weeks)
- Return to fit parts52 · 51.5% of misses
- Same fault within 28 days32 · 31.7% of misses
- Second engineer or specialist17 · 16.8% of misses
Counting rules
- ExcludedSurvey and quote visits, and jobs never attended (no access, then cancelled).
- Not a missA no-access attempt before the first attended visit. A different fault on the same asset. A repeat coded customer-caused. A repeat after the window.
- MissA return to fit parts or bring a second engineer. Any job for the same fault on the same asset within 28 days of the fix.
- WaitA week is final only when 28 days have passed since its last day.
Week from 28 September 2026: the jobs that needed a decision
42 of 56 counted jobs fixed first time (75.0%). Plain first-visit fixes with nothing else on the asset are not listed.
| Job | Asset · fault | Visits | Counted as |
|---|---|---|---|
| R-52478Ivel Court Offices | ChillerHigh pressure trip | 28 Sept fixed | Miss: same fault within 28 days (R-52794) |
| R-52534Coldharbour Leisure Pool | ChillerNot cooling | 29 Sept fixed | Miss: same fault within 28 days (R-52913)Different fault, same asset |
| R-52589Brackwater Primary | ChillerNot cooling | 22 Sept no access28 Sept needs parts30 Sept fixed | Miss: return to fit partsNo access on first attempt |
| R-52639Pellow Street Surgery | BMS controllerOffline | 29 Sept needs parts6 Oct fixed | Miss: return to fit parts |
| R-52640Ivel Court Offices | BoilerLockout | 30 Sept fixed | Miss: same fault within 28 days (R-52701)Customer-caused repeat |
| R-52644Ivel Court Offices | BoilerNo heat | 2 Oct needs 2nd engineer6 Oct fixed | Miss: second engineer or specialist |
| R-52651Ferrand Studios | Water heaterLeaking | 2 Oct needs parts6 Oct fixed | Miss: return to fit partsDifferent fault, same asset |
| R-52656Marrable House | Split ACError code | 2 Oct needs parts12 Oct fixed | Miss: return to fit parts |
| R-52657Marrable House | Split ACError code | 2 Oct fixed | Miss: same fault within 28 days (R-52658) |
| R-52665Coldharbour Leisure Pool | BoilerLow pressure | 28 Sept needs parts5 Oct fixed | Miss: return to fit parts |
| R-52673Marrable House | ChillerNot cooling | 28 Sept needs parts5 Oct fixed | Miss: return to fit parts |
| R-52679Ivel Court Offices | Water heaterLeaking | 2 Oct fixed | Miss: same fault within 28 days (R-52911) |
| R-52681Coldharbour Leisure Pool | ChillerHigh pressure trip | 28 Sept fixed | Miss: same fault within 28 days (R-52682) |
| R-52683Coldharbour Leisure Pool | ChillerNot cooling | 28 Sept fixed | Miss: same fault within 28 days (R-52534)Different fault, same assetRepeat after 29 days (outside window) |
| R-52659Quayle Retail Unit 4 | BoilerLockout | 30 Sept no access | Excluded: never attended (no access, cancelled) |
| R-52674Sandpiper Care Home | Pump setPump failed | 2 Oct survey | Excluded: survey or quote visit |
| R-52265Marrable House | Water heaterNo hot water | 29 Sept fixed | First-time fixDifferent fault, same asset |
| R-52633Northgate Library | Air handling unitFilter alarm | 29 Sept no access2 Oct fixed | First-time fixNo access on first attempt |
| R-52635Elmswood Medical Centre | BoilerLow pressure | 1 Oct fixed | First-time fixCustomer-caused repeat |
| R-52637Tilbrook Depot | BMS controllerSensor fault | 28 Sept no access1 Oct fixed | First-time fixNo access on first attempt |
| R-52669Marrable House | Water heaterLeaking | 29 Sept fixed | First-time fixDifferent fault, same asset |
| R-52672Quayle Retail Unit 4 | Split ACNot cooling | 1 Oct fixed | First-time fixDifferent fault, same asset |
| R-52675Pellow Street Surgery | ChillerNot cooling | 30 Sept fixed | First-time fixDifferent fault, same asset |
Worked example (illustrative, fictional)
The figures are from the fictional dataset behind the chart above: a building services contractor, the week starting Monday 28 September 2026, a 28-day window and a report date of 2 November 2026. The window closed on 1 November, so the week is final.
| Step | Jobs | Note |
|---|---|---|
| Jobs whose first attended visit (or only visit) fell in the week | 58 | |
| Less survey or quote visits | 1 | Excluded |
| Less jobs never attended | 1 | No access, then cancelled |
| Denominator | 56 | 58 − 1 − 1 |
| Misses: return to fit parts | 6 | |
| Misses: second engineer needed | 1 | |
| Misses: same fault on same asset within 28 days | 7 | Each one raised as a new job |
| First-time fixes | 42 | 56 − 6 − 1 − 7 |
- First-time fix rate: 42 ÷ 56 = 75.0%.
- Parts-excused view: none of the six parts returns had a repeat, so (42 + 6) ÷ 56 = 48 ÷ 56 = 85.7%.
- Single-visit job count for the same week: 49 of the 58 jobs closed that week had one visit, 49 ÷ 58 = 84.5%. That is 9.5 points higher than the method, mostly because the seven jobs whose fix failed within 28 days each closed with one visit, and a job count never looks at what happened to the asset next.
Seven of the 42 fixes had something else on the record that a cruder rule would have held against them: two had a no-access attempt before the fixing visit, four had a later job on the same asset for a different fault, and one had a repeat coded customer-caused. None of them is a miss under the rules above.
Over the eight final weeks the fictional contractor's rate is 332 ÷ 433 = 76.7%, against 81.4% from the single-visit count. Of the 101 misses, 52 were parts returns, 32 repeat faults and 17 second-engineer visits. Parts are the biggest cause, which points at van stock and pre-visit diagnosis before it points at engineer skill.
Reading the trend
Treat a single week as noise unless it is very different; with 50-odd jobs a week, three jobs move the rate by about five points. Look at the reasons as well as the rate. A falling rate driven by repeats is a quality question for the engineers and their supervisors. One driven by parts returns is a stock and diagnosis question. One driven by second-engineer visits is often a dispatch question: sending one person to a two-person job.
First-time fix also sits next to other measures. Utilisation pushed too high can show up here as rushed visits, which is why engineer utilisation is worth reading alongside it, and the full set of operational measures is on the field service KPIs template. Planned work has its own measure in the PPM compliance report template.
How to automate it with IVP.ai
The calculation needs jobs, visits and the asset register in one place, refreshed daily, with fault codes mapped to a short list. The IVP.ai Data Layer brings those together from your job system, whether it exposes a REST API or a SQL database, and keeps the history so a week moves from provisional to final on its own when the window closes. It applies the rules above as written, so the definition is the same for every branch and every month.
A Deskless by IVP.ai agent can then send the operations director the weekly rate with its reasons, and send each supervisor the repeat jobs on their patch, along with any job coded customer-caused for them to check. By default it flags and drafts, and a person decides; it does not recode jobs or change the figures. Deskless explains how that works. The national fire safety and security company in our single source of truth case study unified HubSpot, Uptick and finance spreadsheets into one governed view, saving 10+ hours a week on reporting; this report is built the same way. More templates are on the field service reporting hub.
To see your own first-time fix rate measured this way, start with the free 48-hour pilot. We connect up to three sources, clean the data and set one report or agent running on it within 48 hours of read-only access. You then have 14 days of access to decide whether to choose a plan or walk away.