Future Value of Ordinary Annuity Calculator
This future value of an ordinary annuity calculator shows how a sequence of equal deposits can grow when each payment is made at the end of a period and earns a fixed rate thereafter.
Run — free
Enter the payment amount, the interest rate for each payment period, and the number of payments. The result separates your total contributions from the interest earned, making it useful for savings plans, investment projections, reserve funds, and any cash-flow schedule with regular end-of-period deposits.
Understand what an ordinary annuity measures
An ordinary annuity is a stream of equal payments made at the end of consecutive periods. A monthly savings transfer completed on the final day of each month is a familiar example. Because the first payment remains invested for more periods than later payments, every deposit has a different amount of time to earn interest. The calculator combines those individual growth paths into one future value. It reports the payment amount and period count you supplied, the sum of all contributions, the interest earned above those contributions, and the final accumulated value. Timing matters: this calculation assumes no payment exists at the beginning of the first period. If deposits are instead made at the beginning of every period, the arrangement is an annuity due and its future value is higher when the rate is positive. Keep the payment interval and rate interval aligned. For monthly deposits, provide a monthly rate; for annual deposits, provide an annual rate. The calculator does not convert an annual percentage rate into a periodic rate automatically, so the rate entered should already describe one payment period.
How the future value is calculated
For a positive periodic rate, the calculator uses the standard ordinary-annuity factor: the payment multiplied by the quantity of one plus the periodic rate raised to the number of periods, minus one, divided by the periodic rate. The periodic rate is entered as a percentage and converted to decimal form for the calculation. When the rate is zero, division by the rate would be undefined, so the calculator correctly returns the payment multiplied by the number of periods. Internally, the implementation uses numerically stable logarithm and exponential functions to reduce avoidable floating-point error for small rates and long schedules. Monetary results are rounded only after the full calculation, using two decimal places by default; you can request between zero and ten decimal places. The contribution total is simply payment times periods, while interest earned is future value minus that contribution total. Results assume the rate stays fixed, every payment is identical and arrives on time, earned interest remains in the account, and there are no taxes, fees, missed deposits, withdrawals, or rate changes. Those assumptions make the output a projection, not a guarantee of investment performance.
Choose inputs and interpret the result
Start by deciding the exact interval represented by one period. Then enter the amount paid at the end of that interval, the effective interest rate for the same interval, and the total count of payments. For example, a ten-year plan with monthly deposits has 120 periods. If you know only an annual nominal rate, convert it according to the account's compounding convention before using a monthly schedule; simply dividing by twelve may or may not match the financial product's effective monthly rate. Compare the contribution total with the future value to see how much of the ending balance comes from deposits and how much comes from compounding. You can also rerun the calculation with conservative and optimistic rates to see how sensitive a long plan is to the assumed return. A large difference between scenarios is a reminder that forecasts become less certain over longer horizons. Use the optional decimal setting when reconciling another system, but remember that extra displayed precision does not make the assumptions more accurate. For budgeting, round the proposed payment to an amount you can reliably deposit, since consistent execution usually matters more than a theoretically precise payment that is frequently missed.
What you can do with it
Project a recurring savings plan
Estimate the balance produced by equal monthly or yearly deposits and separate deposited principal from compound growth.
Compare contribution schedules
Test different payment amounts, rates, or durations to understand which assumption most changes the ending value.
Model a business reserve fund
Forecast the accumulated value of regular end-of-period transfers into an interest-bearing reserve account.
FAQ
What does the calculation cost?
The browser calculator is free to run. An API request costs $0.002.
What is the difference between an ordinary annuity and an annuity due?
An ordinary annuity pays at the end of each period. An annuity due pays at the beginning, giving every payment one additional period of growth.
Should I enter an annual or monthly interest rate?
Enter the rate for one payment period. Monthly payments require a monthly periodic rate, while annual payments require an annual periodic rate.
What happens when the interest rate is zero?
The future value equals the payment multiplied by the number of periods, so interest earned is zero.
Does the result include an existing starting balance?
No. It values only the equal payment stream. Calculate any starting balance separately and add its future value if needed.
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/finance/future-value-annuity-ordinary \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"payment":500,"periodic_rate_percent":0.5,"periods":120}'const res = await fetch("https://api.kit.forhosting.com/finance/future-value-annuity-ordinary", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"payment": 500,
"periodic_rate_percent": 0.5,
"periods": 120
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/finance/future-value-annuity-ordinary",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"payment": 500,
"periodic_rate_percent": 0.5,
"periods": 120
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/finance/future-value-annuity-ordinary", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"payment":500,"periodic_rate_percent":0.5,"periods":120}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"payment":500,"periodic_rate_percent":0.5,"periods":120}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/finance/future-value-annuity-ordinary", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"payment": 500,
"periodic_rate_percent": 0.5,
"periods": 120
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "finance.future_value_annuity_ordinary",
"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.
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. |