The Roemer Capital Valuation Calculator for your company
Get a transparent, data-driven estimate of your company value in just a few minutes — free of charge.
Written by:
<!-- Roemer Capital Valuation Calculator — embed -->
<div class="cal_class-container" id="roemer-calculator">
<style>
.cal_class-container { font-family: Inter, system-ui, -apple-system, Segoe UI, Roboto, Arial; max-width: 900px; margin: 0 auto; border: 1px solid #e5e7eb; border-radius: 14px; padding: 20px; background: #ffffff; box-shadow: 0 6px 24px rgba(0,0,0,.06); }
.cal_class-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin-bottom: 8px; flex-wrap: wrap; }
.cal_class-title { font-size: 22px; font-weight: 700; letter-spacing: .2px; }
.cal_class-step { margin-top: 18px; padding: 16px; border: 1px solid #eef2f7; border-radius: 12px; background: #fafbfc; }
.cal_class-step h3 { margin: 0 0 8px 0; font-size: 16px; }
.cal_class-field { display: grid; gap: 8px; margin: 12px 0; }
.cal_class-field.inline { grid-template-columns: 1fr 1fr; gap: 10px; }
.cal_class-row { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.cal_class-label { font-size: 13px; color: #334155; }
.cal_class-input, .cal_class-select, .cal_class-number { width: 100%; padding: 10px 12px; border: 1px solid #d1d5db; border-radius: 10px; background: #fff; font-size: 14px; }
.cal_class-input:focus, .cal_class-select:focus, .cal_class-number:focus, .cal_class-textarea:focus { outline: none; border-color: #6366f1; box-shadow: 0 0 0 3px rgba(99,102,241,.15); }
.cal_class-multi { display: flex; flex-wrap: wrap; gap: 8px; }
.cal_class-chip { border: 1px solid #e5e7eb; padding: 6px 10px; border-radius: 999px; background: #fff; cursor: pointer; font-size: 13px; }
.cal_class-chip.active { background: #eef2ff; border-color: #6366f1; color: #3730a3; }
.cal_class-actions { display: flex; gap: 10px; margin-top: 14px; }
.cal_class-btn { padding: 10px 14px; border: 1px solid #c7cfe3; border-radius: 10px; cursor: pointer; background: #111827; color: #fff; font-size: 14px; }
.cal_class-btn.secondary { background: #fff; color: #111827; }
.cal_class-btn:disabled { opacity: .5; cursor: not-allowed; }
.cal_class-hint { font-size: 12px; color: #64748b; }
.cal_class-divider { height: 1px; background: #eef2f7; margin: 16px 0; border-radius: 999px; }
.cal_class-grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.cal_class-note { font-size: 12px; color: #475569; background: #f8fafc; border: 1px dashed #e2e8f0; padding: 10px; border-radius: 10px; }
.cal_class-output { background: #0b1020; color: #e5e7eb; border-radius: 14px; padding: 18px; }
.cal_class-output h3 { color: #ffffff; }
.cal_class-badge { display: inline-block; background: #e0e7ff; color: #312e81; padding: 4px 8px; border-radius: 999px; font-size: 12px; margin-right: 8px; }
.cal_class-progress { white-space: nowrap; margin-right: 0; }
.cal_class-progressbar { height: 4px; background: #e5e7eb; border-radius: 999px; overflow: hidden; margin: 0 0 6px; }
.cal_class-progressbar-fill { height: 100%; width: 17%; background: #6366f1; border-radius: 999px; transition: width .25s ease; }
.cal_class-list { margin: 8px 0 0 16px; }
.cal_class-cta { margin-top: 12px; display: inline-block; background: #22c55e; color: #052e16; padding: 10px 14px; border-radius: 10px; text-decoration: none; font-weight: 600; }
.cal_class-error { color: #b91c1c; font-size: 13px; margin-top: 6px; }
.cal_class-hidden { display: none; }
.cal_class-flex { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.cal_class-small { font-size: 12px; color: #6b7280; }
@media (max-width: 720px) {
.cal_class-row, .cal_class-field.inline, .cal_class-grid-3 { grid-template-columns: 1fr; }
.cal_class-actions { flex-direction: column; }
}
</style>
<div class="cal_class-header">
<div class="cal_class-title" data-i18n="title">Roemer Capital Valuation Calculator</div>
<div class="cal_class-badge cal_class-progress" id="rcProgressText">Step 1 of 6 · 17%</div>
</div>
<div class="cal_class-progressbar" aria-hidden="true"><div class="cal_class-progressbar-fill" id="rcProgressFill"></div></div>
<div class="cal_class-step" data-step="1">
<h3 data-i18n="step1h">Step 1. Your contact details</h3>
<div class="cal_class-row">
<div class="cal_class-field">
<label class="cal_class-label" for="leadFirst" data-i18n="leadFirst">First name</label>
<input class="cal_class-input" id="leadFirst" type="text" autocomplete="given-name" data-i18n-ph="phLeadFirst" placeholder="e.g. Anna" required>
</div>
<div class="cal_class-field">
<label class="cal_class-label" for="leadLast" data-i18n="leadLast">Last name</label>
<input class="cal_class-input" id="leadLast" type="text" autocomplete="family-name" data-i18n-ph="phLeadLast" placeholder="e.g. Müller" required>
</div>
</div>
<div class="cal_class-row">
<div class="cal_class-field">
<label class="cal_class-label" for="leadPosition" data-i18n="leadPosition">Role</label>
<input class="cal_class-input" id="leadPosition" type="text" autocomplete="organization-title" data-i18n-ph="phLeadPosition" placeholder="e.g. Managing Director" required>
</div>
<div class="cal_class-field">
<label class="cal_class-label" for="leadCompany" data-i18n="leadCompany">Company</label>
<input class="cal_class-input" id="leadCompany" type="text" autocomplete="organization" data-i18n-ph="phLeadCompany" placeholder="e.g. Acme GmbH" required>
</div>
</div>
<div class="cal_class-row">
<div class="cal_class-field">
<label class="cal_class-label" for="leadEmail" data-i18n="leadEmail">Email</label>
<input class="cal_class-input" id="leadEmail" type="email" autocomplete="email" data-i18n-ph="phLeadEmail" placeholder="e.g. anna@acme.com" required>
</div>
<div class="cal_class-field">
<label class="cal_class-label" for="leadPhone" data-i18n="leadPhone">Phone</label>
<input class="cal_class-input" id="leadPhone" type="tel" autocomplete="tel" data-i18n-ph="phLeadPhone" placeholder="e.g. +49 170 1234567" required>
</div>
</div>
<div class="cal_class-small" data-i18n="leadLegal">By continuing, you agree to your details being processed so we can get in touch. See the privacy policy for details.</div>
<div class="cal_class-error cal_class-hidden" id="lead-error" data-i18n="leadError">Please fill in all fields with a valid email to continue.</div>
<div class="cal_class-actions">
<button class="cal_class-btn" data-next data-i18n="next">Next</button>
</div>
</div>
<div class="cal_class-step cal_class-hidden" data-step="2">
<h3 data-i18n="step2h">Step 2. What is this valuation for?</h3>
<div class="cal_class-multi" id="purpose">
<button class="cal_class-chip" data-value="Sale" data-i18n="purposeSale">Sale of the company</button>
<button class="cal_class-chip" data-value="Capital" data-i18n="purposeCapital">Capital raise</button>
<button class="cal_class-chip" data-value="Curiosity" data-i18n="purposeCuriosity">Just curious</button>
</div>
<div class="cal_class-hint" data-i18n="purposeHint">For context only. It does not change the calculation.</div>
<div class="cal_class-actions">
<button class="cal_class-btn" data-next data-i18n="next">Next</button>
</div>
</div>
<div class="cal_class-step cal_class-hidden" data-step="3">
<h3 data-i18n="step3h">Step 3. Select your company's sector</h3>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="sector">Sector</label>
<select class="cal_class-select" id="sector"></select>
<div class="cal_class-small" id="sector-info"></div>
</div>
<details class="cal_class-note">
<summary data-i18n="howUsed">How this is used</summary>
<span data-i18n="howUsedBody">The sector sets a starting revenue multiple that is adjusted by growth and quality factors. The range in the result uses the sector minimum and maximum multiples.</span>
</details>
<div class="cal_class-actions">
<button class="cal_class-btn secondary" data-prev data-i18n="back">Back</button>
<button class="cal_class-btn" data-next data-i18n="next">Next</button>
</div>
</div>
<div class="cal_class-step cal_class-hidden" data-step="4">
<h3 data-i18n="step4h">Step 4. Company details</h3>
<div class="cal_class-row">
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="founded">Year founded</label>
<input class="cal_class-number" id="founded" type="number" min="1900" max="2026" data-i18n-ph="phFounded" placeholder="e.g. 2019">
</div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="employees">Number of employees</label>
<input class="cal_class-number" id="employees" type="number" min="0" data-i18n-ph="phEmployees" placeholder="e.g. 24">
</div>
</div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="obstacles">What could slow growth?</label>
<div class="cal_class-multi" id="obstacles">
<button class="cal_class-chip" data-value="Distribution" data-i18n="obsDist">Distribution</button>
<button class="cal_class-chip" data-value="Product" data-i18n="obsProd">Product</button>
<button class="cal_class-chip" data-value="Competition" data-i18n="obsComp">Competition</button>
<button class="cal_class-chip" data-value="Technology" data-i18n="obsTech">Technology</button>
<button class="cal_class-chip" data-value="Other" data-i18n="obsOther">Other</button>
</div>
<div class="cal_class-hint" data-i18n="obsHint">More than two selections apply a 10 percent discount.</div>
</div>
<div class="cal_class-actions">
<button class="cal_class-btn secondary" data-prev data-i18n="back">Back</button>
<button class="cal_class-btn" data-next data-i18n="next">Next</button>
</div>
</div>
<div class="cal_class-step cal_class-hidden" data-step="5">
<h3 data-i18n="step5h">Step 5. Revenue and profitability</h3>
<div class="cal_class-note" data-i18n="revNote">Enter actual revenue for the last three years and an estimate for the current year. Use the same currency throughout.</div>
<div class="cal_class-grid-3">
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="rev3">Revenue 3 years ago</label>
<input class="cal_class-number" id="rev2022" type="number" min="0" step="0.01" data-i18n-ph="phRev3" placeholder="e.g. € 500000">
</div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="rev2">Revenue 2 years ago</label>
<input class="cal_class-number" id="rev2023" type="number" min="0" step="0.01" data-i18n-ph="phRev2" placeholder="e.g. € 850000">
</div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="rev1">Revenue last year</label>
<input class="cal_class-number" id="rev2024" type="number" min="0" step="0.01" data-i18n-ph="phRev1" placeholder="e.g. € 1200000">
</div>
</div>
<div class="cal_class-field" style="margin-top:8px;">
<label class="cal_class-label" data-i18n="rev0">Estimated revenue this year</label>
<input class="cal_class-number" id="rev2025" type="number" min="0" step="0.01" data-i18n-ph="phRev0" placeholder="e.g. € 1800000">
</div>
<div class="cal_class-divider"></div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="profitMetric">Profitability metric</label>
<select class="cal_class-select" id="profitMetric">
<option value="EBITDA" selected>EBITDA</option>
<option value="EBIT">EBIT</option>
<option value="Net" data-i18n="netProfit">Net profit</option>
</select>
<div class="cal_class-small" data-i18n="profitHint">Optional. If you leave profits empty, the Rule of 40 is skipped.</div>
</div>
<div class="cal_class-grid-3">
<div class="cal_class-field">
<label class="cal_class-label"><span id="pm2023">EBITDA</span><span data-i18n="sfx2"> 2 years ago</span></label>
<input class="cal_class-number" id="p2023" type="number" step="0.01" data-i18n-ph="phP3" placeholder="e.g. € 40000">
</div>
<div class="cal_class-field">
<label class="cal_class-label"><span id="pm2024">EBITDA</span><span data-i18n="sfx1"> last year</span></label>
<input class="cal_class-number" id="p2024" type="number" step="0.01" data-i18n-ph="phP4" placeholder="e.g. € 120000">
</div>
<div class="cal_class-field">
<label class="cal_class-label"><span id="pm2025">EBITDA</span><span data-i18n="sfx0"> this year</span></label>
<input class="cal_class-number" id="p2025" type="number" step="0.01" data-i18n-ph="phP5" placeholder="e.g. € 250000">
</div>
</div>
<div class="cal_class-field">
<label class="cal_class-label" id="ownerCostsLabel" data-i18n="owner">Owner costs to add back (this year)</label>
<input class="cal_class-number" id="ownerCosts" type="number" step="0.01" data-i18n-ph="phOwner" placeholder="e.g. € 60000">
<div class="cal_class-small" data-i18n="ownerHint">Added to this year's profit for the margin, because they can usually be removed after a transaction.</div>
</div>
<div class="cal_class-divider"></div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="revHow">How do you generate revenue?</label>
<div class="cal_class-multi" id="revModel">
<button class="cal_class-chip" data-value="Subscription" data-i18n="rmSub">Subscription</button>
<button class="cal_class-chip" data-value="Project" data-i18n="rmProj">Project</button>
<button class="cal_class-chip" data-value="Other" data-i18n="rmOther">Other</button>
</div>
</div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="custShare">Share of the top three customers in total revenue</label>
<select class="cal_class-select" id="custConc">
<option value="<30" data-i18n="ccLt30">under 30 percent</option>
<option value="30-50" data-i18n="cc3050">30 to 50 percent</option>
<option value=">50" data-i18n="ccGt50">over 50 percent</option>
</select>
</div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="capex">Investment need in the next 12 months</label>
<input class="cal_class-number" id="capexNeed" type="number" step="0.01" data-i18n-ph="phCapex" placeholder="optional">
</div>
<div class="cal_class-actions">
<button class="cal_class-btn secondary" data-prev data-i18n="back">Back</button>
<button class="cal_class-btn" data-next data-i18n="next">Next</button>
</div>
<div class="cal_class-error cal_class-hidden" id="rev-error" data-i18n="revError">Please enter last year's revenue and this year's estimate to continue.</div>
</div>
<div class="cal_class-step cal_class-hidden" data-step="6">
<h3 data-i18n="step6h">Step 6. Market position and resilience</h3>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="posLabel">Market position. Select all that apply.</label>
<div class="cal_class-multi" id="position">
<button class="cal_class-chip" data-value="Quality" data-i18n="posQual">Quality leader</button>
<button class="cal_class-chip" data-value="Price" data-i18n="posPrice">Price leader</button>
<button class="cal_class-chip" data-value="Technology" data-i18n="posTech">Technology leader</button>
<button class="cal_class-chip" data-value="Innovation" data-i18n="posInno">Innovation leader</button>
<button class="cal_class-chip" data-value="Other" data-i18n="posOther">Other</button>
</div>
</div>
<div class="cal_class-field">
<label class="cal_class-label" data-i18n="recLabel">How exposed are you to a recession?</label>
<select class="cal_class-select" id="recession">
<option value="Low" data-i18n="recLow">Low impact</option>
<option value="Medium" data-i18n="recMed">Medium</option>
<option value="Large" data-i18n="recHigh">High</option>
</select>
</div>
<div class="cal_class-actions">
<button class="cal_class-btn secondary" data-prev data-i18n="back">Back</button>
<button class="cal_class-btn" id="calcBtn" data-i18n="calc">Calculate valuation</button>
</div>
</div>
<div class="cal_class-step cal_class-hidden" data-step="7" id="resultStep">
<h3 data-i18n="resultH">Result</h3>
<div class="cal_class-output" id="resultBox"></div>
</div>
<script>
;(function(){
var box = document.getElementById('roemer-calculator')
if (!box) return
var currentYear = new Date().getFullYear()
var QSTEPS = 6
var de = false
var T
var euroCompact
var currentStepIdx = 0
var booted = false
var leadSent = false
var N8N_WEBHOOK = 'https://n8n.srv1441852.hstgr.cloud/webhook/rc-funnel'
var I18N = {
en: {
title: 'Roemer Capital Valuation Calculator',
progress: 'Step {x} of {y} · {z}%',
step1h: 'Step 1. Your contact details',
leadFirst: 'First name', leadLast: 'Last name', leadPosition: 'Role', leadCompany: 'Company',
leadEmail: 'Email', leadPhone: 'Phone',
phLeadFirst: 'e.g. Anna', phLeadLast: 'e.g. Müller', phLeadPosition: 'e.g. Managing Director',
phLeadCompany: 'e.g. Acme GmbH', phLeadEmail: 'e.g. anna@acme.com', phLeadPhone: 'e.g. +49 170 1234567',
leadError: 'Please fill in all fields with a valid email to continue.',
leadLegal: 'By continuing, you agree to your details being processed so we can get in touch. See the privacy policy for details.',
step2h: 'Step 2. What is this valuation for?',
purposeSale: 'Sale of the company', purposeCapital: 'Capital raise', purposeCuriosity: 'Just curious',
purposeHint: 'For context only. It does not change the calculation.',
next: 'Next', back: 'Back', calc: 'Calculate valuation',
step3h: "Step 3. Select your company's sector",
sector: 'Sector', ogDefault: 'Default', ogMore: 'More',
howUsed: 'How this is used',
howUsedBody: 'The sector sets a starting revenue multiple that is adjusted by growth and quality factors. The range in the result uses the sector minimum and maximum multiples.',
sectorInfo: 'Start multiple {b}x, range {min}x to {max}x, benchmark growth {g} percent.',
step4h: 'Step 4. Company details',
founded: 'Year founded', employees: 'Number of employees',
obstacles: 'What could slow growth?',
obsDist: 'Distribution', obsProd: 'Product', obsComp: 'Competition', obsTech: 'Technology', obsOther: 'Other',
obsHint: 'More than two selections apply a 10 percent discount.',
phFounded: 'e.g. 2019', phEmployees: 'e.g. 24',
step5h: 'Step 5. Revenue and profitability',
revNote: 'Enter actual revenue for the last three years and an estimate for the current year. Use the same currency throughout.',
rev3: 'Revenue 3 years ago', rev2: 'Revenue 2 years ago', rev1: 'Revenue last year', rev0: 'Estimated revenue this year',
profitMetric: 'Profitability metric',
profitHint: 'Optional. If you leave profits empty, the Rule of 40 is skipped.',
netProfit: 'Net profit',
sfx2: ' 2 years ago', sfx1: ' last year', sfx0: ' this year',
owner: 'Owner costs to add back (this year)',
ownerHint: "Added to this year's profit for the margin, because they can usually be removed after a transaction.",
revHow: 'How do you generate revenue?',
rmSub: 'Subscription', rmProj: 'Project', rmOther: 'Other',
custShare: 'Share of the top three customers in total revenue',
ccLt30: 'under 30 percent', cc3050: '30 to 50 percent', ccGt50: 'over 50 percent',
capex: 'Investment need in the next 12 months', phCapex: 'optional',
revError: "Please enter last year's revenue and this year's estimate to continue.",
phRev3: 'e.g. € 500000', phRev2: 'e.g. € 850000', phRev1: 'e.g. € 1200000', phRev0: 'e.g. € 1800000',
phP3: 'e.g. € 40000', phP4: 'e.g. € 120000', phP5: 'e.g. € 250000', phOwner: 'e.g. € 60000',
step6h: 'Step 6. Market position and resilience',
posLabel: 'Market position. Select all that apply.',
posQual: 'Quality leader', posPrice: 'Price leader', posTech: 'Technology leader', posInno: 'Innovation leader', posOther: 'Other',
recLabel: 'How exposed are you to a recession?',
recLow: 'Low impact', recMed: 'Medium', recHigh: 'High',
resultH: 'Result',
resTitle: 'Roemer Capital Valuation',
resSector: 'Sector {s}', resEmployees: 'Employees {n}', resFounded: 'Founded {n}',
na: 'n.a.', companyValue: 'Company value', centralEst: 'Central estimate', range: 'Range', rangeJoin: ' to ',
rangeHint: 'Based on sector minimum and maximum multiples with the same percentage adjustments',
adjustments: 'Adjustments applied',
cta: "Let's discuss your result. Book a free meeting", ctaHref: '/contact-us',
disclaimer: 'This is a high-level estimate for orientation only.',
baseLine: "Last year's revenue multiplied by sector multiple equals {m} × {x}x",
growthLine: 'Growth versus benchmark CAGR {c} percent versus {b} percent factor adjustment {a}',
growthSkip: 'Growth versus benchmark skipped because history is missing',
adjSub: 'Subscription model plus 15 percent', adjProj: 'Project model minus 10 percent',
adjCust3050: 'Customer concentration 30 to 50 percent minus 10 percent',
adjCust50: 'Customer concentration over 50 percent minus 20 percent',
adjObst: 'More than two growth obstacles minus 10 percent',
adjQual: 'Quality leader plus 10 percent', adjTech: 'Technology leader plus 15 percent',
adjInno: 'Innovation leader plus 15 percent', adjPrice: 'Price leader minus 10 percent',
adjRecLow: 'Low recession impact plus 5 percent', adjRecMed: 'Medium recession impact minus 5 percent',
adjRecHigh: 'Large recession impact minus 15 percent',
ruleLow: 'Rule of 40 under 30 minus 20 percent growth {g} percent margin {m} percent',
ruleMid: 'Rule of 40 30 to 40 neutral growth {g} percent margin {m} percent',
ruleGood: 'Rule of 40 40 to 60 plus 20 percent growth {g} percent margin {m} percent',
ruleHigh: 'Rule of 40 over 60 plus 40 percent growth {g} percent margin {m} percent'
},
de: {
title: 'Bewertungsrechner',
progress: 'Schritt {x} von {y} · {z}%',
step1h: 'Schritt 1. Deine Kontaktdaten',
leadFirst: 'Vorname', leadLast: 'Nachname', leadPosition: 'Position', leadCompany: 'Unternehmen',
leadEmail: 'E-Mail', leadPhone: 'Telefon',
phLeadFirst: 'z. B. Anna', phLeadLast: 'z. B. Müller', phLeadPosition: 'z. B. Geschäftsführer',
phLeadCompany: 'z. B. Acme GmbH', phLeadEmail: 'z. B. anna@acme.com', phLeadPhone: 'z. B. +49 170 1234567',
leadError: 'Bitte alle Felder mit gültiger E-Mail ausfüllen, um weiterzumachen.',
leadLegal: 'Mit dem Weitergehen stimmst du der Verarbeitung deiner Angaben zur Kontaktaufnahme zu. Details in der Datenschutzerklärung.',
step2h: 'Schritt 2. Wozu brauchst du die Bewertung?',
purposeSale: 'Verkauf des Unternehmens', purposeCapital: 'Kapitalerhöhung', purposeCuriosity: 'Nur aus Interesse',
purposeHint: 'Nur zur Einordnung. Fließt nicht in die Berechnung ein.',
next: 'Weiter', back: 'Zurück', calc: 'Bewertung berechnen',
step3h: 'Schritt 3. Branche wählen',
sector: 'Branche', ogDefault: 'Standard', ogMore: 'Weitere',
howUsed: 'So wird das verwendet',
howUsedBody: 'Die Branche setzt den Start-Umsatzmultiplikator. Wachstum und Qualität passen ihn an. Die Bandbreite nutzt Min- und Max-Multiple der Branche.',
sectorInfo: 'Startmultiple {b}x, Spanne {min}x bis {max}x, Benchmark-Wachstum {g} Prozent.',
step4h: 'Schritt 4. Unternehmensdaten',
founded: 'Gründungsjahr', employees: 'Mitarbeiterzahl',
obstacles: 'Was könnte das Wachstum bremsen?',
obsDist: 'Vertrieb', obsProd: 'Produkt', obsComp: 'Wettbewerb', obsTech: 'Technologie', obsOther: 'Sonstiges',
obsHint: 'Mehr als zwei Angaben: 10 Prozent Abschlag.',
phFounded: 'z. B. 2019', phEmployees: 'z. B. 24',
step5h: 'Schritt 5. Umsatz und Profitabilität',
revNote: 'Bitte die tatsächlichen Umsätze der letzten drei Jahre und eine Schätzung fürs laufende Jahr. Überall dieselbe Währung.',
rev3: 'Umsatz vor 3 Jahren', rev2: 'Umsatz vor 2 Jahren', rev1: 'Umsatz letztes Jahr', rev0: 'Schätzung Umsatz laufendes Jahr',
profitMetric: 'Profitabilitätskennzahl',
profitHint: 'Freiwillig. Ohne Gewinnangaben wird die Rule of 40 übersprungen.',
netProfit: 'Jahresüberschuss',
sfx2: ' vor 2 Jahren', sfx1: ' letztes Jahr', sfx0: ' laufendes Jahr',
owner: 'Gesellschafterkosten zum Hinzurechnen (laufendes Jahr)',
ownerHint: 'Fließen in die Marge ein, weil sie nach einer Transaktion oft entfallen.',
revHow: 'Wie entsteht der Umsatz?',
rmSub: 'Abo', rmProj: 'Projekt', rmOther: 'Sonstiges',
custShare: 'Anteil der Top-3-Kunden am Umsatz',
ccLt30: 'unter 30 Prozent', cc3050: '30 bis 50 Prozent', ccGt50: 'über 50 Prozent',
capex: 'Kapitalbedarf nächste 12 Monate', phCapex: 'falls vorhanden',
revError: 'Bitte Umsatz fürs letzte und das laufende Jahr angeben.',
phRev3: 'z. B. 500000 €', phRev2: 'z. B. 850000 €', phRev1: 'z. B. 1200000 €', phRev0: 'z. B. 1800000 €',
phP3: 'z. B. 40000 €', phP4: 'z. B. 120000 €', phP5: 'z. B. 250000 €', phOwner: 'z. B. 60000 €',
step6h: 'Schritt 6. Marktposition und Widerstandsfähigkeit',
posLabel: 'Marktposition. Alles Zutreffende auswählen.',
posQual: 'Qualitätsführer', posPrice: 'Preisführer', posTech: 'Technologieführer', posInno: 'Innovationsführer', posOther: 'Sonstiges',
recLabel: 'Wie stark trifft euch eine Rezession?',
recLow: 'Gering', recMed: 'Mittel', recHigh: 'Stark',
resultH: 'Ergebnis',
resTitle: 'Roemer Capital Bewertung',
resSector: 'Branche {s}', resEmployees: 'Mitarbeiter {n}', resFounded: 'Gegründet {n}',
na: 'k. A.', companyValue: 'Unternehmenswert', centralEst: 'Mittlere Schätzung', range: 'Bandbreite', rangeJoin: ' bis ',
rangeHint: 'Auf Basis der Branchen-Min- und Max-Multiples, gleiche Anpassungen.',
adjustments: 'Anpassungen',
cta: 'Lass uns das Ergebnis durchgehen. Kostenloses Gespräch buchen', ctaHref: '/de/contact-us',
disclaimer: 'Das ist eine grobe Schätzung zu Orientierungszwecken.',
baseLine: 'Umsatz letztes Jahr mal Branchenmultiple ergibt {m} × {x}x',
growthLine: 'Wachstum vs. Benchmark CAGR {c} Prozent vs. {b} Prozent Faktor {a}',
growthSkip: 'Wachstumsvergleich übersprungen, Historie fehlt',
adjSub: 'Abo-Modell plus 15 Prozent', adjProj: 'Projektmodell minus 10 Prozent',
adjCust3050: 'Kundenkonzentration 30 bis 50 Prozent minus 10 Prozent',
adjCust50: 'Kundenkonzentration über 50 Prozent minus 20 Prozent',
adjObst: 'Mehr als zwei Wachstumshemmer minus 10 Prozent',
adjQual: 'Qualitätsführer plus 10 Prozent', adjTech: 'Technologieführer plus 15 Prozent',
adjInno: 'Innovationsführer plus 15 Prozent', adjPrice: 'Preisführer minus 10 Prozent',
adjRecLow: 'Geringe Rezessionslast plus 5 Prozent', adjRecMed: 'Mittlere Rezessionslast minus 5 Prozent',
adjRecHigh: 'Starke Rezessionslast minus 15 Prozent',
ruleLow: 'Rule of 40 unter 30 minus 20 Prozent Wachstum {g} Prozent Marge {m} Prozent',
ruleMid: 'Rule of 40 von 30 bis 40 neutral Wachstum {g} Prozent Marge {m} Prozent',
ruleGood: 'Rule of 40 von 40 bis 60 plus 20 Prozent Wachstum {g} Prozent Marge {m} Prozent',
ruleHigh: 'Rule of 40 über 60 plus 40 Prozent Wachstum {g} Prozent Marge {m} Prozent'
}
}
function fill(s, map){
return String(s).replace(/\{(\w+)\}/g, function(_, k){ return map[k] != null ? map[k] : '' })
}
function detectDe(){
var html = document.documentElement
var lang = ((html.getAttribute('lang') || html.lang || '') + '').toLowerCase()
if (lang.indexOf('de') === 0) return true
var wfLoc = ((html.getAttribute('data-wf-locale') || '') + '').toLowerCase()
var wfCol = ((html.getAttribute('data-wf-collection') || '') + '').toLowerCase()
if (wfLoc.indexOf('de') !== -1 || wfCol.indexOf('de') !== -1) return true
var path = ((location && location.pathname) || '').toLowerCase()
if (path.indexOf('/de/') !== -1 || path === '/de' || path.indexOf('/de-') === 0) return true
var n = box.parentElement
while (n && n !== document.documentElement && n !== document.body) {
var l = ((n.getAttribute && n.getAttribute('lang')) || '').toLowerCase()
if (l.indexOf('de') === 0) return true
var dl = (
((n.getAttribute && n.getAttribute('data-wf-locale')) || '') + ' ' +
((n.getAttribute && n.getAttribute('data-locale')) || '') + ' ' +
((n.getAttribute && n.getAttribute('data-wf-collection')) || '') + ' ' +
(n.className || '')
).toLowerCase()
if (dl.indexOf('de') !== -1 && (l || dl.indexOf('locale') !== -1 || dl.indexOf('lang') !== -1 || (n.getAttribute && n.getAttribute('data-wf-locale')))) return true
n = n.parentElement
}
return false
}
var SECTORS = {
"SaaS": { base: 6, min: 4, max: 10, bench: 0.30 },
"FinTech": { base: 6, min: 5, max: 12, bench: 0.25 },
"Marketplace": { base: 5, min: 3, max: 7, bench: 0.20 },
"E-Commerce": { base: 2, min: 1, max: 3, bench: 0.15 },
"Digital Services": { base: 1.5, min: 1, max: 2.5, bench: 0.10 },
"AI / Machine Learning": { base: 7, min: 5, max: 15, bench: 0.35 },
"Healthcare / MedTech": { base: 4, min: 2, max: 8, bench: 0.20 },
"FoodTech / AgriTech": { base: 3, min: 2, max: 6, bench: 0.20 },
"Hardware / DeepTech": { base: 3, min: 2, max: 5, bench: 0.25 },
"Biotechnology": { base: 5, min: 3, max: 9, bench: 0.20 },
"Blockchain / Web3": { base: 6, min: 3, max: 12, bench: 0.30 },
"Logistics": { base: 2.5, min: 1.5, max: 4, bench: 0.12 },
"Energy & Environment": { base: 4, min: 2, max: 7, bench: 0.18 },
"Consumer & Retail": { base: 2, min: 1, max: 3, bench: 0.10 },
"Travel & Entertainment": { base: 2, min: 1, max: 3.5, bench: 0.12 },
"Media & Advertising": { base: 2.5, min: 1.5, max: 4, bench: 0.12 },
"Education / EdTech": { base: 3, min: 2, max: 5, bench: 0.18 },
"Automotive & Mobility": { base: 2.5, min: 1.5, max: 4, bench: 0.12 },
"Chemicals & Polymers": { base: 2, min: 1.5, max: 3.5, bench: 0.08 },
"Industrial / Manufacturing": { base: 2, min: 1.5, max: 3, bench: 0.08 },
"Building & Infrastructure": { base: 1.5, min: 1, max: 2.5, bench: 0.08 },
"Food & Beverage (classic)": { base: 2, min: 1.5, max: 3.5, bench: 0.10 }
}
var sectorSelect = document.getElementById('sector')
var steps = Array.from(box.querySelectorAll('.cal_class-step'))
var pm = document.getElementById('profitMetric')
function fillSectors(){
if (sectorSelect.options.length) return
var main = ["SaaS","FinTech","Marketplace","E-Commerce","Digital Services","AI / Machine Learning","Healthcare / MedTech","FoodTech / AgriTech"]
var more = ["Hardware / DeepTech","Biotechnology","Blockchain / Web3","Logistics","Energy & Environment","Consumer & Retail","Travel & Entertainment","Media & Advertising","Education / EdTech","Automotive & Mobility","Chemicals & Polymers","Industrial / Manufacturing","Building & Infrastructure","Food & Beverage (classic)"]
var optMain = document.createElement('optgroup'); optMain.label = 'Default'
var optMore = document.createElement('optgroup'); optMore.label = 'More'
main.forEach(function(k){ var o=document.createElement('option'); o.value=k; o.textContent=k; optMain.appendChild(o) })
more.forEach(function(k){ var o=document.createElement('option'); o.value=k; o.textContent=k; optMore.appendChild(o) })
sectorSelect.appendChild(optMain); sectorSelect.appendChild(optMore)
sectorSelect.value = 'SaaS'
}
function updateSectorInfo(){
var s = SECTORS[sectorSelect.value]
if (!s || !T) return
document.getElementById('sector-info').textContent = fill(T.sectorInfo, {
b: s.base.toFixed(1), min: s.min, max: s.max, g: (s.bench*100).toFixed(0)
})
}
function metricLabel(){
var v = pm.value
if (v === 'Net') return T.netProfit
if (v === 'EBIT') return 'EBIT'
return 'EBITDA'
}
function updatePmLabels(){
var lab = metricLabel()
;['pm2023','pm2024','pm2025'].forEach(function(id){
var el = document.getElementById(id)
if (el) el.textContent = lab
})
}
function updateProgress(){
if (!T) return
var isResult = currentStepIdx >= QSTEPS
var x = isResult ? QSTEPS : currentStepIdx + 1
var y = QSTEPS
var z = isResult ? 100 : Math.round((x / y) * 100)
var el = document.getElementById('rcProgressText')
if (el) el.textContent = fill(T.progress, { x: x, y: y, z: z })
var fillEl = document.getElementById('rcProgressFill')
if (fillEl) fillEl.style.width = z + '%'
}
function applyI18n(){
de = detectDe()
T = I18N[de ? 'de' : 'en']
euroCompact = new Intl.NumberFormat(de ? 'de-DE' : 'en-GB', { style: 'currency', currency: 'EUR', notation: 'compact', maximumFractionDigits: 2 })
box.querySelectorAll('[data-i18n]').forEach(function(el){
var k = el.getAttribute('data-i18n')
if (T[k] != null) el.textContent = T[k]
})
box.querySelectorAll('[data-i18n-ph]').forEach(function(el){
var k = el.getAttribute('data-i18n-ph')
if (T[k] != null) el.placeholder = T[k]
})
var groups = sectorSelect.querySelectorAll('optgroup')
if (groups[0]) groups[0].label = T.ogDefault
if (groups[1]) groups[1].label = T.ogMore
var fd = document.getElementById('founded')
if (fd) fd.max = String(currentYear)
updatePmLabels()
updateSectorInfo()
updateProgress()
}
function showStep(idx){
steps.forEach(function(el, i){ el.classList.toggle('cal_class-hidden', i !== idx) })
currentStepIdx = idx
updateProgress()
try { window.scrollTo({ top: box.offsetTop - 12, behavior: 'smooth' }) } catch(e) {}
}
function toggleChip(containerId, single){
var cont = document.getElementById(containerId)
cont.addEventListener('click', function(e){
var b = e.target.closest('.cal_class-chip'); if (!b) return
if (single) {
cont.querySelectorAll('.cal_class-chip').forEach(function(c){ c.classList.remove('active') })
b.classList.add('active')
} else {
b.classList.toggle('active')
}
})
}
function getChipValues(containerId){
return Array.from(document.getElementById(containerId).querySelectorAll('.cal_class-chip.active')).map(function(b){ return b.dataset.value })
}
function num(v){ var n = parseFloat(v); return isNaN(n) ? null : n }
function validateRevenues(){
var r24 = num(document.getElementById('rev2024').value)
var r25 = num(document.getElementById('rev2025').value)
return r24 !== null && r24 >= 0 && r25 !== null && r25 >= 0
}
function validateLead(){
var first = (document.getElementById('leadFirst').value || '').trim()
var last = (document.getElementById('leadLast').value || '').trim()
var position = (document.getElementById('leadPosition').value || '').trim()
var company = (document.getElementById('leadCompany').value || '').trim()
var email = (document.getElementById('leadEmail').value || '').trim()
var phone = (document.getElementById('leadPhone').value || '').trim()
var emailOk = /.+@.+\..+/.test(email)
return !!(first && last && position && company && phone && emailOk)
}
function submitLeadOnce(){
if (leadSent) return
leadSent = true
var vorname = (document.getElementById('leadFirst').value || '').trim()
var nachname = (document.getElementById('leadLast').value || '').trim()
var payload = {
name: (vorname + ' ' + nachname).trim(),
email: (document.getElementById('leadEmail').value || '').trim(),
firma: (document.getElementById('leadCompany').value || '').trim(),
telefon: (document.getElementById('leadPhone').value || '').trim(),
position: (document.getElementById('leadPosition').value || '').trim(),
vorname: vorname,
nachname: nachname,
quelle: 'bewertungsrechner',
locale: de ? 'de' : 'en',
page: (location && location.pathname) || '',
ts: new Date().toISOString()
}
try {
fetch(N8N_WEBHOOK, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
keepalive: true
}).catch(function(){})
} catch (e) {}
try {
var form = document.getElementById('rcValCapture') || document.getElementById('rcCapture');
if (form) {
var map = {
Name: payload.name,
'E-Mail': payload.email,
Firma: payload.firma,
Telefon: payload.telefon || '',
Position: payload.position || '',
Vorname: payload.vorname || '',
Nachname: payload.nachname || '',
Quelle: payload.quelle || 'bewertungsrechner',
Seite: payload.page || '',
Locale: payload.locale || ''
};
Object.keys(map).forEach(function(k){
var el = form.querySelector('[data-name="'+k+'"]');
if (el) el.value = map[k];
});
var $ = window.jQuery || window.$;
if ($) $(form).trigger('submit');
else if (form.requestSubmit) form.requestSubmit();
else form.dispatchEvent(new Event('submit', {bubbles:true, cancelable:true}));
}
} catch (e) {}
}
function calcCAGR(r22, r23, r24, r25){
if (r22 && r22 > 0) return Math.pow((r25||0)/(r22||1), 1/3) - 1
if (r23 && r23 > 0) return Math.pow((r25||0)/(r23||1), 1/2) - 1
if (r24 && r24 > 0) return (r25 - r24) / r24
return null
}
function fmtMoney(n){
if (n === null || isNaN(n)) return T.na
return euroCompact.format(n)
}
function hideRecentYears(){
var y = parseInt(document.getElementById('founded').value, 10)
var Y = currentYear
function vis(id, hide){
var el = document.getElementById(id)
if (!el) return
var f = el.closest('.cal_class-field')
if (f) f.style.display = hide ? 'none' : ''
}
vis('rev2022', !isNaN(y) && y > Y - 3)
vis('rev2023', !isNaN(y) && y > Y - 2)
vis('p2023', !isNaN(y) && y > Y - 2)
}
function bindOnce(){
if (booted) return
booted = true
fillSectors()
sectorSelect.addEventListener('change', updateSectorInfo)
box.querySelectorAll('[data-next]').forEach(function(btn){
btn.addEventListener('click', function(){
if (currentStepIdx === 0) {
var leadOk = validateLead()
document.getElementById('lead-error').classList.toggle('cal_class-hidden', leadOk)
if (!leadOk) return
submitLeadOnce()
}
if (currentStepIdx === 4) {
var ok = validateRevenues()
document.getElementById('rev-error').classList.toggle('cal_class-hidden', ok)
if (!ok) return
}
showStep(Math.min(currentStepIdx + 1, steps.length - 1))
})
})
box.querySelectorAll('[data-prev]').forEach(function(btn){
btn.addEventListener('click', function(){ showStep(Math.max(currentStepIdx - 1, 0)) })
})
toggleChip('purpose', true)
toggleChip('obstacles', false)
toggleChip('revModel', true)
toggleChip('position', false)
pm.addEventListener('change', updatePmLabels)
document.getElementById('founded').addEventListener('input', hideRecentYears)
document.getElementById('calcBtn').addEventListener('click', runCalc)
showStep(0)
}
function runCalc(){
if (!validateRevenues()) {
document.getElementById('rev-error').classList.remove('cal_class-hidden')
showStep(4)
return
}
var sector = sectorSelect.value
var s = SECTORS[sector]
var founded = parseInt(document.getElementById('founded').value, 10)
var employees = parseInt(document.getElementById('employees').value, 10)
var obstacles = getChipValues('obstacles')
var revModel = getChipValues('revModel')[0] || 'Other'
var position = getChipValues('position')
var recession = document.getElementById('recession').value
var custConc = document.getElementById('custConc').value
var r22 = num(document.getElementById('rev2022').value)
var r23 = num(document.getElementById('rev2023').value)
var r24 = num(document.getElementById('rev2024').value) || 0
var r25 = num(document.getElementById('rev2025').value) || 0
var profitMetric = pm.value
var p23 = num(document.getElementById('p2023').value)
var p24 = num(document.getElementById('p2024').value)
var p25raw = num(document.getElementById('p2025').value)
var ownerAddback = num(document.getElementById('ownerCosts').value) || 0
var p25 = (p25raw || 0) + ownerAddback
var factor = s.base
var cagr = calcCAGR(r22, r23, r24, r25)
var growthAdj = 0
if (cagr !== null) {
growthAdj = 0.1 * ((cagr - s.bench) / 0.10)
factor = factor + growthAdj
if (factor < 0.1) factor = 0.1
}
var percAdj = 0
var applied = []
if (revModel === 'Subscription') { percAdj += 0.15; applied.push(T.adjSub) }
if (revModel === 'Project') { percAdj -= 0.10; applied.push(T.adjProj) }
if (custConc === '30-50') { percAdj -= 0.10; applied.push(T.adjCust3050) }
if (custConc === '>50') { percAdj -= 0.20; applied.push(T.adjCust50) }
if ((obstacles||[]).length > 2) { percAdj -= 0.10; applied.push(T.adjObst) }
if (position.indexOf('Quality') !== -1) { percAdj += 0.10; applied.push(T.adjQual) }
if (position.indexOf('Technology') !== -1) { percAdj += 0.15; applied.push(T.adjTech) }
if (position.indexOf('Innovation') !== -1) { percAdj += 0.15; applied.push(T.adjInno) }
if (position.indexOf('Price') !== -1) { percAdj -= 0.10; applied.push(T.adjPrice) }
if (recession === 'Low') { percAdj += 0.05; applied.push(T.adjRecLow) }
if (recession === 'Medium') { percAdj -= 0.05; applied.push(T.adjRecMed) }
if (recession === 'Large') { percAdj -= 0.15; applied.push(T.adjRecHigh) }
var rule40Adj = 0
if (p25raw !== null && r25 > 0) {
var growth25 = r24 > 0 ? (r25 - r24) / r24 : (cagr !== null ? cagr : 0)
var margin25 = p25 / r25
var rule40 = (growth25 + margin25) * 100
var gm = { g: (growth25*100).toFixed(1), m: (margin25*100).toFixed(1) }
if (rule40 < 30) { rule40Adj = -0.20; applied.push(fill(T.ruleLow, gm)) }
else if (rule40 < 40) { rule40Adj = 0; applied.push(fill(T.ruleMid, gm)) }
else if (rule40 <= 60) { rule40Adj = 0.20; applied.push(fill(T.ruleGood, gm)) }
else { rule40Adj = 0.40; applied.push(fill(T.ruleHigh, gm)) }
}
var percentTotal = percAdj + rule40Adj
var centralValue = Math.max(0, r24 * factor) * (1 + percentTotal)
var minValue = Math.max(0, r24 * s.min) * (1 + percentTotal)
var maxValue = Math.max(0, r24 * s.max) * (1 + percentTotal)
var lines = []
lines.push(fill(T.baseLine, { m: fmtMoney(r24), x: s.base.toFixed(1) }))
if (cagr !== null) {
lines.push(fill(T.growthLine, {
c: (cagr*100).toFixed(1), b: (s.bench*100).toFixed(0),
a: (growthAdj>=0?'+':'') + growthAdj.toFixed(2)
}))
} else {
lines.push(T.growthSkip)
}
if (applied.length) lines = lines.concat(applied)
var empStr = isNaN(employees) ? T.na : String(employees)
var foundStr = isNaN(founded) ? T.na : String(founded)
document.getElementById('resultBox').innerHTML =
'<h3>' + T.resTitle + '</h3>' +
'<div class="cal_class-flex">' +
'<span class="cal_class-badge">' + fill(T.resSector, { s: sector }) + '</span>' +
'<span class="cal_class-badge">' + fill(T.resEmployees, { n: empStr }) + '</span>' +
'<span class="cal_class-badge">' + fill(T.resFounded, { n: foundStr }) + '</span>' +
'</div>' +
'<div class="cal_class-divider"></div>' +
'<div class="cal_class-row"><div>' +
'<div class="cal_class-label">' + T.companyValue + '</div>' +
'<div style="font-size:28px; font-weight:800; color:#ffffff;">' + fmtMoney(centralValue) + '</div>' +
'<div class="cal_class-small">' + T.centralEst + '</div>' +
'</div><div>' +
'<div class="cal_class-label">' + T.range + '</div>' +
'<div style="font-size:18px; font-weight:700; color:#bfdbfe;">' + fmtMoney(minValue) + T.rangeJoin + fmtMoney(maxValue) + '</div>' +
'<div class="cal_class-small">' + T.rangeHint + '</div>' +
'</div></div>' +
'<div class="cal_class-divider"></div>' +
'<div class="cal_class-label">' + T.adjustments + '</div>' +
'<ul class="cal_class-list">' + lines.map(function(l){ return '<li>' + l + '</li>' }).join('') + '</ul>' +
'<div class="cal_class-divider"></div>' +
'<a class="cal_class-cta" href="' + T.ctaHref + '">' + T.cta + '</a>' +
'<div class="cal_class-small" style="margin-top:8px;">' + T.disclaimer + '</div>'
showStep(6)
}
function start(){
bindOnce()
applyI18n()
hideRecentYears()
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start)
else start()
setTimeout(start, 50)
setTimeout(start, 400)
setTimeout(start, 600)
})()
</script>
</div>
<!-- End embed -->
