Production Scheduling for Lyophilized Vial Fill-Finish

Replace spreadsheet and whiteboard scheduling for lyophilized vial fill-finish with a hybrid-flowshop model that assigns lyophilizer loads, sequences SIP/CIP changeovers, and runs shift-aware calendars — all in one Gantt.

This guide is for production planners, operations managers, and plant managers at pharmaceutical fill-finish facilities that handle lyophilized injectable products. You will learn how to model your lyophilized vial fill-finish operation as a hybrid-flowshop schedule in Schantt — with parallel lyophilizers as batch machines, filling lines and cappers as flow stages, and campaign changeovers that account for cleaning and sterilization between product classes.

This guide follows a fictional composite company built from industry research on lyophilized vial fill-finish; all names, parameters, and figures are illustrative.

Industry context

Lyophilized vial fill-finish is one of the most operationally complex production flows in pharmaceutical manufacturing. Products move through as many as seven sequential stages — from vial washing and depyrogenation through filling, lyophilizer loading, the freeze-drying cycle itself, unloading, capping, and finally visual inspection and packaging. The process must maintain aseptic conditions throughout, with validated environmental classifications that change as material moves from wash rooms to filling isolators to lyophilizer loading areas. The freeze-drying cycle, in which water is sublimated from the frozen product under vacuum, dominates production time and makes the lyophilizer bank the pacing resource in the entire line.

Three broad product classes typically share this facility: monoclonal antibodies, vaccines, and antibiotics. Each class has distinct processing requirements. Monoclonal antibodies and vaccines run the full seven-stage route, while antibiotic products often skip vial washing — using pre-sterilised ready-to-use vials — and may bypass visual inspection when bulk-shipping to an external packaging partner. Freeze-dry cycle times differ significantly across classes: a standard mAb requires about 60 hours in the lyophilizer, a vaccine about 84 hours, and an antibiotic about 36 hours. Batch sizes per lyophilizer load also vary, from roughly 24,000 vials for an mAb to 50,000 for an antibiotic, driven by the different fill weights and vial geometries.

The fill line, the wash tunnel, the loading and unloading stations, and the capping and inspection machines operate on a two-shift weekday calendar. The lyophilizers, by contrast, run continuously once loaded — a freeze-dry cycle does not pause when the operators go home, so these machines need a 24/7 calendar. This creates a fundamental scheduling tension: the fill line produces a lyophilizer's worth of vials in a few hours, but the lyophilizer then occupies that load for one to three and a half days. The four lyophilizers together form a parallel batch bank whose throughput is measured in loads per day, and balancing fill-line output against that bank's capacity is the core scheduling challenge.

CryoVial Therapeutics runs approximately 140 people at a 5,600 m² cleanroom facility, making 3 product classes across 7 production stages, scheduled by a 3-person planning team.

Process overview

flowchart LR
    S1["Vial Washing & Depyrogenation"]
    S2["Filling & Partial Stoppering"]
    S3["Lyophilizer Loading"]
    S4["Freeze-Drying"]
    S5["Lyophilizer Unloading"]
    S6["Full Stoppering & Capping"]
    S7["Visual Inspection & Packaging"]
    S1 --> S2 --> S3 --> S4 --> S5 --> S6 --> S7

The seven stages of lyophilized vial fill-finish, flowing left to right.

Skip routing. Antibiotic products skip Vial Washing & Depyrogenation (entering the line at Filling with pre-sterilised vials) and Visual Inspection & Packaging (bulk-shipped to an external packaging partner). The routing for this class begins at Stage 2 and ends at Stage 6.

Scheduling challenges and how Schantt handles them

In a typical fill-finish facility, the schedule is driven by an order backlog or campaign plan — a fixed set of product batches to run within a planning window. This guide assumes that demand is externally given as a list of products and quantities that must be produced, and that the planning horizon is several weeks to a few months. If your facility is instead driven by just-in-time downstream orders, the same modeling approach applies, but your schedule cadence may be shorter.

Schantt's scheduling algorithm minimizes total production time — the time from the start of the first job to the completion of the last — by finding efficient sequences and machine assignments. It schedules forward from a start date you provide. For this scenario, a practical horizon of 4 to 8 weeks lets the algorithm optimise across the full campaign sequence.

Schantt offers two optimisation modes. In Auto mode, the algorithm decides both the job sequence and machine assignments. In Semi-Auto mode, you lock the production order and let the algorithm optimise machine assignments within that sequence. Both modes respect the same calendar, changeover, and routing rules.

What Schantt handles well

  • Multi-machine batch stage (lyophilizer bank). Each lyophilizer is a batch machine with its own cycle duration and batch size. The scheduling algorithm assigns loads across the four parallel units to minimise total production time, keeping as many lyophilizers occupied as the campaign allows.

  • Sequence-dependent changeovers (campaign transitions). Directional changeover times between product-class pairs on the fill line encode the time penalty of campaign transitions, including cleaning and sterilisation. The algorithm favours sequences that group similar classes together to reduce transition time.

  • Hybrid batch-flow pipeline. Batch freeze-drying stages and flow fill-cap-inspection stages coexist in the same per-class routing. The algorithm applies the correct duration physics for each stage type — batch cycles for lyophilizers, continuous throughput for fillers and cappers — within a single schedule.

  • Partial transfers for lyophilizer loading. The fill line can begin sending material for the next lyophilizer load while the previous load is still being transferred. This overlaps filling and loading at the critical handoff, keeping the line moving.

  • Shift-aware calendars with machine-level overrides. Fill lines and operator-attended stations run on a shift calendar (Monday through Friday, 6:00 to 22:00). Lyophilizers have a separate 24/7 calendar override so freeze-dry cycles advance through nights and weekends without interruption.

  • Transfer times for stage-to-stage handoffs. Short transfer times between consecutive stages capture cleanroom move delays — conveyor travel, rapid-transfer-port handoffs, and chamber venting — chaining each downstream stage's start to its upstream completion.

How Schantt handles each challenge

1. Campaign changeovers consuming production time.

  • The fill line requires as much as 12 hours of campaign changeover — including cleaning and sterilisation — when switching between an antibiotic and a non-antibiotic product class. Same-class transitions take only 30 minutes, and transitions between mAb and vaccine take 4 hours. When these changeovers are tracked on a whiteboard or spreadsheet, it is easy to underestimate their cumulative impact across a multi-week campaign.
  • Schantt models each directional changeover as a time duration per product-class pair on the filling line, and also applies an 8-hour sterilisation-in-place changeover on each lyophilizer at the antibiotic-to-non-antibiotic campaign boundary. The algorithm folds every changeover into each operation's start time, so a sequence that batches similar classes together naturally scores a shorter total duration than one that ping-pongs between incompatible classes.

2. Lyophilizer bank bottleneck.

  • The fill line produces a lyophilizer load's worth of filled vials in 2 to 6 hours, depending on the product class. That load then occupies a lyophilizer for 36 to 84 hours. The four lyophilizers together can handle about 1 to 3 loads per day, meaning the fill line can easily outpace the drying capacity if the sequence is not planned carefully.
  • Schantt models the lyophilizer bank as four identical batch machines, each with its own cycle duration and batch size per product class. When a job reaches the Freeze-Drying stage, the algorithm assigns it to an available lyophilizer, tracks occupancy across all four units, and schedules downstream operations to start as soon as each load finishes its cycle. The Gantt shows each lyophilizer as its own lane, so you can see at a glance which unit is occupied, by which batch, and when it frees up.

3. Partial transfers and filled-vial hold-time windows.

  • Filled vials waiting for lyophilizer loading have a validated hold-time limit — up to 4 hours at ambient temperature or up to 24 hours if chilled. Exceeding this window risks product quality, and a hold-time breach means the batch must be evaluated or discarded.
  • Schantt enables partial transfer on the Filling-to-Lyophilizer-Loading handoff, so the loading station can begin transferring the first usable portion into a lyophilizer while the filling line continues running. This shrinks the window between fill completion and the start of freeze-drying. The algorithm schedules the minimum handoff delay via the transfer time setting and chains material promptly through the route. You confirm the gap between fill completion and lyophiliser start on the Gantt — if any batch's handoff exceeds the validated window, you can adjust the sequence or start time before executing the schedule.

4. Shift-asymmetric resources on the same schedule.

  • The fill line runs two shifts, Monday through Friday, 6:00 to 22:00. The lyophilizers run around the clock — once a freeze-dry cycle starts, it must not pause. These two calendars must coexist in the same schedule, with the fill line advancing only during its working windows while the lyophilizers advance continuously.
  • Schantt supports a default calendar applied to all machines (the two-shift pattern), then lets you override specific machines with a different calendar. The four lyophilizers each carry a 24/7 override. When the algorithm evaluates timing, the fill line pauses overnight and on weekends, while the lyophilizers keep counting through non-working hours. The Gantt visualises this with shaded non-working overlays, so the planner can see why fill-line bars stop at 22:00 and resume at 6:00 while lyophilizer bars span the intervening hours uninterrupted.

5. Multi-product routing with stage skipping.

  • Antibiotic products skip both vial washing (Stage 1) and visual inspection and packaging (Stage 7). A single schedule must handle products on the full seven-stage route alongside products on a five-stage route that starts at Stage 2 and ends at Stage 6.
  • Schantt models this through per-class routing: each product class defines exactly which stages it passes through. The antibiotic class's routing simply omits the two stages it skips. Transfer times bridge directly from Stage 2 to Stage 3 and from Stage 6 to nothing — there is no orphaned Stage 7 operation for products that skip it. On the Gantt, antibiotic jobs appear only on the stages they actually run, interleaving with mAb and vaccine jobs on the shared filling, lyophilizer, and capping stages.

What to model in Schantt

A lyophilized vial fill-finish configuration in Schantt is built from five first-class entities. The table below gives the entity counts for the scenario in this guide.

Entity Count Notes
Stage 7 6 flow stages + 1 batch stage (Freeze-Drying); wash and inspection stages are optional per routing
Machine 13 1 wash tunnel, 1 filling line, 1 loading station, 4 lyophilizers, 1 unloading station, 2 cappers, 2 inspection machines, 1 labeler
Product Class 3 Standard mAb, Seasonal Vaccine, Antibiotic
Product 3 1 representative product per class
Calendar 2 Fill-line shift (team default) and Lyophilizer 24/7 (machine override)

Step-by-step setup

1. Create the stages in order. Add seven stages in sequence: Vial Washing & Depyrogenation (flow), Filling & Partial Stoppering (flow), Lyophilizer Loading (flow), Freeze-Drying (batch), Lyophilizer Unloading (flow), Full Stoppering & Capping (flow), Visual Inspection & Packaging (flow). On each stage's detail page, set the transfer time to the next stage. The six transfer times represent the real move delays between consecutive stages — 3 minutes from wash to fill via pass-through hatch, 5 minutes from fill to lyo loading, 8 minutes from loading into the lyophilizer chamber via rapid-transfer port, 10 minutes for chamber venting before lyophilizer unloading, 3 minutes from unloading to capping, and 5 minutes from capping to inspection.

2. Add the machines to each stage. Assign machines to their stages:
- Vial Washing & Depyrogenation: Wash Tunnel (1 machine)
- Filling & Partial Stoppering: Filling Line (1 machine)
- Lyophilizer Loading: Loading Station (1 machine)
- Freeze-Drying: Lyophilizer 1 through Lyophilizer 4 (4 machines)
- Lyophilizer Unloading: Unloading Station (1 machine)
- Full Stoppering & Capping: Capper 1, Capper 2 (2 machines)
- Visual Inspection & Packaging: Inspection Machine 1, Inspection Machine 2, Labeler (3 machines)

3. Create the product classes and define routings. Create three product classes — Standard mAb, Seasonal Vaccine, and Antibiotic — each with "vial" as the unit. For each class, define which stages its products pass through. The mAb and vaccine classes follow the full seven-stage route. The antibiotic class begins at Filling (skipping wash) and ends at Capping (skipping inspection and packaging). On the Filling stage of the mAb, vaccine, and antibiotic routings, enable partial transfer and set the partial transfer quantity to the respective lyophilizer load size — 24,000 vials for mAb, 40,000 for vaccine, 50,000 for antibiotic. This tells the algorithm that the fill line can start sending material to the loading station before the entire batch is filled.

4. Add the products. Add one representative product per class: a bevacizumab biosimilar (Standard mAb), a quadrivalent influenza vaccine (Seasonal Vaccine), and ceftriaxone sodium (Antibiotic). Each product inherits its class's routing, so no per-product routing configuration is needed. Assign each product a distinct display colour for Gantt clarity.

5. Set machine capacities and changeovers. On each machine's detail page, configure its production parameters per product class:
- Filling Line — throughput per class: 12,000 vials/hour (mAb), 9,000 vials/hour (vaccine and antibiotic).
- Wash Tunnel — throughput: 20,000 vials/hour (mAb and vaccine). Antibiotic has no entry here because its routing skips this stage.
- Lyophilizer Loading station — throughput: 12,000 vials/hour for all classes.
- Lyophilizer Unloading station — throughput: 15,000 vials/hour for all classes.
- Capper 1 and Capper 2 — throughput: 10,800 vials/hour each for all classes.
- Inspection Machine 1 and 2 — throughput: 12,000 vials/hour (mAb and vaccine only).
- Labeler — throughput: 15,000 vials/hour (mAb and vaccine only).
- Each Lyophilizer 1–4 — batch cycle time and batch size per class:
- Standard mAb: 60 hours cycle, 240 kg batch (approximately 24,000 vials)
- Seasonal Vaccine: 84 hours cycle, 240 kg batch (approximately 40,000 vials)
- Antibiotic: 36 hours cycle, 1,000 kg batch (approximately 50,000 vials)

Next, enter the changeover times. The filling line requires a full three-by-three directional matrix — 9 entries covering all class-to-class transitions on this single machine. Key values:
- Within-class: 30 minutes (any class to itself)
- mAb ↔ vaccine (both directions): 4 hours
- Antibiotic → vaccine: 6 hours
- Antibiotic ↔ mAb (both directions): 12 hours
- Vaccine → antibiotic: 12 hours

Each lyophilizer needs 4 directional changeovers — antibiotic-to-mAb, antibiotic-to-vaccine, mAb-to-antibiotic, and vaccine-to-antibiotic — each 8 hours. On the remaining stations (wash tunnel, loading station, unloading station, cappers, inspection machines, labeler), add quick mechanical changeovers of 5 minutes between the classes that share the machine.

6. Configure calendars, exceptions, and downtimes. The team default calendar covers the fill-line shift pattern: Monday through Friday, 6:00 to 22:00 (two shifts). The lyophilizer 24/7 calendar — Monday through Sunday, midnight to midnight — is set as a per-machine override on Lyophilizer 1 through Lyophilizer 4. Add three calendar exceptions for non-working days: New Year's Day (January 1), International Workers' Day (May 1), and the year-end shutdown (December 31). Add three machine downtimes: the fill line's annual preventive maintenance (mid-July, 2.5 days), a quarterly sterilisation-in-place cycle on Lyophilizer 3 (late September, 24 hours), and a factory-wide HEPA re-certification shutdown (early November, 24 hours).

For step-by-step instructions on configuring each of these in Schantt, see the Schantt documentation.

Common mistakes

1. Using a single blanket changeover instead of per-pair directional times. A single changeover value applied to all product-class transitions on the filling line will undercount — or overcount — the real time for every transition except the pair it was measured from. The 12-hour antibiotic-to-mAb transition and the 4-hour mAb-to-vaccine transition have nothing in common, and the 8-hour sterilisation changeover on each lyophilizer is a completely different duration. Fix: Enter the full directional matrix on the filling line (9 entries covering all class-to-class pairs in both directions) and the 4 antibiotic-boundary entries per lyophilizer. The 5-minute entries on other stations are secondary — model those after the major entries are correct.

2. Modeling lyophilizers as flow stages instead of batch stages. The freeze-drying stage is the only batch stage in this line, and it behaves fundamentally differently from the other stages. A flow stage models continuous processing at a rate (vials per hour). A batch stage models a fixed cycle duration for a fixed load — regardless of how many vials the fill line produces, each lyophilizer must run its full 36-to-84-hour cycle before releasing the load. Fix: Set Freeze-Drying's production type to batch. On each lyophilizer's detail page, enter the cycle duration and batch size per product class, not a throughput rate.

3. Forgetting to enable partial transfers on the filling-to-loading handoff. Without partial transfer, the algorithm waits for the entire fill batch to complete before the loading station can begin transferring vials to a lyophilizer. This introduces unnecessary idle time at the loading stage and widens the gap between fill completion and freeze-dry start. Fix: On the Filling routing entry for each product class that uses lyophilizers, enable partial transfer and set the quantity to one lyophilizer load — the partial transfer quantity from the dataset.

4. Applying the fill-line shift calendar to the lyophilizers. If the default two-shift calendar is left in place for the lyophilizers, the algorithm stops the freeze-dry cycle at 22:00 each evening and resumes at 6:00 the next morning, cutting the 60-hour mAb cycle to only 16 hours of progress per calendar day. The schedule would report a 60-hour processing duration spanning many more wall-clock days than necessary. Fix: Override the calendar on each lyophilizer to the 24/7 calendar so freeze-dry cycles advance through nights and weekends.

5. Creating one product class that covers both antibiotic and non-antibiotic routes. If antibiotic, mAb, and vaccine products share a single product class, all products inherit the same routing — either the full seven-stage route or the five-stage route, never both. You would have to create separate schedule entries for the divergent steps, defeating the purpose of class-level routing. Fix: Create separate product classes for antibiotic products and non-antibiotic products, even if you have only one antibiotic SKU. The routing divergence (stage skipping) is the classification boundary.

What a good schedule looks like

A well-configured schedule in Schantt transforms the weekly planning cycle from a manual reconciliation exercise to a data-driven review.

Before (spreadsheet or whiteboard):
- The planning team spends several hours each week manually assigning lyophilizer loads to the four units, often relying on a physical logbook to track which lyophilizer is occupied and when each will free up
- Campaign changeovers are recorded as notes or highlighted cells — the cumulative time lost to transitions accumulates silently across a multi-week campaign
- Fill-line output and lyophilizer occupancy are tracked on separate views, making it difficult to see when the fill line is about to outpace drying capacity
- The 24/7 freeze-dry calendar and the shift-restricted fill calendar live in different systems, so schedule timing must be manually converted back and forth
- When an antibiotic campaign block is added mid-month, the planner must reshuffle every load assignment by hand

After (Schantt Auto mode):
- The algorithm assigns each lyophilizer load to one of the four units, minimising idle time while respecting campaign order and product class segregation — the planner reviews the assignments on the Gantt in minutes, not hours
- Changeover bars on the Gantt make campaign-boundary time visible at a glance — the weekly meeting shifts from "how much transition time did we lose?" to "is the sequence right for next week?"
- The fill line and the lyophilizer bank appear on the same timeline, with the fill lane advancing on its shift calendar and the lyophilizer lanes running continuously — the bottleneck at the transition from filling to freeze-drying is visible as the gap between fill completion bars and the start of freeze-dry bars
- When an antibiotic campaign block is added mid-month, the planner enters the products and quantities into a new schedule and runs Auto mode again — the algorithm re-sequences and re-assigns across the four lyophilizers in seconds, and the team reviews the updated Gantt immediately

Ready to schedule your own facility?

Try Schantt free — no credit card required. Go from spreadsheet to optimized Gantt chart in 60 minutes.

Try Schantt Free