Indexmiete Rechner, VPI Berechnung, Indexmietvertrag erklärt | agsLutz
Kostenfrei, schnell, nachvollziehbar

Indexmiete Rechner, Miete nach VPI korrekt berechnen

Berechnen Sie Ihre Indexmiete transparent nach § 557b BGB. Sie erhalten Index alt, Index neu, prozentuale Veränderung sowie die neue Nettokaltmiete, inklusive Hinweisen zu typischen Fallstricken.

  • Offizielle VPI Grundlage, Basis 2020 = 100
  • Berechnung der Nettokaltmiete (Indexmiete gem. § 557b BGB)
  • PDF Ausgabe möglich, ideal für Dokumentation
Ratgeber

Was ist eine Indexmiete?

Die Indexmiete ist eine Form der Mietanpassung, bei der sich die Miethöhe am Verbraucherpreisindex (VPI) orientiert. Grundlage ist § 557b BGB. Steigt der Index, kann die Miete entsprechend angepasst werden, maßgeblich ist der im Mietvertrag vereinbarte Ausgangsindex.

Voraussetzungen für eine wirksame Anpassung

Die Indexmiete muss im Mietvertrag vereinbart sein, zwischen zwei Anpassungen müssen grundsätzlich mindestens zwölf Monate liegen, die Erhöhung muss in Textform mit nachvollziehbarer Berechnung mitgeteilt werden.

Wichtig: Maßgeblich ist immer der Indexmonat, der im Mietvertrag als Ausgangspunkt festgelegt ist. Eine Berechnung mit falschem Ausgangsindex kann die Mieterhöhung unwirksam machen.
Berechnung

So funktioniert die Indexmiete Berechnung

Die Berechnung folgt einer festen Logik: Neue Miete ergibt sich aus der alten Miete multipliziert mit dem Verhältnis aus Index neu und Index alt.

Neue Miete = Alte Miete × (Index neu ÷ Index alt)
Tipp: Verwenden Sie für „Index alt“ den Indexmonat der letzten wirksamen Anpassung, bzw. den Mietbeginn, sofern seitdem keine Anpassung erfolgt ist.
Alte Miete
900,00 €
Index alt
107,5
Index neu
110,2
Neue Miete
923,06 €

Beispielwerte dienen der Veranschaulichung. Für die tatsächliche Berechnung nutzen Sie den Rechner oben, Quelle: Statistisches Bundesamt (Destatis), Irrtum vorbehalten.

Praxis

Häufige Fehler bei Indexmietverträgen

In der Praxis sind viele Anpassungen angreifbar, nicht wegen der Mathematik, sondern wegen falscher Indexmonate, Fristen oder Formulierungen.

Falscher Indexmonat

Der Ausgangsindex entspricht dem im Mietvertrag festgelegten Indexmonat bzw. dem Monat der letzten wirksamen Indexanpassung.

Zwölfmonatsfrist nicht beachtet

Zwischen zwei Anpassungen muss die Miete grundsätzlich mindestens zwölf Monate unverändert bleiben.

Formfehler im Schreiben

Ohne klare Berechnung und Textform ist die Anpassung häufig unwirksam.

Verwechslung mit Mietspiegel

Indexmiete folgt dem VPI, nicht der ortsüblichen Vergleichsmiete.

Entlastung

Indexmiete berechnen ist der Anfang, Mietverwaltung ist die Realität

Neben der Berechnung entstehen laufend Aufgaben wie Fristenüberwachung, Mieterkommunikation, rechtssichere Schreiben, Instandhaltung und Dokumentation. Viele Eigentümer wählen deshalb eine SEV Verwaltung, also die professionelle Verwaltung der eigenen Einheit, unabhängig von der WEG Verwaltung.

Was umfasst eine SEV Verwaltung typischerweise?

Ansprechpartner für Mieter, Mieterhöhungen und Indexanpassungen, Koordination von Handwerkern, Dokumentation und Reporting, strukturierte Kommunikation und klare Prozesse.

Regional vor Ort

Betreuung in Stuttgart, Tübingen, Reutlingen und Konstanz, mit Kenntnis lokaler Marktbedingungen und Vermietungspraxis.

FAQ

Häufige Fragen zur Indexmiete

Wie berechnet man die Indexmiete korrekt?

Neue Miete = Alte Miete × (Index neu ÷ Index alt). Verwenden Sie als Ausgangsindex den im Mietvertrag maßgeblichen Indexmonat, bzw. den Indexmonat der letzten wirksamen Anpassung.

Welche Frist gilt bei der Indexmiete?

Zwischen zwei Anpassungen muss die Miete grundsätzlich mindestens zwölf Monate unverändert bleiben. Die Mitteilung muss in Textform erfolgen und die Berechnung muss nachvollziehbar sein.

Darf ich statt Indexmiete auch Mietspiegel ansetzen?

Bei einem Indexmietvertrag wird die Anpassung über den Verbraucherpreisindex vorgenommen. Eine Vermischung mit Mietspiegel oder Vergleichsmiete ist in der Regel nicht zulässig.

Was ist SEV Verwaltung?

SEV Verwaltung (Sondereigentumsverwaltung) ist die professionelle Mietverwaltung Ihrer Eigentumswohnung, unabhängig von der WEG Verwaltung. Typische Themen sind Mieterkommunikation, Mieterhöhungen, Instandhaltung und Dokumentation.

Kostenlos

Kostenlose Erstprüfung für Vermieter

Sie haben einen Indexmietvertrag oder wollen die Verwaltung Ihrer Einheit abgeben? Wir prüfen unverbindlich Mietvertrag, Indexklausel und den bisherigen Verlauf, danach erhalten Sie eine klare Empfehlung für das weitere Vorgehen.

Hinweis: Diese Seite ersetzt keine Rechtsberatung, Irrtum vorbehalten. Quelle: Statistisches Bundesamt (Destatis).

Indexmiete Berechnung

Erstellt am ${today}
${logoHtml}
Beginn / letzte Anpassung
${payload.startLabel}
Berechnung bis
${payload.endLabel}
Index alt
${payload.oldIndex}
Index neu
${payload.newIndex}
Änderung
${payload.pct}
Formel
alte Miete × (Index neu ÷ Index alt)
Derzeitige Miete
${payload.rentOld}
Neue Miete
${payload.rentNew}
Erhöhung
${payload.delta}
${payload.note}
`.trim(); const w = window.open("", "_blank"); if (!w) { showError("PDF Ansicht konnte nicht geöffnet werden. Bitte Popups erlauben."); return; } w.document.open(); w.document.write(html); w.document.close(); w.onload = function () { w.focus(); w.print(); }; } function refreshMonthAvailability(yearSelectId, monthSelectId) { const y = Number(el(yearSelectId).value); const monthSel = el(monthSelectId); const row = VPI_DATA[y] || []; Array.from(monthSel.options).forEach((opt) => { const m = Number(opt.value); const v = row[m - 1]; const ok = typeof v === "number" && isFinite(v) && v > 0; opt.disabled = !ok; }); const current = monthSel.options[monthSel.selectedIndex]; if (current && current.disabled) { for (let i = monthSel.options.length - 1; i >= 0; i--) { if (!monthSel.options[i].disabled) { monthSel.selectedIndex = i; break; } } } } async function init() { disableUI(true); setLoading(true); clearError(); clearWarning(); hideResult(); try { fillYearSelect(el("startYear")); fillYearSelect(el("endYear")); fillMonthSelect(el("startMonth")); fillMonthSelect(el("endMonth")); const endY = 2025; const endM = 11; const startGuess = subtractMonths(endY, endM, 12); el("startYear").value = String(startGuess.year); el("startMonth").value = String(startGuess.month); el("endYear").value = String(endY); el("endMonth").value = String(endM); refreshMonthAvailability("startYear", "startMonth"); refreshMonthAvailability("endYear", "endMonth"); updateBaseYearHint(); el("startYear").addEventListener("change", function () { updateBaseYearHint(); refreshMonthAvailability("startYear", "startMonth"); }); el("startMonth").addEventListener("change", updateBaseYearHint); el("endYear").addEventListener("change", function () { refreshMonthAvailability("endYear", "endMonth"); }); el("btnReset").addEventListener("click", function () { clearError(); clearWarning(); hideResult(); el("rent").value = ""; el("btnPdf").disabled = true; el("startYear").value = String(startGuess.year); el("startMonth").value = String(startGuess.month); el("endYear").value = String(endY); el("endMonth").value = String(endM); refreshMonthAvailability("startYear", "startMonth"); refreshMonthAvailability("endYear", "endMonth"); updateBaseYearHint(); }); el("btnCalc").addEventListener("click", async function () { clearError(); clearWarning(); hideResult(); el("btnPdf").disabled = true; const rentRaw = String(el("rent").value || "").trim(); const rent = Number(rentRaw.replace(",", ".")); if (!isFinite(rent) || rent <= 0) { showError("Bitte eine gültige Miete eingeben."); return; } let sY = Number(el("startYear").value); let sM = Number(el("startMonth").value); let eY = Number(el("endYear").value); let eM = Number(el("endMonth").value); const clampedEnd = clampToAvailEnd(eY, eM); eY = clampedEnd.year; eM = clampedEnd.month; el("endYear").value = String(eY); el("endMonth").value = String(eM); refreshMonthAvailability("endYear", "endMonth"); if (ymKey(eY, eM) < ymKey(sY, sM)) { showError("Der Endzeitpunkt darf nicht vor dem Startzeitpunkt liegen."); return; } try { setLoading(true); const oldHit = fetchIndexNearest(sY, sM, 60); const newHit = fetchIndexNearest(eY, eM, 60); if (ymKey(newHit.year, newHit.month) < ymKey(oldHit.year, oldHit.month)) { showError("Der verfügbare End Index liegt vor dem verfügbaren Start Index. Bitte Zeitraum anpassen."); return; } const oldIndex = oldHit.index; const newIndex = newHit.index; sY = oldHit.year; sM = oldHit.month; eY = newHit.year; eM = newHit.month; const factor = newIndex / oldIndex; const pct = (factor - 1) * 100; const newRent = Math.round(rent * factor * 100) / 100; const delta = Math.round((newRent - rent) * 100) / 100; el("kpiOldIndex").textContent = toIndex(oldIndex); el("kpiNewIndex").textContent = toIndex(newIndex); el("kpiPct").textContent = toPct(pct); el("kpiRentOld").textContent = toMoneyEUR(rent); el("kpiRentNew").textContent = toMoneyEUR(newRent); el("kpiDelta").textContent = toMoneyEUR(delta); const warnings = buildComplianceWarnings(sY, sM, eY, eM, oldIndex, newIndex); const noteLines = []; noteLines.push("Formel: neue Miete = alte Miete × (Index neu ÷ Index alt)."); noteLines.push(""); if (oldHit.steppedBack > 0 || newHit.steppedBack > 0) { noteLines.push( "Hinweis: Für den gewählten Monat lagen ggf. noch keine Werte vor, es wurde automatisch auf den zuletzt verfügbaren Indexmonat zurückgegriffen." ); noteLines.push("Verwendeter Start: " + labelYM(sY, sM)); noteLines.push("Verwendetes Ende: " + labelYM(eY, eM)); noteLines.push(""); } noteLines.push("Hinweise:"); warnings.forEach((x) => noteLines.push("• " + x)); el("resultNote").textContent = noteLines.join("\n"); showResult(); el("btnPdf").disabled = false; el("btnPdf").onclick = function () { openPdfPrintView({ startLabel: labelYM(sY, sM), endLabel: labelYM(eY, eM), oldIndex: toIndex(oldIndex), newIndex: toIndex(newIndex), pct: toPct(pct), rentOld: toMoneyEUR(rent), rentNew: toMoneyEUR(newRent), delta: toMoneyEUR(delta), note: noteLines.join("\n") }); }; } catch (e) { showError("Indexwerte konnten nicht geladen werden. Details: " + (e && e.message ? e.message : String(e))); } finally { setLoading(false); } }); disableUI(false); } catch (e) { showError("Initialisierung fehlgeschlagen. Details: " + (e && e.message ? e.message : String(e))); } finally { setLoading(false); } } init(); })();