OEE How to Calculate (CNC Shop Step-by-Step)
- Matt Ulepic
- Apr 17
- 9 min read

OEE How to Calculate (CNC Shop Step-by-Step)
Most OEE problems in CNC shops aren’t math problems—they’re denominator problems. If your planned time is inconsistent (or your downtime is “remembered later”), the OEE number can look clean while the cell still runs out of capacity, especially across shifts where logging discipline varies.
This guide shows oee how to calculate using inputs that match what actually happens on the floor—changeovers, waiting on material/program/inspection, minor stops, slow cycles, and scrap/rework—then converts the result into minutes and effective capacity you can act on.
TL;DR — OEE how to calculate
Pick a single time base: Planned Production Time (not calendar hours) for day-to-day control.
Keep changeover and first-article approval inside planned time if the team can influence them.
Availability comes from run time vs planned time; run time is planned time minus downtime minutes.
Performance captures “it was running but slow” (reduced feeds, extra in-cycle stops), not just stoppages.
Quality is first-pass good count over total count; define rework once to avoid double-counting.
Translate OEE into minutes lost per shift before you translate it into dollars.
If two shifts show different OEE, confirm they’re logging the same short stops, waiting, and rework definitions.
Key takeaway OEE only becomes decision-useful when it’s built from trusted run-time and downtime signals with consistent definitions across shifts. Once the inputs reflect real machine behavior (including changeovers, waiting, and slow cycles), you can convert “low OEE” into specific minutes of capacity leakage and focus on the top loss buckets before you consider adding machines.
Start with the right time base (or your OEE will be meaningless)
The most common OEE error is mixing time bases. Decide what “time you’re measuring against,” then hold it steady across machines and shifts.
Calendar Time is the full clock time (24 hours/day). It’s useful for questions like “How hard are we running the plant?” but it will bury operational losses under nights, weekends, and unscheduled non-production time.
Unscheduled time (no crew, no order, planned shutdown windows) belongs outside an OEE denominator if your goal is day-to-day execution control.
For most CNC job shops, use Scheduled Time (the shift time you planned to staff) and then derive Planned Production Time by removing planned non-production blocks such as lunch, all-hands meetings, and planned maintenance windows that are truly off-limits for production.
Here’s the CNC reality check: changeover and first-article approval are usually inside planned production time. They consume the same staffed minutes you’re trying to recover. If you exclude them from the denominator, Availability will look better while capacity still disappears—especially in high-mix departments.
A quick decision rule that holds up on the floor: if the team can influence it day-to-day, keep it in the planned time basis. That includes setup discipline, material staging, program readiness, inspection responsiveness, and how quickly the cell transitions between jobs.
If you’re still building confidence in downtime capture, it helps to separate the “math reference” (this page) from the “how we capture time events consistently” problem. For the broader approach to accurate event capture, see machine downtime tracking.
OEE formula (and what each input actually comes from on the shop floor)
The formula is straightforward. The hard part is making each input map to something observable in a CNC environment.
OEE = Availability × Performance × Quality
Availability = Run Time / Planned Production Time
Where Run Time = Planned Production Time − Downtime.
On the floor, “downtime” should mean staffed time when the machine is not producing parts: waiting on material, waiting on an operator, setup/changeover, inspection hold, breakdown, program edits, and similar loss categories.
Performance = (Ideal Cycle Time × Total Count) / Run Time
This captures speed loss: the machine is “running,” but actual rate is slower than the defensible ideal for that job/part family.
Quality = Good Count / Total Count
This is first-pass yield if you define “Good” consistently (more on that below).
Common CNC input pitfalls to resolve up front:
Part counts on multi-spindle/sub-spindle work: confirm whether “Total Count” is parts completed, ops completed, or cycles.
Warm-up and prove-out cycles: decide if they’re planned non-production (excluded) or planned production losses you want to improve (included).
Probing cycles and in-process gaging: they can be legitimate in-cycle time; don’t “hide” them as downtime unless you’re explicitly tracking them as stops.
Rework counting: if you count rework parts as good later, define whether they were not-good on first pass to keep Quality meaningful.
Step-by-step: calculate Availability from downtime minutes (with a CNC shift example)
Availability is where weak downtime tracking creates the biggest distortions. You don’t need a massive code tree to calculate it; you need a minimum set that stays consistent.
Minimum viable downtime categories for usable Availability math in a CNC shop: changeover/setup, waiting on material, waiting on program/tooling, waiting on inspection/QA, operator unavailable, breakdown/maintenance, and “other” (but limit “other” and require a note).
Worked example (single shift)
Assume a 10-hour shift (600 minutes). Planned non-production time includes two breaks + lunch totaling 50–70 minutes (use your real number). If we use 60 minutes for this example:
Planned Production Time = 600 − 60 = 540 minutes
Now sum downtime minutes inside that planned production window (illustrative numbers):
Changeover/setup: 55 minutes
Waiting on material: 30 minutes
Waiting on inspection/first-article approval: 25 minutes
Operator unavailable: 20 minutes
Breakdown: 15 minutes
Total Downtime = 145 minutes Run Time = 540 − 145 = 395 minutes Availability = 395 / 540 = 0.731 (73.1% in this hypothetical example)
Availability loss translated into time is immediate: you planned for 540 production minutes and only got 395 minutes of run time. That’s 145 minutes of lost run time—and you already have the top buckets to attack (setup, material waiting, and approval delays).
Required scenario: two-shift CNC lathe cell with inconsistent logging
In a two-shift CNC lathe cell, it’s common to see second shift “report” higher OEE because short stops and waiting don’t get logged. Example: both shifts have the same Planned Production Time of 540 minutes. First shift logs 145 minutes downtime (Availability 73.1% as above). Second shift logs only 80 minutes downtime because waiting on material and minor stops under ~5 minutes are ignored.
Second shift math with under-logging:
Run Time = 540 − 80 = 460 so Availability = 460/540 = 0.852 (85.2%).
The “better” Availability is really a definition problem, not a performance difference. Correcting the inputs (adding back the missing short stops and waiting minutes) often narrows or eliminates the apparent shift gap—and it removes the incentive to hide stoppages.
If your ERP relies on after-the-fact notes, this is where the ERP vs. actual machine behavior gap shows up. Tightening downtime capture (whether manual with discipline or automated event capture) is what makes the Availability number operationally trustworthy. If you want a focused overview of approaches, see machine monitoring systems.
Step-by-step: calculate Performance (the hidden ‘it was running but slow’ loss)
Performance is the “speed” component: when the machine is in a running state, how close are you to a defensible ideal rate? In CNC, Performance is often where capacity leaks quietly—feeds get reduced, cycle time creeps up, or extra in-cycle pauses appear—and it never shows as downtime.
Start by choosing an Ideal Cycle Time source you can defend: a proven best-run program for that part, a documented standard, or a historical median from stable runs. The goal is not to create a “perfect world” target; it’s to pick a reference that makes the metric useful instead of accusatory.
In high-mix shops, avoid forcing one ideal cycle time onto everything. A practical approach is: compute Performance per job (or part family) and then roll up by run time so long-running jobs weigh more than short trials.
Required scenario: it “runs” at reduced feed/speed
Example: a mill is producing parts, but the programmer (or operator) runs reduced feeds/speeds due to tool wear concerns or a conservative proven-out program. Nothing is “down,” but cycle time stretches.
Suppose over a run window you recorded Run Time = 240 minutes, total produced Total Count = 60 parts, and a defensible Ideal Cycle Time = 3.5 minutes/part.
Performance = (3.5 × 60) / 240 = 210 / 240 = 0.875 (87.5% in this hypothetical example)
That 12.5% Performance loss is where you investigate: tool strategy, program optimization, chip control, in-cycle pauses, or whether the “ideal” needs to be updated because the process changed.
Guardrail: if your ideal is unrealistic, Performance becomes a blame metric and people stop trusting the number. Keep the ideal grounded in actual best runs, not hopes.
Mid-process diagnostic: if you have decent time signals but spend too long interpreting what changed (speed vs stops vs mix), an assistant that summarizes patterns by machine/job can shorten the “so what” cycle. That’s the role of an AI Production Assistant when it’s grounded in actual run/downtime events—interpretation, not buzzwords.
Step-by-step: calculate Quality (and avoid double-counting scrap vs rework)
Quality is the simplest fraction, but it becomes messy in CNC shops when rework and inspection holds are logged differently by shift or by cell.
Start with a consistent rule: Quality = Good Count / Total Count, where “Good” is first-pass good. A practical recommendation is to count rework as not-good on first pass, even if the part is later recovered—otherwise you end up with “paper yield” that doesn’t reflect the capacity consumed by rework loops.
Example: you ran 80 parts. 74 passed on first inspection, 4 required rework but were later accepted, and 2 were scrapped.
With first-pass logic: Good Count = 74, Total Count = 80, so Quality = 74/80 = 0.925 (92.5% in this hypothetical example). You can still track “recovered after rework” as a separate note/tag for root cause without changing the math.
Where first-article failures and inspection holds fit:
inspection holds often present as Availability loss (waiting on QA approval) because the machine is staffed but not producing.
first-article failures hit Quality (not-good parts) and may also create Availability loss if the machine is paused for investigation. You don’t need perfect categorization to start; you need consistent rules so the number doesn’t change with whoever is logging.
Quick check to avoid “paper yield”: periodically reconcile total good to shipped-good (or accepted into inventory) for the same window. If the counts don’t tie out, the issue is usually definition drift (rework counted twice, scrap not recorded, or totals based on cycles rather than parts).
Convert OEE into downtime impact: capacity leakage you can act on
Once you have Availability, Performance, and Quality, multiply them to get OEE. But don’t stop at the percentage. The operational value comes from converting OEE into time and throughput impact so you can isolate the biggest loss categories quickly.
Use this translation:
Effective Capacity (minutes) = Planned Production Time × OEE
Example (continuing hypothetically): Availability 0.731, Performance 0.875, Quality 0.925 gives OEE = 0.731 × 0.875 × 0.925 ≈ 0.592 (59.2%).
If Planned Production Time is 540 minutes, then Effective Capacity ≈ 540 × 0.592 = 320 minutes of “fully effective” production time.
To estimate parts impact, state your assumption explicitly. Two common options:
(1) use actual minutes-per-part from the run window, or (2) use ideal minutes-per-part if you’re estimating theoretical opportunity. Either is fine as long as you label it.
For example, if you lost 40 minutes of run time and your actual observed rate was roughly 4–6 minutes/part, that’s on the order of 6–10 parts of potential output (hypothetical).
Prioritize by dollars only after minutes are trusted. Start with the top 2–3 loss buckets by time (setup/changeover, material waiting, QA holds, chronic minor stops, slow cycles). This prevents “financial prioritization” from being built on guessed downtime.
If your team is currently using spreadsheets and end-of-shift notes, be explicit about the limit: manual methods tend to under-capture short stops and waiting, which is exactly where multi-shift comparisons go wrong.
Required scenario: high-mix milling with changeovers and first-article approvals
In a high-mix milling department, frequent changeovers and first-article approvals are real capacity consumers. If you exclude changeover from Planned Production Time (by treating it as “not scheduled”), Availability inflates and the department looks healthier than it is.
Operationally, you want the opposite: keep changeover and approval time in the planned basis so the metric exposes capacity leakage and supports improvement work (staging, presetting, fixture standardization, QA response cadence).
Scenario: recover 20 minutes/shift—where you recover it matters
If you recover 20 minutes/shift from waiting on material, you directly increase Run Time (Availability) and usually get more starts/completions that day. If you recover 20 minutes/shift from slow cycles (Performance), you may get the same run time but more parts inside it. Both are valuable, but they require different countermeasures—material staging and kitting versus program/tool/process tuning.
When you’re ready to scale this beyond a couple machines, the practical questions tend to be about implementation effort and operating friction (mixed controls, legacy equipment, multiple shifts), not the formula. For context on utilization and capacity-focused tracking, see machine utilization tracking software.
For implementation cost framing without guessing, review pricing. If you want to sanity-check your OEE inputs against real machine behavior—especially across shifts—bring one cell’s planned time rules, a week of downtime categories, and your part count definitions. We’ll walk through the calculation and the “minutes lost” translation with you, then identify the top loss buckets worth fixing first. schedule a demo.

.png)








