Production Scheduling for Vaccine Vial Fill-Finish

Learn how to configure and schedule a vaccine vial fill-finish facility in Schantt, with parallel filling lines, aseptic hold windows, and sequence-dependent cleaning changeovers.

Production planners at vaccine vial fill-finish facilities can model every stage of aseptic processing in Schantt — from BDS receipt through formulation, filling, lyophilisation, and packaging — with parallel filling lines, sequence-dependent SIP/CIP changeovers, and sterile hold windows configured as minimum transfer times between stages. This guide shows how to set up the full multi-stage batch/flow hybrid model and use Schantt's Auto and Semi-Auto scheduling modes to generate optimised production schedules.

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

Industry context

Vaccine vial fill-finish is a sterile drug-product manufacturing process that converts bulk drug substance (BDS) into sealed, labelled, and packaged primary containers. The process spans nine stages from BDS receipt through to palletised finished goods: BDS receipt and hold, formulation (mixing with excipients and adjuvants), sterile filtration, vial washing and depyrogenation, filling, lyophilisation (freeze-drying — for lyophilised products only), capping, visual inspection, and labelling and packaging. Each stage has distinct throughput characteristics — some operate in batch mode (BDS receipt and hold, formulation, lyophilisation), others as continuous flow (sterile filtration, vial washing, filling, capping, visual inspection, and labelling and packaging) — and the handoffs between them must respect strict aseptic hold windows to maintain sterility and product quality.

The scheduling challenge at a fill-finish facility is coordinating these heterogeneous stages under tight regulatory constraints. Filling lines run at different speeds (200 to 350 vials per minute) and serve different vial sizes and container types. Changeovers between product classes require sterilise-in-place (SIP) cycles that can consume up to four hours of production time. Lyophilisation imposes a long-duration batch step that decouples the filling line's continuous output from the downstream capping and inspection lines. Schedule planners must sequence campaigns, assign batches to compatible filling lines, and verify that every sterile hold window is feasible — all while responding to campaign demand from upstream drug-substance manufacturing.

VaxVial Biologics runs approximately 100 people at a single-facility contract development and manufacturing organisation (CDMO), producing three vaccine product classes across nine production stages, scheduled by a three-person planning team. The facility operates two 1,000-litre BDS hold tanks, two 2,000-litre formulation vessels, three filling lines, two freeze-dryers, and supporting capping, inspection, and packaging lines. The team runs seasonal campaigns driven by demand from vaccine manufacturers, alternating between standard two-shift operation and extended campaign schedules with three shifts and Saturday working.

Process overview

flowchart LR
  BDS["BDS Receipt & Hold"] --> FORM["Formulation"]
  FORM --> FILT["Sterile Filtration"]
  FILT --> WASH["Vial Washing & Depyrogenation"]
  WASH --> FILL["Filling"]
  FILL --> LYO["Lyophilisation"]
  FILL --> CAP["Capping"]
  LYO --> CAP
  CAP --> INSP["Visual Inspection"]
  INSP --> LABEL["Labelling & Packaging"]
  FILT -.->|RTU skip wash| FILL

Vaccine vial fill-finish production flow from BDS receipt through formulation, sterile filtration, filling, lyophilisation (Class B only), capping, visual inspection, and labelling/packaging. The dotted line shows the RTU class skipping vial washing.

Skip-routing note: Product Class C (RTU high-potency) skips Vial Washing & Depyrogenation — its routing runs directly from Sterile Filtration to Filling. Product Class B (lyophilised) routes through Lyophilisation between Filling and Capping. Product Class A (liquid standard) bypasses Lyophilisation and proceeds from Filling directly to Capping.

Scheduling challenges and how Schantt handles them

The schedule at a vaccine fill-finish facility is driven by campaign demand — monthly or quarterly orders from pharmaceutical partners specifying product, vial size, and quantity per campaign. Schantt optimises total production time, scheduling forward from a start date you set. The practical horizon for this scenario is one to three months, covering a single campaign run or a sequence of campaigns across product classes. Schantt offers two scheduling modes: Auto mode optimises both job sequence and machine assignments to minimise total production time; Semi-Auto mode lets you fix the campaign order (for example, when potency-tier segregation or customer delivery commitments dictate the run sequence) while the algorithm optimises machine assignments within that fixed order.

What Schantt handles well

  • Multi-stage sequential flow modelling with per-class routings — each product class follows exactly the stages its routing specifies; stages absent from a routing are automatically skipped, and transfer times bridge across gaps.
  • Parallel filling lines with per-line product eligibility — three filling lines with different throughputs and vial-size compatibility; a product class is eligible only on lines where its rate entries are populated.
  • Sequence-dependent changeovers (SIP/CIP between campaigns) — directional changeover times encode cleaning durations between product-class transitions; the algorithm favours sequences that group similar classes to minimise changeover time.
  • Transfer times for sterile hold windows between stages — forward-only transfer times between consecutive stages model minimum handoff delays; partial transfers at the filling-to-lyophilisation handoff shrink the exposure window.
  • Calendar-driven scheduling with shift patterns and exceptions — a default two-shift weekday calendar covers production; machine-level overrides extend hours for campaigns; freeze-dryers run 24/7; holidays and maintenance downtimes are modelled as calendar exceptions and machine downtimes.
  • Auto and Semi-Auto scheduling modes — Auto mode optimises job sequence and machine assignments for total production time; Semi-Auto preserves the planner's fixed campaign order (required when potency segregation or customer commitments dictate the sequence) while optimising machine assignments within it.

How Schantt handles each challenge

1. Aseptic sterile hold windows between stages.

  • Regulatory requirements impose maximum hold times between sterile processing stages — for example, BDS must be filled within 24 hours of thawing, and filled but uncapped vials for lyophilisation must not exceed 4 hours at ambient temperature or 24 hours when chilled. These windows are strict quality limits; exceeding them forces batch rejection.
  • Schantt models the transfer time between consecutive stages as a minimum handoff delay — the scheduler ensures no batch leaves a stage before the preceding stage's output is available at the next stage. The planner configures the transfer duration per stage pair (for example, 30 minutes from sterile filtration to filling). The maximum hold window is not an algorithm constraint — the planner visually confirms that the gap between a batch's completion at one stage and its start at the next falls within the regulatory window by inspecting the Gantt chart.

2. Sequence-dependent SIP/CIP changeovers on filling lines.

  • Changeovers between product classes on filling lines require SIP cycles that differ in duration depending on the classes involved — a transition from a standard liquid to a lyophilised product takes less time than a transition from a standard product to a high-potency RTU product, which demands a full decontamination cycle. A naive first-come-first-served sequence can accumulate hours of cleaning time across a multi-campaign run.
  • Schantt models changeover times as directional durations between product-class pairs on each machine. The planner enters the SIP duration for each class-to-class transition directly — for example, 240 minutes for a cross-class changeover and 60 minutes for a same-class changeover. When running in Auto mode, the scheduling algorithm sequences jobs to group similar classes together, minimising total changeover time across the campaign.

3. Parallel filling lines with per-line vial-size and container eligibility.

  • The three filling lines — FILL-1 (200 vials per minute, handling 2 to 10 mL vials for standard liquid and lyophilised products), FILL-2 (350 vials per minute, handling 1 to 5 mL vials), and FILL-3 (150 vials per minute, ready-to-use containers only for high-potency products) — each serve different product portfolios. Assigning a product to an incompatible line would halt production.
  • In Schantt, each product class is eligible only on the filling lines where its throughput rates are configured. When the planner creates the product classes and defines routings, they populate rate entries only on the compatible lines for each class. The scheduling algorithm then assigns each batch exclusively to an eligible line, preventing invalid assignments while distributing workload across available lines.

4. Lyophilisation as a batch bottleneck between flow stages.

  • Lyophilisation inserts a long-duration batch step between the continuous flow of filling and the continuous flow of capping. Two freeze-dryers, FD-1 and FD-2, each process up to 50,000 vials per load with cycle times of approximately 50 hours, while the filling lines feed vials at 200 to 350 vials per minute and the capping lines run at 10,000 vials per hour. Without careful coordination, filling outruns the freeze-dryers or the capping lines starve while waiting for lyophilised vials.
  • Schantt models lyophilisation as a batch stage with a per-load batch size and cycle duration. The two freeze-dryers provide parallel capacity — the algorithm schedules each lyophilisation load to one of the two machines and staggers cycle start times so the filling line and capping lines remain balanced. Partial transfers from filling to lyophilisation (configured on the product class routing) let a batch start freeze-drying before the entire fill batch is complete, reducing the idle window on downstream capping.

5. Campaign-based scheduling across two calendar regimes.

  • The facility alternates between a standard two-shift calendar (Monday to Friday, 06:00 to 22:00) and an extended campaign calendar (Monday to Saturday, around the clock on weekdays) depending on seasonal demand. Freeze-dryers operate 24/7 regardless of the shift pattern. Annual maintenance shutdowns, quarterly isolator decontamination, and public holidays further complicate the available production time.
  • Schantt supports multiple calendars per facility. The default calendar covers standard two-shift operation; a second campaign calendar extends hours and adds Saturday work. Individual machines — specifically the freeze-dryers — can override the facility calendar with a 24/7 pattern. Machine downtimes for annual maintenance (two-week factory-wide shutdown) and quarterly hydrogen peroxide decontamination (eight hours per isolator line) are modelled as planned downtime events. The scheduling algorithm respects all calendar rules and downtime events when placing jobs on the timeline.

What to model in Schantt

Configuring a vaccine vial fill-finish facility in Schantt requires creating the following top-level entities with the counts listed below.

Entity Count Notes
Stage 9 BDS Receipt & Hold, Formulation, Sterile Filtration, Vial Washing & Depyrogenation, Filling, Lyophilisation, Capping, Visual Inspection, Labelling & Packaging
Machine 19 Across the 9 stages — including BDS hold tanks, formulation vessels, sterile filters, vial washers, filling lines, freeze-dryers, cappers, inspection machines, and packaging lines
Product Class 3 Class A (liquid standard), Class B (lyophilised), Class C (RTU high-potency)
Product 3 One representative product per class
Calendar 2 Standard two-shift calendar (Monday to Friday, 06:00 to 22:00); campaign extension (Monday to Saturday, around the clock weekdays)

Step-by-step setup

1. Create the nine stages in flow order. Set the production type for each stage — Sterile Filtration, Vial Washing & Depyrogenation, Filling, Capping, Visual Inspection, and Labelling & Packaging are FLOW stages (continuous throughput); BDS Receipt & Hold, Formulation, and Lyophilisation are BATCH stages (cycle-driven with a fixed load size). On each stage's detail page, set the transfer time to the next stage in the flow. These transfer times encode the minimum handoff delay between stages — for example, 30 minutes from sterile filtration to filling, 45 minutes from filling to capping, and 60 minutes from filling to lyophilisation. For skip-bridge routes (sterile filtration to filling, for Class C which skips vial washing), add a transfer time between sterile filtration and filling directly.

2. Add machines to each stage. Create one machine entry per physical unit on the floor:

  • BDS Receipt & Hold: BDS-1, BDS-2 (1,000 L hold tanks)
  • Formulation: FORM-1, FORM-2 (2,000 L formulation vessels)
  • Sterile Filtration: FILT-1, FILT-2
  • Vial Washing & Depyrogenation: WASH-1, WASH-2
  • Filling: FILL-1 (200 vials/min, 2–10 mL vials, standard and lyophilised products), FILL-2 (350 vials/min, 1–5 mL vials), FILL-3 (150 vials/min, RTU only)
  • Lyophilisation: FD-1, FD-2 (50,000 vial load, ~50 hour cycle)
  • Capping: CAP-1, CAP-2 (10,000 vials per hour)
  • Visual Inspection: INSP-1, INSP-2
  • Labelling & Packaging: LABEL-1, LABEL-2

3. Create three product classes and define routings. Set up Class A (liquid standard), Class B (lyophilised), and Class C (RTU high-potency). On each class's detail page, define the routing — exactly the sequence of stages that class passes through:

  • Class A: all stages except Lyophilisation (BDS → Formulation → Sterile Filtration → Vial Washing → Filling → Capping → Visual Inspection → Labelling)
  • Class B: all nine stages in order (routes through Lyophilisation)
  • Class C: all stages except Vial Washing (skips directly from Sterile Filtration to Filling)

On Class B's routing, enable partial transfers at the Filling-to-Lyophilisation handoff and set the partial transfer quantity — this lets a fill batch begin moving to the freeze-dryer before the entire batch is filled, reducing the downstream idle window.

4. Add one product per class. Create three products, each assigned to its product class with a representative batch quantity.

5. Set capacity parameters and changeovers on each machine. On each machine's detail page, enter the throughput (for FLOW stages) or cycle duration and batch size (for BATCH stages) for each product class the machine serves. For the filling lines, only add throughput entries for the product classes each line can handle — FILL-3 gets entries only for Class C, for example.

On FILL-1, FILL-2, and FILL-3, configure directional changeover times between every product-class pair that uses that line. For each pair, enter the SIP/CIP duration in minutes. Key values:

  • Cross-class changeover on any filling line: 240 minutes (for example, from Class A to Class B, or from Class A to Class C)
  • Same-class changeover on any filling line: 60 minutes
  • Transitions involving the high-potency class (Class C to or from any other class): 240 minutes

On CAP-1 and CAP-2, configure the same directional changeover pairs, as capper tooling changes also follow product-class transitions.

6. Configure calendars, exceptions, and downtimes. Create two calendars — the default standard calendar (Monday to Friday, 06:00 to 22:00, two shifts) and a campaign calendar (Monday to Saturday, 24-hour operation on weekdays, 06:00 to 22:00 on Saturday). Assign FD-1 and FD-2 a 24/7 calendar override since freeze-dryers run continuously regardless of shift patterns. Add calendar exceptions for non-working days — New Year's Day (1 January), International Workers' Day (1 May), and a nine-day year-end shutdown (24 December through 1 January). Add two machine downtimes: an annual two-week factory-wide maintenance shutdown and a quarterly eight-hour hydrogen peroxide decontamination window for each isolator filling line.

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

Common mistakes

1. Using a single blanket changeover time instead of directional per-pair durations. On filling lines, a single changeover time ignores the difference between a same-class transition (60 minutes for a quick rinse) and a cross-class transition (240 minutes for a full SIP cycle). The algorithm will not recognise the cleaning-time advantage of grouping similar classes, leading to a sequence with more changeover time than necessary. Fix: enter directional changeover durations for every (from-class, to-class) pair on each filling line and capper, even if both directions share the same duration — the directional form lets the algorithm sequence jobs to minimise total changeover time.

2. Defining one product class with a routing that covers too many divergent paths. If you create a single class that tries to accommodate both liquid-standard and lyophilised products with optional lyophilisation, the algorithm will either always route through the freeze-dryer (inflating the schedule) or never route through it (missing the required step). Fix: create three separate product classes — one for each distinct routing — with exactly the stages each product requires.

3. Setting filling-line throughput for every product class on every filling line. If you enter throughput rates for Class C on FILL-1 and FILL-2, the algorithm may assign a high-potency RTU batch to a standard filling line, causing a contamination or container-compatibility issue. Fix: enter throughput entries only for the product classes that a given filling line can physically serve — Class C only on FILL-3, Classes A and B on FILL-1 and FILL-2.

4. Using a single calendar for all machines. If you apply the standard two-shift calendar to freeze-dryers, the algorithm will pause lyophilisation cycles overnight, doubling the effective cycle time of an already-long batch step. Fix: assign freeze-dryers a separate 24/7 calendar override that keeps them running through nights and weekends, and add the campaign calendar as a machine override on filling lines during peak periods.

5. Forgetting to bridge skip-routing gaps with transfer times. If Class C's routing skips vial washing but no transfer time is configured between sterile filtration and filling, the algorithm will not know how long the handoff takes and may place jobs with unrealistic timing. Fix: add a transfer time between sterile filtration and filling for the skip-bridge path, just as you would for the consecutive-stage pairs.

What a good schedule looks like

A well-configured Schantt model transforms a manually assembled campaign sequence into a time-optimised production plan that respects every constraint in the model — machine eligibility, changeovers, transfer times, calendars, and downtimes.

Before (manual spreadsheet): The planning team spends days constructing a single campaign sequence by hand. Changeover time between campaigns is a rough estimate — the team adds a blanket four-hour buffer between every product-class transition regardless of the actual classes involved. Bottlenecks at the freeze-dryer are hard to visualise, so capping lines frequently idle while waiting for lyophilised vials. The schedule is a static timeline that breaks as soon as a machine downtime or holiday exception is added to the mix.

  • A four-campaign run (Class B → Class A → Class C → Class B) carries three cross-class changeover slots at 240 minutes each, plus a same-class transition — totalling over 13 hours of changeover time on the filling line alone, much of it unplanned overhead.
  • The freeze-dryer queue is opaque: batches arrive at the lyophilisation stage unpredictably, and the planner cannot tell whether FD-1 and FD-2 are balanced or one machine is overloaded.
  • Shift-calendar mismatches are common — a planner schedules filling on a Saturday, not realising the standard calendar flags Saturday as non-working, and the whole timeline shifts when the error is caught.

After (Schantt Semi-Auto mode): The planning team loads the same four-campaign run into Schantt in the desired customer-commitment order (Semi-Auto mode). The algorithm respects the fixed campaign sequence while optimising machine assignments, transfer timing, and changeover sequencing.

  • The algorithm groups same-class batches together within each campaign, so the only cross-class changeover is the one between campaigns — the planned 240-minute SIP at each campaign boundary. Same-class transitions within a campaign take only 60 minutes.
  • Both freeze-dryers are kept balanced: FD-1 and FD-2 each receive alternating loads, and partial transfers from filling to lyophilisation keep the capping lines fed without idle gaps.
  • Calendar rules are applied automatically — no Saturday shifts on the standard calendar, 24/7 freeze-dryer operation, and the year-end shutdown is a blocked region the algorithm never schedules into.
  • The total production time for the four-campaign run drops measurably compared to the manual spreadsheet, and the resulting Gantt chart gives the planning team a single source of truth they can adjust, share, and reverify with confidence.

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