Year-over-year growth calculator
A rise from 100 last year to 112 this year is 12% year-over-year growth, given straight as a percent rather than 0.12. Enter last year's and this year's figures in the same units. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Previous value
- 100
- Current value
- 112
- Change
- 12
- Growth percent
- 12
- Direction
- growth
Year-over-year growth is the relative change of a quantity from one year to the next, stated as a percentage of last year’s value. Founders, analysts, investors, journalists, and students recover that rate from two numbers they already have: the previous year’s figure and the current year’s figure. Subtract the previous value from the current value, divide by the previous value, and multiply by one hundred. This year-over-year growth calculator applies that identity and returns the growth percentage, so a move from one hundred to one hundred twelve prints twelve rather than the decimal 0.12. It does not annualize a multi-year gap, does not compound, and does not fetch official series.
What year-over-year growth means and how the percent is defined
The year-over-year growth rate is the relative change of a measured quantity between two consecutive years. Returning the percentage keeps the contract honest for dashboards, board packs, and search traffic that already expect a year-over-year percent rather than a 0.12 fraction. A later value above the earlier value is growth; a later value below the earlier value is decline; identical values mean the quantity was unchanged on this measure.
The previous value is the denominator, so it cannot be zero: dividing by zero is undefined, and this calculator rejects that case instead of returning Infinity or NaN. Current value may sit above, equal to, or below previous value, including zero, because a collapse of measured activity is a real decline of one hundred percent. This tool does not annualize a multi-year gap, does not convert a decimal into a percent after the fact, does not compound, and does not fetch official numbers from a statistical office.
It evaluates the closed form on the two numbers you already have from a spreadsheet, a 10-K, a classroom problem, or a dashboard. It is not a GDP-specific growth rate that returns a decimal, and it is not a compound annual growth rate over n years: those are different searches and different jobs.
What you can do with it
Revenue and KPI board packs
Turn last year’s revenue, bookings, or active users and this year’s print into the year-over-year percent a board pack or lender memo can quote.
Classroom and homework oracles
Generate reproducible year-over-year answer keys that reject a zero previous year instead of printing Infinity.
FAQ
Is the result a percent or a decimal?
A percent. A move from 100 to 112 returns 12. Do not multiply by 100 again unless you are converting a decimal from another tool.
What happens if last year's value is zero?
The calculation is refused. Growth is measured against last year's figure, and dividing by zero has no answer, so you get a clear rejection instead of an infinite percentage.
Can this year's value be lower than last year's?
Yes. A lower figure gives a negative percentage, a decline; an equal figure gives zero. Even a current value of zero is accepted and shows a decline of 100%.
Can I use it for growth over several years?
No. It compares two consecutive years only: it does not compound or spread a multi-year gap over each year. For that you need a compound annual growth rate, which is a different calculation.
Which figures can I compare year over year?
Any quantity measured the same way in both years, such as revenue, bookings or active users from a board pack, a filing or a homework problem. Both values must be in the same units.
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/year-over-year-growth \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"previous_value":100,"current_value":112}'const res = await fetch("https://api.kit.forhosting.com/fin/year-over-year-growth", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"previous_value": 100,
"current_value": 112
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/year-over-year-growth",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"previous_value": 100,
"current_value": 112
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/year-over-year-growth", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"previous_value":100,"current_value":112}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"previous_value":100,"current_value":112}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/year-over-year-growth", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"previous_value": 100,
"current_value": 112
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.year_over_year_growth",
"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. |
Technical notes
A previous value of zero is rejected with invalid_input because the rate is undefined.
What year-over-year growth means and how the percent is defined
If previous_value is last year’s figure and current_value is this year’s figure, the identity is growth_percent equals current_value minus previous_value, divided by previous_value, times one hundred. That result is a percentage, not a decimal: a rise from one hundred to one hundred twelve is twelve, which a journalist would quote as twelve percent without a further multiply.
Input contract, response shape, and error behaviour
The value must be a finite number and must not be zero. Failed validation does not consume balance. POST a JSON body with two required finite numbers in the same units. previous_value is last year’s figure and is the denominator of the growth rate; aliases previous, prior, last_year, year0, and previous_year_value are accepted so spreadsheets can keep familiar column names. If previous_value is missing, empty, infinite, or exactly zero, the task fails with invalid_input naming previous_value; a zero previous year is the contracted error and it is not billed. current_value is this year’s figure; aliases current, later, this_year, year1, and current_year_value map to the same field. It must be a finite number and may be higher, equal, or lower than last year’s print. Each field may arrive as a JSON number or a numeric string. On success the body echoes previous_value and current_value, returns change as current minus previous rounded half-up to ten decimal places, returns growth_percent as the percentage rounded half-up to ten decimal places, sets direction to growth, decline, or unchanged according to the sign of the percent, and includes a formula string restating the identity. Example: previous one hundred and current one hundred twelve yields growth_percent twelve, change twelve, and direction growth. Previous two hundred fifty thousand and current two hundred thousand yields growth_percent negative twenty and direction decline.
Where a year-over-year growth calculator earns its keep
Finance teams, founders, and classrooms use a year-over-year growth calculator when the question is how much a quantity changed from last year to this year, not how that quantity compounded over a longer horizon. Operators compare last year’s revenue, units, users, or traffic with this year’s print to brief a board or a lender. When you later need a multi-year compound rate, or a GDP-specific decimal, use those dedicated identities rather than stretching this two-print year-over-year contract. Product teams wire the same contract into dashboards so a founder who types two yearly totals sees the identical growth_percent the API will later return in a test suite. Keep requests small, pin the rounded growth_percent in tests, and you get reproducible year-over-year percentages for worksheets, LMS plugins, and edge workers without standing up a time-series client of your own.
Integration use cases
Dashboard and CI fixtures
Pin growth_percent in a spreadsheet check or a test suite so a pipeline and a browser widget never disagree on the rounded percent.
Technical questions
How do I calculate year-over-year growth from two yearly values?
Send finite numbers previous_value (non-zero) and current_value. The API returns growth_percent = (current_value − previous_value) / previous_value × 100, plus the absolute change and a direction label.
What happens if last year’s value is zero?
The task fails with invalid_input naming previous_value. Year-over-year growth is undefined when the previous year is zero, so the request is not billed.
Can this year’s value be lower than last year’s?
Yes. A later print below the earlier print is decline: growth_percent is negative and direction is decline. Equal prints return zero with direction unchanged.
What does the year-over-year growth calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.