Markdown percentage calculator
Turn two price tags into a markdown percentage: an item cut from 80 to 60 is 25% off, with 20 taken off. It also works backwards, from the original price and a percentage to the sale price. Free in your browser.
- Free
- Runs in your browser
- No sign-up
- Your data stays on your device
Run — free
Worked example
- Original price
- 80
- Sale price
- 60
- Decimal places
- 2
- Calculation mode
- from_prices
- Markdown percent
- 25
- Amount off
- 20
Retail markdown % from prices or sale from %. Search intent: markdown percentage calculator. No network calls or random seeds are required. Failed jobs are not billed.
What a markdown percentage measures
A markdown is the cut a shop makes to a price, and its percentage tells shoppers and buyers how deep that cut is compared with the original tag. The calculation takes the difference between the original price and the sale price, divides it by the original price and multiplies by 100. An item reduced from 80 to 60 has 20 taken off, which is a markdown of 25%. The tool works in both directions: give it the two prices to get the percentage and the amount off, or give it the original price and the percentage to get the price to print on the sale tag.
Mistakes to avoid when marking down prices
The most common slip is dividing the amount off by the sale price instead of the original one, which gives a bigger percentage than the one on the sign. The base is always the price before the reduction. Another is rounding at every step: here rounding happens once, on the final figure, and only when you ask for a set number of decimals, so a column of prices stays consistent. The calculator also shows the prices you typed next to the result, so you can spot a typing slip at a glance before the new tags go out.
What you can do with it
Teaching
Pinned goldens.
FAQ
How do I calculate the markdown percentage between two prices?
Enter the original price and the sale price. The calculator subtracts one from the other, divides the gap by the original price and multiplies by 100, so a drop from 80 to 60 is a 25% markdown, with 20 off.
How do I work out the sale price from a percentage off?
Enter the original price and the markdown percentage instead of a sale price. The calculator takes that share off the original, so 80 with a 25% markdown gives a sale price of 60.
Why is the markdown based on the original price?
Because a markdown describes how much of the original tag was removed. Dividing the amount off by the sale price instead gives a higher percentage that does not match what the shopper sees on the sign.
How does the calculator round the markdown percentage?
It rounds only when you choose a number of decimals, and then just once, on the final figure, with halves rounded up. That keeps a list of tags consistent instead of drifting through rounded intermediate steps.
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/math/markdown-percent \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"original":80,"sale":60}'const res = await fetch("https://api.kit.forhosting.com/math/markdown-percent", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"original": 80,
"sale": 60
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/math/markdown-percent",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"original": 80,
"sale": 60
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/math/markdown-percent", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"original":80,"sale":60}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"original":80,"sale":60}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/math/markdown-percent", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"original": 80,
"sale": 60
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "math.markdown_percent",
"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
The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
How it works
Retail markdown % from prices or sale from %. markdown%=100×(original−sale)/original. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
Inputs, limits and rounding
Optional decimals use half-up once. Outputs echo inputs. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. Provide required JSON fields. Invalid types raise invalid_input. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
When to use it
Use when search intent matches. Retail markdown % from prices or sale from %. No network calls or random seeds are required. Failed jobs are not billed. No network calls or random seeds are required. Failed jobs are not billed. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos. The calculator is free in the browser, deterministic, and identical on the API path. Inputs are validated before arithmetic so invalid payloads fail with invalid_input. Half-up rounding is applied once from raw IEEE values when decimals are requested. Use the same JSON from spreadsheets, CMS, automation, or teaching demos.
Integration use cases
Quick check
Free widget.
Automation
Same JSON via API.
Technical questions
Free?
Yes tier A.
Network?
No.
Bad input?
invalid_input.
API?
Yes.
Locales?
EN-only; Nitro hydrates.