Debt snowball calculator
Clear the smallest balance first and roll each freed minimum into the next: cards of 800 and 2500 plus a 5000 loan, with 200 extra a month, are all paid off in 18 months, the 800 card by month 4. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Extra payment
- 200
- Debt count
- 3
- Monthly budget
- 465
- Max months
- 600
- Total principal
- 8,300
The debt snowball method is a payoff plan that ranks every balance from smallest to largest so you can retire easy wins first while still covering every contractual minimum. Each month you pay the minimum on every open debt, then you send any extra cash to the smallest remaining principal. When that smallest account hits zero, its old minimum rolls onto the next smallest balance and the monthly attack payment grows like a snowball rolling downhill. This calculator accepts a list of debts with names, balances, and minimum payments, plus an optional extra payment, and returns the snowball payoff sequence together with the number of months needed to clear every balance. A negative balance is rejected as invalid input rather than silently treated as a credit.
How snowball ranking and the monthly cascade work
Debt snowball is a behavioral payoff rule, not an interest-minimizing rule. You list every open balance, sort from smallest principal to largest, and treat that ranking as the attack order. Ties keep the original input order so two equal balances stay stable across runs.
First the engine pays each still-open debt up to its contractual minimum, never more than the remaining principal. Whatever is left of the monthly budget is applied to the current snowball focus—the first debt in the original smallest-to-largest ranking that still has a positive balance. If that focus is paid off mid-month, leftover cash immediately cascades to the next ranked open debt in the same month, which is how a real household would reallocate a surplus rather than leaving money idle.
When a debt is retired, its minimum is not removed from the budget; it stays inside the constant monthly total and becomes extra firepower for the next target. The sister comparison of snowball versus avalanche with interest is a different calculator.
What you can do with it
Coaching and counseling sessions
Load a client’s cards and loans with statement balances and minimums, then show snowball payoff order and months to clear without requiring APR on every row.
FAQ
What is the debt snowball method?
Snowball ranks debts from smallest balance to largest, pays every minimum, and sends extra cash to the smallest remaining principal. When a debt is paid, its old minimum rolls onto the next smallest target.
How is payoff order chosen?
They often match, but a large minimum can retire a bigger debt earlier.
Does extra payment speed the snowball up?
Freed minimums also cascade, so each win accelerates the next.
What happens if a balance is negative?
A negative balance is not an open debt; the calculator rejects it instead of treating it as a credit. Failed validation is not billed.
Does the snowball calculator include interest?
No, interest is left out on purpose. It ranks and times the payoff from balances and minimum payments only, so you do not need the rate of every card. A comparison of snowball and avalanche with interest is a different calculator.
Related tools
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/fin/debt-snowball \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"debts":[{"name":"Card A","balance":2500,"min_payment":75},{"name":"Card B","balance":800,"min_payment":40},{"name":"Personal loan","balance":5000,"min_payment":150}]}'const res = await fetch("https://api.kit.forhosting.com/fin/debt-snowball", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"debts": [
{
"name": "Card A",
"balance": 2500,
"min_payment": 75
},
{
"name": "Card B",
"balance": 800,
"min_payment": 40
},
{
"name": "Personal loan",
"balance": 5000,
"min_payment": 150
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/debt-snowball",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"debts": [
{
"name": "Card A",
"balance": 2500,
"min_payment": 75
},
{
"name": "Card B",
"balance": 800,
"min_payment": 40
},
{
"name": "Personal loan",
"balance": 5000,
"min_payment": 150
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/debt-snowball", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"debts":[{"name":"Card A","balance":2500,"min_payment":75},{"name":"Card B","balance":800,"min_payment":40},{"name":"Personal loan","balance":5000,"min_payment":150}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"debts":[{"name":"Card A","balance":2500,"min_payment":75},{"name":"Card B","balance":800,"min_payment":40},{"name":"Personal loan","balance":5000,"min_payment":150}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/debt-snowball", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"debts": [
{
"name": "Card A",
"balance": 2500,
"min_payment": 75
},
{
"name": "Card B",
"balance": 800,
"min_payment": 40
},
{
"name": "Personal loan",
"balance": 5000,
"min_payment": 150
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.debt_snowball",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_items | 30 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |
Technical notes
How snowball ranking and the monthly cascade work
Every simulated month the total cash you send creditors is constant: the sum of all original minimum payments plus extra_payment. Interest is intentionally omitted: this endpoint ranks and times a principal-only snowball from balances and minimums, which is the search intent of people who want payoff order and months without APR.
Input contract, response fields, and failure modes
Optional decimals from zero to eight controls half-up rounding of currency-style outputs and defaults to two. Example: Card B at eight hundred with a forty minimum, Card A at twenty-five hundred with a seventy-five minimum, and a personal loan at five thousand with a one hundred fifty minimum, plus two hundred extra, produces a three-step snowball and a single months-to-payoff figure you can pin in tests. POST a JSON body with a required debts array of one to thirty objects. Each row needs a finite balance that is greater than zero and a finite min_payment that is greater than or equal to zero. A negative balance is invalid_input and is the explicit error this contract promises; a zero balance is also rejected because it is not an open debt. An optional name labels the debt in snowball_order, payoff_order, and the payoff table; omitted or blank names become Debt 1, Debt 2, and so on. Optional extra_payment defaults to zero and is the surplus beyond the sum of all original minimums. Optional max_months defaults to six hundred and is a safety cap from one to twelve hundred; if the principal-only schedule cannot finish inside that cap the request fails. On success the body includes debt_count, extra_payment, monthly_budget, max_months, total_principal, months, years, total_paid, snowball_order, payoff_order, a payoff array of name, balance, min_payment, month_paid, and sequence, plus a formula string. Missing debts, empty arrays, non-finite numbers, negative min_payment or extra_payment, out-of-range integers, a zero monthly budget, and schedules that cannot finish within max_months fail with invalid_input and are not billed.
Where a debt snowball API earns its keep
Many users know their balances and minimums from a statement but do not have a clean interest rate, so a principal-only snowball calculator matches how they actually plan. Education sites that rank for debt snowball calculator convert better when the free browser tool matches the automation path byte for byte on the same pure module. Treat the result as decision support, not legal or fiduciary advice: the tool does not model fees, deferred-interest promotions, variable rates, or tax deductibility—only a deterministic monthly principal cascade under a constant budget. Fintech onboarding flows can pre-fill debts from account links and return payoff_order plus months as a deterministic JSON contract for dashboards. Classroom modules can pin months and payoff_order against hand-worked cases that ignore interest on purpose. Sweep extra_payment in your own loop to show how one extra grocery-budget cut shortens the last month_paid. Keep max_months tight in interactive demos so an underfunded plan fails fast instead of looping.
Integration use cases
Household cash-flow planning
Sweep extra_payment to see how many months a grocery-budget cut or side-hustle surplus shaves off the last month_paid on the snowball plan.
Education pages and product sandboxes
Embed the free browser widget on debt snowball articles, or call the API from LMS graders and quote flows to pin payoff_order and months for scripted debt sets.
Technical questions
What does the debt snowball calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.