TTM calculator
Quarters of 1,200,000, 1,350,000, 1,425,000 and 1,500,000 add up to a trailing twelve months total of 5,475,000. Paste four or more quarterly values, oldest first, and the last four are summed. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Quarters
- 1,200,000, 1,350,000, 1,425,000, 1,500,000
- Q1
- 1,200,000
- Q2
- 1,350,000
- Q3
- 1,425,000
- Q4
- 1,500,000
Trailing twelve months, or TTM, is the sum of a metric over the most recent four fiscal quarters. Analysts, lenders, and operator finance teams use that rolling year when a fiscal year-end is stale, when they need a comparable annual figure from the latest filings, and when they want one number that does not wait for the next annual report. This TTM calculator accepts at least four quarterly values — revenue, earnings, or any other additive line in one currency — keeps the last four, and returns their sum as the trailing twelve months total.
What trailing twelve months actually adds, and why four quarters
Trailing twelve months asks a narrow question: if you line up the last four reported quarters of one additive metric, what annual figure do those four print when you add them. The identity this calculator uses is ttm equals q1 plus q2 plus q3 plus q4, where those four values are the most recent quarters you send, in chronological order with the oldest of the four first.
Revenue is the usual line — four quarters of sales become TTM revenue — but the same sum is how TTM earnings, TTM operating income, TTM free cash flow, or TTM bookings are built when the metric is additive across quarters. Four is not a convention you can skip: a calendar year has four quarters, so a stub of two or three quarters is a year-to-date figure, not a trailing year, and annualizing it by multiplying would invent growth that the filings did not show.
A one million two hundred thousand first quarter, a one million three hundred fifty thousand second quarter, a one million four hundred twenty-five thousand third quarter, and a one million five hundred thousand fourth quarter print a TTM of five million four hundred seventy-five thousand because those four addends are the entire year. Zero is a legitimate quarter and is not an error: a dry season still belongs in the trailing year.
Negative values are accepted because a loss quarter still belongs in TTM earnings; the sum follows that sign instead of hiding behind an absolute value. If you send more than four quarters, only the last four are kept — that is the trailing window — so a six-quarter history of eight hundred, nine hundred, one thousand, one thousand one hundred, one thousand two hundred, and negative fifty prints TTM from the last four only.
This calculator does not multiply last month by twelve, does not apply a growth rate, does not convert currencies, and does not look up a live filing. You supply finite quarterly numbers that already share one metric and one currency; the calculator adds the trailing four and rounds the sum half-up to two decimal places so goldens compare byte-for-byte across runtimes. This is a four-quarter TTM sum, not an exit run rate, not a fiscal-year total that waits for year-end, and not a consensus estimate.
Where a TTM calculator earns its keep
Operators closing a quarter use a trailing twelve months calculator to turn the last four reported lines into one comparable annual figure before they open a full model or a board pack. Equity analysts re-run the same four fields when a new 10-Q lands, then pin ttm next to a multiple so every memo starts from a rolling year rather than from a stale fiscal year or from a single quarter that has not been annualized honestly.
Lenders and credit committees drop four quarters of revenue or EBITDA into the identity and compare that TTM with a covenant package that is written on a trailing-twelve-month basis, rather than treating year-to-date as a substitute. Investor-relations teams put the same TTM beside an exit run rate so a data room does not confuse last-month times twelve with the sum of the last four quarters.
This is a different search and a different job from exit ARR, from a fiscal-year total, from net revenue retention, and from a simple annualization of one quarter: those tools start from different lines and answer different questions. Failed validation does not consume balance. Keep at least four finite quarters, pin the rounded TTM in tests, and you get a reproducible trailing-year figure for teasers, LMS plugins, and edge workers without standing up a general ledger of your own.
What you can do with it
Quarterly close before the annual model
Turn the last four reported quarters of revenue or earnings into one TTM line before you open a full annual model or a board pack.
Analyst memos and rolling multiples
Pin trailing twelve months next to a valuation multiple so a memo shares one rolling year rather than a stale fiscal total or a single unscaled quarter.
Covenant packs versus year-to-date
Drop four quarters of the covenant metric into TTM so a credit file uses the trailing year the documents name, not a stub year-to-date figure.
FAQ
How is trailing twelve months (TTM) calculated?
ttm is q1 plus q2 plus q3 plus q4, the last four quarterly values you send in chronological order. The calculator also echoes those four addends and how many quarters you provided. The sum rounds half-up to two decimal places.
What happens if I send fewer than four quarterly values?
TTM is a four-quarter year; a stub of two or three quarters is year-to-date, not a trailing year. Those failures are not billed.
What if I send more than four quarters?
Only the last four are summed. More than eighty entries is rejected.
Can a quarter be zero or negative?
Yes. A dry quarter still belongs in TTM revenue, and a loss quarter still belongs in TTM earnings.
Which figures can I turn into a TTM total?
Any metric that adds up across quarters in one currency: revenue, earnings, operating income or bookings. Enter the four latest quarters of that one line and the sum is its trailing year.
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/ttm-trailing-twelve-months \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"quarters":[1200000,1350000,1425000,1500000]}'const res = await fetch("https://api.kit.forhosting.com/fin/ttm-trailing-twelve-months", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"quarters": [
1200000,
1350000,
1425000,
1500000
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/fin/ttm-trailing-twelve-months",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"quarters": [
1200000,
1350000,
1425000,
1500000
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/fin/ttm-trailing-twelve-months", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"quarters":[1200000,1350000,1425000,1500000]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"quarters":[1200000,1350000,1425000,1500000]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/fin/ttm-trailing-twelve-months", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"quarters": [
1200000,
1350000,
1425000,
1500000
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "fin.ttm_trailing_twelve_months",
"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 | 80 |
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
Fewer than four quarters is rejected with invalid_input rather than a silent annualization of a stub period.
Input contract, response shape, and error behaviour
At least four values are required. More than eighty entries fails so a pasted ledger cannot stall the isolate. Zero and negative quarters are allowed: a dry quarter or a loss still produces a finite TTM. Example: one million two hundred thousand, one million three hundred fifty thousand, one million four hundred twenty-five thousand, and one million five hundred thousand yield TTM of five million four hundred seventy-five thousand. POST a JSON body with one required field, quarters, as an array of finite numbers in chronological order, oldest first. Aliases quarterly, quarterly_values, values, q, and ttm_quarters map to the same list so a worksheet can keep its column name. Each entry may arrive as a JSON number or a numeric string; a comma-separated or whitespace-separated string is also accepted and split into the same list. If more than four are sent, the engine keeps only the last four as the trailing window and reports how many you provided in provided_count. Missing fields, empty strings, and non-finite values — NaN, Infinity, or text that does not parse as a number — fail with invalid_input naming the field. Those failures are not billed. Fewer than four quarterly values fails with invalid_input rather than multiplying a stub into a fake year. On success the body echoes the four trailing addends as q1, q2, q3, and q4 and as the quarters array, reports provided_count, returns ttm as their sum rounded half-up to two decimal places, and restates the identity in the formula field. Pair the JSON with your own rule for which line you summed — TTM revenue is not TTM earnings, and a quarterly booking figure is not net sales — because this endpoint adds the four numbers you send; it does not rebuild an income statement, choose a reporting convention, or look up a filing.
Technical questions
What does the TTM calculator cost?
The browser tool is free. API requests use prepaid KIT balance at $0.002 per successful call; invalid input is not billed.