The term nobody tells a shop owner
Most owners run into finite capacity scheduling the hard way, years before they hear the phrase. You promise six jobs for Friday. Friday arrives with four of them done. Nobody was lazy and no machine broke. The week just never had room for six, and nothing in your planning ever said so.
That gap has a name. Understanding it is the difference between a schedule you argue with and a schedule you can run.
What finite capacity scheduling means
Finite capacity scheduling means building a schedule against the capacity you actually have. Every machine runs one job at a time. Every operator is in one place at a time. The schedule can only place work where there is genuinely room for it, so a mill booked from 9 to 2 cannot take another job from 9 to 2, no matter how urgent the second one is.
That is the whole idea. It sounds obvious written down, which is exactly why it catches people out: almost every tool a small shop actually uses breaks the rule.
Finite vs infinite capacity scheduling
Infinite capacity scheduling asks when a job should run. Finite capacity scheduling asks when it can. Infinite is probably what your shop runs on today, whether you chose it or not.
Infinite capacity planning starts at the due date and works backwards. The job takes ten hours, the customer wants it Thursday, so it starts Wednesday afternoon. Nothing in that arithmetic asks whether the machine is free Wednesday afternoon. Do it for forty jobs and you get a plan where every job looks fine on its own line and the shop is booked at 180% on Wednesday.
Finite capacity scheduling places jobs against each other on one timeline. When there is no room, the schedule says so instead of stacking. Same input, two very different outputs.
The same week, planned both ways
One mill. One week, Monday to Friday, 8 hours a day, so 40 hours of machine time available. Five jobs are due.
| Job | Hours needed | Due |
|---|---|---|
| A | 12 | Wednesday |
| B | 10 | Wednesday |
| C | 14 | Thursday |
| D | 9 | Friday |
| E | 8 | Friday |
That is 53 hours of work in a 40 hour week. The shortage is already there, sitting in the numbers, before anyone schedules anything.
Scheduled at infinite capacity, each job is placed backwards from its own due date:
| Job | Starts | Finishes | Status in the plan |
|---|---|---|---|
| A | Tue midday | Wed end of day | On time |
| B | Tue afternoon | Wed end of day | On time |
| C | Wed morning | Thu end of day | On time |
| D | Thu afternoon | Fri end of day | On time |
| E | Fri morning | Fri end of day | On time |
Five out of five on time. Every line is individually correct: each job really does take that long and really would finish by its due date if it had the machine. Look at Wednesday, though, and jobs A, B, and C are all running on the same mill at once. The plan has quietly invented a second and third machine.
Scheduled at finite capacity, jobs go on one at a time, in due date order, and each one starts when the mill is actually free:
| Job | Starts | Finishes | Due | Status |
|---|---|---|---|---|
| A | Mon 8am | Tue midday | Wed | On time |
| B | Tue midday | Wed 2pm | Wed | Tight, on time |
| C | Wed 2pm | Fri midday | Thu | Late by 4 hours |
| D | Fri midday | Mon 1pm | Fri | Late by 5 hours |
| E | Mon 1pm | Tue 1pm | Fri | Late by 13 hours |
Two make it. Three do not.
Nothing changed between the two schedules. Both weeks contain 53 hours of work and 40 hours of machine time. Both weeks end with three jobs late. The infinite capacity plan did not cause the shortage and the finite capacity plan did not fix it. All that changed is when you found out, and therefore what you could do about it.
On Monday morning, 13 hours short is a set of decisions: run Saturday, move one date with a customer who will probably say yes, subcontract job E, or call the customer on job C now while there is still goodwill in it. On Thursday afternoon, the same 13 hours is a fire, three apologies, and a weekend nobody planned.
How to tell which one you are running
| What you use | Which it does | Why |
|---|---|---|
| Spreadsheet | Infinite | A cell holds anything you type. Two jobs on one machine on one day is not an error, it is just text. |
| Google Calendar | Infinite | It will stack four events at 10am without comment. |
| Whiteboard | Roughly finite | A row runs out of physical space, which is a crude capacity limit. It will not tell you what the squeeze pushed late. |
| MRP or standard ERP | Infinite | Built to answer what to buy and when to release, not how to sequence Tuesday. |
| ERP with an APS module | Finite | Usually a paid add-on that needs shift calendars and setup matrices kept accurate. |
| A board that blocks double-booking | Finite | Capacity is enforced by refusal rather than optimized by a solver. |
The quick test: try to book two jobs on the same machine at the same time. If the tool lets you and says nothing, it is scheduling at infinite capacity.
The infinite tools were never built to check capacity. MRP, for instance, explodes the bill of materials, subtracts the lead time, and hands over a start date. Capacity checking is either absent or sold separately as a finite scheduling module, which is one of the reasons full ERP is a poor fit for a small shop.
Finite is not the same thing as forward
These two pairs get used interchangeably, but they are different axes. Finite versus infinite is about whether the plan respects the capacity that exists. Forward versus backward is about which end of the calendar you start from: forward scheduling starts from now and works out the earliest a job can finish; backward scheduling starts from the due date and works out the latest it can safely start.
In practice, infinite systems tend to be backward and finite systems tend to be forward, which is why the terms get welded together. But you can schedule backwards and still respect capacity, and plenty of finite systems do exactly that in order to avoid starting everything as early as possible. If someone tells you their system does forward scheduling, that has not answered the capacity question.
When infinite capacity is genuinely fine
Infinite capacity planning is not simply wrong. It is the correct tool for the job it was built for.
Long-range material planning. When you are working out what steel to order eight weeks out, you do not care which machine runs on which Tuesday, and pretending to know would make the answer worse rather than better. This is what MRP does well and why it exists.
A shop with real slack. If your machines are at 45% utilization, the machine is usually free, and the assumption infinite scheduling makes is usually true. The cost of being wrong is low. Fix the utilization problem first, because a machine at 45% has a scheduling problem, not a capacity problem.
Rough feasibility on a quote. A quick backward pass tells you whether a date is even in the right ballpark before you spend time on a real schedule.
Infinite capacity becomes a problem in one specific situation: using it to plan a floor that is close to full. Which is most job shops, most weeks.
Why high-mix shops feel it worst
If you run high-mix, low-volume work, infinite capacity planning hurts more than it does anywhere else, for two reasons.
Setup is a large share of every job. In a long production run, changeover time disappears against the cutting hours. In a job shop, setup is often the main event, and infinite capacity planning tends to ignore it entirely or apply one flat number to every changeover. The capacity you thought you were scheduling was never there.
The mix moves under you. A rush order lands, an inspection kicks a job back, a customer pulls a date in. Each one re-sequences the floor. A backwards-scheduled plan cannot absorb that, because it was built on an assumption about a week that no longer exists by Tuesday.
Add both together and the plan promises capacity the shop does not own, then loses track of what it did own. That is the Wednesday scramble, and it is structural rather than personal.
What you get when capacity is finite
Three things change.
You find out early. The five-job week above is the whole argument: the shortage never changes, only how much room you have to respond to it. That room is worth more than any feature on a comparison table.
Your lead times get honest. When the schedule refuses to book a machine that is already busy, the date it gives you is a date the shop can actually hit. That is what lets you quote lead times you can defend instead of padding everything by two weeks and losing the order to a shop that quoted straight.
Double-booking stops being possible. Not less likely, not caught at standup. Not possible. That single constraint removes an entire category of lost hours, which is why it is the highest-value thing most shops fix first. The habits that get you there are further down this page.
Working out what your capacity actually is
Scheduling against a finite number means knowing the number. Most shops have never worked it out, and the ones that have usually reached for the theoretical figure, which is the one that flatters the schedule and then leaves you short every Thursday.
Start with the basics. No spreadsheet required for this first pass.
Step 1: Count your available machine-hours
For each machine, multiply:
- Hours per shift × shifts per day × days per week
Example: You run one 8-hour shift, 5 days a week, and you have 6 machines.
6 machines × 8 hours × 5 days = 240 machine-hours per week
That is your theoretical maximum. The actual number is lower.
Step 2: Subtract non-production time
Not every hour is production time. You need to subtract:
- Setup/changeover time. Most shops lose 15-25% of available time to setups. If your setups average 20% of machine time, subtract 48 hours from the 240.
- Planned maintenance. If each machine gets 1 hour of maintenance per week, subtract 6 hours.
- Breaks and shift transitions. Maybe 30 minutes per machine per day for operator breaks and shift handoffs. That is 15 hours per week.
240 - 48 (setups) - 6 (maintenance) - 15 (breaks) = 171 practical machine-hours per week
That is your real capacity. About 71% of the theoretical max. This is normal for a well-run small shop.
Step 3: Know your bottleneck
Not all machines are equal. Your capacity is really determined by your most constrained machine.
If your VMC runs at 90% utilization but your lathe runs at 40%, your VMC is the bottleneck. Adding more lathe time doesn’t help. Every new job that needs the VMC competes with everything already on it.
Identify your bottleneck. That machine’s capacity is your shop’s true capacity for any job that needs it.
When to say no
Saying no to work is hard. Every job is revenue. But taking on a job you can’t deliver on time is worse than declining it.
Here are clear signals to say no (or push the deadline):
- Your bottleneck machine is already at 80%+ utilization for the period the job needs it
- The job requires a setup that would bump an existing job with a tighter deadline
- You would need overtime to fit it in, and the margin doesn’t justify the overtime cost
- You don’t have the material in stock and lead time puts the job at risk
Saying no today, with a clear explanation, keeps the relationship intact. Missing the deadline later does not.
Knowing the number is one half. Making the schedule respect it is the other, and there are two ways to buy that.
Two ways to do it, and the price gap between them
Finite capacity scheduling is a principle, not a product. There are two ways to put it into practice, and the industry tends to talk about only the expensive one.
The solver. Advanced Planning and Scheduling software models your capacity in detail (shift calendars, setup matrices, operator skills, tooling), then sequences the work for you and re-sequences when something changes. In a large plant with stable routings, that is genuinely powerful and earns its cost. In a shop with 3 to 30 machines, the license is the small part of the bill. The real cost is the modeling: an APS is only as good as the data you feed it, and keeping setup matrices accurate for a shop that runs forty different parts a week is a job nobody in a 12-person shop has time to do.
The board. Every machine and every job on one shared schedule, laid out against real time, where the system will not let two jobs occupy the same machine or the same person at once. No solver decides the sequence. You do, which in a small shop you were going to do anyway, because you know which customer waits and which one does not. The capacity is still finite. It is enforced by the tool instead of optimized by it.
This is the option most small shops are never shown, because it does not have a sales team. It is what a scheduling board is for, and for a small or mid-size shop it captures most of the benefit at a fraction of the cost and effort. Machestra is one of these: assign an operation to a machine or a person who is already busy and it refuses the booking and tells you which job is in the way.
Keeping two jobs off the same machine
Finite capacity is the principle. A double-booking is what its absence looks like on a Tuesday morning, with two operators and one machine. Five habits close the gap, and only one of them is software.
Keep one schedule
Not a whiteboard and a spreadsheet. Not a spreadsheet and your head. One system that everyone looks at and everyone updates.
Per-job paperwork is not a second schedule, so it does not count against this. A job traveler traveling with the parts tells one operator what to do with the job in their hands. It has no idea what the other twelve jobs are doing, which is exactly why it cannot catch a double-booking and the schedule has to live somewhere else.
When there’s one place to check, people check it. When there are three places, people check none of them.
Add conflict detection
This is the fix. When you assign a job to a machine, the system should check whether that machine is already booked at that time. If it is, the system should warn you before you save.
Spreadsheets can’t do this reliably. Whiteboards can’t do this at all. This is where scheduling software earns its cost. A $19/mo* tool pays for itself the first time it catches a double-booking.
Conflict detection doesn’t just prevent mistakes. It changes how you schedule. Instead of guessing whether a machine is free and hoping you’re right, you know. You schedule with confidence because the system checks for you.
Make the schedule visible to everyone
Your operators shouldn’t have to walk to the office to see the schedule. The schedule should be available on a phone, a tablet, or any browser. When the operator can check the schedule from the machine, they catch conflicts too.
More eyes on the schedule means more chances to catch a problem before it reaches the floor. If Operator A sees that Operator B is scheduled on the same machine at the same time, they’ll say something. But only if they can see it.
Handle rush jobs through the system
This is the hardest habit to build. When a rush job comes in, the instinct is to just commit and figure it out later. Force yourself to check the schedule first.
Open the schedule. Look at the machine. Is it free at the time you need? If yes, assign the job. If no, see what’s on it and decide whether to bump or reschedule.
This takes 30 seconds. It prevents an hour-long mess on the floor. The math works out.
Limit who can schedule
Not everyone needs to assign jobs to machines. The more people who can change the schedule, the more chances for conflicts. Pick one or two people to manage the schedule. Everyone else views it.
This doesn’t mean your team can’t give input. They can flag problems, suggest changes, and update job statuses. But the act of assigning a job to a machine at a specific time should go through a small number of people who coordinate with each other.
The part software cannot do for you
Finite capacity scheduling only works if the capacity numbers are true, and this is where most implementations quietly fail.
If you schedule from cycle time, the cutting number, you are still doing infinite capacity planning with extra steps. The load, the deburr, the walk to the tool crib, the inspection queue, and the setup are all real hours that a cycle time does not contain. Schedule from that number and your finite schedule confidently books capacity that does not exist, which is why jobs run late even when the machines are fine.
Time a few of your common part families door to door. You do not need a time and motion study, you need honest numbers on the ten jobs you run most. That is also the input the capacity arithmetic above depends on, so the work pays for itself twice.
When you actually need an APS
To be fair to the category, there is a point where a solver is the right answer. Look at buying one when you are running hundreds of jobs at once across dozens of work centers, when your routings are stable enough that a setup matrix stays accurate for more than a month, when sequencing decisions are too complex for a person to hold in their head, and when you have someone whose job includes maintaining the model.
If you are a 9-machine shop running aerospace and medical parts in small batches, you are almost certainly not there. What you need is one schedule that tells the truth about time and refuses to book a machine twice. The same question comes up now with the AI label on it, and the answer sorts out the same way: does a small shop actually need AI scheduling software.
Where to start
You can start on Monday without buying anything. Get honest process times for your ten most common jobs. Put every machine and every open job in one place. Then let nothing be booked twice, whether that rule is enforced by software or by one person owning the board.
If you want to see what the software version looks like, our guide to machine scheduling software for small shops walks through what to look for and what to skip, and the complete guide to job shop scheduling covers the mechanics underneath all of it.
Machestra is built on the board approach: your machines and your people on one board, real blocks of time, a hard stop when a job would put a machine in two places at once, and a flag on both jobs when an operator is booked twice. Finite capacity, without the APS price tag.
*All Machestra prices shown in USD. Actual price may vary based on your location.