discount · savings · stacked · local

Calculate discounts and stacks

Single percent or sequential stacks of discounts. See savings, final price, and the difference between additive vs sequential application — entirely in your browser.

Discount Calculator
Original
100.00
input
Discount
25%
rate
Savings
25.00
off
Final
75.00
to pay
Mode
input · numbers

Single mode: final = original × (1 − discount/100).

output · result
You save
25.00
Final price
75.00
Formula
100.00 × (1 − 25/100)
Quick Start

How discounts stack

10% then 20% off is not 30% off — it's 28% off because the second discount applies to the already-reduced price.

  1. 01

    Pick mode

    Single percent or stack of multiple discounts.

    Inputs are treated as UTF-8 throughout the pipeline and validated client-side as you type — nothing dispatches until the value is well-formed.

    modeinpututf-8client-sidevalidated
    mode · textstack · set
    10, 15, 5
    loaded · parsedclient-side
  2. 02

    Enter price

    The original / list price.

    Each toggle re-computes through a memoised hook, so flipping options never resets your input and the UI stays snappy on large inputs.

    priceoptionslivememoisedtoggles
    price · memoised$100 · live
    $100.00
    options set · memoisedlive
  3. 03

    Enter discounts

    Single value or comma-separated stack.

    Randomness — where used — comes from crypto.getRandomValues, never Math.random. Heavy work sits in useMemo.

    pctcomputeinstantlocaldeterministic
    pct · instantstack · computed
    10, 15, 5
    computed · instantinstant
  4. 04

    Read both totals

    Additive sums percentages; sequential compounds. Sequential is usually the legal interpretation.

    Copy writes through navigator.clipboard and downloads use a Blob — zero network traffic. Same input plus same options always yield the same bytes.

    readcopydownloadzero-networkreproducible
    ok · copiedready · copied
    Copied
    shipped · ready to shipsuccess
Pro tips

Pro tips for everyday utilities

Reach for crypto.getRandomValues

Cryptographically random for IDs, tokens, salts. Math.random is for animation and games, not security.

Sort IDs lexicographically

UUID v4 has no time ordering. Use ULID or UUID v7 if you need sorted IDs.

Mock data with seeds

Faker-style libraries can be seeded so tests are reproducible. Embed the seed in the fixture file.

Reference cards beat memory

Cheatsheets for Vim, Git, Docker, Linux signals are faster than man pages when you’re mid-flow.

Browser APIs vary

Touch events, gamepads, and clipboard differ across vendors. Feature-detect before use.

Persist in the right place

localStorage for user preferences, sessionStorage for transient state, IndexedDB for structured data.

Use Cases

When to compute discounts

Sales, promo codes, B2B contracts.

Black Friday math

Compare 30% off vs 15+15 stack. Random values come from crypto.getRandomValues — cryptographically secure for tokens, salts, and session IDs. Math.random is deterministic enough for animations but predictable enough to be a security bug.

CSPRNG-backed

Coupon stacking

See what sequential codes really save you. Pair with hashids, ULID, or UUID v7 when you need both random and sortable — useful for primary keys, public-facing IDs, and event log ordering without a sequence column.

reproducible

B2B pricing

Volume + loyalty discounts compounded. Output is deterministic given the same seed, so fixtures and tests stay reproducible across CI runs and contributor machines. Embed the seed in the fixture file for full replay.

b2b

Margin checks

Verify deal margins before approval. Heavy work runs through useMemo so the UI stays snappy on large inputs. Same input + same options yields identical bytes — the kind of stability snapshot tests rely on.

feature-detected

Quote builders

Quick sanity check when sending quotes. Storage tools persist to the right backend: localStorage for user preferences, sessionStorage for transient state, IndexedDB for structured data. Pick the right shelf and quota worries disappear.

deterministic

Comparison shopping

Apples-to-apples final price across stores. Browser feature detection: clipboard, fullscreen, gamepad, and Web Bluetooth APIs gracefully fall back when unavailable. No surprise white screens on Safari or older Firefox.

production-ready
FAQ

Frequently asked questions

Additive sums the percents. Sequential applies each to the previous result. Sequential is mathematically correct for stacked discounts in most jurisdictions.
No. 20% then 20% = 36% off (sequential). Additive would say 40% off.
Additive caps at 100%. Sequential approaches but never quite hits 100%.
No — combine in your own logic. The calculator just shows the math.
Yes — all math is in your browser. Nothing is sent to a server.
Suggest a tool

Something missing?

Tell us what you need. We ship the top requests every two weeks.

Sent straight to the maintainers · no account needed
47 in queue·8 shipped this month
Request queued. Thanks!