Calculate fair service pricing based on income equity
$
$
Income below which Min Fee applies
$
Income above which Max Fee applies
$
$
Maximum Income must be greater than Minimum Income.
Recommended Fee Per Session/Service
$0.00
Understanding Sliding Scale Pricing
A sliding scale is a flexible pricing model designed to make services accessible to people with different income levels. Unlike a tiered system which uses rigid steps, a linear sliding scale calculates a precise fee that is directly proportional to the client's income relative to a defined range.
This calculator uses a Linear Interpolation method. This ensures that a client earning slightly more than another client pays slightly more, rather than jumping up a large "bracket" step.
How the Formula Works
The fee is determined by where the client's income falls between your defined Minimum and Maximum income thresholds. This position is then applied to the fee range.
Fee = Min Fee + [(Income – Min Income) / (Max Income – Min Income)] × (Max Fee – Min Fee)
Logic Rules Used:
Below the Floor: If the client's income is less than or equal to the "Lower Income Limit", they pay the Minimum Fee.
Above the Ceiling: If the client's income is greater than or equal to the "Upper Income Limit", they pay the Maximum Fee.
In the Range: If the income is between the limits, the fee scales proportionally. For example, if their income is exactly halfway between the Min and Max limits, the fee will be exactly halfway between the Min and Max fees.
Why Use a Sliding Scale?
Sliding scales are commonly used by therapists, non-profits, legal aid clinics, and medical providers committed to economic justice. It allows providers to maintain a sustainable average rate while ensuring that lower-income clients are not priced out of essential services.
Example Calculation
Let's say a therapist sets their scale as follows:
Income Range: $30,000 to $90,000
Fee Range: $60 to $180
If a client earns $60,000 (exactly halfway between $30k and $90k), the calculator determines they are at the 50% mark of the income scale. Consequently, they pay the 50% mark of the fee scale: $120.
function validateInputs() {
var minInc = parseFloat(document.getElementById('minIncome').value);
var maxInc = parseFloat(document.getElementById('maxIncome').value);
var errBox = document.getElementById('errorBox');
if (!isNaN(minInc) && !isNaN(maxInc) && minInc >= maxInc) {
errBox.style.display = 'block';
errBox.innerHTML = "Error: Upper Income Limit must be higher than Lower Income Limit.";
return false;
} else {
errBox.style.display = 'none';
return true;
}
}
function calculateFee() {
// 1. Get DOM elements
var incomeInput = document.getElementById('clientIncome');
var minIncomeInput = document.getElementById('minIncome');
var maxIncomeInput = document.getElementById('maxIncome');
var minFeeInput = document.getElementById('minFee');
var maxFeeInput = document.getElementById('maxFee');
var resultArea = document.getElementById('result-area');
var finalFeeDisplay = document.getElementById('finalFeeDisplay');
var feePercentage = document.getElementById('feePercentage');
// 2. Parse values
var income = parseFloat(incomeInput.value);
var lowInc = parseFloat(minIncomeInput.value);
var highInc = parseFloat(maxIncomeInput.value);
var lowFee = parseFloat(minFeeInput.value);
var highFee = parseFloat(maxFeeInput.value);
// 3. Validation
if (isNaN(income) || isNaN(lowInc) || isNaN(highInc) || isNaN(lowFee) || isNaN(highFee)) {
alert("Please fill in all fields with valid numbers.");
return;
}
if (!validateInputs()) {
return;
}
// 4. Calculation Logic
var calculatedFee = 0;
var percentage = 0;
var note = "";
if (income = highInc) {
// Case 2: Income is above or at the ceiling
calculatedFee = highFee;
note = "(Client qualifies for the Maximum Fee)";
} else {
// Case 3: Sliding Scale Calculation (Linear Interpolation)
// Determine ratio (0 to 1) of income within the range
var incomeRange = highInc – lowInc;
var feeRange = highFee – lowFee;
var incomeOffset = income – lowInc;
var ratio = incomeOffset / incomeRange;
// Apply ratio to fee range
calculatedFee = lowFee + (ratio * feeRange);
percentage = Math.round(ratio * 100);
note = "(Based on income position at " + percentage + "% of the scale)";
}
// 5. Display Result
resultArea.style.display = 'block';
finalFeeDisplay.innerHTML = "$" + calculatedFee.toFixed(2);
feePercentage.innerHTML = note;
}