File: //proc/self/root/tmp/ezdns_health_after_restart.html
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>DNS Check für Domains: DNSSEC, SPF & DMARC | ezdns.support</title>
<meta name="description" content="DNS-Check für Domain Owner & KMU: Delegation, DNSSEC, Mail-Sicherheit (SPF/DKIM/DMARC) und Performance – mit verständlichen Erklärungen und konkreten Fixes." />
<link rel="canonical" href="https://ezdns.support/" />
<meta name="robots" content="index, follow" />
<meta name="theme-color" content="#020617" />
<meta property="og:type" content="website" />
<meta property="og:site_name" content="ezdns.support" />
<meta property="og:title" content="DNS Check für Domains: DNSSEC, SPF & DMARC" />
<meta property="og:description" content="DNS-Check für Domain Owner & KMU: Delegation, DNSSEC, Mail-Sicherheit (SPF/DKIM/DMARC) und Performance – mit verständlichen Erklärungen und konkreten Fixes." />
<meta property="og:url" content="https://ezdns.support/" />
<meta property="og:image" content="https://ezdns.support/app/logo.svg" />
<meta name="twitter:card" content="summary" />
<meta name="twitter:title" content="DNS Check für Domains: DNSSEC, SPF & DMARC" />
<meta name="twitter:description" content="DNS-Check für Domain Owner & KMU: Delegation, DNSSEC, Mail-Sicherheit (SPF/DKIM/DMARC) und Performance – mit verständlichen Erklärungen und konkreten Fixes." />
<meta name="twitter:image" content="https://ezdns.support/app/logo.svg" />
<link rel="icon" href="/app/logo.svg" type="image/svg+xml" />
<link rel="preconnect" href="https://rsms.me/" />
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" />
<link rel="stylesheet" href="/app/assets/app.css?v=20260531-pricing1" />
<!-- Google AdSense -->
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1965425453542572" crossorigin="anonymous"></script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "WebSite",
"name": "ezdns.support",
"url": "https://ezdns.support/"
}
</script>
</head>
<body class="bg-slate-950 text-slate-100">
<div class="max-w-7xl mx-auto p-6">
<header class="flex flex-wrap items-center justify-between gap-3">
<a href="/" class="flex items-center gap-3">
<img src="/app/logo.svg" alt="ezdns.support" class="h-8 w-auto" />
</a>
<nav class="flex flex-wrap items-center gap-2 text-sm" aria-label="Hauptnavigation">
<a class="px-3 py-2 rounded-lg border border-slate-700 text-blue-200 hover:border-blue-400" href="/pricing">Preise</a>
<a class="px-3 py-2 rounded-lg border border-slate-700 text-blue-200 hover:border-blue-400" href="#free-tools">Tools</a>
<a class="px-3 py-2 rounded-lg border border-slate-700 text-blue-200 hover:border-blue-400" href="/dmarc-fix">DMARC Fix</a>
<a class="px-3 py-2 rounded-lg border border-slate-700 text-blue-200 hover:border-blue-400" href="#fix-request">Anfrage</a>
</nav>
</header>
<!-- Hero -->
<section class="ez-hero-modern mt-6 bg-gradient-to-br from-slate-900 to-slate-800 rounded-2xl p-6 border border-slate-800">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 items-start">
<div>
<h1 class="text-3xl font-bold">DNS‑Check für deine Domain – und klare Fix‑Optionen</h1>
<p class="mt-3 text-slate-300">Für Domain Owner & KMU: ezdns.support prüft Delegation, DNSSEC, Mail‑Sicherheit (SPF/DKIM/DMARC) und Performance – mit verständlichen Prioritäten, bezahltem Priority Audit ab €49, DNS‑Fix ab €149 und optionalem Monitoring.</p>
<div class="mt-3 grid grid-cols-1 sm:grid-cols-2 gap-2 text-sm text-slate-200">
<div class="flex items-center gap-2"><span class="text-emerald-300">•</span><span>Übersicht „gut / ok / kritisch“</span></div>
<div class="flex items-center gap-2"><span class="text-emerald-300">•</span><span>Top‑Fixes nach Impact und Aufwand</span></div>
<div class="flex items-center gap-2"><span class="text-emerald-300">•</span><span>Report teilen, CSV/PDF Export, Badge</span></div>
<div class="flex items-center gap-2"><span class="text-emerald-300">•</span><span>Fix‑Service, Monitoring und API</span></div>
</div>
<div id="heroActions" class="mt-4 flex flex-wrap gap-3">
<button id="ctaFocus" class="px-5 py-2 rounded-lg bg-green-600 text-white">Kostenlosen Scan starten</button>
<button id="serviceCta" data-service-lead="priority_audit" class="px-5 py-2 rounded-lg bg-blue-600 text-white">Priority Audit €49 buchen</button>
<a href="/pricing" class="px-5 py-2 rounded-lg border border-blue-500/60 text-blue-100">Preise ansehen</a><a href="/docs" class="px-5 py-2 rounded-lg border border-slate-700 text-slate-200">API Docs</a>
</div>
<div class="ez-proof-strip" aria-label="ezdns Leistungsnachweise">
<div><strong>SPF · DKIM · DMARC</strong><span>Mail-Auth mit Abnahme-Report</span></div>
<div><strong>DNSSEC · Delegation</strong><span>Chain, DS, DNSKEY und NS prüfen</span></div>
<div><strong>Audit ab €49</strong><span>Niedriger bezahlter Einstieg in HostBill</span></div>
</div>
</div>
<div class="bg-slate-900/60 border border-slate-800 rounded-2xl p-4">
<div class="text-xs uppercase tracking-wide text-slate-400">Sofort‑Scan</div>
<div class="mt-2 flex flex-wrap items-center gap-2">
<input id="domain" class="flex-1 min-w-[220px] px-3 py-2 border border-slate-300 rounded-lg text-base bg-white text-slate-900 placeholder-slate-500 focus:outline-none focus:ring-2 focus:ring-blue-600" placeholder="example.com" />
<button id="scan" class="shrink-0 px-4 py-2 text-base bg-green-600 text-white rounded-lg">Scan</button>
</div>
<div class="mt-2">
<label class="flex items-center gap-2 text-slate-300 text-sm"><input id="listed" type="checkbox" class="accent-blue-600" checked /> im Verlauf anzeigen</label>
</div>
<div class="ez-report-visual" aria-label="Beispielhafte DNS-Risiko-Visualisierung">
<div class="ez-visual-topline">
<div>
<div class="ez-visual-kicker">Live Report</div>
<strong>example.com</strong>
</div>
<span class="ez-pill ez-pill-warn">3 kritische Fixes</span>
</div>
<div class="ez-visual-body">
<div class="ez-score-ring" aria-label="DNS Health Score 71">
<svg viewBox="0 0 120 120" role="img" aria-hidden="true">
<circle cx="60" cy="60" r="48" class="ez-ring-bg" />
<circle cx="60" cy="60" r="48" class="ez-ring-progress" pathLength="100" />
</svg>
<div class="ez-score-label"><strong>71</strong><span>fixbar</span></div>
</div>
<div class="ez-risk-stack">
<div class="ez-risk-row"><span class="ez-risk-dot ez-dot-danger"></span><span>DMARC nur Monitoring</span><strong>€149</strong></div>
<div class="ez-risk-row"><span class="ez-risk-dot ez-dot-warn"></span><span>SPF Lookup-Limit nah</span><strong>€149</strong></div>
<div class="ez-risk-row"><span class="ez-risk-dot ez-dot-ok"></span><span>DNSSEC valide</span><strong>ok</strong></div>
</div>
</div>
<div class="ez-metric-grid" aria-label="Geprüfte Bereiche">
<div><span>Delegation</span><strong>OK</strong></div>
<div><span>Mail</span><strong>Fix</strong></div>
<div><span>DNSSEC</span><strong>Gut</strong></div>
<div><span>p95</span><strong>42ms</strong></div>
</div>
</div>
<div id="scanOutcome" class="ez-scan-outcome hidden" aria-live="polite"></div>
<div class="mt-4">
<div class="flex flex-wrap gap-2 text-sm">
<button class="tab-btn px-3 py-1.5 rounded-lg bg-slate-800 text-slate-100" data-tab="why">Warum</button>
<button class="tab-btn px-3 py-1.5 rounded-lg border border-slate-700 text-slate-200" data-tab="checks">Checks</button>
<button class="tab-btn px-3 py-1.5 rounded-lg border border-slate-700 text-slate-200" data-tab="pricing">Preise</button>
<button class="tab-btn px-3 py-1.5 rounded-lg border border-slate-700 text-slate-200" data-tab="scans">Letzte Scans</button>
</div>
<div class="mt-3">
<div id="tab-why" class="tab-panel text-sm text-slate-300">
<div class="grid grid-cols-1 gap-2">
<div><span class="text-slate-100 font-medium">Vermeide Ausfälle:</span> Delegation/DNSSEC-Probleme führen oft zu kompletten Nichterreichbarkeiten.</div>
<div><span class="text-slate-100 font-medium">Bessere Zustellbarkeit:</span> SPF/DMARC reduziert Spoofing und verbessert Mail-Delivery.</div>
<div><span class="text-slate-100 font-medium">Schneller handeln:</span> „gut/ok/kritisch“ + Erklärungen pro Metrik.</div>
</div>
</div>
<div id="tab-checks" class="tab-panel hidden text-sm text-slate-300">
<div class="grid grid-cols-1 gap-2">
<div><span class="text-slate-100 font-medium">Delegation:</span> Parent/Child NS, Glue, Lame NS, AXFR, Recursion</div>
<div><span class="text-slate-100 font-medium">Mail:</span> MX, SPF (Lookups), DMARC Policy, DKIM Hinweise, CAA</div>
<div><span class="text-slate-100 font-medium">DNSSEC:</span> DS/DNSKEY Match, RRSIG Expiry, Negative Signing</div>
<div><span class="text-slate-100 font-medium">Performance:</span> p50/p95 und Score</div>
</div>
</div>
<div id="tab-pricing" class="tab-panel hidden text-sm text-slate-300">
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
<div class="bg-slate-900 border border-slate-700 rounded-xl p-4">
<h3 class="text-lg font-bold mb-2">Free Scan</h3>
<div class="text-3xl font-bold mb-1">€0</div>
<p class="text-slate-400 text-sm mb-3">Für den ersten DNS- und Mail-Security-Check.</p>
<ul class="text-sm space-y-1 mb-4">
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Delegation, DNSSEC, SPF, DKIM und DMARC prüfen</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Report-Link und priorisierte Findings</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Direkter Anschluss an Audit oder Fix</span></li>
</ul>
<button onclick="checkout('free')" class="w-full py-2 rounded-lg bg-slate-800 text-slate-200 hover:bg-slate-700 transition">Kostenlos scannen</button>
</div>
<div class="bg-slate-900 border-2 border-emerald-500 rounded-xl p-4 relative">
<div class="absolute -top-3 left-1/2 transform -translate-x-1/2 bg-emerald-600 text-white px-3 py-1 rounded-full text-xs font-semibold">Bester Einstieg</div>
<h3 class="text-lg font-bold mb-2">Priority Audit</h3>
<div class="text-3xl font-bold mb-1">€49<span class="text-sm text-slate-400"> einmalig</span></div>
<p class="text-slate-400 text-sm mb-3">Für unklare Findings und einen priorisierten Maßnahmenplan.</p>
<ul class="text-sm space-y-1 mb-4">
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Eine Domain mit DNS-, SPF-, DKIM-, DMARC- und DNSSEC-Fokus</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>HostBill-Warenkorb mit Domain, Problem und Kontakt</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Klare Entscheidung: Fix, Cleanup oder Monitoring</span></li>
</ul>
<button data-service-lead="priority_audit" onclick="requestService('priority_audit', 'service_lead')" class="w-full py-2 rounded-lg bg-emerald-600 text-white hover:bg-emerald-700 transition font-semibold">Audit buchen - €49</button>
</div>
<div class="bg-slate-900 border border-blue-500 rounded-xl p-4">
<h3 class="text-lg font-bold mb-2">Quick Fix</h3>
<div class="text-3xl font-bold mb-1">€149<span class="text-sm text-slate-400"> einmalig</span></div>
<p class="text-slate-400 text-sm mb-3">Für ein klar abgegrenztes DNS- oder Mail-Security-Finding.</p>
<ul class="text-sm space-y-1 mb-4">
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>SPF, DMARC, DKIM, DNSSEC, CAA oder Delegation</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Konkrete Korrektur mit Nachprüfung</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Abnahme per neuem Report</span></li>
</ul>
<button data-service-lead="quick_fix" onclick="requestService('quick_fix', 'service_lead')" class="w-full py-2 rounded-lg bg-blue-600 text-white hover:bg-blue-700 transition">Quick Fix buchen - €149</button>
</div>
<div class="bg-slate-900 border border-slate-700 rounded-xl p-4">
<h3 class="text-lg font-bold mb-2">Managed Monitoring</h3>
<div class="text-3xl font-bold mb-1">€199<span class="text-sm text-slate-400">/Monat</span></div>
<p class="text-slate-400 text-sm mb-3">Für produktive Domains, bei denen DNS-Risiken nicht wiederkommen dürfen.</p>
<ul class="text-sm space-y-1 mb-4">
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Regelmäßige Checks und Alerting</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Monatlicher Health-Report</span></li>
<li class="flex items-start gap-2"><span class="text-emerald-400">✓</span><span>Optionaler Cleanup für mehrere Findings</span></li>
</ul>
<button data-service-lead="managed_monitoring" onclick="requestService('managed_monitoring', 'service_lead')" class="w-full py-2 rounded-lg bg-slate-800 text-slate-200 hover:bg-slate-700 transition">Monitoring buchen - €199/Monat</button>
</div>
</div>
<div class="mt-6 bg-slate-900 border border-slate-800 rounded-xl p-4">
<div class="flex items-center gap-4">
<div class="text-3xl">✓</div>
<div>
<strong class="text-lg">Kaufpfad mit Abnahme</strong>
<p class="text-slate-400 text-sm">Scan, Warenkorb, Kontextfelder und Report-Nachprüfung sind messbar.</p>
</div>
</div>
</div>
</div>
<div id="tab-scans" class="tab-panel hidden">
<table class="w-full text-sm">
<thead>
<tr class="text-left text-slate-400">
<th class="py-2">Domain</th>
<th>Status</th>
<th></th>
</tr>
</thead>
<tbody id="scans"></tbody>
</table>
<div class="mt-2 text-xs text-slate-400">Tipp: Im Report gibt es Farbcodierung und Erklärungen pro Metrik.</div>
</div>
</div>
</div>
</div>
</div>
</section>
<section id="fix-service" class="mt-6 bg-slate-900 border border-slate-800 rounded-2xl p-6">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 items-start">
<div>
<div class="text-xs uppercase tracking-wide text-slate-400">Bezahlbare Umsetzung</div>
<h2 class="mt-2 text-3xl font-bold">Kritische Findings nicht nur sehen, sondern beheben lassen.</h2>
<p class="mt-3 text-slate-300">Wenn SPF, DMARC, DNSSEC oder Delegation kritisch sind, kann Panomity den Fix übernehmen. Die Buchung läuft über den Panomity-Warenkorb; der Report liefert die technische Abnahme.</p>
<div class="ez-fix-flow" aria-label="Umsatzpfad von Scan bis Monitoring">
<div><span>1</span><strong>Scan</strong><small>kritische Findings</small></div>
<div><span>2</span><strong>Audit/Fix</strong><small>ab €49 buchbar</small></div>
<div><span>3</span><strong>Abnahme</strong><small>neuer Report</small></div>
<div><span>4</span><strong>Monitoring</strong><small>€199/Monat</small></div>
</div>
<div class="ez-diagnostic-showcase">
<img src="/app/assets/ezdns-diagnostics-panels.webp" width="1600" height="900" alt="DNS-, SPF-, DMARC- und DNSSEC-Diagnosepanels" loading="eager" />
</div>
</div>
<div class="lg:col-span-2 grid grid-cols-1 md:grid-cols-2 xl:grid-cols-4 gap-4">
<div class="bg-slate-950 border border-emerald-500 rounded-xl p-4">
<h3 class="text-lg font-bold">Priority Audit</h3>
<div class="mt-2 text-3xl font-bold">€49</div>
<p class="mt-2 text-sm text-slate-400">Priorisierter DNS-, Mail- und DNSSEC-Audit für eine Domain.</p>
<button data-service-lead="priority_audit" onclick="requestService('priority_audit', 'service_lead')" class="mt-4 w-full py-2 rounded-lg bg-emerald-600 text-white">Audit buchen</button>
</div>
<div class="bg-slate-950 border border-slate-700 rounded-xl p-4">
<h3 class="text-lg font-bold">Quick Fix</h3>
<div class="mt-2 text-3xl font-bold">€149</div>
<p class="mt-2 text-sm text-slate-400">Ein klar abgegrenzter DNS-, SPF-, DMARC- oder CAA-Fix.</p>
<button data-service-lead="quick_fix" onclick="requestService('quick_fix', 'service_lead')" class="mt-4 w-full py-2 rounded-lg bg-blue-600 text-white">Fix buchen</button>
</div>
<div class="bg-slate-950 border border-blue-500 rounded-xl p-4">
<h3 class="text-lg font-bold">DNS/Mail Cleanup</h3>
<div class="mt-2 text-3xl font-bold">€499</div>
<p class="mt-2 text-sm text-slate-400">Delegation, SPF, DKIM/DMARC, CAA und Report-Nachprüfung.</p>
<button data-service-lead="cleanup" onclick="requestService('cleanup', 'service_lead')" class="mt-4 w-full py-2 rounded-lg bg-green-600 text-white">Cleanup buchen</button>
</div>
<div class="bg-slate-950 border border-slate-700 rounded-xl p-4">
<h3 class="text-lg font-bold">Managed Monitoring</h3>
<div class="mt-2 text-3xl font-bold">€199<span class="text-sm text-slate-400">/Monat</span></div>
<p class="mt-2 text-sm text-slate-400">Regelmäßige Checks, Alerting und monatlicher Health-Report.</p>
<button data-service-lead="managed_monitoring" onclick="requestService('managed_monitoring', 'service_lead')" class="mt-4 w-full py-2 rounded-lg bg-slate-800 text-slate-200">Monitoring buchen</button>
</div>
</div>
</div>
<div class="ez-journey-visual mt-6">
<img src="/app/assets/ezdns-fix-journey.webp" width="1672" height="941" alt="DNS Fix Journey von Domain Scan über Priority Audit zu Fix Plan und Verify" loading="lazy" />
</div>
</section>
<section id="fix-request" class="ez-quote-section mt-6">
<div class="ez-quote-copy">
<h2>Unsicher, welches Paket passt?</h2>
<p>Schick Domain, Kontakt und kurz das Problem. Wir können daraus einen klaren Fix-Pfad ableiten, ohne dass ein kaufbereiter Besucher im Warenkorb verloren geht.</p>
<div class="ez-quote-points">
<span>Antwortpfad für DMARC, SPF, DNSSEC und Delegation</span>
<span>Lead bleibt messbar, auch wenn noch kein Checkout passiert</span>
<span>Direkter Anschluss an Priority Audit, Quick Fix, Cleanup oder Monitoring</span>
</div>
<form id="quickRequestForm" class="ez-quote-form">
<label>
<span>Domain</span>
<input id="requestDomain" name="domain" placeholder="example.com" autocomplete="url" />
</label>
<label>
<span>E-Mail</span>
<input id="requestEmail" name="email" type="email" placeholder="admin@example.com" autocomplete="email" required />
</label>
<label class="ez-quote-wide">
<span>Problem</span>
<textarea id="requestMessage" name="message" rows="4" placeholder="z. B. DMARC p=none, Microsoft 365 DKIM fehlt, SPF PermError oder DNSSEC SERVFAIL" required></textarea>
</label>
<label>
<span>Paket</span>
<select id="requestPlan" name="plan">
<option value="priority_audit">DNS Priority Audit €49</option>
<option value="cleanup">DNS/Mail Cleanup €499</option>
<option value="quick_fix">Quick Fix €149</option>
<option value="managed_monitoring">Managed Monitoring €199/Monat</option>
</select>
</label>
<button type="submit">Fix-Angebot anfordern</button>
<p id="requestStatus" class="ez-quote-status" aria-live="polite"></p>
</form>
</div>
<div class="ez-quote-visual" aria-label="Visualisierung des ezDNS Fix-Anfragepfads">
<img src="/app/assets/ezdns-fix-request-workflow.webp" width="1672" height="941" alt="ezDNS Fix-Anfrage mit Domain, Problem, Kontakt und Abnahme-Report" loading="lazy" />
</div>
</section>
<section id="free-tools" class="mt-6 bg-slate-900 border border-slate-800 rounded-2xl p-6">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 items-start">
<div>
<div class="text-xs uppercase tracking-wide text-slate-400">Kostenlose DNS Tools</div>
<h2 class="mt-2 text-3xl font-bold">Suchtraffic zuerst prüfen lassen.</h2>
<p class="mt-3 text-slate-300">Freie Checker holen kaufnahe Suchanfragen ab und führen Findings direkt zu Priority Audit, Quick Fix, Cleanup oder Monitoring.</p>
</div>
<div class="lg:col-span-2 grid grid-cols-1 md:grid-cols-2 gap-3">
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/spf-checker"><h3 class="text-lg font-bold">SPF Checker</h3><p class="mt-2 text-sm text-slate-400">Lookup-Limit, includes und PermError-Risiko prüfen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Tool öffnen</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dmarc-checker"><h3 class="text-lg font-bold">DMARC Checker</h3><p class="mt-2 text-sm text-slate-400">Policy, Alignment und Spoofing-Risiko prüfen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Tool öffnen</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dkim-checker"><h3 class="text-lg font-bold">DKIM Checker</h3><p class="mt-2 text-sm text-slate-400">Selector, DNS-Record und Signatur prüfen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Tool öffnen</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dnssec-checker"><h3 class="text-lg font-bold">DNSSEC Checker</h3><p class="mt-2 text-sm text-slate-400">DS, DNSKEY und SERVFAIL-Risiko prüfen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Tool öffnen</span></a>
</div>
</div>
</section>
<section id="problem-guides" class="mt-6 bg-slate-900 border border-slate-800 rounded-2xl p-6">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 items-start">
<div>
<div class="text-xs uppercase tracking-wide text-slate-400">Kaufnahe Problemseiten</div>
<h2 class="mt-2 text-3xl font-bold">Direkt vom Finding zum buchbaren Fix.</h2>
<p class="mt-3 text-slate-300">Neue Intent-Seiten greifen konkrete DNS- und Mail-Probleme auf: DMARC, SPF-Limit oder DNSSEC-Fehler.</p>
</div>
<div class="lg:col-span-2 grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
<a class="bg-slate-950 border border-emerald-600 rounded-xl p-4" href="/dns-priority-audit"><h3 class="text-lg font-bold">DNS Priority Audit</h3><p class="mt-2 text-sm text-slate-400">Bezahlter Einstieg: Audit und Maßnahmenplan für 49 Euro.</p><span class="mt-3 inline-block text-emerald-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dmarc-fix"><h3 class="text-lg font-bold">DMARC Fix</h3><p class="mt-2 text-sm text-slate-400">SPF/DKIM Alignment, Policy-Stufen und Report-Abnahme.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/spf-lookup-limit"><h3 class="text-lg font-bold">SPF Lookup Limit</h3><p class="mt-2 text-sm text-slate-400">PermError vermeiden und include-Ketten bereinigen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dnssec-fix"><h3 class="text-lg font-bold">DNSSEC Fix</h3><p class="mt-2 text-sm text-slate-400">DS/DNSKEY/RRSIG prüfen und SERVFAIL-Risiken beheben.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/microsoft-365-dmarc-fix"><h3 class="text-lg font-bold">Microsoft 365 DMARC</h3><p class="mt-2 text-sm text-slate-400">Exchange Online, SPF, DKIM und externe Sender sauber abgleichen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/google-workspace-dmarc-fix"><h3 class="text-lg font-bold">Google Workspace DMARC</h3><p class="mt-2 text-sm text-slate-400">Workspace-DKIM, SPF und DMARC-Policy mit Abnahme-Scan prüfen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dmarc-p-none-fix"><h3 class="text-lg font-bold">DMARC p=none</h3><p class="mt-2 text-sm text-slate-400">Monitoring-Policy sicher Richtung Schutz verschärfen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/spf-permerror-fix"><h3 class="text-lg font-bold">SPF PermError</h3><p class="mt-2 text-sm text-slate-400">Lookup-Limit, includes und Altquellen bereinigen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dkim-selector-fehlt"><h3 class="text-lg font-bold">DKIM Selector fehlt</h3><p class="mt-2 text-sm text-slate-400">DNS-Record und Provider-Signatur abgleichen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/google-workspace-dkim-einrichten"><h3 class="text-lg font-bold">Google Workspace DKIM</h3><p class="mt-2 text-sm text-slate-400">Workspace-DKIM veröffentlichen und DMARC prüfen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/microsoft-365-dkim-dmarc"><h3 class="text-lg font-bold">M365 DKIM/DMARC</h3><p class="mt-2 text-sm text-slate-400">Custom-Domain DKIM und externe Sender abgleichen.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
<a class="bg-slate-950 border border-slate-700 rounded-xl p-4" href="/dnssec-servfail-fix"><h3 class="text-lg font-bold">DNSSEC SERVFAIL</h3><p class="mt-2 text-sm text-slate-400">DS, DNSKEY und Signaturen reparieren.</p><span class="mt-3 inline-block text-blue-400 font-semibold">Zur Seite</span></a>
</div>
</div>
</section>
</div>
<footer class="mt-12 text-center text-sm text-slate-400">
<div class="space-x-4">
<a class="text-blue-400 hover:underline" href="/pricing">Preise</a>
<a class="text-blue-400 hover:underline" href="/docs" target="_blank">API Docs</a>
<a class="text-blue-400 hover:underline" href="/app/imprint.html">Imprint</a>
<a class="text-blue-400 hover:underline" href="/app/privacy.html">Privacy</a>
<a class="text-blue-400 hover:underline" href="https://support.panomity.com/tickets/new/" target="_blank" rel="noopener">Contact</a>
</div>
<div class="mt-2"> © <span id="year"></span> <a class="text-blue-400 hover:underline" href="https://panomity.de/" target="_blank" rel="noopener">Panomity GmbH</a></div>
</footer>
<script>
const apiBase = '';
const scansTbody = document.getElementById('scans');
const scanBtn = document.getElementById('scan');
const domainInput = document.getElementById('domain');
const scanOutcome = document.getElementById('scanOutcome');
let lastScanOutcomeDomain = '';
const API_KEY = 'dev-key';
const SUPPORT_URL = 'https://support.panomity.com/tickets/new/';
const quickRequestForm = document.getElementById('quickRequestForm');
const requestDomain = document.getElementById('requestDomain');
const requestEmail = document.getElementById('requestEmail');
const requestMessage = document.getElementById('requestMessage');
const requestPlan = document.getElementById('requestPlan');
const requestStatus = document.getElementById('requestStatus');
const ORDER_URLS = {
priority_audit: 'https://support.panomity.com/cart/priority-support/DNS-Priority-Audit/&step=0',
quick_fix: 'https://support.panomity.com/cart/priority-support/DNS-Quick-Fix/&step=0',
cleanup: 'https://support.panomity.com/cart/priority-support/DNS-Mail-Security-Cleanup/&step=0',
managed_monitoring: 'https://support.panomity.com/?cmd=cart&action=add&id=856&cycle=m',
pro_monthly: 'https://support.panomity.com/?cmd=cart&action=add&id=854&cycle=m',
pro_yearly: 'https://support.panomity.com/?cmd=cart&action=add&id=854&cycle=a',
business_monthly: 'https://support.panomity.com/?cmd=cart&action=add&id=855&cycle=m',
business_yearly: 'https://support.panomity.com/?cmd=cart&action=add&id=855&cycle=a',
agency_monthly: 'https://support.panomity.com/?cmd=cart&action=add&id=856&cycle=m',
agency_yearly: 'https://support.panomity.com/?cmd=cart&action=add&id=856&cycle=a'
};
const ORDER_POSTS = {
priority_audit: { action: "https://support.panomity.com/cart/priority-support/DNS-Priority-Audit/&step=0", id: "879", cycle: "Once" },
quick_fix: { action: "https://support.panomity.com/cart/priority-support/DNS-Quick-Fix/&step=0", id: "867", cycle: "Once" },
cleanup: { action: "https://support.panomity.com/cart/priority-support/DNS-Mail-Security-Cleanup/&step=0", id: "868", cycle: "Once" }
};
function trackEvent(category, action, name) {
if (window._paq) window._paq.push(['trackEvent', category, action, name || '']);
}
function currentDomainValue() {
const typed = domainInput && domainInput.value ? domainInput.value.trim().toLowerCase() : '';
return typed || lastScanOutcomeDomain;
}
async function recordLead(intent, plan, extra = {}) {
try {
const payload = Object.assign({
source: 'website',
intent,
plan,
domain: currentDomainValue(),
page: window.location.pathname
}, extra || {});
await fetch('/v1/leads', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
} catch (e) { /* lead tracking must never block sales */ }
}
function syncRequestDomain() {
if (requestDomain && !requestDomain.value && currentDomainValue()) {
requestDomain.value = currentDomainValue();
}
}
async function submitQualifiedRequest(event) {
event.preventDefault();
const email = requestEmail ? requestEmail.value.trim() : '';
const message = requestMessage ? requestMessage.value.trim() : '';
const domain = requestDomain && requestDomain.value.trim() ? requestDomain.value.trim().toLowerCase() : currentDomainValue();
const plan = requestPlan && requestPlan.value ? requestPlan.value : 'cleanup';
if (!email || !message) {
if (requestStatus) requestStatus.textContent = 'Bitte E-Mail und Problem ergänzen.';
return;
}
if (requestStatus) requestStatus.textContent = 'Anfrage wird gespeichert…';
trackEvent('Revenue', 'qualified_fix_request', plan);
await recordLead('qualified_fix_request', plan, {
domain,
contact_email: email,
message,
page: window.location.pathname + '#fix-request'
});
if (requestStatus) requestStatus.textContent = 'Gespeichert. Wir haben jetzt Domain, Kontakt und Problem im Revenue-Report.';
toast('Fix-Anfrage gespeichert. Nächster Schritt: passendes Paket buchen.', 'success', {
actionHref: orderUrlFor(plan) || supportTicketUrl('qualified_fix_request', plan),
actionLabel: 'Paket öffnen',
timeoutMs: 9000
});
}
function supportTicketUrl(intent, plan) {
const params = new URLSearchParams();
params.set('subject', `ezdns.support ${intent}: ${plan}`);
if (currentDomainValue()) params.set('domain', currentDomainValue());
params.set('source', 'ezdns.support');
return `${SUPPORT_URL}?${params.toString()}`;
}
function orderUrlFor(plan) {
return ORDER_URLS[plan] || '';
}
function submitHostBillOrder(plan) {
const cfg = ORDER_POSTS[plan];
if (!cfg) return false;
const form = document.createElement("form");
form.method = "post";
form.action = cfg.action;
for (const [name, value] of Object.entries({ action: "add", id: cfg.id, cycle: cfg.cycle })) {
const input = document.createElement("input");
input.type = "hidden";
input.name = name;
input.value = value;
form.appendChild(input);
}
document.body.appendChild(form);
form.submit();
return true;
}
async function requestService(plan, intent = 'service_lead') {
trackEvent('Revenue', intent, plan);
await recordLead(intent, plan);
const orderUrl = orderUrlFor(plan);
toast(orderUrl ? 'Warenkorb wird geöffnet…' : 'Anfrage wird geöffnet…', 'info', { timeoutMs: 1500 });
setTimeout(() => {
if (submitHostBillOrder(plan)) return;
window.location.href = orderUrl || supportTicketUrl(intent, plan);
}, 250);
}
async function fetchJSON(url, opts={}) {
const headers = Object.assign({ 'x-api-key': API_KEY }, opts.headers||{});
const res = await fetch(url, Object.assign({}, opts, { headers }));
if (!res.ok) throw new Error('HTTP '+res.status);
return await res.json();
}
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function toast(message, variant = 'info', opts = {}) {
const hostId = 'toastHost';
let host = document.getElementById(hostId);
if (!host) {
host = document.createElement('div');
host.id = hostId;
host.className = 'fixed top-4 right-4 z-50 flex flex-col gap-2';
document.body.appendChild(host);
}
const t = document.createElement('div');
const cls = variant === 'success'
? 'bg-emerald-900 text-emerald-100 border border-emerald-700'
: variant === 'error'
? 'bg-red-900 text-red-100 border border-red-700'
: 'bg-slate-900 text-slate-100 border border-slate-700';
t.className = `px-3 py-2 rounded shadow max-w-sm ${cls}`;
const row = document.createElement('div');
row.className = 'flex items-center gap-3';
const msg = document.createElement('div');
msg.className = 'text-sm';
msg.textContent = message;
row.appendChild(msg);
if (opts.actionHref && opts.actionLabel) {
const a = document.createElement('a');
a.href = opts.actionHref;
a.className = 'text-sm text-blue-200 hover:underline whitespace-nowrap';
a.textContent = opts.actionLabel;
row.appendChild(a);
}
t.appendChild(row);
host.appendChild(t);
const timeoutMs = Number.isFinite(opts.timeoutMs) ? opts.timeoutMs : 3500;
if (timeoutMs > 0) {
setTimeout(() => {
t.remove();
if (host && host.childElementCount === 0) host.remove();
}, timeoutMs);
}
return t;
}
const scanPollers = new Map();
async function pollScanUntilDone(scanId, { maxMs = 120000, intervalMs = 2000 } = {}) {
const start = Date.now();
while (Date.now() - start < maxMs) {
await sleep(intervalMs);
const scan = await fetchJSON(`${apiBase}/v1/scan/${scanId}`);
if (scan && scan.status === 'done') return scan;
}
throw new Error('timeout');
}
function row(status) {
const cls = status === 'done' ? 'bg-emerald-900 text-emerald-200' : 'bg-amber-900 text-amber-200';
return `<span class="px-2 py-0.5 rounded ${cls}">${status}</span>`;
}
function escapeHTML(value) {
return String(value ?? '').replace(/[&<>"']/g, (ch) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[ch]));
}
function scanFindings(scan) {
const result = scan && scan.result ? scan.result : {};
return Array.isArray(result.findings) ? result.findings : [];
}
function renderScanOutcome(scan) {
if (!scanOutcome || !scan) return;
const result = scan.result || {};
const domain = result.domain || currentDomainValue() || 'deine Domain';
lastScanOutcomeDomain = String(domain || '').trim().toLowerCase();
syncRequestDomain();
const findings = scanFindings(scan);
const critical = findings.filter((f) => f.severity === 'error').length;
const warnings = findings.filter((f) => f.severity === 'warning').length;
const top = findings.find((f) => f.severity === 'error') || findings.find((f) => f.severity === 'warning') || findings[0];
const recommendedPlan = critical > 0 || findings.length > 1 ? 'cleanup' : 'quick_fix';
const recommendedLabel = recommendedPlan === 'cleanup' ? 'Cleanup €499 buchen' : 'Quick Fix €149 buchen';
const scoreLabel = critical > 0 ? 'kritisch' : warnings > 0 ? 'fixbar' : 'stabil';
const summaryText = findings.length
? `${critical} kritisch · ${warnings} Warnungen · ${findings.length} Findings`
: 'Keine dringenden Findings gefunden';
const findingText = top
? `${escapeHTML(top.category || 'dns')} – ${escapeHTML(top.message || 'Empfohlene DNS-Korrektur')}`
: 'Monitoring aktivieren, damit DNS- und Mail-Änderungen nicht unbemerkt bleiben.';
scanOutcome.classList.remove('hidden');
scanOutcome.innerHTML = `
<div class="ez-scan-outcome-head">
<div>
<span>Scan-Ergebnis</span>
<strong>${escapeHTML(domain)}</strong>
</div>
<b>${escapeHTML(scoreLabel)}</b>
</div>
<div class="ez-scan-outcome-body">
<div>
<small>${escapeHTML(summaryText)}</small>
<p>${findingText}</p>
</div>
<div class="ez-scan-outcome-actions">
<a href="/app/detail.html?id=${encodeURIComponent(scan.id)}">Report öffnen</a>
<button data-scan-service-lead="priority_audit">Audit €49</button>
<button data-scan-service-lead="${recommendedPlan}">${recommendedLabel}</button>
${recommendedPlan === 'cleanup' ? '<button data-scan-service-lead="quick_fix">Quick Fix €149</button>' : '<button data-scan-service-lead="cleanup">Cleanup €499</button>'}
</div>
</div>
`;
}
function setActiveTab(tab) {
const buttons = document.querySelectorAll('.tab-btn');
const panels = document.querySelectorAll('.tab-panel');
for (const b of buttons) {
const isActive = b.dataset.tab === tab;
b.className = isActive
? 'tab-btn px-3 py-1.5 rounded-lg bg-slate-800 text-slate-100'
: 'tab-btn px-3 py-1.5 rounded-lg border border-slate-700 text-slate-200';
}
for (const p of panels) {
p.classList.toggle('hidden', p.id !== `tab-${tab}`);
}
}
async function loadScans() {
const data = await fetchJSON(`${apiBase}/v1/scans?limit=5`);
scansTbody.innerHTML = '';
for (const s of data.items) {
const tr = document.createElement('tr');
const domain = s.domain || s.domain_id;
tr.innerHTML = `
<td class="py-2 text-blue-300">${domain}</td>
<td>${row(s.status)}</td>
<td><a href="/app/detail.html?id=${s.id}" class="text-sm text-blue-400 hover:underline">Open</a></td>
`;
scansTbody.appendChild(tr);
}
}
// kein separates Detail-Panel mehr
const listedCheckbox = document.getElementById('listed');
scanBtn.addEventListener('click', async () => {
const d = domainInput.value.trim();
if (!d) return;
try {
scanBtn.disabled = true; scanBtn.textContent = 'Starting…';
const created = await fetchJSON(`${apiBase}/v1/scan`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ domain: d, listed: !!listedCheckbox.checked }) });
const scanId = created && created.id;
toast('Scan läuft… wir sagen Bescheid, sobald er fertig ist.', 'info', { timeoutMs: 4000 });
setActiveTab('scans');
await loadScans();
if (scanId && !scanPollers.has(scanId)) {
const p = pollScanUntilDone(scanId)
.then(async (finishedScan) => {
renderScanOutcome(finishedScan);
toast('Scan fertig. Ergebnis und Fix-Optionen sind sichtbar.', 'success', { actionLabel: 'Report öffnen', actionHref: `/app/detail.html?id=${scanId}`, timeoutMs: 9000 });
await loadScans();
})
.catch(() => {
toast('Scan läuft noch – bitte in „Letzte Scans“ prüfen.', 'info', { timeoutMs: 6000 });
})
.finally(() => {
scanPollers.delete(scanId);
});
scanPollers.set(scanId, p);
}
} catch (e) {
toast('Scan konnte nicht gestartet werden.', 'error', { timeoutMs: 5000 });
} finally {
scanBtn.disabled = false; scanBtn.textContent = 'Scan';
}
});
// Checkout-Funktion für den kostenlosen Scan. Bezahlte CTAs nutzen requestService() und HostBill direkt.
function checkout(plan) {
if (plan === 'free') {
trackEvent('Revenue', 'free_plan_clicked', 'free');
domainInput.focus();
setActiveTab('scans');
return;
}
requestService(plan, 'plan_inquiry');
}
// Tabs + initial state
document.querySelectorAll('.tab-btn').forEach((b) => {
b.addEventListener('click', () => setActiveTab(b.dataset.tab));
});
setActiveTab('why');
const cta = document.getElementById('ctaFocus');
if (cta) {
cta.addEventListener('click', () => {
trackEvent('Acquisition', 'scan_cta_clicked', 'hero');
domainInput.focus();
setActiveTab('scans');
});
}
const serviceCta = document.getElementById('serviceCta');
if (serviceCta) {
serviceCta.addEventListener('click', () => requestService(serviceCta.dataset.serviceLead || 'priority_audit', 'service_lead'));
}
if (quickRequestForm) {
syncRequestDomain();
quickRequestForm.addEventListener('submit', submitQualifiedRequest);
}
document.body.addEventListener('click', (event) => {
const scanServiceBtn = event.target.closest('[data-scan-service-lead]');
if (!scanServiceBtn) return;
event.preventDefault();
requestService(scanServiceBtn.dataset.scanServiceLead, 'scan_result_fix');
});
loadScans();
// Footer year
document.getElementById('year').textContent = new Date().getFullYear();
// Matomo config + tracking
(async () => {
try {
await import('/config.js');
const cfg = window.__APP_CONFIG__ || {};
if (cfg.MATOMO_URL && cfg.MATOMO_SITE_ID) {
var _paq = (window._paq = window._paq || []);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u = cfg.MATOMO_URL.endsWith('/') ? cfg.MATOMO_URL : cfg.MATOMO_URL + '/';
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', cfg.MATOMO_SITE_ID]);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.async = true; g.src = u + 'matomo.js'; s.parentNode.insertBefore(g, s);
})();
}
} catch (e) { /* ignore */ }
})();
</script>
</body>
</html>