Simple savings calculator
Open with 1,000, add 100 every month at 5% interest and after 10 years the account holds 17,175.24, including 4,175.24 of interest. The horizon is counted in whole years, so every statement month is included. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Initial deposit
- 1,000
- Monthly contribution
- 100
- Annual rate
- 5
- Years
- 10
- Months
- 120
- Monthly rate
- 0.0041666667
- Total deposited
- 13,000
- Interest earned
- 4,175.24
A simple savings calculator answers the household question that sits between an opening deposit and a calendar date: if this account starts with this amount, I add this much every month, and it earns this annual interest, what is the balance after this many years? Emergency funds, house down-payment pots, and rainy-day accounts all need that future figure before the first standing order is set up. This tool accepts the initial deposit, the fixed monthly contribution, the nominal annual interest rate as a percent, and a whole number of years, compounds that rate monthly, then returns the final balance together with how much was deposited and how much interest was earned.
How a savings balance grows with monthly deposits and compound interest
A savings-account future-value schedule is the household counterpart of a withdrawal plan: money enters the account every month, while existing principal keeps earning interest. The horizon in months n is years times twelve, and years must be a positive integer so the month count is a whole number of statement periods rather than a silent truncation of three-point-seven years into three. Each month the current balance is grown by one plus i and then increased by the monthly contribution C.
When the annual rate is zero there is no growth, so the final balance is simply the initial deposit P plus C times n. When the rate is positive the closed form is P times (1+i) to the n, plus C times ((1+i) to the n minus one) divided by i. That identity is the ordinary future value of a compound-interest account with level end-of-month deposits, the same recurrence a savings statement shows.
If the contribution is zero the account still compounds the opening deposit alone, which is a valid lump-sum savings question. The calculator does not model taxes, inflation, market returns, a changing contribution, a beginning-of-month annuity-due, or a bonus APY tier. It only answers what this cash pile becomes under a fixed monthly add and a stated annual rate over a whole number of years.
What you can do with it
Down-payment and emergency-fund planning
Enter the cash you already have, the amount you will add each month, the savings rate, and how many whole years you will wait, then read the future balance before you start the standing deposit.
Homework and compound-interest oracles
Students compute the future value of a savings account under monthly compounding with level end-of-month deposits and compare against a deterministic result that rejects a non-integer year count.
FAQ
What happens if years is not a positive integer?
Zero, fractions, negatives, and missing years are not billed, because the month count must be a whole number of statement periods.
Is the annual interest rate a percent or a decimal fraction?
A percent. Use 5 for five percent per year, not 0.05.
Are monthly contributions added at the beginning or the end of each month?
At the end of each month (ordinary annuity). Each period the current balance earns interest first, then the contribution is added, matching a typical savings statement.
What happens with a 0% interest rate?
There is no growth, so the balance is just the opening deposit plus every monthly addition. With 1,000 to start and 100 a month for 2 years, the 24 deposits simply sit on top of the opening 1,000.
Does the result include taxes, inflation or bonus rates?
No. It assumes one fixed monthly addition and one stated annual rate. Taxes, inflation, market returns, changing contributions and bonus interest tiers are left out of the calculation.
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/simple-savings \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"initial_deposit":1000,"monthly_contribution":100,"annual_rate":5,"years":10}'const res = await fetch("https://api.kit.forhosting.com/fin/simple-savings", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"initial_deposit": 1000,
"monthly_contribution": 100,
"annual_rate": 5,
"years": 10
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/simple-savings",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"initial_deposit": 1000,
"monthly_contribution": 100,
"annual_rate": 5,
"years": 10
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/simple-savings", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"initial_deposit":1000,"monthly_contribution":100,"annual_rate":5,"years":10}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"initial_deposit":1000,"monthly_contribution":100,"annual_rate":5,"years":10}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/simple-savings", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"initial_deposit": 1000,
"monthly_contribution": 100,
"annual_rate": 5,
"years": 10
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.simple_savings",
"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_abs | 1000000000000000 |
max_rate | 100 |
max_years | 100 |
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
Years that are not a positive integer are rejected as invalid_input rather than silently truncated. Successful calls are billed at $0.002; invalid input is not charged.
How a savings balance grows with monthly deposits and compound interest
Convert the quoted annual rate into a monthly rate i equal to annual_rate divided by one hundred and then by twelve.
Input contract, non-integer years, and the response shape
Example: one thousand opening, one hundred a month, a zero rate, and two years lands at three thousand four hundred, because twenty-four deposits of one hundred sit on top of the opening thousand with no growth. POST a JSON body with four required fields. initial_deposit is the opening amount in currency units and must be greater than or equal to zero; aliases principal, deposit, starting_balance, and initial are accepted so a statement row does not need a rename step. monthly_contribution is the amount added at the end of each month in the same currency and must be greater than or equal to zero; aliases monthly, contribution, pmt, and monthly_deposit are accepted. annual_rate is the nominal annual interest as a percent, compounded monthly—use 5 for five percent per year, not 0.05—and must be a finite number greater than or equal to zero and at most one hundred; aliases rate, interest_rate, annual_interest_rate, and apr are accepted. years is the hard product field: it must be a positive integer of whole years, at least one and at most one hundred. Zero, a fraction such as two-point-five, a negative count, a non-numeric string, or a missing years value fails with invalid_input naming the field and is not billed, because a partial year would pretend the last statement period had run when it had not. Missing amount fields, empty strings, non-finite values, a negative deposit or contribution, a negative rate, or a magnitude beyond the published limits also fail with invalid_input. On success the body echoes the four inputs, months, and monthly_rate, then returns total_deposited, interest_earned, and the primary final_balance rounded to cents. Prefer JSON numbers over currency-formatted strings. Pricing for a successful item is a flat $0.002.
Where a simple savings calculator earns its keep
People who search simple savings or savings calculator future value already know they want a final balance from an opening deposit, a monthly add, an annual rate, and a count of years, not months-to-goal arithmetic and not a drawdown clock. A down-payment planner uses it before setting a standing order: five years of one hundred a month on a one-thousand seed is a different picture once the account still pays a small annual rate. Emergency-fund builders, holiday pots, and certificate-to-savings rollovers all share the same four-field identity. Failed validation does not consume balance. Classroom consumer-math courses assign compound-interest worksheets and need an oracle that marks a non-integer year count as invalid_input. Automation pipelines call the same contract at $0.002 per successful item without standing up a spreadsheet service. Keep requests small, pin the cent-rounded final_balance in tests, and you get reproducible savings-growth arithmetic for homework, household planners, and lightweight budgeting webhooks without standing up a full wealth engine.
Integration use cases
Budgeting scripts and household planning
Call the same contract from a planner or a webhook so a holiday pot or certificate-rollover horizon matches the landing-page widget down to the cent.
Technical questions
How do I calculate the future balance of a savings account?
Send initial_deposit, monthly_contribution, annual_rate as a percent, and years as a positive integer. The API compounds the rate monthly and returns final_balance, plus total_deposited and interest_earned.
What does the simple savings calculator cost?
The browser tool is free. API requests use prepaid balance at $0.002 per successful call; invalid input is not billed.