Files

298 lines
18 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
require_once __DIR__ . '/app/bootstrap.php';
// Absolute Basis-URL fuer Open-Graph/Canonical: die Landingpage laeuft auf der
// Marketing-Domain (nicht APP_HOST), daher aus dem aktuellen Request ableiten.
$landingScheme = app_is_https() ? 'https' : 'http';
$landingHost = (string)($_SERVER['HTTP_HOST'] ?? '');
$landingBase = $landingHost !== '' ? $landingScheme . '://' . $landingHost : '';
$landingUrl = $landingBase !== '' ? $landingBase . '/' : '';
$landingImage = $landingBase !== '' ? $landingBase . '/assets/images/landing-hero.png' : '';
$metaDescription = 'Kaffeeliste automatisiert die Abrechnung eurer Kaffeekasse: Guthaben, Zahlungen und offene Beträge immer im Blick. In 5 Minuten startklar, kostenlos für Teams bis 10 Personen.';
$faqItems = [
['Wie schnell ist meine Kaffeeliste startklar?', 'Kundenkonto anlegen, Mitglieder eintragen, loslegen. Es ist keine Einrichtung durch uns nötig, und die bestehenden Abläufe rund um Striche und Einzahlungen bleiben dieselben.'],
['Was kostet die Kaffeeliste?', 'Bis 10 Teilnehmer kostenlos, danach gestaffelt nach Teamgröße ab 3,99 € im Monat ohne Kosten pro Kopf.'],
['Sind unsere Daten von denen anderer Kunden getrennt?', 'Ja. Jeder Kunde hat einen eigenen, isolierten Bereich für Mitglieder, Buchungen und Einstellungen. Diese Trennung ist fester Bestandteil der App und wird automatisiert geprüft.'],
['Wer darf in unserem Team was ändern?', 'Ihr vergebt Rollen wie Administrator, Kassenwart oder Mitglied gezielt pro Person und könnt den Zugang jederzeit wieder entziehen, ohne den Mitgliedseintrag selbst zu löschen.'],
['Können wir unsere Daten exportieren oder löschen lassen?', 'Ja. Ihr könnt alle gespeicherten Daten jederzeit als Export herunterladen und einzelne Mitglieder oder euren gesamten Kundenbereich selbstständig wieder entfernen lassen.'],
['Müssen wir PayPal nutzen?', 'Nein, PayPal ist optional und lässt sich in den Mandant-Einstellungen aktivieren. Einzahlungen können weiterhin auch manuell erfasst werden.'],
];
$faqLd = [
'@context' => 'https://schema.org',
'@type' => 'FAQPage',
'mainEntity' => array_map(static function (array $item): array {
return [
'@type' => 'Question',
'name' => $item[0],
'acceptedAnswer' => ['@type' => 'Answer', 'text' => $item[1]],
];
}, $faqItems),
];
$productLd = [
'@context' => 'https://schema.org',
'@type' => 'SoftwareApplication',
'name' => 'Kaffeeliste',
'applicationCategory' => 'BusinessApplication',
'operatingSystem' => 'Web',
'description' => $metaDescription,
'offers' => [
['@type' => 'Offer', 'price' => '0', 'priceCurrency' => 'EUR', 'description' => 'Bis 10 Teilnehmer'],
['@type' => 'Offer', 'price' => '3.99', 'priceCurrency' => 'EUR', 'description' => 'Bis 25 Teilnehmer / Monat'],
['@type' => 'Offer', 'price' => '7.99', 'priceCurrency' => 'EUR', 'description' => 'Bis 50 Teilnehmer / Monat'],
['@type' => 'Offer', 'price' => '12.99', 'priceCurrency' => 'EUR', 'description' => 'Bis 150 Teilnehmer / Monat'],
],
];
$jsonFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
?>
<!DOCTYPE HTML>
<html lang="de">
<head>
<title>Kaffeeliste die digitale Kaffeekasse, die von allein mitrechnet</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="<?php echo htmlspecialchars($metaDescription, ENT_QUOTES, 'UTF-8'); ?>" />
<meta name="theme-color" content="#38761d" />
<?php if ($landingUrl !== ''): ?>
<link rel="canonical" href="<?php echo htmlspecialchars($landingUrl, ENT_QUOTES, 'UTF-8'); ?>" />
<?php endif; ?>
<meta property="og:type" content="website" />
<meta property="og:site_name" content="Kaffeeliste" />
<meta property="og:title" content="Die Kaffeekasse, die von allein mitrechnet" />
<meta property="og:description" content="<?php echo htmlspecialchars($metaDescription, ENT_QUOTES, 'UTF-8'); ?>" />
<meta property="og:locale" content="de_DE" />
<?php if ($landingUrl !== ''): ?>
<meta property="og:url" content="<?php echo htmlspecialchars($landingUrl, ENT_QUOTES, 'UTF-8'); ?>" />
<?php endif; ?>
<?php if ($landingImage !== ''): ?>
<meta property="og:image" content="<?php echo htmlspecialchars($landingImage, ENT_QUOTES, 'UTF-8'); ?>" />
<meta name="twitter:image" content="<?php echo htmlspecialchars($landingImage, ENT_QUOTES, 'UTF-8'); ?>" />
<?php endif; ?>
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Die Kaffeekasse, die von allein mitrechnet" />
<meta name="twitter:description" content="<?php echo htmlspecialchars($metaDescription, ENT_QUOTES, 'UTF-8'); ?>" />
<link rel="preload" as="image" href="assets/images/landing-hero.png" />
<link rel="stylesheet" href="assets/css/main.css" />
<link rel="stylesheet" href="assets/css/public.css" />
<script type="application/ld+json"><?php echo json_encode($productLd, $jsonFlags); ?></script>
<script type="application/ld+json"><?php echo json_encode($faqLd, $jsonFlags); ?></script>
</head>
<body class="is-preload public-page">
<div class="public-shell">
<section class="public-hero">
<nav class="public-nav" aria-label="Hauptnavigation">
<strong>Kaffeeliste</strong>
<ul class="actions">
<li><a href="<?php echo htmlspecialchars(app_primary_url('login.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button">Login</a></li>
<li><a href="<?php echo htmlspecialchars(app_primary_url('register.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button primary">Registrieren</a></li>
</ul>
</nav>
<div class="public-hero-content">
<h1>Die Kaffeekasse, die von allein mitrechnet</h1>
<p class="public-hero-lead">Schluss mit Kopfrechnen, Zettelwirtschaft und dem lästigen Kassensturz am Monatsende. Wer wie viel offen hat, sieht jeder auf einen Blick ihr macht nur noch die Striche, den Rest erledigt Kaffeeliste.</p>
<p class="public-hero-sub"><strong>In 5 Minuten startklar. Kostenlos für Teams bis 10 Personen.</strong></p>
<ul class="actions">
<li><a href="<?php echo htmlspecialchars(app_primary_url('register.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button primary big">Kostenlos einrichten</a></li>
<li><a href="<?php echo htmlspecialchars(app_primary_url('login.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button big">Zur App</a></li>
</ul>
<p class="public-hero-reassure">Keine Kreditkarte nötig&nbsp;· in wenigen Minuten startklar&nbsp;· jederzeit kündbar</p>
</div>
</section>
<section class="public-trust" aria-label="Auf einen Blick">
<ul>
<li>Bis 10&nbsp;Personen kostenlos</li>
<li>Ohne Kreditkarte starten</li>
<li>DSGVO-konform: Daten jederzeit export- &amp; löschbar</li>
<li>§&nbsp;19&nbsp;UStG keine Mehrwertsteuer</li>
<li>Bestehende Abläufe bleiben</li>
</ul>
</section>
<section class="public-section public-audience">
<header class="major">
<h2>Für jede Teeküche gemacht</h2>
<p>Überall dort, wo mehrere Leute an einer Maschine trinken und am Ende niemand nachrechnen will.</p>
</header>
<ul class="public-audience-list">
<li>Büros &amp; Agenturen</li>
<li>Arzt- &amp; Zahnarztpraxen</li>
<li>Vereine</li>
<li>Werkstätten &amp; Betriebe</li>
<li>Kanzleien</li>
<li>Gemeinschaftsküchen</li>
</ul>
</section>
<section class="public-section">
<header class="major">
<h2>So funktioniert's</h2>
<p>Drei Schritte, kein Umlernen für dein Team nötig.</p>
</header>
<div class="public-grid public-steps">
<article class="public-feature">
<span class="public-step-number">1</span>
<h3>Kaffee nehmen</h3>
<p>Wie bisher: Kaffee holen, Tee, Wasser ganz ohne App am Automaten oder an der Maschine selbst.</p>
</article>
<article class="public-feature">
<span class="public-step-number">2</span>
<h3>Strich setzen</h3>
<p>Der Strich landet in der Kaffeeliste gesammelt durch die zuständige Person oder, wenn gewünscht, in Sekunden selbst im eigenen Dashboard erfasst.</p>
</article>
<article class="public-feature">
<span class="public-step-number">3</span>
<h3>Bei Bedarf bezahlen</h3>
<p>Der aktuelle Stand ist immer sichtbar. Ausgleich in einem Klick per PayPal, ganz ohne Bargeld und Wechselgeld-Suche.</p>
</article>
</div>
</section>
<section class="public-section">
<header class="major">
<h2>Was dein Team davon hat</h2>
<p>Für alle, die einfach nur Kaffee trinken wollen ohne Diskussionen über die Kasse.</p>
</header>
<div class="public-grid">
<article class="public-feature">
<h3>Jeder sieht seinen Stand</h3>
<p>Kein Nachfragen, kein böses Erwachen: Guthaben oder offener Betrag stehen jederzeit im eigenen Dashboard am Handy in der Teeküche oder am Rechner.</p>
</article>
<article class="public-feature">
<h3>Strich in zwei Sekunden</h3>
<p>Ein Tipp auf „Ein Strich" oder „Zwei Striche" im eigenen Konto der Verbrauch wird automatisch richtig zugeordnet. Nichts eintragen, nichts nachtragen.</p>
</article>
<article class="public-feature">
<h3>Bezahlen ohne Kleingeld</h3>
<p>Offener Betrag? Ein fertiger PayPal-Link mit dem passenden Betrag wartet schon. Kein Bargeld, kein „Ich hab's gleich".</p>
</article>
<article class="public-feature">
<h3>Die Liste an der Wand bleibt</h3>
<p>Der vertraute Ausdruck neben der Maschine bleibt jetzt mit eurem eigenen Hinweistext als Wasserzeichen und automatisch passender Zeilengröße.</p>
</article>
<article class="public-feature">
<h3>Ein Hinweis für alle</h3>
<p>„Maschine ist kaputt" oder „Neue Sorte da"? Ein Banner erscheint für alle sichtbar in der App ohne Rundmail und Zettel am Kühlschrank.</p>
</article>
</div>
</section>
<section class="public-section public-highlight">
<header class="major">
<h2>6 Gründe, warum Kassenwarte Kaffeeliste lieben</h2>
<p>Der Papierkram der Kaffeekasse ab jetzt erledigt sich der größtenteils selbst.</p>
</header>
<div class="public-grid public-steps public-advantages">
<article class="public-feature">
<span class="public-step-number">1</span>
<h3>Kein Taschenrechner mehr</h3>
<p>Salden berechnen sich automatisch. Nie wieder Striche und Zahlungen am Monatsende von Hand zusammenzählen.</p>
</article>
<article class="public-feature">
<span class="public-step-number">2</span>
<h3>Jahresabschluss auf Knopfdruck</h3>
<p>Auswertung fürs ganze Jahr direkt aus der App statt Excel-Formeln zu pflegen, die keiner mehr versteht.</p>
</article>
<article class="public-feature">
<span class="public-step-number">3</span>
<h3>Erinnerungen laufen von allein</h3>
<p>Eine Info-Mail an alle mit offenem Betrag statt jede Person einzeln anzuschreiben oder in der Küche anzusprechen.</p>
</article>
<article class="public-feature">
<span class="public-step-number">4</span>
<h3>Mitglieder in Sekunden verwaltet</h3>
<p>Neue Kolleg:innen anlegen, alte deaktivieren, Rollen vergeben ohne Rückfragen, wer worauf Zugriff hat.</p>
</article>
<article class="public-feature">
<span class="public-step-number">5</span>
<h3>PayPal-Abgleich ohne Nachrechnen</h3>
<p>Eingehende Zahlungen lassen sich per Export einlesen und dem richtigen Mitglied zuordnen inklusive Dublettenprüfung.</p>
</article>
<article class="public-feature">
<span class="public-step-number">6</span>
<h3>Kein Feilschen mehr</h3>
<p>Jede Buchung ist nachvollziehbar bis zum ersten Tag. Diskussionen über „Ich hab aber weniger getrunken" erledigen sich von selbst.</p>
</article>
</div>
</section>
<section class="public-section">
<header class="major">
<h2>Preise</h2>
<p>Ein Preis pro Team, gestaffelt nach aktiven Teilnehmern keine Kosten pro Kopf, keine versteckten Gebühren.</p>
</header>
<div class="public-grid">
<article class="public-feature">
<h3>Bis 10 Teilnehmer</h3>
<p class="public-price">Kostenlos</p>
</article>
<article class="public-feature">
<h3>Bis 25 Teilnehmer</h3>
<p class="public-price">3,99 €<span> / Monat</span></p>
</article>
<article class="public-feature">
<h3>Bis 50 Teilnehmer</h3>
<p class="public-price">7,99 €<span> / Monat</span></p>
</article>
<article class="public-feature">
<h3>Bis 150 Teilnehmer</h3>
<p class="public-price">12,99 €<span> / Monat</span></p>
</article>
</div>
<p class="public-fineprint">Mehr als 150 Teilnehmer? <a href="<?php echo htmlspecialchars(app_primary_url('preise.php'), ENT_QUOTES, 'UTF-8'); ?>">Preis auf Anfrage</a>. Gemäß § 19 UStG wird keine Umsatzsteuer berechnet die genannten Beträge sind die tatsächlich zu zahlenden Endpreise. Details unter <a href="<?php echo htmlspecialchars(app_primary_url('preise.php'), ENT_QUOTES, 'UTF-8'); ?>">Preise</a>.</p>
</section>
<section class="public-section public-demo">
<header class="major">
<h2>So sieht's in der App aus</h2>
<p>Klares Layout, aufgeräumte Tabellen, alles auf einen Blick die Kaffeeliste bleibt bewusst eine Arbeitsoberfläche statt einer verspielten Marketing-App.</p>
</header>
<div class="public-demo-frame">
<img src="assets/images/demo-kaffeeliste.png" alt="Ausschnitt aus der Kaffeeliste: Gesamtübersicht mit aktivem Mitglied, Stand, Ausgabe, Strichen und Einzahlungen" loading="lazy">
</div>
</section>
<section class="public-section">
<header class="major">
<h2>Häufige Fragen</h2>
</header>
<div class="public-faq">
<?php foreach ($faqItems as $item): ?>
<div class="public-panel">
<h3><?php echo htmlspecialchars($item[0], ENT_QUOTES, 'UTF-8'); ?></h3>
<p><?php echo htmlspecialchars($item[1], ENT_QUOTES, 'UTF-8'); ?></p>
</div>
<?php endforeach; ?>
</div>
</section>
<section class="public-section public-cta">
<header class="major">
<h2>Bereit für eine Kaffeekasse, die mitdenkt?</h2>
<p>In wenigen Minuten eingerichtet, für dein ganzes Team nutzbar.</p>
</header>
<ul class="actions">
<li><a href="<?php echo htmlspecialchars(app_primary_url('register.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button primary big">Kundenkonto anlegen</a></li>
<li><a href="<?php echo htmlspecialchars(app_primary_url('login.php'), ENT_QUOTES, 'UTF-8'); ?>" class="button big">Zur App</a></li>
</ul>
<p class="public-cta-reassure">Bis 10 Personen kostenlos&nbsp;· keine Kreditkarte nötig&nbsp;· jederzeit kündbar</p>
</section>
</div>
<footer class="public-footer-links">
<a href="impressum.php">Impressum</a>
<a href="agb.php">AGB</a>
<a href="datenschutz.php">Datenschutz</a>
<a href="preise.php">Preise</a>
</footer>
<script src="assets/js/jquery.min.js"></script>
<script src="assets/js/browser.min.js"></script>
<script src="assets/js/breakpoints.min.js"></script>
<script src="assets/js/util.js"></script>
<script src="assets/js/main.js"></script>
</body>
</html>