Key takeaways
Most preventive maintenance problems are not scheduling problems. They are modelling problems, and they start when a plant keeps the rule and the job in the same record.
This page is the data model behind a schedule: the tables, the fields and the arithmetic. For how to build the schedule as a practice, see our guide to the preventive maintenance schedule.
| Object | What it is | How many |
|---|---|---|
| PM plan | The rule: when work falls due on one asset | One per asset and interval |
| Task list | The steps, readings and parts | One, reused by many plans |
| Work order | One dated occurrence of the plan | One per occurrence |
| Completion record | What was found, read, used and signed | One per work order |
The plan lives forever and changes rarely. The work order lives for days and changes constantly.
A technician runs the 500 hour service on the filler and finds the checklist has no step for the second grease point.
He adds it to the work order in front of him, and next month the same job arrives without it, because he edited the instance and not the template.
The reverse version is worse. A planner pushes the due date on the work order to next week, believing the plan has moved, and the plan raises the following job on the old rule anyway.
| Edit this | And this happens |
|---|---|
| Step on the work order | One job changes, the template does not |
| Step on the task list | Every future job changes |
| Due date on the work order | One job moves, the plan is untouched |
| Interval on the plan | Next due point is recalculated |
| last_ | The whole future schedule shifts |
Two rules stop the confusion. Show the plan identifier on every generated work order, and make the work order's step list a copy with the task list version stamped on it.
Copying is the right default because an auditor asks what the instruction said on the day, not what it says now. Referencing the live task list rewrites history every time somebody fixes a typo.
The fourth object is treated as a formality, and it is the one that advances the schedule.
| Completion field | Example |
|---|---|
| completed_ | 2026-07-18 14:20, Employee 2231 |
| meter_ | 13,000 h |
| step_ | 11 typed answers, 1 out of limit |
| parts_ | 6 seals, booked to the work order |
| actual_ | 105 against 90 planned |
| follow_ | Raised from the out of limit step |
Completion writes last_
Miss it and the plan never advances, so a job done in the field stays overdue forever.
These are the fields a plan needs before it can raise anything, in the names most systems use.
| Field | What it holds | Example |
|---|---|---|
| plan_ | The key | PM-2118 |
| asset_ | Asset covered, one only | FIL-01 |
| task_ | Template of steps | TL-FILL-500H |
| trigger_ | Calendar, Meter, Cycles, Condition | Meter |
| meter_ | Counter watched, if any | MTR-FIL-01-H |
| interval_ | The number | 500 |
| interval_ | days, weeks, run hours, cycles | run hours |
| schedule_ | Floating or fixed | Floating |
| lead_ | How early the job is raised | 7 days |
| grace_ | Still counted on time | 3 |
| last_ | Written back on completion | 2026-07-18 |
| last_ | Reading at completion | 13,000 h |
| next_ | Derived, never typed | 2026-09-12 |
| next_ | Derived, never typed | 13,500 h |
| assigned_ | Team or person by default | Mechanical team |
| estimated_ | Planned minutes | 90 |
| priority | 1 to 4 | 3 |
| shutdown_ | Needs the line stopped | Yes |
| is_ | Raises work or not | Yes |
Two fields are derived and must never be editable: next_
One field carries the whole calculation: schedule_
The plan points at one asset. For which level of the tree that should be, see our asset hierarchy data model, and for the surrounding tables see the CMMS data model.
Every preventive task fires on one of four things: a date, a counter, a cycle count, or a measured condition. Choosing the wrong one over-maintains half your plant and under-maintains the other half.
| Trigger | Fires when |
|---|---|
| Calendar | Today reaches next_due_date minus lead_time |
| Meter | Reading reaches next_due_meter minus the lead in meter units |
| Cycles | Cycle counter reaches the due count minus the lead in cycles |
| Condition | A measured value crosses a stored limit |
The simplest trigger, and the right one whenever wear is driven by time rather than use.
It needs four fields: interval_
Use it for rubber and grease ageing, statutory inspections, calibration, seasonal work and anything a regulator or a customer dates.
The failure mode is an asset whose use varies. A machine running 20 hours a week and one running 120 hours a week get the same 90 day service, so one is over-serviced and the other is late.
An interval of 28 days keeps the same weekday and 30 days does not, so use multiples of 7 when the job needs a specific crew on a specific shift.
The right trigger for wear driven by running: bearings, belts, filters, oil, drives.
It needs meter_
A lead time of 7 days means nothing to a counter, so it has to be turned into hours before the job can appear on anybody's list.
Take plan PM‑2118 on filler FIL‑01, interval 500 run hours, last done at 13,000 h.
Store the averaging window with the plan, because a 7 day window and a 90 day window give very different dates.
The failure mode is a standby asset. A spare pump that runs 40 hours a year never reaches its meter due point, so a meter only plan stays quiet while the seals dry out and the casing corrodes.
The fix is a second trigger, whichever comes first: 500 run hours or 12 months. Any plan on an intermittently used asset needs that calendar backstop.
Moulds, dies, presses, punches, welding guns and pneumatic actuators wear per operation, not per hour. A press standing idle with the tool mounted burns hours and no tool life.
It needs the same fields as the meter trigger, with one difference that catches almost everybody: the cycle meter belongs to the tool, not to the machine.
Mould MOLD‑07 moves between three presses. The press shot counter counts every shot the press makes, including shots made with a different tool in it.
So the model needs a mount event, and the tool's life is the sum of its deltas.
| Mount event field | Example |
|---|---|
| tool_ | MOLD-07 / PRS-04 |
| mounted_ | 2026-09-02 06:10 |
| counter_ | 4,210,900 |
| dismounted_ | 2026-09-09 14:30 |
| counter_ | 4,268,400 |
| Cycles credited to the tool | 57,500 |
Plan PM‑3304 on MOLD‑07 has an interval of 250,000 cycles and was last done at 1,750,000, so it is due at 2,000,000.
The failure mode here is counting the press instead of the tool: the tool you just mounted looks worn out while the one on the rack looks new.
The trigger fires when a measured value crosses a limit: vibration, temperature, oil particle count, wall thickness, current draw.
It needs a source, a measured field, a limit and a direction, plus the task list to run when it fires (see condition based maintenance).
The readings come from two places: a sensor or monitoring feed, or a step on an inspection checklist that a person fills in.
The second path is the one the model usually forgets. If the reading only exists as a checklist answer, the condition plan depends on a calendar inspection plan running first.
The failure mode is a plan with no reading source. It never fires, it never shows up as overdue, and it looks perfectly healthy on the plan list for years.
Guard it with a staleness rule: if the newest reading for the plan is older than the inspection interval, raise the plan as overdue on missing data rather than treating silence as a pass.
| Trigger is wrong when | What you get |
|---|---|
| Calendar on a variable use machine | Half the fleet over-serviced, half under-serviced |
| Meter on a standby asset | The plan never fires at all |
| Cycles read off the machine | Tool life charged to the wrong tool |
| Meter on time-aged rubber or grease | Ageing ignored while the machine sits |
| Condition with no reading source | Silence reads as healthy |
Floating calculates the next due point from the last completion. Fixed calculates it from the original grid, whatever the completion date was.
Both are defensible, and a plant needs both. What breaks plants is not knowing which one a plan uses.
Take a 30 day plan first due on 2026-03-04, where cycle 1 is completed 9 days late on 2026-03-13 and every later cycle is done on its due date.
| Cycle | Fixed due | Floating due |
|---|---|---|
| 1 | 2026-03-04 | 2026-03-04 |
| 2 | 2026-04-03 | 2026-04-12 |
| 3 | 2026-05-03 | 2026-05-12 |
| 4 | 2026-06-02 | 2026-06-11 |
The 9 day gap never closes. It is carried forward for the life of the plan, because floating re-anchors on every completion.
Count the occurrences in the 365 days from 2026-03-04.
Nobody decided to cut three services. The plan did it quietly, one late job at a time.
Meter plans float by default, and PM‑2118 shows why that matters. It is due at 13,500 h but the technician gets to it at 13,562 h.
Write the real reading into last_done_meter, never the due value, because setting it to 13,500 hides the drift instead of removing it.
| Work | Mode |
|---|---|
| Lubrication, cleaning, filter change | Floating |
| Hour or cycle based service | Floating on the meter |
| Statutory inspection | Fixed, grace 0 |
| Customer audited check | Fixed |
| Shutdown work | Fixed to the shutdown window |
| Seasonal (heating, cooling) | Fixed calendar date |
The rule of thumb: if being late is a scheduling inconvenience, float it. If being late is a breach, fix it.
Some plans exist because a regulator, an insurer or a customer says so. Pressure vessels, lifting gear, safety interlock checks, calibration of test equipment and hygiene verification all sit here.
These must be fixed grid, anchored to the certificate or the approval date, and never floated from the last completion.
The reason is arithmetic. A 12 month statutory interval floated from a completion two weeks late becomes a 12 month and 14 day interval, and the certificate has already expired by the time the job is raised.
Three extra fields carry the obligation on the plan.
| Field | What it holds |
|---|---|
| compliance_ | The rule or customer standard |
| certificate_ | Hard date, independent of the plan |
| required_ | Who is allowed to sign |
Keep the completion record, the readings, the person, their qualification at the time and any certificate file, with a retention longer than the asset's life.
That rules out three habits: deleting old work orders to tidy the list, overwriting a completion, and editing a task list without a version.
The task list is the instruction template. One task list serves every asset of the same class, which is why the steps name components rather than tags.
| Header field | Example |
|---|---|
| task_ | TL-FILL-500H |
| version | 4 |
| applies_ | asset_class FILLER |
| estimated_ | 90 |
| required_ | Mechanical level 2 |
| safety | Isolation required |
| parts_ | KIT-FIL-500H |
Then the steps. This is where a checklist becomes data instead of paper.
| Step field | What it holds | Example |
|---|---|---|
| step_ | Order on the card | 7 |
| instruction | One action | Measure bearing temperature |
| component_ | What it is done to | Main drive |
| response_ | Value, pass/fail, choice, photo | Value |
| uom | Unit of the reading | °C |
| expected | Nominal | 55 |
| limit_ | Tolerance | 40 / 70 |
| on_ | What the answer sets off | Raise a follow-up job |
| part_ | Normally consumed | SEAL-24V-EPDM, 6 |
| estimated_ | Planned time | 5 |
| is_ | Blocks completion if empty | Yes |
The parts on the steps add up to the kit, so a storeman can pick a job before the technician arrives.
It also feeds the reorder point: a plan due 12 times a year with 6 seals per visit is 72 predictable seals of demand.
A checklist that asks "bearing temperature OK?" and accepts a sentence produces a pile of words. One that asks for a number in °C produces a series.
| Free text answer | Typed reading |
|---|---|
| "looks fine" | 62.4 °C |
| Cannot be charted | 12 months of trend |
| No limit check | Flagged out of limit on entry |
| Cannot trigger anything | Can fire a condition plan |
| Read by one person once | Compares six identical machines |
Keep a free text note field beside the typed answer, because technicians see things no field anticipated. Just never let the note be the only place the value lives.
The same argument applies to stop reasons on the production side (downtime reason code design).
The generator turns plans into work orders. Six rules keep it from flooding the list or going quiet.
| Rule | Setting |
|---|---|
| Horizon | Raise at due minus lead_time, not months ahead |
| Open jobs per plan | One at a time |
| Duplicate key | Unique on plan_id plus due key |
| Next due while one is open | Suppress, flag overdue, log the miss |
| Skipped work | Status Skipped plus reason, row kept |
| Plan not active | Stop raising, keep the history |
The duplicate key is the one to insist on. A unique constraint on plan_
Without it, a retry after a timeout quietly doubles a month of preventive work, and nobody can tell the copies apart.
Roll forward is the dangerous one, because it makes compliance look perfect by construction. If your due dates never go red, check whether the system is rolling them forward.
Raise a year of work and the list becomes wallpaper. Raise nothing until the due date and nobody can order a part or book a shutdown.
Lead time plus the part lead time is a sane default, so a plan needing a seal with a 12 day supplier lead needs at least 12 days of notice (see unplanned downtime).
One plant, 120 maintenance assets, March 2026. Every number below reconciles with the ones above it.
PM coverage is the share of assets carrying at least one active plan. Count assets, not plans, or six plans on one filler will hide a machine with none.
| Class | Assets | Covered |
|---|---|---|
| A | 24 | 23 (95.8%) |
| B | 40 | 34 (85.0%) |
| C | 56 | 29 (51.8%) |
| Total | 120 | 86 (71.7%) |
Total coverage is 23 + 34 + 29 = 86, and 86 ÷ 120 = 71.7%.
The headline figure is the least useful line in the table. The one that matters is the single class A asset with no plan at all, which a 71.7% number buries completely.
Those 86 assets carry 214 active plans, an average of 2.5 per covered asset.
Schedule compliance is completed on time divided by due in the period. On time means completed on or before next_
148 PM work orders had a due date in March 2026.
| Outcome | Jobs |
|---|---|
| Completed on time | 96 |
| Completed late | 31 |
| Still open at month end | 12 |
| Skipped with a reason | 9 |
| Due in March | 148 |
The rows add up: 96 + 31 + 12 + 9 = 148.
Now suppose the 9 skipped jobs are deleted from the list instead of being kept with a status. Nothing about the plant changed, and only the denominator did.
| What you count | Result |
|---|---|
| 96 ÷ 148 (correct) | 64.9% |
| 96 ÷ 139 (skipped deleted) | 69.1% |
| 96 ÷ 127 (open ones dropped too) | 75.6% |
Deleting the skipped jobs is worth 4.2 points. Dropping the still open ones as well is worth 10.7 points.
The same 96 jobs were done in all three cases. The only thing that improved was the reporting.
This is why skipped is a status and never a delete. A skipped row with a reason is the single most valuable record in a preventive maintenance history, because it is the only evidence that the plan asked and the plant said no.
Print the numerator and the denominator on the report, always. A compliance percentage with no counts beside it cannot be checked, the same discipline our OEE calculation guide applies to availability.
Ask for a demonstration in their system rather than a yes.
Before a shortlist, read what is a CMMS and equipment maintenance software. For the orders that make product rather than fix machines, see the production work order data model.
Fabrico is an OEE platform with a full CMMS built in, and the working core of this model is in it.
Preventive plans use recurring templates with checklists and conditional tasks, and they run on calendar or meter triggers with an annual plan view.
Generated work orders go through approvals, shifts and assignment, with push, in-app and email notifications when something falls due or goes late.
Technicians work from the iOS, Android or web app and scan a QR code on the machine or the part to open the right card. Inventory holds min and max levels, and consumption is booked against the work order.
What it does not do: your team creates and confirms the work, failure forecasting is not a standard feature, and there is no production planning. The deeper reference material here, such as tool mount events and versioned task lists, is a specification to compare against rather than a feature list.
Want your PM plans, checklists and machine data in one place? Book a 30 minute demo with a Fabrico consultant, no commitment, or contact us with your questions.
The plan is the rule that says when work falls due on an asset, and it lives for years. The work order is one dated occurrence copied from that plan, and editing it changes that job only.
plan_id, asset_id, task_list_id, trigger_type, meter_id, interval_value, interval_uom, schedule_mode, lead_time, grace_days, last_done_date, last_done_meter, assigned_to, estimated_duration, priority and is_active. next_due_date and next_due_meter are derived from those and should never be typed.
Floating calculates the next due date from the last completion, so a late job pushes every later one. Fixed keeps the original grid, which is why statutory and customer audited work must be fixed.
Put the cycle meter on the tool, not on the press, and record a mount event with the machine counter at mount and dismount. The tool's life is the sum of those deltas, so a tool that moves between presses keeps one correct count.
Divide the jobs completed on or before their due date plus the grace window by the jobs due in the period. Keep skipped occurrences in the denominator: dropping the nine skipped jobs in the example above moves 96 ÷ 148 to 96 ÷ 139, which is 4.2 points of pure arithmetic.
Zakažite sastanak KSNUMKS-to-KSNUMKS sa našim stručnjacima ili se direktno upišite u naš besplatni plan.
Nije potrebna kreditna kartica!