The rebuilt Gantt workspace: machines grouped by capability down the left — 5-axis mills, lathes, surface grinders — each row carrying its scheduled work orders across a shared two-week time axis, with load and next-available time summarised per group and machines that are down flagged in the hierarchy

Production Schedule

Rebuilding the heart of a manufacturing ERP.

  • Enterprise SaaS
  • Manufacturing ERP
  • Systems design
  • 0–1 rebuild
Duration
Sept 2025 – present · Beta Sept 2026
Role
Lead Product Designer — UX strategy, research, systems architecture, interaction design, interactive prototypes
Team
Product (PM) · Engineering · Customer Success · internal domain SMEs
Status
Build phase, heading into beta
Overview

Production scheduling decides what every machine and every person in a shop does next. In our product it had become a tool one person per shop knew how to drive, and when that person was away, the schedule waited for them.

I was handed a UI face-lift. After time with schedulers I was sure the problems they described lived in the data model, not the screens, so I took two costed paths to the VP — polish now, or foundation first. She chose foundation.

This is the rebuild that followed: planning, the shop floor and the numbers leadership reports on, designed as one scheduling system rather than screens that each knew half the story. It ships to every account in September 2026.

At stake
Evidence base 12+ Customer interviews, power users through to abandoners
Scoped 8 Phase-1 workstreams, from one scoping framework
Reach All Core scheduling ships to every account, ungated
Target Active scheduling users per account, 90 days post-GA

Why scheduling is the hardest problem in a machine shop

The core business question: given finite machines, people and hours, in what order should every operation run so that every part leaves on time?

A part takes two to three months to make, and machining is less than half of that. The rest is material, inspection, outside processing at a vendor the shop can’t see into, assembly and shipping — each with a hard must-leave-by date. One late arrival cascades through everything behind it.

Job lifecycle
Two-part diagram. Top: one operation spanning four stages over two to three months — material waiting on stock, machining at under half the elapsed time, an outside-processing vendor leg marked off the radar, and shipping against a must-leave-by date. Bottom: the same operation placed on a schedule of finite machines, people and hours, with three machine rows part-filled, unplaced slots marked by question marks, and a red must-leave-by line the work has to land before
The lifecycle with its hard dates. The outside-processing leg is the one the scheduler can’t see, and it’s where the schedule quietly goes wrong.

What failure actually looks like

It doesn’t look like an error. A promise slips by a few days, nobody is told, and a week later a customer calls.

Silent slip
Two panels contrasting the promise with the reality. On the schedule: a shipment moves through its date to a confirmed “It ships Friday.” Off the radar: a phone call saying “Sorry — I don’t actually know when your parts will ship,” and a frustrated customer. Below, a timeline of the quiet slide — day zero, a vendor slips, a machine goes down or material runs late; days one to seven, the schedule shows nothing; day seven, found on a manual sweep; past the date, an order already late
Nothing in the system marks the slip, so it surfaces on somebody’s manual sweep instead of as an alert.
Accounts 65.6% Of all active accounts touched the legacy Schedule in 30 days (458 accounts)
People 3,919 Users in the same 30-day window
Habit 58% Used it on 5+ separate days — habitual, not occasional

Pendo, 30 days to 20 Aug 2026. Scheduling is daily use for most accounts, not a niche module.

Four questions a schedule has to answer

The legacy schedule was genuinely powerful, but only one person per shop had learned to drive it. That made the most important screen in the product a single point of failure.

When I sorted everything I’d heard, it came down to four things a schedule has to get right: what a job needs, when a machine can actually run, how work gets placed, and whether each person can see it at the level they work at. I call them Resources, Time, Method and Visibility, and I’ve organized the rest of this case study around them — every finding and every screen below belongs to exactly one.

Shadow systems
The legacy schedule at the center, marked ~1.7 active editors per shop and a single point of failure rather than shared infrastructure, with five customer-built shadow systems orbiting it on dashed lines: a production manager’s whiteboard meeting (gap: staffing), an Excel assignment sheet (gap: assignment), a Smartsheet Gantt (gap: visibility), JobBoss running in parallel (gap: trust), and a PMTQ readiness matrix (gap: readiness). Every orbit is a feature gap someone paid to solve themselves

“The schedule is a lie.”

Not one shop’s bad day — the same sentence, from different shops, in NPS comments about the module they depend on most.

  1. P1 Resources · what does this job need?

    The machine is the only constraint

    People, skills, material and outside processing don’t exist on the schedule — so a plan can be “correct” and still unrunnable.

    NPS detractor analysisWhere “the schedule is a lie” came from, read at volume so a vivid quote couldn’t pass as a pattern. 12+ interviewsPower users from Pendo’s top-editor list, plus novices and people who had given up. Sampling only the 294 who can edit would have confirmed the tool rather than tested it.
    The legacy schedule for a work center: rows of work orders across a two-week time axis, with a block detail popover open showing work center, operation number, previous and next operation sequence, must-leave-by dates and status. Annotated: no operator, material or OSP anywhere on the screen
  2. P2 Time · when can it actually run?

    Capacity by subtraction

    Availability is carved out of each machine by hand — no shifts, no holidays, no bulk apply, and a silent two-year expiry. Every date on the board rests on a calendar nobody trusts.

    Tickets against usage dataInterviews say what hurts; Pendo says how many people it happens to. Neither one is sufficient to prioritize against. 12+ interviewsPower users from Pendo’s top-editor list, plus novices and people who had given up. Sampling only the 294 who can edit would have confirmed the tool rather than tested it.
    The Machine Schedule month view with a booking dialog open on “Booking type: Make unavailable”, and every day of the month filled with stacked “Unavailable” entries for each machine. Annotated: negative-time blocks
  3. P3 Method · how does work land?

    Placement by hand

    One job per machine, sequence unenforced, a hard date the only lever — so schedulers faked concurrency with ghost jobs, work orders that don’t exist.

    12+ interviewsPower users from Pendo’s top-editor list, plus novices and people who had given up. Sampling only the 294 who can edit would have confirmed the tool rather than tested it.
    A work center’s schedule rows, where two rows named “Precision Machine: Ghost Job 1” and “Ghost Job 2” sit among the real work orders and are bracketed together. Annotated: fake work orders — the only way to say “these run together”
  4. P4 Visibility · where is this job, and what’s happening?

    One zoom level

    Everything at the granularity of one operation, nothing above it and no path down — so every role expands cards just to read a status.

    Contextual inquiryOnsite, watching the shadow systems get used: the whiteboard meeting, the monitor in the corner. Nobody reports a workaround in an interview, because to them it isn’t one.
    Two schedule panels stacked with a scroll indicator between them: the same work order 22-0178 appears as operation 50 in one work center and operation 60 in another. Annotated: op 50 lives here, op 60 six scrolls away

The same gap, in numbers

The usage data tells the story the quotes tell.

Editors 7.5% Of Schedule users have ever opened Edit Mode
Per shop ~1.7 Editors per account — 294 people across 174 accounts
Ratio ~13:1 Viewers to editors. Thousands rely on a schedule almost nobody can maintain

Support tickets from the same weeks say it a third way — work orders silently missing from the schedule, maintenance utilities reporting “success” with no diagnostics. Heavy dependence, fragile trust. These are the baselines every post-beta result gets measured against.

How might we turn the schedule from one expert's tool into shared shop infrastructure — so anyone can see, trust and act on it?

What I needed to find out first

Two numbers didn’t add up: 65.6% of accounts opened the schedule, and 7.5% of those users ever edited it. Nobody could tell me why — it could have been permissions, training, trust or the interface.

I only had budget to answer questions that would change what we built, so I kept the ones with a fork in them: two plausible answers that lead to two different products. Three passed that test.

Four sources, each covering the last one’s blind spot

Interviewing only power users would have given me a faster version of the same tool. The people who’d given up on the schedule are the ones who explain the 1.7 editors, so I paired each source with one that would catch what it missed.

Four sources

Evidence matrix

FindingNPSJiraInterviewsOnsite
The schedule can’t be trusted to match realityThe symptom. Every finding below is one of its causes.3621
F1Shops think in departments and machine familiesP141
F2People, material and OSP decide the schedule — and can’t be seen on itP1172
F3Availability is the friction point, and it driftsP2131
F4Open capacity can’t be seen or soldP2231
F5Op sequence is enforced by handP322
F6Concurrent running is modeled wrongP3231
F7You see one machine at a time, never the shopP42242
F8No overview and no drill-downP41231

Dot size is how many pieces of evidence back a finding in that source. NPS is silent on six of eight: it says scheduling is broken, not what’s broken.

NPS verbatims

Office staffWAL13 · detractor×2 responses

“The UI needs a lot of updating, the scheduling needs a lot of updating…”

Office staffEXO16 · detractor

“The scheduling portion is unusable for our company. Upgrades seem to more appearance an less for function.”

Quality mgmtHIL26 · detractor

“Great information. Just needs a good GUI for visualization of work cell scheduling and shop work flow.”

ExecutiveQUA57 · passive

“Would like to see a bit more AI tools within the software (i.e. scheduling), scheduling would be better to be more visual and click & drag.”

Office staffWES18 · passive

“Down from a 10 due to the scheduling being quirky.”

Pendo — five accounts, six responses, sorted by score.

Jira feedback and tickets

Product feedback

PF-2038

Scheduling enhancements — sequence dependency, WO Gantt, priority-aware auto-schedule, drag-to-reassign

Ouroboros Space (OUR1) · May 2026 · proposed

Hard sequence locking, slippage propagatesWO-level Gantt on a shared timelinePriority tiers the optimizer respectsDrag-to-reassign writes back to resourceScaling 11 → 30 machinesManager resigned over scheduling load
PF-1326

Assign users to a scheduled resource

All clients · 19 shops tagged incl. Moseys, Trulife · in discovery

Assign people to work cells and WOsTold to manage assignment outside ProShopSpreadsheet workaroundWhiteboard with user magnets
PF-1602

Add sequential op # order dependency

Sales-driven · all customers with multi-op WOs

Ops scheduled out of sequenceManual chronological checking todayScheduling inaccuracy
PF-1600

Schedule work orders to run concurrently

Cells, pallet machines, additive segment

Two WOs on one resource at onceSequential workaround skews start and end timesPallet machines
PF-1400

Create condensed schedule overview

Buyken · large shops

Shop-wide resource capacity viewHard to navigate many work cellsSpot where capacity is and isn’t2wk to 2yr ranges
PF-1313

Schedule summary (availability) show running

Estimating, quoting, CSR

End date without opening each work centerAssign work to machines not runningQuote turnaround time
PF-1843

Schedule view — all resources expanded, no white space

All users · re-platforming scope · backlog

Expand all resources by defaultOpen and scroll to see anythingWhite space wastes the canvas

Support tickets

Orphaned or corrupted schedule records2 tickets

TS-38331

Redline Chambers (RED1) · resource-less calendar entry cannot be deleted, no master-week link · 28 Aug 2026 · high

TS-38286

Die Craft Machining (DIE1) · invalid return diving into schedulequeue on machine H08 · 24 Aug 2026 · blocked

Work orders or operations missing from schedule3 tickets

TS-38041

Kennewell (KEN4) · WO not appearing on machine schedule after routing correction · 5 Aug 2026 · highest

TS-37291

Hawk Machine (HAW2) · operations not displaying, resource 2100 scheduleIDTable missing value · 16 Jun 2026

TS-37860

Sealth · scheduled work queues returned no results across work cells though WOs were scheduled

Direct schedule manipulation fails1 ticket

TS-37221

Alloy Concepts (ALL2) · drag and drop error on machine schedule · 11 Jun 2026 · high

Seven product-feedback ideas, and six support tickets clustered into three themes.

Interview notes

Moseys

10 Jun 2026

Concurrent run, multi-machine mosaic

Whole-shop view, not one machine at a timePallet count caps concurrent jobsOne job can hold multiple palletsPartial completions across shift boundaries

Flying S

Andrew · 18 Nov 2025

Better insight into what’s preventing an order from starting — part stock, BOM (COTS, parts), outside process

Limiting factors invisible on scheduleAssembly family and BOM GanttSub-assembly disruption flagged upstreamSmartsheet Gantt workaroundMachining is under half the lifecycle

Tesseca CA

Karla · 16 Oct 2025

Group “like” machines; visibility into outside processing when it precedes machining

OSP is 90% of work and off-scheduleNo staging area before machine assignmentCapacity planning is manualOSP countdown at a glanceStill using JobBossWants WO-level Gantt

Rhine Machine

Tyler, operations manager · 3 Oct 2025 · open to alpha testing

Master week available time; vacation time; work cell assignment whiteboard

Master week is the friction pointHoliday config for company and usersEfficiency multiplier vs available hoursSplit jobs around maintenanceWhiteboard user assignment

Mahler Machining

Michael O’Neill, production coordinator · 1 Oct 2025

Target time vs current / actual time

Plan vs actual in one viewPredictive per-operation targetsColor cues tied to must-leave-byExcel for machine assignmentRed jobs don’t convey run time

CNC Swiss

Jay & Bogda, production + quoting · 29 Sep 2025

Grouping machines before assigning WOs; users as a constraint

Second session: better insight on first available machine — “selling the gap”

Holding tank for unassigned jobsSetup and user skill as constraintsNext available slot per machineSell open machine time when quotingScrolling and whitespacePP check readiness

Machine Science

Malcolm, scheduler · 29 Sep 2025

Grouping before assigning machines; concurrent run; capacity by department / group / machine; intelligent placement by date

No macro or department viewOSP countdown not on the chartPartial quantities invisibleAuto-placement from must-leave-byWhiteboard for priority jobsOpen order report

Truline Industries

25 Sep 2025 · early adopter, not yet on the schedule

Grouping before machine assignment; flag hot jobs

Department queueHot job priority flagNo cross-department visibilityPredicting the end dateHomegrown system today

Coastal Machine & Supply

Kody · 24 Sep 2025

Visibility of jobs at inspection or OSP, using the QQ next-op icon

OSP and inspection invisible on chartSplit WO across machinesPallet pool concurrent runsConcurrent group, not stacked blocksTime off affects must-leave-by

Confluence — nine shops, September 2025 to June 2026.

Onsite photographs

A wall monitor showing a Miro board zoomed out to about nine per cent: hundreds of small coloured sticky notes arranged inside framed zones that span the whole shop
Full board at 9%
The same Miro board zoomed in. A vertical column of machine lanes runs down the middle — CNC Mazak 5X, Mazak 510, Mazak 530, CNC Fadal, Mazak Lathe QTU-350 and CNC Router Overflow — crossed by two-week and three-week bands, with zones labeled In-process Shelf, Work Orders Requiring QC and Needs Deburred
Machine lanes

A&S Designs

Abbotsford BC · 9 Sep 2025 · Kyle McHardy, owner

They don’t use ProShop’s Schedule at all — they built their own in Miro. Every board like it is a specification somebody already paid to write.

Post-its carry anything you’d normally text or DM someone about a job, and they stay with the WO block.

Entire shop on one board, ~20 zonesLayout mimics physical work station placementAwaiting material and outside processing are zonesSpans about 8 weeksLinear system didn’t work for themOne block per WO, not per opOperators move blocks resource to resourceEveryone hands-on, not one person with controlBlocks hyperlink back to ProShop — dealbreakerDates drift: changed in ProShop, not on the blockColor by priority from the customer PO10+ Work Order Navigator tabs open
Six screens mounted on a shop wall: a color-coded machine status grid, the CNC Swiss logo, two bar charts, and two Excel schedule sheets with day-of-week columns
Screen wall

CNC Swiss Inc.

Bloomingdale IL · Jun 2026 · Jay Boryscka · 34 machines, 3 shifts

They built their own Excel dashboard, pulling via API to see sellable open slots per machine.

MachineMetrics on the TV wall, not ProShopExcel scheduling sheets alongsideUser assignment and job progress on a boardLights-out midnight–6am shiftSellable capacity when quotingBatch quantity over default round robin, so a subset finishes inside one shift

Three photographs across two shops, from the client onsite tour notes.

Eight findings, two per failure

Each card is one thing I heard often enough to trust; the sketch under it is the shape of the answer it implies — the principle, not the feature. The four design chapters each pick up their pair.

P1

ResourcesWhat does this job need?

  1. F1

    Shops think in departments and machine families

    A resource hierarchy: one top-level node branching into two highlighted machine groups, each of which expands into the individual machines beneath it.
    So: a hierarchy the shop already talks in
  2. F2

    People, material and OSP decide the schedule — and can’t be seen on it

    “90% of our work goes to OSP — and it’s invisible on the schedule.”on outside processing
    A job block connected downward to three constraint icons — a person, a material carton, and a delivery truck for outside processing — carried on the block itself.
    So: constraints carried on the block itself
P2

TimeWhen can it actually run?

  1. F3

    Availability is the friction point, and it drifts

    One shift-template card on the left, its working-day band highlighted, with five arrows fanning out to a stack of machine rows on the right — each row receiving the same positive working-day bar.
    So: working time declared once, positively
  2. F4

    Open capacity can’t be seen or sold

    “Selling the gap.”on quoting from open machine time
    Three machine rows on a Tuesday-to-Thursday timeline. The middle row is highlighted: two booked blocks with a dashed, measured gap between them, and a capacity bar beneath keyed booked and open — the open time shown as a quantity rather than an absence.
    So: open capacity as a computed figure
P3

MethodHow does work land?

  1. F5

    Op sequence is enforced by hand

    “We lock the schedule Thursday at 5 PM… then juggle it all week.”on what “the plan” means in practice
    Two machine rows sharing one timeline: operation 10 sits on the upper row, and a dependency arrow curves from its end down to operation 20 on the row below.
    So: routing order as an invariant
  2. F6

    Concurrent running is modeled wrong

    The same run drawn three ways on a timeline: evenly spaced phases, the same phases highlighted, and a version where concurrent phases compress into a tight cluster at the end of the bar.
    So: time-dilated bars
P4

VisibilityWhere is this job, and what’s happening?

  1. F7

    You see one machine at a time, never the shop

    “I need to see the entire mosaic.”on flipping between per-machine views
    A continuous schedule canvas: collapsed rows shown as a single occupied-summary strip, and expanded rows showing individual job blocks, one of them a chain stepping down and across the timeline.
    So: one continuous canvas
  2. F8

    No overview and no drill-down — every role digs through cards

    Three stacked panels narrowing downward like a funnel — department, machine group, machine — each a zoom level deeper than the last. The department row carries a utilization dial and sparkline, the group rows carry roll-up capacity bars, and the machine row shows the individual operation blocks on a timeline.
    So: one tree, any altitude

From face-lift to foundation

Nobody handed me a rebuild. The brief was six feature PRDs on the existing skeleton, and nobody had asked whether the skeleton could carry them. I task-tested the legacy workflows to find out: the six would have shipped as plug-ins, with every frustration underneath them intact.

Legacy edit mode
Legacy schedule edit mode, annotated in red. Two stacked machine cards, each with its own search field, its own bulk-action dropdown and an Action column of checkboxes beside an After column of radio buttons. Rows are tinted pink or blue with no other status indicator. A callout panel headed Where it breaks lists five numbered problems: every card has its own bulk menu, Action is a checkbox while After is a radio, the menu speaks internal vocabulary, scope resets at every card boundary, and row color is the only status channel. It closes: none of these is a missing feature, they are one interaction model, and it doesn't survive a restyle.
Task-testing legacy edit mode. Five things break at once, and not one of them is a missing feature — they are a single interaction model.

So I made the case for a different question. With the PM I ran a short prototype sprint to show how far the current model sat from what we wanted next, then brought the VP two costed paths — face-lift now and overhaul later, or foundation first. She chose foundation. Engineering re-estimated alongside us and found that replicating legacy saved nothing; its component patterns were reusable either way.

How might we spend an extended scope on the foundation the next five years need — not the six features the brief asked for?

Scoping the V1

Once the scope opened, the risk flipped to doing too much. I gave every candidate one test: which pillar does this strengthen, and is that pillar ready to carry it?

I ran the sort with the PM and the roadmap owners — Usability Fixes, NextGen, Not Right Now — and eight workstreams made V1. Target-vs-actual time didn’t: it depends on Machine Monitoring, and I wasn’t going to put a dependency on the critical path.

Scoping map
Left: the six pre-written PRDs as a fanned stack of documents — Concurrent Run, User as Constraints, User as Resources, Master Week Improvement, Machine Group (Bucket) and Set Business Day & Holiday. An arrow leads to the board they became: three columns for Core Usability Fixes, Enhancements & New Features and AI-Powered Features, cut across by three tiers — Tier 1 must-have, Tier 2, and a dashed Tier 3 Not Right Now — with each idea a sticky note and starred notes marking the ones carried over from the original PRDs.

Frameworks before screens

My first deliverables weren’t screens. For a system this entangled the rules every screen hangs off are the design, so I wrote those first.

I gave the team one sentence to argue with: the schedule should express what a shop actually has, actually does and actually decides — and the interface should follow from that. The four chapters below are that sentence, one per pillar. Each runs the same way: what I heard, the model I chose, and what it produced.

How might we design the physics of a schedule before its pixels — so every screen is an expression of a rule the team already agreed?

01Resources — what does this job need?

The machine is the only constraintF1departments and machine familiesF2people, material and OSP can’t be seen

Shops told me two things. They already think in departments and machine families, and most of what decides whether a job can run — people, material, outside processing — had no place on the schedule at all. One model answers both: a tree of everything the shop has, with every constraint a job needs shown on the block itself.

The resource hierarchy

One tree feeds four places: the Gantt’s left panel, capacity roll-ups, group-level assignment, and navigation across every view. The group layer is optional — SME review taught me that a six-machine shop shouldn’t have to look at structure it doesn’t need. The tree is defined here and does its real work in Visibility, where its rows become the canvas.

Hierarchy model
The four levels nested inside one another: a CNC Machining department containing a 5-Axis Mills group, badged opt-in and holding three machines; inside it the machine Haas VF-2, and inside that the operations Op 30 and Op 40. DMG Mori and Mazak i-300 sit alongside as the group's other machines, and the level names run down the right edge — dept, group, machine, operation.
Drill-down
The schedule's left resource panel being drilled into: departments CNC Machining, Grinding and Finishing each hold machine groups — 5-Axis Mills, Lathes, Surface Grinders, Deburr / Polish — carrying a machine count and an unscheduled badge. Clicking a group expands it, and each row's capacity bar on the right rolls the level below it up into hours booked against hours open.

Everything that can stop a job, on the block

One shop sends 90% of its work out for outside processing. Another had operators who weren’t qualified for a setup. Material that hasn’t arrived stalls everyone. Legacy had no field for any of it, which is exactly why the whiteboards and spreadsheets existed. Each becomes a mark on the operation block — readiness symbols, the production-planning check, an owner — so “can this run?” is answered where the block is, not in a meeting.

People as a schedulable resource

I treated people the way the schedule already treated machines. One board where an admin sets every assignment, syncing to the Gantt and to Kanban with per-operation setup and run states — the whiteboard photo from the onsite visit, turned into a screen. The SMEs’ first reaction was that this alone would close a lot of tickets.

02Time — when can it actually run?

Capacity by subtractionF3availability is the friction pointF4open capacity can’t be seen or sold

Availability was where schedulers spent most of their effort, and it drifted quietly; and nobody could see, let alone sell, the capacity that was open. They’re the same defect from two sides — time was declared by subtraction and never checked against anything. I made working time a positive object the solver plans against, so a start date, a finish date and an open gap all derive from the same fact.

Positive availability

A shift template states a working day. Holidays and downtime are blocks laid on top of it, not carve-outs from it. Templates apply across the shop in one pass instead of one Master Week per cell — and downtime as a block matters again in Method, where “hold this time open” finally gets an honest home.

  1. T1Availability logic
    Before
    Setting availability the legacy way. A Master Week calendar covers one machine for a single week — Monday 7 to Sunday 13 September 2026 — with a plus button on every day to add a block of time the machine is unavailable. The header reads machine 1 of 30, so the same week has to be filled in by hand twenty-nine more times.

    Subtractive. A Master Week per work cell where you mark what's unavailable — mental arithmetic, no bulk apply, and a silent two-year expiry.

    After
    Setting availability additively. A single Day Shift template states a positive working day of 06:00 to 16:00, and one Assign work cells action applies it across the shop: the machine list fills in from Haas VF-2 downward, the counter climbs from 0 to 30 of 30 machines, and the result is confirmed as applied to all machines in one pass.

    Additive. Define a positive working day, then drag-and-apply shift templates across the shop.

~10 min → ~2 min per machine

Availability setup. Bulk apply means a 30-machine shop configures once, not thirty times.

Capacity you can see — and sell

Because availability is positive, open capacity becomes a number the system computes: hours open per machine, rolled up to group and department, and a next-available time on every row. That’s what CNC Swiss meant by selling the gap — quoting a delivery from real open machine time instead of a guess — and it’s why the capacity bars and the utilization figures can be believed: they come from the same declared time the schedule is placed against.

Capacity roll-up
The Gantt resource panel with a capacity bar on every group row. 5-Axis Mills reads 1,008 hours total with 512 hours open and a next-available slot of Sep 10, 11:00 AM for 3 hours; Lathes reads 672 total, 362 open, next available Sep 11, 01:00 AM for 5 hours; Surface Grinders reads 672 total, 389 open, next available Sep 10, 02:00 PM for 4 hours.
Hours booked against hours open, rolled up to each group, with a next-available time on every row. 512 of the 5-Axis Mills’ 1,008 hours are open — a number, not an inference.
Open-slot filter
The schedule filter panel open, with an Open capacity group offering Gap 2 hours or more, Gap 4 hours or more, Full shift open, and Nothing scheduled. Gap 4 hours or more is checked, and the panel explains that only machines with a capacity gap are shown and that open slots are highlighted on the timeline.
And filterable: show only machines with a gap of four hours or more, with the open slots highlighted on the board. Finding sellable time stops being a hunt.

03Method — how does work land?

Placement by handF5op sequence enforced by handF6concurrent running modeled wrong

Op sequence was enforced by hand and concurrency was modeled wrong, and behind both sits the complaint the NPS comments make most often: the board can’t be trusted, because it’s full of decisions nobody can explain. Schedulers were doing the solver’s job by hand, and every legacy control existed to help them do it.

A schedule isn’t a document you maintain. It’s an answer the system recomputes from facts you give it.

So I drew one line: store facts and commitments, derive everything else. A hard start date was neither — it was a stored answer, which is why it went stale.

GPS metaphor
Two panels. Left, headed The road closes: a hand-written list of turn-by-turn directions beside a route blocked by a barrier, a confused worker, and the note that your directions are now wrong and nothing tells you which line broke. Under In the schedule it lists Last Direct Order, hard start dates and phantom placeholders, each crossed out. Right, headed The route is recomputed: a route that detours around the same barrier and reaches its destination, with the note that you state what's true and the system finds the way. Under In the schedule it lists due date as the destination, sequence and flow dependencies, and availability, people and material, each checked.
The metaphor I used with stakeholders. One deliberate difference from a real GPS: this one never re-routes unless it is asked to — a plan the floor has already acted on is worth more than an optimal one.
Gaps, explained
The same machine schedule, legacy and rebuilt Above, the legacy board: OP-C is pinned by a hard start date, leaving an unexplained gap before it, and on a second machine Op 20 sits ahead of Op 10, flagged with a ghost block rather than prevented. Below, the rebuild: the same ops placed just-in-time, the surviving gap labeled as waiting on material against a dashed can't-start-before floor, and Op 10 running before Op 20 because routing order is an invariant. BEFORE — LEGACY MON TUE WED THU FRI N40 OP-A OP-C · hard start OP-D a gap nobody can explain N42 Op 20 Op 10 Op 20 before Op 10 — flagged with a ghost block, not prevented Placement is the control. Nothing on the board records why. AFTER — REBUILD N40 OP-A material arrives Thu OP-C OP-D the gap has a name: waiting on material N42 Op 10 Op 20 routing order is an invariant, not a warning Intent is the control. Every position and every gap traces to a reason.
Same machine, same jobs. The rebuild doesn’t remove gaps — it makes them explainable. The one that survives is bounded by a fact the scheduler entered.
The ground rule

Ops of a job always run in routing order.

Legacy could schedule Op 20 before Op 10 — the second row above — and warn you with a ghost block, a system telling you your own plan was impossible. If something can be proven unbuildable, it shouldn’t be expressible. I deleted the state instead of improving the warning.

WAS POSSIBLE Op 20 Op 10 NOW THE ONLY SHAPE Op 10 Op 20 ONE LESS STATE · ONE LESS SYMBOL · ONE LESS CLASS OF SILENT FAILURE

The solver is opt-in

Legacy ran one global rule on top of per-cell settings; when they disagreed, jobs silently failed to schedule.

ProShop’s own help docs told customers to leave deburr, assembly and inspection off the schedule — a product admitting it had the wrong model. Now each cell declares whether placement is a question at all: an Optimized cell lets the solver place just-in-time; a Manual / FIFO cell is a queue the scheduler owns, and the solver never touches it.

What was retired

Retired controls
Three groups, each tracing a legacy control across three columns: legacy control, what it was actually doing, and what replaced it. Split into three: the hard start date, labelled one control quietly doing three jobs, fans out to three timeline sketches and becomes a pin that protects the order you set, a can't-start-before floor that records a fact where later is fine, and a downtime block that holds time open. Absorbed: Latest, or must leave by, shown auto-placing three blocks against their deadline flags, becomes the solver's objective, placing every free op just-in-time on every run. Deleted: Last direct order, struck through, shown stacking blocks from the bottom with job order ignored, and has no replacement.
The three controls I retired, and what each was actually doing. The middle column is the point: schedulers had no words for it, which is how a single date ended up quietly protecting an order, recording a fact about the world, and reserving time all at once.

Freezing a job at a clock position is what fought the optimizer. Appending new work to the tail was the other change, and the trade is honest: an appended job can land past its date, and a wrong answer you can see beats a right answer you can’t.

Engineering solves sequencing with CP-SAT from Google’s OR-Tools, which set my constraint as a designer: every rule I wrote had to be something the solver could satisfy, or report as infeasible.

Concurrency, modeled truthfully

Stacked full-length blocks give every concurrent job the wrong end time, and the on-time-delivery number downstream inherits the error. The rebuild computes a block’s length phase by phase, so a bar’s width is what actually happens on the machine.

Concurrent group
Gantt view of a 5-axis mill marked DOWN, with four operations from work orders WO-4525 and WO-4526 linked into one concurrent group. A hover card headed Concurrent Group reads: contains 3 concurrent operations, mode Round Robin, WO-4525 and WO-4526. One bar carries the label Qty 46 at 20 minutes per part.
The card names the mode and the jobs sharing the spindle; the bar carries the quantity and cycle time its length came from.
Run calculator
The Concurrent Run Calculator. Three jobs are entered with a quantity and a per-part cycle time, each running one hour forty alone. Mode is set to round-robin with zero changeover; a timeline plots every individual part as a coloured block, and a breakdown table gives the finish times: WO-102 at 2h 50m, WO-101 at 4h 5m, WO-103 at 5h, twenty-four swaps, five hours total batch time.
Three jobs that each run 1h 40m alone finish at 2h 50m, 4h 5m and 5h sharing one machine — that spread is what a bar has to show.

I built it as a standalone tool first — V1 round-robin, V2 per-job batch quantities after shop feedback. Getting the math right on its own is why the Gantt bars could be trusted later.

04Visibility — where is this job, and what’s happening?

One zoom levelF7one machine at a time, never the shopF8no overview, no drill-down

You saw one machine at a time, and there was no overview and no way down. Both are one missing idea: altitude. Everything above — the hierarchy, the availability, the placement rules — is drawn on a single decision about what a schedule looks like, then read at three zoom levels: the shop, the canvas, the block.

A canvas, not a grid

Whether the schedule is a grid of machine cards or one continuous canvas decides how every work cell is shown, so I settled it first. I rejected the card grid on evidence, not taste: finding open capacity was a scavenger hunt, and the grid is what made it one. I built the side-by-side prototype so the argument could be tried rather than described.

  1. 00Grid to flow
    Before Grid
    Searching work order WO-4526 in the card layout. Each machine group is its own collapsed card — 5-Axis Mills, Lathes, Surface Grinders, Deburr / Polish — and the search reports one match inside three of them, forcing each card open in turn. The three matching operations surface as Op 30, then Op 10, then Op 20: three ops out of order, with the sequence left to be assembled by hand, and nothing anywhere about when any of them runs.
    After Flow
    The same search on the continuous canvas. Haas VF-2, DMG Mori, Okuma LB3000 and Mazak i-300 are rows on one shared, gridded time axis, and all three matches appear together as bars sitting where they actually fall in time — the sequence readable straight off the canvas instead of reassembled by hand, and each row keeping an occupied summary strip so a collapsed department never hides that it is busy.

Altitude 1 — the shop, the view from above

Shop owners’ complaint was that every statistic lived at the deepest level. The KPI page is the missing altitude — utilization, on-time delivery, what’s at risk and where the bottleneck is — and the Kanban is the whole-shop view for people who need to see rather than edit.

KPI dashboard
The Schedule dashboard. A key-metrics row of four cards, each with a sparkline: capacity utilization 78% up 2.4, on-time delivery 94% up 3, OEE 74% down 1.1, and three at-risk jobs. Below it a department overview — CNC Milling, Turning & Lathe, Grinding & Finishing, Quality & Inspection — each carrying its group and machine count and a utilization, on-time and capacity figure over a status bar. Underneath, a capacity trend chart grouped by weekday and a bottleneck heat map of departments against Monday to Friday, keyed slack, healthy, at the limit and over capacity, with Grinding over capacity from Wednesday on.
The KPI landing page: the shop's health check before any block is touched.
Kanban view
The Kanban view. A filter bar counts four late jobs, one alarm and one machine offline, with queue depth set to active plus next up. CNC Milling shows 12 of 14 machines active; the Haas VF group gives each of its four machines a column headed by machine name, cell ID and shift, holding an active card and a next card. Each card carries a work order and operation number, a part thumbnail, part name and number, an op-must-leave-by date and a quantity done against ordered. One queued card is flagged red — Seal Carrier L-22, can't meet must-leave date. The DMG 5-axis group below shows a machine in alarm and another idle.
Kanban: the entire mosaic, for the people who need to see rather than edit.

Altitude 2 — the canvas, and the tree as its rows

The tree from Resources becomes the rows of the canvas. Collapse a department and you get a summary strip, so a closed row never hides that it’s busy; expand it and the machines appear on the same time axis. One rule governs the whole workspace, short enough to hold in your head: orientation left, action center, depth right, attention on top.

Zone walkthrough
A walkthrough of the Gantt workspace, zone by zone, alternating between the live screen and a numbered schematic that badges each zone in turn — 01 tree panel, 02 timeline scale, 03 swim lanes, 04 command bar, 05 detail panel. Left, the tree panel: departments and machine groups — CNC Machining with 5-Axis Mills and Lathes, Grinding with Surface Grinders — each row carrying a machine count, an unscheduled badge and a capacity bar that rolls up the level beneath it. Center, the timeline canvas: work-order blocks laid on a shared date axis across machine rows, with open-capacity gaps labeled in hours and a next-available time on each group. Top, the alert and filter layer: time period, zoom, display and version controls, and the last-published timestamp. Right, the detail side panel for the job Bearing Cap — quantity, part number, customer, start and end, the must-leave-by and customer-due dates, and a constraints block holding a can't-start-before field and an auto-pinned note reading that the job starts within the next three-day window.

Altitude 3 — the block, one glance, three questions

A block has to answer three questions without being opened, and each answer has its own visual channel so two states can never contradict each other. Fill carries on-time risk. The left rail carries the scheduling rule as a position, so it survives any fill. Opacity carries readiness. And three fixed symbol slots answer can I run this?, how does it move? and whose is it? — one from each pillar.

I kept the legacy color vocabulary on purpose. Color is the schedule’s language, and the research said users love it and distrust it in equal measure; replacing it would have cost the love and kept the distrust. So color is confined to the one slot where it means something — readiness — and structure is drawn in neutral ink.

Block anatomy
Block anatomy: one attribute per visual channel. A sample block — WO-4526, Op 30, Bearing Cap — is called out to four channels: fill, left rail, shape cue and opacity. Fill carries on-time risk across five states: placeholder for no job yet, on track needing no action, in buffer at one to three days, late for past must-leave-by, and linked for shared setup. The left rail carries the scheduling rule — free for no constraint, an orange rail for pinned or can't-start-before — noted as a position on the block rather than a color, so it survives any fill. Opacity carries production-planning readiness — solid for ready, hatched for waiting — noted as routing to the detail panel, which lists exactly which items are outstanding.
Symbol system
The three-slot symbol system: fixed positions, each slot optional. Three sample rows — part 123 with work order ABC at op 50, part 456 with XYZ at op 90, part 789 with CDF at op 80 — show the three slots filled or empty independently, keyed filled equals slot in use, so a symbol always means the same thing wherever it appears. Slot 1 is readiness — can I run this? — and is the only slot where color carries meaning: outside-processing status as pending, processing, late and released, and previous operation as waiting or ready. Slot 2 is flow — how does this op move? — drawn in neutral ink only: lead, follower and linked. Slot 3 is ownership — whose is this? — and is optional: a planner avatar or an assigned user.

Reviewed by experts, then tested with customers

Two loops, and they catch different things. Internal domain experts attacked the model on paper before it was built; customers used the real thing while it was still being built. The useful output of a review is what it changed, so both columns are here — including the one where I was wrong.

Loop 1 — SME pilot review

January 2026, with colleagues who have run shops. The framework was the thing under review, not the screens, which is the only reason a model error could still be cheap to fix.

Changed by review4 changes
AS9100 traceability hardeningNo setup, FAI or time tracking until a machine is actually selected
Opt-in group layerRight for 34 machines, wrong for 6 — small shops promote machines up a level
Bulk select-all and cross-machine “Move to”The scale of real re-planning was larger than I had designed for
Placeholder blocksExtended with a convert-to-work-order flow
Validated2 bets
User assignmentConfirmed as the pain-point killer — the whiteboard replacement was the right bet
Visual continuityPP Check and OSP language carried over: “new system, familiar vocabulary”

Loop 2 — the Client Advisory Board

A standing call where early-access features are shown on a live product instance, not a prototype. Shops react differently to software they can picture using on Monday: a click-through gets opinions, a working instance gets objections.

The same shops see the module every few weeks, so a change lands in front of the people who asked for it while their reasoning is still fresh. The interview cohort became this room — which is also why the beta pipeline was warm before beta existed.

One system, five surfaces

Phase 1 ships as one scheduling system, not a bundle of pages. The four chapters stack into three layers — declare what the shop has and when it runs, decide how work lands, see where everything is. Screens for reading are kept apart from screens for acting, on purpose.

  1. Top · see · Visibility

    KPI landing page & Kanban view

    Where is the shop, and what’s happening? Two read altitudes for people who look rather than edit — the dashboard for managers and owners, the Kanban for leads and operators. No scheduling actions on either, deliberately.

  2. Mid · decide · Method

    Gantt workspace

    How does work land? Where the placement rules get exercised — floors, pins, the opt-in solver — and where conflicts get resolved. The one screen a schedule is committed from.

  3. Mid · decide · Resources

    User assignment board

    What does this job need, and who? The admin’s single source of truth for people. Defaults set here cascade down to the Gantt, where the scheduler sees who is on a machine per shift and can override one operation without editing the plan.

  4. Base · declare · Time

    Availability & shift templates

    When can a machine actually run? Declared once, positively, in settings where it belongs. Nothing above works if this is wrong.

One work order, across all five

The stack above is the system at rest. This is one job moving through it, from the shift template that defines its machine’s day to the on-time-delivery number it finally moves. “Where is this going next?” stops being a question you trace across screens.

  • Declare · TimeShift templateDefines the machine’s working day
  • Decide · MethodLands on the GanttOptimized cell, just-in-time slot
  • Decide · ResourcesOperator assignedOn the board; syncs to every view
  • See · VisibilityAppears on KanbanIn the operator’s column, with readiness signals
  • See · VisibilityFeeds the KPIsCompletion lands in OTD and utilization

The AI layer: designed for, not painted on

Everything above is the foundation; this is what it was shaped to carry. The AI scheduling layer is fully designed and planned as a premium capability after GA. Rather than ship half of it, I’d rather show that the AI vision came first, and its requirements are visibly wired into the foundation.

The three levels came out of clustering the AI sprint’s raw idea list.

Four things are in the live product only because the AI layer was already on the table: Scheduling Mode, the per-cell contract for where automation may act; a solver that fires on placement and on request, never continuously; an audit trail that is both the compliance story and the training signal; and reserved slots in the block badges, side panel and attention banner. All four were cheaper to decide before the build than to retrofit after a complaint.

AI rush options

Measurement Baseline only

Beta begins September 2026. Every number here is a legacy baseline or a target — the results column stays empty until real schedulers have run real shops on it.

MetricLegacy baselineTargetPost-beta
Active editors per account~1.7 (294 editors / 174 accounts) within 90 days of GA
Schedule users who edit7.5%Meaningfully up — shared maintenance
Non-scheduler roles engaging~0 (view-only by design)30% monthly
Account activationnet-new60% in 30 days
Scheduler-persona weekly activesnet-new50% in 90 days
Beta accounts in weekly use8+

Baselines: Pendo, 22 Jul – 20 Aug 2026.

At beta scale, percentages are noise. With roughly eight accounts the results column will use counts and cohorts — “six of eight beta shops had three or more roles active weekly, against 1.7 editors on legacy” is honest at small n. Behavioral evidence carries the beta story: a shop retiring its whiteboard or its Excel monitor. Full metrics land at GA.

Already realized Structural

The placement rules and the audit trail are the trust and data foundation the AI layer is being built on — designed once, for both the free foundation and the premium capability. That doesn’t depend on adoption to be true.

The interview cohort became the beta and reference pipeline, which is the cheapest research dividend I’ve had on a project.

Reflection

  1. 01
    Design the physics before the pixels

    The placement-rules document took more risk out of this project than any mockup. Every screen after it was drawing rules we’d already agreed, which is why estimation stopped being a negotiation.

  2. 02
    Scope is a design deliverable

    “Foundation before intelligence” was the most useful argument I made, and it wasn’t a screen. Seeing it wasn’t the hard part. Carrying it to a VP as something concrete enough to decide on was.

  3. 03
    Abstractions must degrade gracefully

    The hierarchy was right for 34 machines and wrong for 6. The optional group layer came from letting SMEs attack the framework instead of admire it — scaling down matters as much as scaling up.

Next case study

Operator View

One screen for the person at the machine, built inside the ERP.

Read case study