Calculate your daily rate, hourly rate, and bi-weekly gross pay based on the Chicago Public Schools salary schedule.
Base salary from CTU contract grid
Standard is 208 for 52-week pay calc
26 Pay Periods (Year Round)
20 Pay Periods (School Year)
Standard teacher day is 7 hours
Standard (2% Employee Paid)
Full (9% Employee Paid)
Most CPS teachers pay 2%, CPS picks up 7%
Estimated Gross Pay Per Check$0.00
Daily Rate (Based on Contract Days)$0.00
Hourly Rate$0.00
Est. Pension Deduction (Per Check)$0.00
Est. Pre-Tax Pay (Net of Pension)$0.00
Understanding Your CPS Pay Rate
Teachers in Chicago Public Schools (CPS) are paid according to a collective bargaining agreement between the district and the Chicago Teachers Union (CTU). Understanding how your annual salary translates into daily and hourly rates is crucial for understanding your paycheck, extra-duty pay, and severance calculations.
Key Inputs for Calculation
Annual Salary: This is the base number found on the "Step and Lane" salary schedule. "Steps" generally correspond to years of experience, while "Lanes" correspond to your level of education (Bachelor's, Master's, Master's +15, etc.).
Contract Days: For most regular track teachers, the "daily rate" divisor is technically 208 days. This figure is used to spread your salary over the year, even though the actual number of student attendance and professional development days may be closer to 190.
Pay Periods: CPS teachers can typically choose between 22 pay periods (getting paid only during the school year) or 26 pay periods (having pay spread out through the summer). This affects your bi-weekly gross amount but not your total annual earnings.
The Pension "Pickup"
One unique aspect of CPS compensation is the pension contribution to the Chicago Teachers' Pension Fund (CTPF). The standard contribution rate is 9% of your salary. However, for many teachers, CPS "picks up" (pays) 7% of this contribution, meaning the employee only sees a 2% deduction from their gross pay. This calculator allows you to toggle between the 2% and 9% deduction scenarios to estimate your pre-tax take-home pay.
Why Know Your Hourly Rate?
Knowing your calculated hourly rate is essential when accepting "bucket" positions or extra-duty assignments. While some extra duties have a fixed stipend rate (non-instructional rate), others may be pro-rated based on your contractual hourly rate derived from your step and lane.
function calculateCPSPay() {
// Get Input Values
var annualSalary = parseFloat(document.getElementById('cpsAnnualSalary').value);
var contractDays = parseFloat(document.getElementById('cpsContractDays').value);
var payPeriods = parseInt(document.getElementById('cpsPayPeriods').value);
var hoursPerDay = parseFloat(document.getElementById('cpsDailyHours').value);
var pensionRate = parseFloat(document.getElementById('cpsPensionPickup').value);
// Validation
if (isNaN(annualSalary) || annualSalary <= 0) {
alert("Please enter a valid Annual Salary.");
return;
}
if (isNaN(contractDays) || contractDays <= 0) {
alert("Please enter valid Contract Days.");
return;
}
if (isNaN(hoursPerDay) || hoursPerDay <= 0) {
alert("Please enter valid Hours Per Day.");
return;
}
// Calculations
var dailyRate = annualSalary / contractDays;
var hourlyRate = dailyRate / hoursPerDay;
var grossPerCheck = annualSalary / payPeriods;
// Pension Calc
var pensionDeductionAnnual = annualSalary * pensionRate;
var pensionDeductionPerCheck = pensionDeductionAnnual / payPeriods;
var netPreTaxCheck = grossPerCheck – pensionDeductionPerCheck;
// Display Results
document.getElementById('resBiWeekly').innerHTML = formatCurrency(grossPerCheck);
document.getElementById('resDailyRate').innerHTML = formatCurrency(dailyRate);
document.getElementById('resHourlyRate').innerHTML = formatCurrency(hourlyRate);
document.getElementById('resPension').innerHTML = formatCurrency(pensionDeductionPerCheck);
document.getElementById('resNetPreTax').innerHTML = formatCurrency(netPreTaxCheck);
// Show Results Section
document.getElementById('resultsArea').style.display = "block";
}
function formatCurrency(num) {
return "$" + num.toFixed(2).replace(/\d(?=(\d{3})+\.)/g, '$&,');
}