Overview

The Master Schedule Optimizer reads your school's current schedule and student course requests directly from Aeries exports and uses a mathematical constraint solver to build a new master schedule that fills as many student requests as possible — while respecting your constraints. No AI or machine learning is involved.

Upload two files, answer a short configuration wizard, and the system produces an optimized schedule ready to load back into Aeries.

The Two Input Files

MST / SMS File

The Master Schedule export from Aeries. Contains every section — section number, period, teacher, course, room, and enrollment cap.

SSS File

The Student Subject Selections export. Lists every course request each student has made for the upcoming school year.

The Workflow at a Glance

1 Upload
2 Configure Wizard
3 Optimizer Runs
4 Review Results
5 Export

After reviewing results you can bump section capacities, assign teachers to high-demand courses, or adjust any constraint and re-run the optimizer without re-uploading your files.

1 Upload Files

The home page is where every session begins. Upload both Aeries export files to start the analysis. Both .xlsx and .csv formats are accepted.

HOW THIS WORKS
No AI involved
Mathematical constraint solving, not machine learning.
No student PII
Files contain section numbers and course codes only.
Master Schedule Optimizer for Aeries® SIS
Turn weeks of scheduling headaches into 10 minutes of optimization
1
Upload
2
Profile
3
Configure
4
Optimize
5
Export
MST / SMS File *
Master Schedule Table
Drag & drop or click to browse
.xlsx or .csv
SSS File *
👥
Student Scheduling Schedules
Drag & drop or click to browse
.xlsx or .csv
🔍 Analyze Schedule
Takes 5–20 seconds depending on file size.
🛡 Processed locally — no data sent externally ⚡ Supports Aeries SIS exports 2020 onward 🔄 Sessions saved 24 hrs — re-upload anytime
💡Sessions are saved for 24 hours. If you need to step away after uploading, you can return to the wizard or results page without re-uploading your files.

Period Setup

After your files are analyzed you move through the 5-step workflow. Step 3 is the Configuration Wizard — a single scrollable page with numbered sections. A navy sidebar on the left shows your progress and lets you jump between sections.

Section 1 — Period Configuration lets you confirm which periods are part of the standard school day. The system auto-detects standard vs. outlier periods from your MST data.

CONFIGURATION WIZARD
Period Setup
Standard & outlier periods
Section Locks
Pin sections in place
Teacher Loads
2 above standard
Missing Courses
4 courses need action
Staff Changes
Solver Settings
Step 3 of 5
Configure Optimization Constraints
Review the detected anomalies and tell the optimizer how to handle each one.
1
Period Configuration
Confirm which periods are standard scheduling periods. Outlier periods require a handling decision.
Standard Scheduling Periods Check all periods that are standard instructional periods
0
1
2
3
4
5
6
7
ℹ Detected standard periods: 1, 2, 3, 4, 5, 6. Outlier periods detected: 0, 7. The optimizer will only assign students to checked periods.
✓ All sections complete — ready to optimize!
← Back to Profile
Save & Run Optimizer →

Periods shown in blue are active (checked). Gray buttons are outlier periods. The optimizer only moves and places students in checked periods — sections in unchecked periods stay exactly where they are.

💡Leave Period 0 (zero period / early-bird) unchecked unless you want the optimizer to treat it as a normal rotation period. Individual sections in outlier periods can still be pinned in the Section Locks step.

Section Locks

Section 2 — Pin / Lock Specific Sections — tells the optimizer which sections must not be moved. Outlier-period sections are locked by default. Standard-period sections are unlocked by default.

Click the chevron on any period row to expand it and see individual sections. Toggle each section's lock state by clicking its checkbox.

2
Pin / Lock Specific Sections
Locked sections will not be moved or changed by the optimizer. Lock sections that have contractual, room, or teacher constraints.
📌 28 outlier-period sections found. All are locked by default. Expand a period to review its sections and unlock any you want the optimizer to consider for rescheduling.
P0Period 01 section
🔒 1 locked
P7Period 727 sections
🔒 27 locked
Pin Standard-Period Sections All unlocked by default — expand a period to lock specific sections.
P1Period 129 sections
0 locked
P2Period 231 sections
0 locked
Manually Add a Section — Add a section not yet in the MST. The optimizer will treat it as a real section.
Course Number
E.G. P730
Period
— Select —
Teacher
— Select —
⊕ Add Section
⚠️Locking too many sections limits the optimizer's ability to improve the schedule. Lock only what truly cannot move — special education rooms, co-teaching assignments, contractual commitments, etc.

Teacher Loads

Section 3 — Teacher Section Load — is a read-only reference panel. It flags any teachers whose current section count is above the standard load for your school, so you're aware of anomalies before the optimizer runs. No action is required here.

3
Teacher Section Load
Standard load is 6 periods. The 2 teachers below carry above-standard loads. This panel is for reference — the optimizer works within the existing schedule.
For reference only. After running the optimizer, use the Staffing Gap Matchmaker on the Results page to act on teacher availability.
Cipolla Gregory #83
7 periods (+1 above standard)242 students · 7 sections
Fernandez Kori #2
7 periods (+1 above standard)63 students · 9 sections

Click the chevron to expand a teacher's section list. This step is informational — if a teacher is overloaded, address it through staffing decisions outside the optimizer before the final export.

Resolve Missing Courses

Section 4 — Resolve Missing Courses — lists every course that appears in student SSS requests but has no sections in the current MST. You must choose an action for each course before you can run the optimizer.

4
Resolve Missing Courses
These 4 courses have student requests but no sections in the MST. Choose an action for each. All are HIGH severity.
0808 Career Foc Med LOW
👥 27 student requests ⊞ -2 sections needed No action selected
Create Sections
Map to Existing
Exclude
🗓
Hold Period
M120 Mixed Choir LOW
👥 8 student requests
Create Sections
Map to Existing
Exclude
🗓
Hold Period

The Four Options

OptionWhat it doesWhen to use
Create SectionsThe optimizer builds new sections and places students into them. You choose how many sections and which periods to allow.Course is being offered but isn't in the MST yet.
Map to ExistingRequests for this course are treated as requests for a different, existing course.Course was renamed or renumbered in Aeries.
ExcludeRequests are ignored — students requesting this course won't be scheduled for it.Course is not being offered; requests were submitted in error.
Hold PeriodCreates a placeholder section pinned to a specific period.Course is planned but teacher isn't confirmed yet.
💡When choosing Create Sections, you can pick any period including outlier periods (0, 7, 8, 9). You can also select a teacher from the dropdown — if no teacher is available, the section is created as "Unassigned."

Solver Settings

Section 5 — Solver Settings — lets you tune how the optimizer runs. The defaults work well for most schools. Only adjust these if you have a specific reason to.

5
Solver Settings
Tune the optimizer parameters. Defaults are recommended for most schedules.
Solver Time Limit (seconds)
120s
Longer limits allow better solutions. 120–180s recommended for schedules with 200+ sections.
Target Minimum Fill Rate
75%
Current average fill rate is 75.3%. Set target above current to push for improvement.
Period Rearrangement (Phase 2)
Enable period rearrangement
Unlocked sections may shift to a different standard period. Sections taught by the same teacher move together as a group.
Course Priority Weights
Mark courses as High Priority (weight 10×) so the solver fills them before lower-priority courses when capacity forces a choice. Unchecked = Low Priority (1×).
Mark All High Priority
Mark All Low Priority
N162 Math 8 High
L100 English 7 High
D110 Yearbook Low
86 course(s) marked High Priority · 3 Low Priority
SettingWhat it controlsDefault
Solver Time LimitMaximum seconds the solver runs. Longer = potentially better result, but slower.120s
Target Fill RateThe solver pushes to exceed this rate. Set above your current fill rate to drive improvement.75%
Auto-add ThresholdA new section is auto-added when SSS demand exceeds current capacity by more than this many students. Set to 0 to always scale; set high to disable.15
Period RearrangementAllows the optimizer to move unlocked sections to different periods to improve student fit. Teachers' full section groups move together.On ✓
Course Priority WeightsHigh-priority (10×) courses are scheduled before low-priority (1×) when there are conflicts. Overall fill rate % is unaffected — weights determine who wins ties.All high

Staff Changes

Staff Changes is an optional wizard section shown with a checkmark in the sidebar (not a numbered step). Use it if teachers are departing or new teachers are joining before the schedule is finalized.

Click Staff Changes in the wizard sidebar to expand it. Select "Yes, there are changes" to reveal two lists — one for departing teachers (their sections will be released) and one for new teachers (assign them courses). If there are no changes, leave it at the default "No changes."

The most common scenario is no staff changes. This is the correct choice when running the optimizer for schedule analysis or incremental improvements — not when rebuilding the schedule from scratch.

Ready to Run

Once all wizard sections show a green ✅ in the sidebar, the footer bar shows ✓ All sections complete — ready to optimize! and the Save & Run Optimizer → button becomes active. Click it to save your settings and launch the solver.

💡Your wizard settings are saved immediately when you click Run. Even if the browser closes, you can return to the results page later — your constraints are preserved for re-runs.

Results Page

After the optimizer finishes, you are taken to the Results page. This page has a top header bar with key stats and export buttons, followed by a row of tabs — each giving a different view of the optimized schedule.

Optimization Results FEASIBLE
MST.xlsx + SSS.xlsx · Solved in 72.7s
95.1%
Requests Satisfied
5,694/6,000
Student Requests Filled
761/1,007
Students Fully Scheduled
72.7s
Solve Time
Export results:
Overview
Sections
Students 191
Courses
Staffing Gaps 57
Schedule Changes 144
↑ Tab content shown below in each section

Header Stats

The four KPI numbers in the blue header update every time you re-run the optimizer. Requests Satisfied % is the primary metric. Student Requests Filled shows the raw count vs. total. Students Fully Scheduled counts students where every single request was placed. Solve Time shows how long the solver ran.

The badge next to the title shows the solver's final status: OPTIMAL means OR-Tools found the mathematically best solution; FEASIBLE means it found a valid solution that may improve with more time — try increasing the solver time limit in wizard settings and re-running.

Export Buttons

ButtonFormatUse for…
Excel WorkbookFormatted .xlsx (5 sheets)Visual review and sharing with administrators
Aeries SQL ExportDELETE + INSERT SQL scriptDirect import into Aeries SIS by a DBA or IT administrator
⚠️The SQL export uses the exact Aeries column schema. Have your DBA review the script before running it against the live database.

Overview Tab

The Overview tab is the landing tab on the Results page. It shows aggregate statistics about the optimized schedule in a card-and-chart layout — no row-level data.

Request Fill Rate
95.1%
5,694 of 6,000 requests filled
Fully Scheduled
72.1%
761 of 1,007 students
Empty Sections
61
Zero students assigned
At/Over Capacity
40
100%+ fill rate
Sections Per Period
P1
P2
P3
P4
P5
P6
Top Unfilled Courses
AP Chemistry28 unfilled
Drama 221 unfilled
Spanish 314 unfilled
Solver Info
Solver time12.4 s
Variables4,206
StatusOPTIMAL

What Each Card and Chart Shows

Card / ChartMeaning
Request Fill RatePercentage of all student course requests assigned to a section. This is the primary optimization target.
Fully ScheduledStudents where every single request was fulfilled, shown as both a percentage and a raw count.
Empty SectionsSections that exist in the schedule but had zero students assigned. Candidates for removal or consolidation.
At/Over CapacitySections where assigned enrollment meets or exceeds the section maximum. These may need a capacity bump or an added section.
Fill Rate DistributionDoughnut chart breaking down sections by enrollment band: 0%, 1–25%, 26–50%, 51–75%, 76–99%, 100%+.
Student Satisfaction BreakdownBar chart grouping students by how many of their requests were filled: 100% (fully scheduled), 75–99%, 50–74%, and <50%.
Enrollment by PeriodGrouped bar chart showing total Assigned enrollment vs. total Capacity for every period. Useful for spotting periods that are heavily under-utilized or over-booked.
Sections Below 50% Fill RateWarning table listing every section where enrollment is under 50% of its maximum. Columns: Section#, Period, Course#, Title, Teacher, Max, Assigned, Fill Rate. These sections are prime candidates for consolidation or period reassignment.
Staffing Comparison — Unique Teachers per PeriodTable showing how many distinct teachers are active each period in the Original vs. Optimized schedule, with a Delta column. A negative delta means the optimizer consolidated teachers out of that period; a positive delta means it spread teachers into it. The "All Periods" row shows the net change across all periods.
💡OPTIMAL means OR-Tools found the mathematically best solution within the time limit. FEASIBLE means it found a valid (but possibly improvable) solution — try increasing the solver time limit in wizard settings and re-running.

Sections Tab

The Sections tab shows the complete optimized master schedule — every section, its teacher, its period, its room, and how many students are enrolled. This is the closest view to what will be imported into Aeries.

Sec # Course Teacher Per Room Enrolled Cap Fill%
101 English 9 (N101) Smith J. 1 101 28 32 88%
102 Algebra 1 (M200) Garcia M. 1 205 31 32 97%
103 AP Chemistry (S410) Chen L. 2 312 18 24 75%
104 PE 9 (P100) Williams S. 3 GYM 40 50 80%
…84 total rows

Reading the Table

ColumnDescription
SECTION#Section number from the Aeries SMS extract. Auto-scaled sections added by the optimizer show a NEW badge.
PThe period this section is placed in.
COURSE#Aeries course number.
TITLECourse name. Auto-scaled sections show "(Auto-Scaled)" appended.
TEACHERTeacher name. "Unassigned" indicates a virtual section with no teacher yet — use Staffing Gaps to assign one.
ROOMRoom number from the original extract.
MAXSection capacity (maximum seats) from the original Aeries data.
ASSIGNEDStudents the optimizer placed in this section. Red text = zero or very low enrollment.
FILL RATEASSIGNED ÷ MAX shown as a color-coded progress bar and percentage.
CHANGENet change in enrollment vs. the original MST. Green = more students placed, red = fewer. A dash means no change.

Filtering and Searching

Use the filter box to search by course number, title, or teacher name. The All Periods dropdown narrows the table to a single period.

💡Look for NEW badged rows to see which sections the optimizer auto-added to meet demand. Sort by FILL RATE ascending to find the emptiest sections.

Students Tab

The Students tab shows only the students with unfilled requests — fully scheduled students are not listed here. The tab count badge (e.g., Students 160) tells you at a glance how many students have at least one unfilled course.

54
Period Conflict
Course has no section in a free period for this student
Add parallel section
63
Section Full
Section exists in a free period but has no remaining seats
Increase Max or add section
0
No Sections
Course has no sections in the active schedule
Missing Course wizard action
57
Solver Anomaly
Compatible section existed but student was not placed
Re-run optimizer
All (160) Period Conflict (54) Section Full (63)
Student# Requested Filled Missed Rate Unfilled Courses — Failure Reason
23905 9 6 3 66.7% P111 — PE 8 (Period Conflict) H120 — US History (Anomaly)
24341 7 4 3 57.1% N161 — Math 7 (Section Full)
…160 students with unfilled requests · click any row for full schedule & diagnostics

Failure Reason Cards

The four cards at the top summarize why requests went unfilled across all students:

ReasonMeaningRecommended Action
Period ConflictEvery section of the course is in a period already occupied by another of the student's placed courses.Add a parallel section in a different period via Staffing Gaps.
Section FullA section existed in a free period but all its seats were taken by other students.Increase the section Max (capacity bump) or add a second section.
No SectionsThe course appears in SSS requests but has no sections in the active schedule at all.Use the Missing Course wizard action to create sections.
Solver AnomalyA valid placement existed but the solver didn't make it — usually due to time limit pressure.Re-run with a longer solver timeout.

Filtering

Click the Period Conflict or Section Full filter pills to narrow the table to only students with that failure type. Use the Filter by Student# box to jump directly to a specific student.

Fix It Button

Rows where all missed requests are Section Full show a green ⚡ Fix it button. Clicking it pre-loads a capacity bump for that section into the wizard so you can immediately re-run without navigating to Staffing Gaps manually.

Student Detail Modal

Click any student row to open a full-schedule diagnostic modal showing every request, which section was assigned (or why it wasn't), and the failure category for each unfilled course.

⚠️Solver Anomaly failures are normal at high fill rates — the solver is racing against the time limit and occasionally leaves a valid placement on the table. Re-running with a longer timeout usually resolves most anomalies.

Courses Tab

The Courses tab aggregates results by course — showing how many sections exist, total seat capacity, how many students were assigned, and the overall fill rate. Use this tab to identify courses that are over- or under-served.

COURSE SUMMARY (90 COURSES)
COURSE# TITLE SECTIONS CAPACITY ASSIGNED FILL RATE
N162 Math 8 12 426 344 80.8%
L100 English 7 10 365 289 79.2%
P110 PE 7 5 220 206 93.6%

Column Reference

ColumnDescription
COURSE#Aeries course number.
TITLECourse name.
SECTIONSNumber of sections in the optimized schedule for this course.
CAPACITYCombined maximum seats across all sections of this course.
ASSIGNEDTotal students placed into this course by the optimizer.
FILL RATEASSIGNED ÷ CAPACITY as a percentage with color-coded bar.

What to Look For

Sort by FILL RATE ascending to find the most under-served courses — prime candidates for adding sections. High ASSIGNED numbers with low FILL RATE typically means demand exceeds capacity and period conflicts are blocking students.

💡Use the Courses tab together with the Staffing Gaps tab. Find the course with the worst fill rate here, then switch to Staffing Gaps to assign an underutilized teacher to a new section of that course.

Staffing Gaps Tab

The Staffing Gaps tab is an action tab — not just a report. It uses a two-panel Staffing Gap Matchmaker layout to connect available teachers with high-demand courses. The tab badge count shows the total number of stranded course-student combinations needing attention.

💡 Staffing Gap Matchmaker
Left: Teachers with open periods (their sections in that period had zero enrollment). Right: Courses with the most unplaced student requests. Click Assign → to pre-load a section into the wizard and re-run the optimizer.
Available Teachers (30)
Calle Jan P2 open P4 open
Was teaching 5 periods · Now 1 period
Currently: P1: X130 — Clerical Serv
Zero-enrollment: E520, E521, E541, E542…
Sender, Andrea P1 open P3 open
Was teaching 5 periods · Now 1 period
⚠ High-Demand Stranded Courses (25)
D110 Yearbook 13 period-conflict
13 students stranded
Best: P6 (7)
Free students by period: P6: 7 · P3: 3 · P5: 1
Assign to:
Abir I. P1 Andrea S. P3 Jan C. P6

Left Panel — Available Teachers

Shows every teacher who has at least one period where all their sections had zero enrollment (meaning students were not placed there). Each teacher card shows:

Right Panel — High-Demand Stranded Courses

Shows courses ranked by the number of students who could not be scheduled — sorted by unmet demand. Each course card shows:

After Assigning

Clicking a teacher-period pill immediately pre-loads the assignment into the wizard as a manual section. Re-run the optimizer to see the updated fill rate with the new section included.

⚠️Assigning a teacher here does not immediately update the results — it queues a constraint for the next optimizer run. Always re-run after making staffing assignments to see the impact.

Schedule Changes Tab

The Schedule Changes tab shows the impact of the optimizer's period rearrangement (Pass 2). It has four KPI cards at the top followed by two detail tables: Period Changes (sections that moved) and Auto-Added Sections (sections created to meet demand).

90.2%
Pass 1 Rate
Fixed-period baseline
96.1%
Final Rate
After period rearrangement
+5.9%
Improvement
From period rearrangement
60
Sections Moved
Period changed by optimizer
PERIOD CHANGES (60) Sections whose period was moved during Pass 2 rearrangement
SECTION# COURSE# COURSE TITLE TEACHER FROM PERIOD TO PERIOD
3058 A111 Color & Design 8 Nakajima, Snow Period 3 Period 1
5035 L110 English 8 Freestone Jessica Period 5 Period 1
…60 total period changes
AUTO-ADDED SECTIONS (34) New sections created because demand exceeded capacity by more than the threshold
SECTION# COURSE# PERIOD SSS DEMAND ORIGINAL CAPACITY OVERFLOW CAP ADDED
18051 H100 1 280 152 +128 +35
…34 total auto-added sections

KPI Cards

CardMeaning
Pass 1 RateFill rate achieved with original fixed periods, before any period rearrangement. This is the baseline the optimizer started from.
Final RateFill rate after period rearrangement (Pass 2) and re-solve (Pass 3). This is the number shown in the main header.
ImprovementThe gain from period rearrangement alone — Final Rate minus Pass 1 Rate. A positive value confirms rearrangement helped.
Sections MovedTotal number of sections whose period changed during Pass 2.

Period Changes Table

Lists every section the optimizer moved, showing Section#, Course, Teacher, the original period (FROM PERIOD), and the new period (TO PERIOD). Use this to verify no locked sections were moved unexpectedly. If you see an unwanted move, go back to the wizard and lock that section before re-running.

Auto-Added Sections Table

Lists virtual sections the optimizer created because SSS student demand exceeded the existing section capacity by more than the auto-add threshold. Columns:

ColumnMeaning
SSS DEMANDTotal student requests for this course from the SSS file.
ORIGINAL CAPACITYTotal seats that existed before auto-scaling.
OVERFLOWDemand minus original capacity — the gap the optimizer needed to fill.
CAP ADDEDSeats added by the new virtual section(s). Virtual sections show "Unassigned" as teacher — assign a real teacher via Staffing Gaps.
💡Review the Period Changes table before importing to Aeries. If you see unexpected MOVED sections, go back to the wizard and lock those sections before re-running.

Capacity Quick-Fix

The Capacity Quick-Fix feature appears in the Sections tab when a section has significantly low enrollment relative to its capacity — usually indicating that a period conflict is blocking students from accessing it. Quick-Fix lets you increase the section's enrollment cap or change its period without re-running the full optimizer.

⚠️Capacity Quick-Fix adjusts the schedule directly and is best used for small, targeted corrections. For systemic changes (many sections affected), it is better to adjust constraints in the wizard and re-run the optimizer.

When to Use It

Use Capacity Quick-Fix when you see a single section with very low enrollment (e.g., 5 students in a 30-seat class) and you know there are students who want it but are blocked by a period conflict. Bumping the cap rarely helps in this case — moving the section to a less-contested period is more effective.

Re-running the Optimizer

You can re-run the optimizer at any time without re-uploading your files. Your original MST/SMS and SSS data is preserved in the session, and your wizard constraints are saved automatically.

Current Constraints
✓ Standard periods: 1–6
✓ 3 sections locked
✓ Period rearrangement: On
✓ 1 manual section added
✓ Solver time limit: 60s
✓ No staff changes
Optimizer running… 14 / 60 seconds

Re-run Workflows

ScenarioRecommended Steps
You added a teacher in Staffing Gaps and want to see the impact Click Re-run Optimizer → in the toast notification, or navigate to the wizard and click Save & Run Optimizer.
Fill rate is low and you want to try a longer solver time Open the wizard → Solver Settings → increase the time limit → Save & Run Optimizer.
A section moved unexpectedly — you want to lock it and re-run Open the wizard → Section Locks → check the section to lock it → Save & Run Optimizer.
You want to start completely fresh Return to the home page and upload new files. This creates a new session with no preserved constraints.
💡Each re-run is a fresh solve — the optimizer doesn't "remember" the previous run's section assignments. If you've locked the right sections and set your manual staffing assignments, the results will be consistent across re-runs.

Tips & Troubleshooting

Common Issues

IssueLikely CauseFix
Fill rate is below 70% Too few sections for high-demand courses, or period conflicts are widespread Check Staffing Gaps tab → assign additional teachers → re-run. Also try enabling Period Rearrangement in Solver Settings.
Solver status is FEASIBLE, not OPTIMAL The time limit was reached before the solver found the best solution Increase solver time limit in wizard → Solver Settings → re-run.
A course appears in SSS but not in the Sections tab The course number in SSS was not mapped in the Missing Courses wizard step Return to wizard → Missing Courses → confirm or map the course number → re-run.
A section you locked still moved periods The lock was not saved before the last run, or Period Rearrangement moved a different section that you expected to stay Open wizard → Section Locks → verify the correct sections are checked → re-run.
File upload shows a parse error The CSV has trailing commas, extra blank rows, or BOM characters from Excel export Open the CSV in a text editor, remove trailing content, and re-save as UTF-8 CSV before uploading.

Best Practices

Start each scheduling cycle by uploading fresh exports from Aeries — never reuse an export from a prior year. Lock only the sections that are truly immovable (e.g., a teacher who can only teach a specific period due to a contract constraint). The more flexibility you give the optimizer, the higher the fill rate will be.

Run the optimizer first with default settings to get a baseline fill rate. Then iteratively improve: check the Staffing Gaps tab, add a section, re-run, and compare the new fill rate. Repeat until diminishing returns.

💡The optimizer is deterministic for a given set of constraints — the same inputs will produce the same output. This means you can confidently share results with colleagues knowing they will match if they re-run with the same settings.