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
The Master Schedule export from Aeries. Contains every section — section number, period, teacher, course, room, and enrollment cap.
The Student Subject Selections export. Lists every course request each student has made for the upcoming school year.
The Workflow at a Glance
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.
.xlsx or .csv
.xlsx or .csv
- ①The MST / SMS file is your current Aeries master schedule. Export from Scheduling → Master Schedule → Export.
- ②The SSS file contains student course requests. Export from Scheduling → Student Requests → Export.
- ③Do not manually edit either file before uploading — column names must match Aeries exactly or the parser will fail.
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.
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.
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.
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.
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.
The Four Options
| Option | What it does | When to use |
|---|---|---|
| Create Sections | The 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 Existing | Requests for this course are treated as requests for a different, existing course. | Course was renamed or renumbered in Aeries. |
| Exclude | Requests are ignored — students requesting this course won't be scheduled for it. | Course is not being offered; requests were submitted in error. |
| Hold Period | Creates a placeholder section pinned to a specific period. | Course is planned but teacher isn't confirmed yet. |
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.
| Setting | What it controls | Default |
|---|---|---|
| Solver Time Limit | Maximum seconds the solver runs. Longer = potentially better result, but slower. | 120s |
| Target Fill Rate | The solver pushes to exceed this rate. Set above your current fill rate to drive improvement. | 75% |
| Auto-add Threshold | A 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 Rearrangement | Allows the optimizer to move unlocked sections to different periods to improve student fit. Teachers' full section groups move together. | On ✓ |
| Course Priority Weights | High-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."
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.
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.
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
| Button | Format | Use for… |
|---|---|---|
| Excel Workbook | Formatted .xlsx (5 sheets) | Visual review and sharing with administrators |
| Aeries SQL Export | DELETE + INSERT SQL script | Direct import into Aeries SIS by a DBA or IT administrator |
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.
What Each Card and Chart Shows
| Card / Chart | Meaning |
|---|---|
| Request Fill Rate | Percentage of all student course requests assigned to a section. This is the primary optimization target. |
| Fully Scheduled | Students where every single request was fulfilled, shown as both a percentage and a raw count. |
| Empty Sections | Sections that exist in the schedule but had zero students assigned. Candidates for removal or consolidation. |
| At/Over Capacity | Sections where assigned enrollment meets or exceeds the section maximum. These may need a capacity bump or an added section. |
| Fill Rate Distribution | Doughnut chart breaking down sections by enrollment band: 0%, 1–25%, 26–50%, 51–75%, 76–99%, 100%+. |
| Student Satisfaction Breakdown | Bar chart grouping students by how many of their requests were filled: 100% (fully scheduled), 75–99%, 50–74%, and <50%. |
| Enrollment by Period | Grouped 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 Rate | Warning 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 Period | Table 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. |
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.
Reading the Table
| Column | Description |
|---|---|
| SECTION# | Section number from the Aeries SMS extract. Auto-scaled sections added by the optimizer show a NEW badge. |
| P | The period this section is placed in. |
| COURSE# | Aeries course number. |
| TITLE | Course name. Auto-scaled sections show "(Auto-Scaled)" appended. |
| TEACHER | Teacher name. "Unassigned" indicates a virtual section with no teacher yet — use Staffing Gaps to assign one. |
| ROOM | Room number from the original extract. |
| MAX | Section capacity (maximum seats) from the original Aeries data. |
| ASSIGNED | Students the optimizer placed in this section. Red text = zero or very low enrollment. |
| FILL RATE | ASSIGNED ÷ MAX shown as a color-coded progress bar and percentage. |
| CHANGE | Net 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.
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.
Failure Reason Cards
The four cards at the top summarize why requests went unfilled across all students:
| Reason | Meaning | Recommended Action |
|---|---|---|
| Period Conflict | Every 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 Full | A 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 Sections | The 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 Anomaly | A 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.
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.
Column Reference
| Column | Description |
|---|---|
| COURSE# | Aeries course number. |
| TITLE | Course name. |
| SECTIONS | Number of sections in the optimized schedule for this course. |
| CAPACITY | Combined maximum seats across all sections of this course. |
| ASSIGNED | Total students placed into this course by the optimizer. |
| FILL RATE | ASSIGNED ÷ 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.
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.
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:
- Which periods are open (blue badges)
- Their currently active sections
- The zero-enrollment sections that freed up those periods
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:
- Total stranded students and the failure breakdown (period-conflict vs. section-full)
- Best period — the period where the most free students exist
- Free students by period — how many students have that period open
- Assign to: teacher-period pill buttons — click any pill to pre-load that teacher/period/course as a manual section in the wizard
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.
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).
KPI Cards
| Card | Meaning |
|---|---|
| Pass 1 Rate | Fill rate achieved with original fixed periods, before any period rearrangement. This is the baseline the optimizer started from. |
| Final Rate | Fill rate after period rearrangement (Pass 2) and re-solve (Pass 3). This is the number shown in the main header. |
| Improvement | The gain from period rearrangement alone — Final Rate minus Pass 1 Rate. A positive value confirms rearrangement helped. |
| Sections Moved | Total 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:
| Column | Meaning |
|---|---|
| SSS DEMAND | Total student requests for this course from the SSS file. |
| ORIGINAL CAPACITY | Total seats that existed before auto-scaling. |
| OVERFLOW | Demand minus original capacity — the gap the optimizer needed to fill. |
| CAP ADDED | Seats added by the new virtual section(s). Virtual sections show "Unassigned" as teacher — assign a real teacher via Staffing Gaps. |
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.
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.
Re-run Workflows
| Scenario | Recommended 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. |
Tips & Troubleshooting
Common Issues
| Issue | Likely Cause | Fix |
|---|---|---|
| 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.