---
title: Tax calculator
url: "https://www.unknowngravity.com/en/calculadora-fiscalidad-security-tokens"
site: Unknown Gravity
published: "2026-06-23T14:55:51+00:00"
modified: "2026-06-23T15:18:34+00:00"
language: en-US
section: "Home > Tax calculator"
---

# Tax calculator

TOOLS · TAXATION · IRPF 2025

Calculate Spanish personal income tax (IRPF) on your security tokens: investment income, capital gains and the 2025 savings scale. Free indicative estimate.

Unknown Gravity · Taxation

## Security token tax calculator (Spanish IRPF)

Estimate the Spanish personal income tax (IRPF) on your security token income under the savings tax base: capital gains from a sale or investment income. A quick estimate before talking to our team.

This calculator estimates the Spanish personal income tax of an **individual who is a tax resident in Spain**. If the token is held by a company it pays corporate income tax, at a flat rate and outside the savings scale; if the holder is not resident in Spain, non-resident income tax applies. In those two cases the result below does not apply (Law 35/2006, BOE-A-2006-20764; Law 27/2014, BOE-A-2014-12328).

'; html += '

'; // Cifras destacadas html += '

'; html += '

'; html += '

Estimated IRPF due

'; html += '

' + escapeHtml(money(calc.total)) + '

'; html += '

On ' + escapeHtml(money(amount)) + ' of ' + (state.type === 'gain' ? 'gain' : 'income') + '

'; html += '

'; html += '

'; html += '

Average effective rate

'; html += '

' + escapeHtml(pct(avgRate)) + '

'; html += '

On this income

'; html += '

'; html += '

'; // Desglose por tramos html += '

Breakdown by bracket

'; html += '

'; for (var i = 0; i < calc.rows.length; i++) { var r = calc.rows[i]; var rateLabel = Math.round(r.rate * 100) + ' %'; var baseLabel = formatBracketLabel(r); html += '

'; html += '' + escapeHtml(rateLabel) + ''; html += '' + escapeHtml(baseLabel) + (r.used ? ' · ' + escapeHtml(money(r.taxable)) : '') + ''; html += '' + (r.used ? escapeHtml(money(r.cuota)) : '—') + ''; html += '

'; } // Total html += '

'; html += 'Total'; html += 'Average rate ' + escapeHtml(pct(avgRate)) + ''; html += '' + escapeHtml(money(calc.total)) + ''; html += '

'; html += '

'; // breakdown if (other > 0) { html += '

We have factored in **' + escapeHtml(money(other)) + '** of other savings income as a prior base, which is why this income starts being taxed in a higher bracket. Your total savings tax base for the year would come to **' + escapeHtml(money(calc.endBase)) + '**.

'; } else { html += '

The brackets apply marginally: each portion of the income is taxed at the rate of its bracket.

'; } // Marco aplicable html += '

'; html += '

' + ICON.scale + 'Applicable framework

'; html += '

Spanish IRPF savings tax base · Ley 35/2006 (LIRPF) · 2025 scale (Ley 7/2024)

'; html += '

'; // Aviso orientativo html += '

' + ICON.info + '

**Indicative** estimate. The savings tax base aggregates **all** savings income for the tax year (not just this one), so the actual bracket may vary. It does not include withholding tax already applied, possible loss offsets, or regional (autonomous community) specifics. Always confirm your case with a tax advisor.

'; html += '

'; // CTAs html += '

'; html += '[' + ICON.calendar + 'Talk to Unknown Gravity](' + MEETING_URL + ')'; html += '[' + 'Read: security token taxation in Spain' + ICON.arrowUpRight + '](' + ARTICLE_URL + ')'; html += '

'; // Recalcular html += ''; // Pie disclaimer html += '

' + ICON.info + 'Indicative only; not tax advice.

'; html += '

'; // body html += '

'; // result-card html += '

'; // result stageEl.innerHTML = html; bindResult(); } /* ---------- Render del caso pérdida ---------- */ function renderLoss(amount, typeName) { var negativo = -Math.abs(amount); var esGanancia = state.type === 'gain'; var html = ''; html += '

'; html += '

'; html += ''; html += '

'; html += '

'; html += '

'; html += '

Estimated IRPF due

'; html += '

' + escapeHtml(money(0)) + '

'; html += '

No tax is due on a ' + (esGanancia ? 'loss' : 'negative income') + '

'; html += '

'; html += '

'; html += '

' + (esGanancia ? 'Loss' : 'Negative balance') + '

'; html += '

' + escapeHtml(money(negativo)) + '

'; html += '

Available to offset

'; html += '

'; html += '

'; html += '

What this means

'; if (esGanancia) { html += '

A capital loss does not generate any tax due. It is included in the savings tax base and can **offset gains** from the same tax year; any remaining negative balance offsets up to **25%** of investment income, and whatever is left over carries forward to the **next 4 tax years**.

'; } else { html += '

Negative investment income does not generate any tax due. It offsets other investment income for the tax year and, if a negative balance remains, up to **25%** of the net capital gains balance; the rest carries forward to the **next 4 tax years**.

'; } // Marco aplicable html += '

'; html += '

' + ICON.scale + 'Applicable framework

'; html += '

Spanish IRPF savings tax base · Ley 35/2006 (LIRPF) · 2025 scale (Ley 7/2024)

'; html += '

'; html += '

' + ICON.info + '

**Indicative** estimate. Loss and negative balance offset rules have limits and deadlines; their effect depends on the rest of your savings income for the tax year. Always confirm your case with a tax advisor.

'; html += '

'; html += '

'; html += '[' + ICON.calendar + 'Talk to Unknown Gravity](' + MEETING_URL + ')'; html += '[' + 'Read: security token taxation in Spain' + ICON.arrowUpRight + '](' + ARTICLE_URL + ')'; html += '

'; html += ''; html += '

' + ICON.info + 'Indicative only; not tax advice.

'; html += '

'; stageEl.innerHTML = html; bindResult(); } /* ---------- Etiqueta legible del tramo ---------- */ function formatBracketLabel(r) { if (r.lower === 0) { return 'Up to ' + money0(6000); } if (r.limit === null) { return 'From ' + money0(r.lower); } return money0(r.lower) + ' – ' + money0(r.limit); } /* ---------- Bind del resultado ---------- */ function bindResult() { var restartBtn = stageEl.querySelector('[data-ugc-restart]'); if (restartBtn) { restartBtn.addEventListener('click', function () { transition(function () { stageEl.innerHTML = ''; }); // Devuelve el foco al primer campo del formulario amountInput.focus(); if (amountInput.scrollIntoView) { amountInput.scrollIntoView({ behavior: REDUCED ? 'auto' : 'smooth', block: 'center' }); } }); // preventScroll: el foco al botón de reinicio (al pie) arrastraba el viewport // móvil hasta el disclaimer; el usuario debe aterrizar en SU resultado. restartBtn.focus({ preventScroll: true }); if (stageEl.scrollIntoView) stageEl.scrollIntoView({ behavior: REDUCED ? 'auto' : 'smooth', block: 'start' }); } } /* ---------- Arranque ---------- */ syncTypeUI(); })();
