SLA uptime credit calculator
This SLA uptime credit calculator turns a measured monthly uptime result into a clear service-credit amount.
Run — free
Enter the uptime percentage, the eligible monthly bill, and the credit schedule from the service agreement. The calculator identifies the applicable range, applies its credit percentage, and returns both the credit owed and the remaining bill after credit. It is useful for providers validating an incident adjustment and customers checking whether a proposed credit follows the written SLA.
Translate the SLA schedule into precise ranges
Start with the service-credit table in the signed agreement, not a marketing summary or status-page label. Enter each tier with a minimum uptime, maximum uptime, and credit percentage. The calculator treats the lower bound as inclusive and the upper bound as exclusive, except that an upper bound of 100 includes exactly 100 percent uptime. This convention lets adjacent ranges meet cleanly: a 99 to 99.9 tier covers 99.000 through values below 99.9, while a 99.9 to 100 tier begins at exactly 99.9. Do not create overlapping ranges, because one measurement would then produce two possible credits. You may leave gaps when the agreement genuinely leaves them, but a measured uptime in a gap produces an error rather than an invented result. Include a zero-credit range if the SLA expressly says that performance at or above a threshold earns no credit. Every uptime bound and credit percentage must remain between zero and 100, and each minimum must be lower than its maximum.
Use the correct uptime and eligible bill amount
Use the final measured uptime percentage for the billing month and service scope covered by the SLA. Providers may exclude announced maintenance, customer-caused outages, force-majeure events, or services outside the affected region, so the percentage used here should already reflect the agreement's measurement and exclusion rules. The monthly bill should likewise be the amount eligible for credit. Some contracts apply a credit only to the affected service, resource, region, or recurring fee, rather than the entire invoice. Enter that eligible amount as a non-negative number in your chosen currency; the calculator does not attach or convert a currency. It multiplies the eligible bill by the matched tier's credit percentage and rounds monetary results to two decimal places. The response preserves the input uptime and bill, reports the matched credit rate and tier bounds, calculates the credit owed, and shows the bill after credit. Because this is arithmetic rather than contract interpretation, confirm both source values before relying on the result.
Review the result and document the claim
After calculation, compare the matched tier with the exact wording of the agreement. The response states whether the maximum bound is inclusive, which is especially helpful at boundary values such as 99.9 or 100. Attach the underlying monitoring report, the relevant SLA table, the eligible charge calculation, and the returned credit amount to the claim or approval record. This creates a reproducible trail: another reviewer can submit the same three inputs and receive the same answer. The algorithm uses no network requests, current dates, random values, or hidden external data. It also refuses uptime outside zero to 100, invalid bill amounts, malformed tiers, overlaps, and measurements that no tier covers. Those errors are safeguards, not estimates. They prompt you to repair the schedule or inputs instead of silently selecting a convenient tier. The API costs $0.002 per request, while the browser execution can support quick manual checks. The result is a calculation aid and does not override notice deadlines, credit caps, claim procedures, or other contractual conditions.
What you can do with it
Validate a customer credit
Check that a proposed service credit uses the measured uptime, eligible monthly charge, and percentage stated in the SLA.
Prepare an outage claim
Calculate the requested amount and preserve the matched tier alongside monitoring evidence before submitting a claim.
Automate billing adjustments
Apply a controlled SLA schedule to monthly uptime results and pass the deterministic credit amount into a review workflow.
FAQ
How is the service credit calculated?
The eligible monthly bill is multiplied by the credit percentage from the single tier that covers the measured uptime, then rounded to two decimal places.
What happens when uptime is below zero or above 100 percent?
The calculator returns an invalid-input error because an uptime percentage outside zero through 100 is not valid.
How are tier boundaries handled?
Each minimum is inclusive and each maximum is exclusive, except a maximum of 100 includes exactly 100. This makes adjacent ranges deterministic.
What if no tier covers the measured uptime?
The calculator returns an error. Add the missing contractual range or correct the measurement instead of assuming a credit rate.
Can I enter the full invoice amount?
Only if the SLA makes the full invoice eligible. Many agreements limit credits to the affected service or recurring charge.
What does the API request cost?
Each API request costs $0.002. The result includes the credit owed and the bill remaining after that credit.
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/dev/server-uptime-sla-credit-calc \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"uptime_percentage":99.5,"monthly_bill":2500,"sla_tiers":[{"minimum_uptime":0,"maximum_uptime":99,"credit_percentage":25},{"minimum_uptime":99,"maximum_uptime":99.9,"credit_percentage":10},{"minimum_uptime":99.9,"maximum_uptime":100,"credit_percentage":0}]}'const res = await fetch("https://api.kit.forhosting.com/dev/server-uptime-sla-credit-calc", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"uptime_percentage": 99.5,
"monthly_bill": 2500,
"sla_tiers": [
{
"minimum_uptime": 0,
"maximum_uptime": 99,
"credit_percentage": 25
},
{
"minimum_uptime": 99,
"maximum_uptime": 99.9,
"credit_percentage": 10
},
{
"minimum_uptime": 99.9,
"maximum_uptime": 100,
"credit_percentage": 0
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/server-uptime-sla-credit-calc",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"uptime_percentage": 99.5,
"monthly_bill": 2500,
"sla_tiers": [
{
"minimum_uptime": 0,
"maximum_uptime": 99,
"credit_percentage": 25
},
{
"minimum_uptime": 99,
"maximum_uptime": 99.9,
"credit_percentage": 10
},
{
"minimum_uptime": 99.9,
"maximum_uptime": 100,
"credit_percentage": 0
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/server-uptime-sla-credit-calc", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"uptime_percentage":99.5,"monthly_bill":2500,"sla_tiers":[{"minimum_uptime":0,"maximum_uptime":99,"credit_percentage":25},{"minimum_uptime":99,"maximum_uptime":99.9,"credit_percentage":10},{"minimum_uptime":99.9,"maximum_uptime":100,"credit_percentage":0}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"uptime_percentage":99.5,"monthly_bill":2500,"sla_tiers":[{"minimum_uptime":0,"maximum_uptime":99,"credit_percentage":25},{"minimum_uptime":99,"maximum_uptime":99.9,"credit_percentage":10},{"minimum_uptime":99.9,"maximum_uptime":100,"credit_percentage":0}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/server-uptime-sla-credit-calc", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"uptime_percentage": 99.5,
"monthly_bill": 2500,
"sla_tiers": [
{
"minimum_uptime": 0,
"maximum_uptime": 99,
"credit_percentage": 25
},
{
"minimum_uptime": 99,
"maximum_uptime": 99.9,
"credit_percentage": 10
},
{
"minimum_uptime": 99.9,
"maximum_uptime": 100,
"credit_percentage": 0
}
]
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.server_uptime_sla_credit_calc",
"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. |