web: Erstquelle-Absatz in der Veröffentlichungsmail, vierte Transparenzseite „kostenlos veröffentlichen" (Anhang 1: 1d, 2.4, E7)
Meldungen, die über die API eingegangen sind, bekommen in der Veröffentlichungsmail einen Absatz zum Unterschied Erstquelle/Kopie — technische Tatsache, ohne Preis und Angebot; direkt eingereichte nicht. /pressemitteilung-kostenlos-veroeffentlichen beantwortet die Suche nach „kostenlos" ehrlich: kein kostenloser Weg (E7), was kostenlose Portale leisten, warum Links aus Presseportalen kaum tragen (auch bei uns sponsored nofollow), warum Annahme ohne Gegenwert und Prüfung sich ausschließen, wer am Ende zahlt. Die Liste kostenloser Portale ist in config/transparency.php vorbereitet und bleibt leer, bis geprüfte Einträge mit Prüfdatum vorliegen. Unter-Navigation, Hilfe, Sitemaps, llms.txt und die Modelltabelle der Kostenseite verlinken die neue Seite. Anhang 1 und Protokoll Teil 6. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
6b8728242f
commit
375138679d
21 changed files with 597 additions and 12 deletions
|
|
@ -50,6 +50,7 @@ class LlmsTxtController extends Controller
|
|||
'- [Richtlinien]('.$base.'/de/richtlinien): Was veröffentlicht wird und was nicht',
|
||||
'- [Was kostet eine Pressemitteilung?]('.$base.'/de/was-kostet-eine-pressemitteilung): Abrechnungsmodelle, Prüfliste für Folgekosten, Rechenbeispiel',
|
||||
'- [Pressemitteilung löschen oder ändern lassen]('.$base.'/de/pressemitteilung-loeschen-oder-aendern-lassen)',
|
||||
'- [Pressemitteilung kostenlos veröffentlichen?]('.$base.'/de/pressemitteilung-kostenlos-veroeffentlichen): Warum es hier keine kostenlose Einreichung gibt, was kostenlose Portale leisten',
|
||||
'- [API]('.$base.'/de/api): Einlieferung per REST-API; OpenAPI-Spezifikation unter '.$base.'/docs/api/v1',
|
||||
'',
|
||||
'## Portale',
|
||||
|
|
@ -111,6 +112,7 @@ class LlmsTxtController extends Controller
|
|||
'- [Was kostet eine Pressemitteilung?]('.$base.'/de/was-kostet-eine-pressemitteilung): Abrechnungsmodelle, Prüfliste für Folgekosten, Rechenbeispiel',
|
||||
'- [Pressemitteilung veröffentlichen ohne Abo]('.$base.'/de/pressemitteilung-veroeffentlichen-ohne-abo)',
|
||||
'- [Pressemitteilung löschen oder ändern lassen]('.$base.'/de/pressemitteilung-loeschen-oder-aendern-lassen): Korrektur, Änderung, DSGVO, Depublikation',
|
||||
'- [Pressemitteilung kostenlos veröffentlichen?]('.$base.'/de/pressemitteilung-kostenlos-veroeffentlichen): Warum es hier keine kostenlose Einreichung gibt, was kostenlose Portale leisten',
|
||||
'- [Was eine gute Pressemitteilung ausmacht]('.$base.'/de/gute-pressemitteilung)',
|
||||
'- [Hilfe]('.$base.'/de/hilfe)',
|
||||
'- [API]('.$base.'/de/api): Einlieferung per REST-API über den Publisher-Bereich '.$hub,
|
||||
|
|
|
|||
|
|
@ -26,14 +26,14 @@ class SitemapController extends Controller
|
|||
/** @var list<string> */
|
||||
private const HUB_PAGES = [
|
||||
'faq', 'hilfe', 'gute-pressemitteilung', 'api', 'kuendigung',
|
||||
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen',
|
||||
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen', 'pressemitteilung-kostenlos-veroeffentlichen',
|
||||
'impressum', 'datenschutz', 'agb', 'richtlinien', 'melden',
|
||||
];
|
||||
|
||||
/** @var list<string> */
|
||||
private const PORTAL_PAGES = [
|
||||
'preise', 'veroeffentlichen', 'newsrooms', 'faq', 'hilfe', 'gute-pressemitteilung', 'api',
|
||||
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen',
|
||||
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen', 'pressemitteilung-kostenlos-veroeffentlichen',
|
||||
'impressum', 'datenschutz', 'agb', 'richtlinien', 'melden',
|
||||
];
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ use Illuminate\Contracts\View\View;
|
|||
use Illuminate\Http\Request;
|
||||
|
||||
/**
|
||||
* Transparenzseiten (Roadmap 2.4): drei Seiten mit unterschiedlicher
|
||||
* Transparenzseiten (Roadmap 2.4): vier Seiten mit unterschiedlicher
|
||||
* Suchintention, alle mit denselben Zahlen aus PricingTransparencyData.
|
||||
*/
|
||||
class TransparencyPageController extends Controller
|
||||
|
|
@ -28,6 +28,11 @@ class TransparencyPageController extends Controller
|
|||
return view('web.pressemitteilung-loeschen-oder-aendern-lassen', $this->pageData($request, $data));
|
||||
}
|
||||
|
||||
public function free(Request $request, PricingTransparencyData $data): View
|
||||
{
|
||||
return view('web.pressemitteilung-kostenlos-veroeffentlichen', $this->pageData($request, $data));
|
||||
}
|
||||
|
||||
/**
|
||||
* Markenname aus dem Host (wie /melden) — der Theme-Provider ist in
|
||||
* Tests noch nicht auf den Request-Host gelaufen.
|
||||
|
|
|
|||
|
|
@ -44,6 +44,12 @@ class PressReleasePublished extends Mailable
|
|||
public readonly PressRelease $pressRelease,
|
||||
?string $recipientName = null,
|
||||
?string $recipientEmail = null,
|
||||
/**
|
||||
* Über einen Verteiler (API) eingegangen: dann erklärt die Mail den
|
||||
* Unterschied Erstquelle/Kopie (Roadmap 1d, Anhang 17.09.2026) —
|
||||
* eine technische Tatsache, kein Angebot.
|
||||
*/
|
||||
public readonly bool $viaSyndication = false,
|
||||
) {
|
||||
$this->recipientName = $recipientName ?? $user->name;
|
||||
$this->showUrl = self::tagged(
|
||||
|
|
|
|||
|
|
@ -799,7 +799,7 @@ class PressReleaseService
|
|||
}
|
||||
|
||||
$mailable = match ($event) {
|
||||
'published' => new PressReleasePublished($user, $pressRelease, $recipientName, $recipient),
|
||||
'published' => new PressReleasePublished($user, $pressRelease, $recipientName, $recipient, $isApiSubmitter),
|
||||
'held' => new PressReleaseHeldForReview($user, $pressRelease, $automationExhausted, $recipientName, $recipient),
|
||||
default => new PressReleaseRejected($user, $pressRelease, $reason, $recipientName, $recipient),
|
||||
};
|
||||
|
|
|
|||
24
config/transparency.php
Normal file
24
config/transparency.php
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Transparenzseiten (Roadmap 2.4)
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Liste kostenloser Presseportale am Ende von
|
||||
| /pressemitteilung-kostenlos-veroeffentlichen. Jeder Eintrag ist eine
|
||||
| Tatsachenbehauptung über einen Dritten — deshalb nur mit eigenem
|
||||
| Prüfdatum und nur, was am Prüftag tatsächlich kostenlos Einreichungen
|
||||
| angenommen hat. Leer = der Abschnitt erscheint nicht.
|
||||
|
|
||||
| Eintrag: ['name' => 'Portalname', 'url' => 'https://…', 'note' => 'Auflagen in einem Satz (optional)']
|
||||
|
|
||||
*/
|
||||
|
||||
return [
|
||||
|
||||
'free_portals_checked_at' => env('TRANSPARENCY_FREE_PORTALS_CHECKED_AT'),
|
||||
|
||||
'free_portals' => [],
|
||||
|
||||
];
|
||||
|
|
@ -134,6 +134,8 @@ Für selbst angelegte Firmendaten trägt der Nutzer die Verantwortung. Für die
|
|||
|
||||
### 1c Sichtbarkeit belegen
|
||||
|
||||
*Abschnitt durch Anhang 1 (`roadmap-anhang1-2026.md`, 17.09.2026) ersetzt: 1c.0 Crawler-Protokoll, Stufe 1 ohne Google-Link, 1c.4 Search Console intern, 1c.6 KI-Abrufe. Stand dort.*
|
||||
|
||||
| Nr. | Arbeitspaket | Aufwand | Abhängigkeit |
|
||||
|---|---|---|---|
|
||||
| ~~1c.1~~ | Absenderansicht je Meldung: Aufrufe im Verlauf, Indexierungsstatus, Einordnung gegen Portaldurchschnitt — **gebaut 16.09.2026**: Panel „Sichtbarkeit" auf der Meldungsseite, Tagesbalken 30/90 Tage (Ereignisse seit 17.07.2026, davor „keine Messung"), Rohzahlen nach E2; Indexierung in **Variante B** („in der Sitemap seit", Link auf die Google-Suche) — Search-Console-Abgleich (Variante A) bewusst ans Ende geschoben | M | 0.1 |
|
||||
|
|
@ -187,7 +189,7 @@ Verbreitert den Trichter oben. Sinnvoll erst, wenn Block 1 unten geschlossen ist
|
|||
| ~~2.1~~ | NewsArticle-Schema auf allen Meldungen, Organization-Schema auf Newsrooms — **Grundgerüst seit Juli (379688f), 17.09.2026 ergänzt:** gemeinsame `@id` zwischen `NewsArticle.author` und Newsroom-Organization, Publisher mit `@id` und Logo (`App\Support\StructuredData`) | M | 1b.1 |
|
||||
| 2.2 | Aufnahme in Google News und Publisher Center prüfen und beantragen — **technischer Teil 17.09.2026:** News-Sitemap `/sitemap-news.xml` je Spoke (48 h, ≤ 1.000), in `robots.txt`; Publisher-Center-Anmeldung liegt beim Betreiber (Protokoll Teil 5) | M | 2.1 |
|
||||
| ~~2.3~~ | Branchen- und Kategorie-Landingpages aus dem Archivbestand — **17.09.2026:** Jahresarchiv je Branche `/category/{slug}/archiv/{jahr}` (34.600 Meldungen intern verlinkt, in der Sitemap), Jahresleiste auf der Branchenseite, Beschreibungen für alle 14 Kategorien (`categories:seed-descriptions`), Portalname im Titel | M | keine |
|
||||
| ~~2.4~~ | Transparenzseiten — **17.09.2026 nach Briefing, drei Seiten:** `was-kostet-eine-pressemitteilung` (Modellvergleich ohne Namen, Prüfliste Folgekosten, eigene Zusagen, Rechenbeispiel mit gemischtem Ausgang), `pressemitteilung-veroeffentlichen-ohne-abo`, `pressemitteilung-loeschen-oder-aendern-lassen` (Meldeverfahren + Absatz für fremde Portale); keine fremden Zahlen | S | keine |
|
||||
| ~~2.4~~ | Transparenzseiten — **17.09.2026 nach Briefing, drei Seiten:** `was-kostet-eine-pressemitteilung` (Modellvergleich ohne Namen, Prüfliste Folgekosten, eigene Zusagen, Rechenbeispiel mit gemischtem Ausgang), `pressemitteilung-veroeffentlichen-ohne-abo`, `pressemitteilung-loeschen-oder-aendern-lassen` (Meldeverfahren + Absatz für fremde Portale); keine fremden Zahlen | S | keine — **Nachtrag 17.09.2026 (Anhang 1):** vierte Seite „kostenlos veröffentlichen" |
|
||||
| 2.5 | Konsolidierung der bestehenden Ratgeberseiten unter `/de/presse/` gegen 1d.1 und 2.4 prüfen | S | 1d.1 |
|
||||
| 2.6 | Outreach an Betreiber von Presseportal-Listen und Vergleichsartikeln | M | 2.4 |
|
||||
| ~~2.7~~ | Auffindbarkeit für KI-Systeme: strukturierte Daten, klare Entitätszuordnung, `llms.txt` — **17.09.2026:** `/llms.txt` je Host (Hub verweist auf beide Portale), Entitätszuordnung über 2.1 | M | 2.1 |
|
||||
|
|
|
|||
160
dev/2026-09-01/roadmap-anhang1-2026.md
Normal file
160
dev/2026-09-01/roadmap-anhang1-2026.md
Normal file
|
|
@ -0,0 +1,160 @@
|
|||
# Anhang zur Roadmap Nutzergewinnung — Änderungen vom 17.09.2026
|
||||
|
||||
*Ergänzung zur Fassung vom 01.09.2026. Die Abschnitte unten ersetzen oder erweitern die jeweils genannte Stelle.*
|
||||
|
||||
---
|
||||
|
||||
## Überblick
|
||||
|
||||
| Änderung | Betrifft | Art |
|
||||
|---|---|---|
|
||||
| Crawler-Abruf-Protokoll als eigenes Arbeitspaket | 1c.0 | neu |
|
||||
| Absenderansicht in Stufen zerlegt, Indexierungsstatus zunächst intern | 1c.1, 1c.4 bis 1c.6 | ersetzt |
|
||||
| Erstquelle gegen Kopie als Argument für die Direktveröffentlichung | 1d | neu |
|
||||
| Transparenzseiten ausformuliert, kein Wettbewerbervergleich | 2.4 | ersetzt |
|
||||
| Zuschriften an Portalübersichten ausformuliert, zwei konkrete Ziele | 2.6 | ersetzt |
|
||||
| 2.7 rückt vor, Begründung ergänzt | 2.7 | ergänzt |
|
||||
| Zwei neue offene Entscheidungen | E7, E8 | neu |
|
||||
|
||||
**Anlass der Änderung:** Recherche zum Marktstand am 17.09.2026. Zwei Befunde haben die Priorisierung verschoben — die Belegbarkeit von KI-Abrufen über eigene Serverlogs, und die Tatsache, dass die GEO-Positionierung seit Ende August 2026 besetzt ist.
|
||||
|
||||
---
|
||||
|
||||
## 1. Block 1c — ersetzt den bisherigen Abschnitt vollständig
|
||||
|
||||
### 1c Sichtbarkeit belegen
|
||||
|
||||
| Nr. | Arbeitspaket | Aufwand | Abhängigkeit |
|
||||
|---|---|---|---|
|
||||
| ~~1c.0~~ | Crawler-Abruf-Protokoll — **gebaut 17.09.2026**: `press_release_crawler_hits`, 15 Dienste in `config/crawlers.php`, keine IP, Bereinigung mit dem Ereignis-Log; `CRAWLER_HITS_RECORDED_SINCE` beim Deploy setzen | S | keine |
|
||||
| ~~1c.1~~ | Absenderansicht Stufe 1 — **umgebaut 17.09.2026**: Panel heißt „Auslieferung", Google-Suchlink entfernt, Sitemap-Datum bleibt; keine Feeds vorhanden, daher kein Feed-Eintrag | M | 0.1 |
|
||||
| 1c.2 | Zugang zur Ansicht über Magic Link, auch ohne Konto | S | 1b.2 |
|
||||
| 1c.3 | Newsroom-Übersicht mit allen Meldungen der Firma und Summenwerten | M | 1a.3, 1c.1 |
|
||||
| ~~1c.4~~ | Indexierungsstatus — **gebaut 17.09.2026**: `press-releases:check-index-status` (täglich, Kontingent nach Alter gestaffelt), `press_release_index_checks` als Momentaufnahmen, Admin ▸ Reports ▸ Indexierung getrennt nach direkt/API; **läuft erst mit Service-Konto** (`GSC_*` in `.env`) | M | GSC-Property je Portal verifiziert |
|
||||
| 1c.5 | Entscheidung über die Kundenansicht des Indexierungsstatus, auf Basis der Verteilung aus 1c.4 — Schalter `GSC_CUSTOMER_VISIBLE` ist vorbereitet; Altbestand ohne Status-Log zählt in der Verteilung als „direkt" | S | 1c.4 |
|
||||
| ~~1c.6~~ | Abrufe durch KI-Dienste — **gebaut 17.09.2026**: Block im Panel je Dienst mit letztem Abruf und Anzahl, Satz „Ein Abruf ist kein Zitat" | S | 1c.0, 1c.1 |
|
||||
|
||||
**Stufe 1 verspricht nichts, was von Dritten abhängt.** Überschrift "Auslieferung", nicht "Sichtbarkeit bei Google". Keine Schaltfläche, die eine `site:`-Suche öffnet — sie liefert dem Kunden ein unvollständiges Ergebnis ohne Einordnung und ist schlechter als keine Angabe.
|
||||
|
||||
**Warum 1c.4 erst intern läuft:** Google News spielt bei mehrfach veröffentlichten Texten nur eine Quelle aus, und syndizierte Meldungen liegen gleichzeitig auf vielen Portalen. Die Indexierungsquote des syndizierten Bestands wird deshalb niedrig ausfallen, aus einem Grund, der nicht am Portal liegt. Erst die Verteilung kennen, getrennt nach Direkteinreichung und Syndikation, dann über die Kundenansicht entscheiden. Fällt der Unterschied deutlich aus, ist er das stärkste sachliche Argument für die Direktveröffentlichung.
|
||||
|
||||
**Technische Hinweise zu 1c.4**
|
||||
|
||||
- URL Inspection API, 2.000 Abfragen pro Tag und Property, also je Portal getrennt
|
||||
- nach Alter gestaffelt prüfen statt täglich alles; ein festes Tageskontingent auf die jüngsten Meldungen bleibt weit unter der Quote
|
||||
- jede Antwort mit Zeitstempel in eigener Tabelle speichern; die API liefert eine Momentaufnahme, der Verlauf lässt sich nicht nachträglich erzeugen
|
||||
- "noch nicht gecrawlt" und "gecrawlt, aber nicht indexiert" sind verschiedene Befunde und müssen in jeder Anzeige unterschieden werden
|
||||
|
||||
**Grenze bei 1c.6:** Ein Abruf ist kein Zitat. Die Anzeige belegt, dass der Crawler eines Dienstes die Seite geholt hat, mehr nicht. Genau so formulieren. Erfasst werden User-Agent, Zeitpunkt und Meldung, keine IP-Adressen.
|
||||
|
||||
**Warum 1c.0 sofort kommt:** Die Daten entstehen erst ab dem Einschalten des Protokolls. Jeder Tag ohne Protokoll ist ein Tag ohne Beleg, und rückwirkend lässt sich nichts erzeugen. Das Paket ist klein und unabhängig von allem anderen.
|
||||
|
||||
---
|
||||
|
||||
## 2. Block 1d — neuer Absatz, direkt nach "Nebeneffekt"
|
||||
|
||||
**Erstquelle gegen Kopie** (*eingebaut 17.09.2026: Absatz in der Veröffentlichungsmail, nur bei API-Meldungen, ohne Preis und Angebot*)**:** Eine über einen Verteiler ausgespielte Meldung liegt gleichlautend auf vielen Portalen und hat für Such- und KI-Systeme keine erkennbare Erstquelle. Eine direkt eingereichte Meldung kann als Erstquelle mit strukturierten Daten, geprüften Angaben und stabiler Adresse erscheinen. Das ist eine technische Tatsache und lässt sich in den Benachrichtigungen ohne Verkaufsdruck erklären. Es ist die erste sachliche Begründung dafür, dass die Direktveröffentlichung mehr wert ist als die Syndikation.
|
||||
|
||||
---
|
||||
|
||||
## 3. Block 2 — Tabellenzeilen 2.4, 2.6, 2.7 ersetzt
|
||||
|
||||
| Nr. | Arbeitspaket | Aufwand | Abhängigkeit |
|
||||
|---|---|---|---|
|
||||
| ~~2.4~~ | Transparenzseiten — vier Seiten, die vierte (`/pressemitteilung-kostenlos-veroeffentlichen`) **gebaut 17.09.2026**; Liste kostenloser Portale in `config/transparency.php` vorbereitet, leer bis geprüfte Einträge vorliegen | S | keine |
|
||||
| 2.6 | Zuschriften an Betreiber von Portalübersichten — übernimmt der Betreiber, nicht Teil der Umsetzung | S | 2.4 |
|
||||
| 2.7 | Auffindbarkeit für KI-Systeme: strukturierte Daten, klare Entitätszuordnung, `llms.txt` | M | 2.1 |
|
||||
|
||||
**2.7 rückt vor.** Das Feld ist nicht mehr leer: seit Ende August 2026 besetzt mit Leitquelle ein kuratiertes Portal genau diese Positionierung, betrieben von einer Berliner PR-Agentur, 89 Euro je Meldung. Der Bestand dort ist zum Stichtag klein und die Aufbereitung Handarbeit; die These wird damit bestätigt, nicht der Markt besetzt. Der Vorteil liegt bei Archiv, Zulauf und Automatisierung — nicht beim Vokabular. Begriffe wie "KI-lesbar" oder "Referenzversion" sind belegt und werden nicht übernommen.
|
||||
|
||||
**Formulierungsgrenze bei 2.7:** Die technischen Voraussetzungen zu beschreiben ist haltbar. Eine Nennung in KI-Antworten zu versprechen ist es nicht. Belegbar ist allein der Abruf durch einen Crawler (1c.0, 1c.6).
|
||||
|
||||
---
|
||||
|
||||
## 4. Neuer Unterabschnitt: 2.4 im Einzelnen
|
||||
|
||||
Kein Vergleich mit Wettbewerbern. Eine Tabelle mit fremden Preisen veraltet und wird damit zur unrichtigen Tatsachenbehauptung über einen Mitbewerber; Nachpflege ist für ein Solo-Projekt der falsche Aufwand. Die Argumentation läuft über das Abrechnungsmodell, nicht über die Zahl.
|
||||
|
||||
| Seite | Suchintention |
|
||||
|---|---|
|
||||
| Was kostet eine Pressemitteilung | Preis, Budget, Vergleich |
|
||||
| Pressemitteilung veröffentlichen ohne Abo | gezielte Ablehnung eines Modells |
|
||||
| Pressemitteilung löschen oder ändern lassen | akutes Problem, oft bei einem fremden Portal |
|
||||
| Pressemitteilung kostenlos veröffentlichen | sucht kostenlos, bekommt die Begründung, warum es das hier nicht gibt |
|
||||
|
||||
**Aufbau der ersten Seite**
|
||||
|
||||
1. Preis im ersten Bildschirm
|
||||
2. Modellvergleich ohne Anbieternamen: Abo, verfallendes Guthaben, Einzelabrechnung, kostenlos mit Auflagen
|
||||
3. Prüfliste zu Folgekosten, auf jedes Angebot anwendbar — öffentlicher Preis, automatische Verlängerung, Guthabenverfall, Kosten für Korrektur und Löschung, Verbleib nach Vertragsende
|
||||
4. Die eigenen Zusagen mit konkreter Einlösung
|
||||
5. Rechenbeispiel mit den eigenen Optionen
|
||||
|
||||
Gewinnt im Rechenbeispiel in jeder Zeile dasselbe Produkt, ist es ein Verkaufsargument und verliert seine Wirkung.
|
||||
|
||||
Abschnitt 3 ist der Teil, der die Seite verlinkenswert macht: er hilft auch dem, der bei einem anderen Anbieter bleibt.
|
||||
|
||||
Die dritte Seite ist die stärkste und bisher unbesetzt, führt aber Anfragen zu fremden Portalen herbei. Ein Absatz dazu, an wen man sich dort wendet, fängt das auf.
|
||||
|
||||
**Zur vierten Seite:** "Pressemitteilung kostenlos veröffentlichen" ist ein gesuchter Begriff, und die Seite beantwortet ihn ehrlich, statt ihn zu meiden. Inhalt: was kostenlose Portale tatsächlich leisten, warum Links dort als `nofollow` oder `sponsored` gekennzeichnet werden und kaum tragen, warum kostenfreie Annahme und Qualitätsprüfung sich ausschließen, und wer die Kosten bei kostenlosen Angeboten am Ende trägt. Am Ende eine kurze Liste kostenloser Portale für alle, die genau das suchen. Wer bleibt, bleibt informiert.
|
||||
|
||||
**Falls doch fremde Zahlen:** nur öffentlich einsehbare Listenpreise, jeder Eintrag mit Stichtag und Link zur Preisseite des Anbieters, sichtbarer Erhebungshinweis. Keine Durchschnittspreise aus Sekundärquellen, weil die Erhebungsmethode nicht verteidigt werden kann.
|
||||
|
||||
---
|
||||
|
||||
## 5. Neuer Unterabschnitt: 2.6 im Einzelnen
|
||||
|
||||
**Arbeitsregel:** nur dort anschreiben, wo entweder ein Eintrag zum eigenen Portal bereits besteht und sachlich falsch ist, oder wo die Redaktion ausdrücklich um Zuschriften bittet. Eine Bitte um Neuaufnahme ohne solchen Anlass zielt auf Absatzförderung und fällt unter die Einwilligungspflicht bei elektronischer Post, die auch gegenüber Unternehmen gilt. Eine Korrektur einer bestehenden Angabe tut das nicht.
|
||||
|
||||
**Listen kostenloser Presseportale entfallen als Ziel.** Beide Portale nehmen keine kostenfreien Einreichungen an (E7). Eine Aufnahme dort wäre nicht nur unpassend, sondern schädlich, weil sie Einreicher mit falscher Preiserwartung schickt. Damit fällt der größte Teil der vorhandenen Übersichtsartikel weg.
|
||||
|
||||
| Ziel | Befund zum 17.09.2026 | Anlass |
|
||||
|---|---|---|
|
||||
| PR-Gateway, Top-30-Übersicht | beide Portale unter *kostenlose* Presseportale geführt | Korrektur einer Angabe, die falschen Zulauf erzeugt |
|
||||
| pronline.de und vergleichbare Listen kostenloser Portale | beide Portale nicht gelistet | kein Anlass, gehört dort nicht hin |
|
||||
| Übersichten kuratierter oder kostenpflichtiger Portale | zu erheben | Aufnahme sachlich passend |
|
||||
|
||||
**Die PR-Gateway-Korrektur ist kein Marketingvorgang.** Sie verhindert Einreichungen, die an der Preiserwartung scheitern, und damit Ablehnungen, Rückfragen und Frust. Vor dem Schreiben den konkreten Eintrag selbst prüfen.
|
||||
|
||||
**Eigener Beitrag statt Bitte:** Portalübersichten verfallen schnell, und der Zustand vieler angeschlossener Portale ist aus dem Verteilerbetrieb bekannt. Eine Rückmeldung mit geprüften Einträgen und Prüfdatum ist ein redaktionsfähiger Beitrag und ein Anlass, der nichts mit dem eigenen Eintrag zu tun hat. Zweiter Beitrag: die Kriterienliste aus 2.4.
|
||||
|
||||
**Bezahlte Platzierungen in redaktionellen Ranglisten werden nicht gekauft.** Sie verstoßen gegen Googles Richtlinien zu Linkspam und untergraben die eigene Qualitätsargumentation. Ein klar gekennzeichneter Anzeigenplatz ist etwas anderes und wird als Werbung behandelt.
|
||||
|
||||
**Aufwandsdeckel:** eine Welle, höchstens acht Kontakte, eine Mail je Kontakt, kein Nachfassen, Zielliste mit Datum dokumentiert. Messung über Referrer in Umami, nicht über die Ereignistabelle.
|
||||
|
||||
**Mustertext für den Korrekturfall**
|
||||
|
||||
> Betreff: Korrektur zu Ihrer Portalübersicht — Eintrag [Portal]
|
||||
>
|
||||
> Sehr geehrte/r [Name],
|
||||
>
|
||||
> in Ihrer Übersicht [Titel, URL] ist [Portal] mit [falsche Angabe] aufgeführt. Das trifft seit [Zeitpunkt] nicht mehr zu. Richtig ist: [korrekte Angabe]. Öffentlich einsehbar unter [Link].
|
||||
>
|
||||
> Beim Durchsehen ist mir außerdem aufgefallen, dass [Anzahl] der genannten Portale am [Prüfdatum] keine Einreichung mehr angenommen haben: [Liste]. Falls Sie die Angaben nachhalten wollen, schicke ich Ihnen die Prüfnotizen gern.
|
||||
>
|
||||
> Freundliche Grüße
|
||||
> [Absender]
|
||||
|
||||
Kein Anhang, kein zweiter Link auf eine Verkaufsseite, keine Nachfassmail.
|
||||
|
||||
---
|
||||
|
||||
## 6. Offene Entscheidungen — zwei neue Zeilen
|
||||
|
||||
| Nr. | Frage | Betrifft |
|
||||
|---|---|---|
|
||||
| ~~E7~~ | **Entschieden 17.09.2026:** keine kostenfreie Einreichung, dauerhaft. Listen kostenloser Portale entfallen als Ziel. | 2.6 |
|
||||
| E8 | In welcher Form geht der Indexierungsstatus in die Kundenansicht? **Teilentscheidung 17.09.2026:** wird gleich mitgebaut, Anzeige beim Kunden zunächst zu. *Umgesetzt: Block „Google-Index" im Panel hinter `GSC_CUSTOMER_VISIBLE` (false).* | 1c.5 |
|
||||
|
||||
---
|
||||
|
||||
## 7. Marktbefunde, auf denen diese Änderungen beruhen
|
||||
|
||||
*Stand 17.09.2026, zur Nachvollziehbarkeit festgehalten.*
|
||||
|
||||
- Beide Portale fehlen in der geprüften Portalliste von pronline.de (Prüfdatum 09.09.2026) vollständig. Sie sind nicht gestrichen worden, sie waren nie gelistet. Auf Platz 7 steht pr-echo.de, ein anderes Portal.
|
||||
- Auf der Top-30-Liste von PR-Gateway sind beide Portale unter "kostenlose Presseportale" geführt.
|
||||
- Leitquelle (leitquelle.de), betrieben von PRonline Media UG, Berlin, veröffentlicht seit 27.08.2026 kuratierte Meldungen als KI-lesbare Referenzversionen mit Faktenbox, FAQ und JSON-LD. Preis 89 Euro, Beta mit kostenlosen Plätzen. Bestand zum Stichtag rund ein Dutzend Meldungen.
|
||||
- Leitquelle protokolliert Abrufe durch ChatGPT, Bing, Copilot, Google und Claude öffentlich mit Datum und Uhrzeit je Meldung und formuliert dazu ausdrücklich, dass kein Portal eine Zitierung garantieren kann. Das ist die Vorlage für 1c.0 und 1c.6.
|
||||
- Grundsatzentscheidung 17.09.2026: keine kostenfreie Einreichung. Kostenfreie Annahme zieht Texte an, deren Prüfung und Betrieb Geld und Zeit kosten, ohne Gegenwert, und steht im Widerspruch zum Qualitätsgate.
|
||||
- Branchenbefund: eine über einen Verteiler ausgespielte Meldung erscheint gleichlautend auf vielen Portalen, ohne erkennbare Erstquelle. Links aus Pressemitteilungen sollen als `sponsored` oder `nofollow` gekennzeichnet werden und tragen als SEO-Argument kaum noch.
|
||||
|
|
@ -1738,3 +1738,134 @@ neue Tabellen-Styles), `view:cache`/`route:cache` wie üblich, dann
|
|||
`/sitemap-news.xml`, `/llms.txt`, `/de/category/handel/archiv/2019` und
|
||||
eine Meldung im Rich-Results-Test (search.google.com/test/rich-results)
|
||||
prüfen.
|
||||
|
||||
## Teil 6 — Anhang 1 zur Roadmap (17.09.2026)
|
||||
|
||||
Grundlage: `roadmap-anhang1-2026.md`. 2.6 (Zuschriften an Betreiber)
|
||||
bewusst ausgelassen — übernimmt der Betreiber an anderer Stelle. 2.7 war
|
||||
mit Teil 5 bereits gebaut; die Formulierungsgrenze (Abruf belegbar,
|
||||
Nennung nicht) gilt in allen neuen Texten.
|
||||
|
||||
### 1c.0 Crawler-Abruf-Protokoll
|
||||
|
||||
Tabelle `press_release_crawler_hits` (Meldung, Dienst, User-Agent auf 255
|
||||
Zeichen gekürzt, Zeitpunkt — **keine IP**). Erkennung über
|
||||
`config/crawlers.php`: 15 Dienste mit User-Agent-Mustern und Art
|
||||
(Suche/KI) — OpenAI, Anthropic, Perplexity, Google-Extended (Gemini),
|
||||
Google Suche, Bing/Copilot, Apple, Meta, Amazon, Mistral, Cohere,
|
||||
DuckDuckGo, ByteDance, Common Crawl, Yandex. Die Liste ist Konfiguration,
|
||||
neue Dienste kommen ohne Code dazu. Aufzeichnung in
|
||||
`ReleaseDetailPageData` neben dem Aufruf-Zähler, per `defer()` nach der
|
||||
Antwort und fehlertolerant (`PressRelease::recordDeferredCrawlerHit`).
|
||||
Bereinigung hängt an `press-releases:purge-events` (gleiche Aufbewahrung,
|
||||
keine Wasserstandsmarke nötig). `crawlers.recorded_since` (Vorgabe
|
||||
18.09.2026, per `CRAWLER_HITS_RECORDED_SINCE` auf den Deploy-Tag setzen)
|
||||
sagt der Absenderansicht, ab wann es Daten geben kann.
|
||||
|
||||
Dev-Probe: Abruf mit GPTBot-User-Agent → eine Zeile `openai`; Browser →
|
||||
nichts.
|
||||
|
||||
### 1c.1 Stufe 1 — Panel umgebaut
|
||||
|
||||
Panel heißt jetzt **„Auslieferung"**, nicht mehr „Sichtbarkeit". Der
|
||||
Google-Button (Variante B, `site:`-Suche) ist raus — er lieferte ein
|
||||
unvollständiges Ergebnis ohne Einordnung. Geblieben: Aufrufe gesamt,
|
||||
Aufrufe im Zeitraum, Geteilt, Tagesbalken, „Sitemap für Suchmaschinen:
|
||||
gelistet seit". Feeds gibt es auf den Portalen nicht (kein RSS), deshalb
|
||||
kein Feed-Eintrag.
|
||||
|
||||
### 1c.6 Abrufe durch Such- und KI-Dienste
|
||||
|
||||
Block im Panel: je Dienst Bezeichnung, Art (Suche/KI), letzter Abruf,
|
||||
Anzahl. Darunter der Satz „Ein Abruf belegt, dass der Crawler des
|
||||
Dienstes die Seite geholt hat — nicht, dass sie dort angezeigt oder
|
||||
zitiert wird." Ohne Abrufe: „Noch kein Abruf protokolliert" plus Datum,
|
||||
ab dem erfasst wird.
|
||||
|
||||
### 1c.4 Indexierungsstatus (Search Console), intern
|
||||
|
||||
- `config/search_console.php`: `GSC_ENABLED`, `GSC_SERVICE_ACCOUNT_FILE`
|
||||
(JSON-Schlüssel eines Service-Kontos, außerhalb `public/`),
|
||||
`GSC_PROPERTY_PRESSEECHO` / `GSC_PROPERTY_BUSINESSPORTAL24` (Vorgabe
|
||||
`sc-domain:…`), `GSC_DAILY_BUDGET` (300 je Portal, Quote 2.000),
|
||||
`GSC_CUSTOMER_VISIBLE` (false, E8).
|
||||
- `SearchConsoleClient`: Service-Konto-JWT (RS256 per `openssl_sign`),
|
||||
Token 50 Minuten gecacht, ein Endpunkt (`urlInspection/index:inspect`).
|
||||
Bewusst ohne Google-SDK — keine neue Abhängigkeit.
|
||||
- Tabelle `press_release_index_checks`: jede Antwort eine Zeile mit
|
||||
Zeitstempel (Momentaufnahme, kein Verlauf nachträglich), Google-Felder
|
||||
einzeln plus `raw`, dazu der reduzierte Befund `IndexState`:
|
||||
indexiert / gecrawlt, nicht indexiert / noch nicht gecrawlt /
|
||||
ausgeschlossen / unbekannt. „Noch nicht gecrawlt" = kein
|
||||
`lastCrawlTime`.
|
||||
- `press-releases:check-index-status` täglich 05:10, je Portal ein
|
||||
Kontingent, nach Alter gestaffelt (`recheck_days`: ≤14 Tage alle 3,
|
||||
≤90 alle 14, ≤365 alle 45, älter alle 180), nie geprüfte zuerst, dann
|
||||
jüngste zuerst. Abbruch nach fünf Fehlern ohne Treffer (Quote/Auth).
|
||||
`--dry-run` listet, `--portal=`, `--budget=`.
|
||||
- Admin ▸ Reports ▸ **Indexierung** (`/admin/reports/indexierung`):
|
||||
je Portal Verteilung der Befunde, getrennt nach Direkteinreichung und
|
||||
Syndikation (Marker: Status-Log `source = api`), Ungeprüfte, jüngste
|
||||
100 Prüfungen, CSV (2.000). **Einschränkung:** Der Altbestand hat
|
||||
keine Status-Logs und zählt als „direkt" — die Trennung ist nur für
|
||||
Meldungen seit dem neuen System belastbar (Dev: presseecho 10.971
|
||||
direkt / 1.616 API, businessportal24 20.349 / …).
|
||||
- Kundenansicht (E8, mitgebaut, **zu**): Block „Google-Index" im Panel
|
||||
erscheint nur mit `GSC_CUSTOMER_VISIBLE=true`, zeigt je Portal den
|
||||
jüngsten Befund mit Datum und „zuletzt gecrawlt". Test erzwingt, dass
|
||||
der Block ohne Freigabe nicht ausgeliefert wird.
|
||||
|
||||
**Voraussetzung auf Betreiberseite:** Service-Konto in der Google Cloud
|
||||
Console anlegen, Schlüsseldatei erzeugen, die Konto-E-Mail in beiden
|
||||
Search-Console-Properties als Nutzer (Lesen reicht) eintragen, Datei auf
|
||||
den Server, `.env` setzen. Erster Lauf von Hand mit `--dry-run`.
|
||||
|
||||
### 1d Erstquelle gegen Kopie
|
||||
|
||||
Absatz in der Veröffentlichungsmail, **nur** bei Meldungen, die über die
|
||||
API eingegangen sind (`PressReleasePublished::$viaSyndication`, Marker
|
||||
wie beim Empfängerwechsel): Verteiler-Text liegt gleichlautend auf vielen
|
||||
Portalen und hat keine erkennbare Erstquelle; eine direkt eingereichte
|
||||
Meldung erscheint als Erstquelle mit strukturierten Daten, geprüften
|
||||
Angaben, stabiler Adresse. Kein Preis, kein Angebot, kein Link — der Test
|
||||
prüft, dass kein Euro-Zeichen im Absatz steht und direkte Meldungen den
|
||||
Absatz nicht bekommen.
|
||||
|
||||
### 2.4 Vierte Seite: `/pressemitteilung-kostenlos-veroeffentlichen`
|
||||
|
||||
Aufbau nach Anhang: kurze Antwort (Preis, kein kostenloser Weg, E7 als
|
||||
Grundsatz), was kostenlose Portale leisten und was nicht, warum Links aus
|
||||
Presseportalen kaum tragen (**inklusive der Aussage, dass unsere
|
||||
externen Links ebenfalls `sponsored nofollow` tragen** — Link-Policy
|
||||
seit 11.06.2026, sonst wäre der Abschnitt unehrlich), warum kostenfreie
|
||||
Annahme und Prüfung sich ausschließen, wer am Ende zahlt, CTA ohne
|
||||
Verkaufsdruck auf „Ohne Abo veröffentlichen".
|
||||
|
||||
**Liste kostenloser Portale: vorbereitet, leer.** Jeder Eintrag ist eine
|
||||
Tatsachenbehauptung über einen Dritten; ich habe keine geprüfte Liste.
|
||||
`config/transparency.php` (`free_portals` als Name/URL/Notiz,
|
||||
`TRANSPARENCY_FREE_PORTALS_CHECKED_AT` = Prüfdatum). Der Abschnitt
|
||||
erscheint nur, wenn beides gesetzt ist, Links dort `rel="nofollow"`, mit
|
||||
dem Hinweis, dass kein Eintrag eine Empfehlung ist.
|
||||
|
||||
Unter-Navigation hat jetzt fünf Punkte; Modelltabelle auf Seite 1
|
||||
verlinkt bei „Kostenlos mit Auflagen" auf die neue Seite; Hilfe-Center,
|
||||
Sitemaps, `llms.txt`, Legacy-Slug-Liste ergänzt.
|
||||
|
||||
### E7
|
||||
|
||||
Keine Stelle im Web-Auftritt verspricht kostenlose Veröffentlichung
|
||||
(geprüft: `lang/*`, `resources/views/web`). „Kostenlos" steht nur bei
|
||||
Konto, Newsroom-Zugang, Meldeverfahren und kleinen Korrekturen — alles
|
||||
zutreffend.
|
||||
|
||||
### Tests / Qualität
|
||||
|
||||
`CrawlerHitLogTest` (4), `VisibilityStatsTest` (umgebaut, 7),
|
||||
`IndexStatusCheckTest` (11, API per `Http::fake`), `AddressUnsubscribeTest`
|
||||
(+1), `TransparencyPagesTest` (11). Pint, Larastan Level 4 ohne Befund.
|
||||
|
||||
**Deploy:** `migrate` (zwei neue Tabellen, keine Änderung an
|
||||
`press_releases`), `npm run build`, `view:cache`/`route:cache`,
|
||||
`CRAWLER_HITS_RECORDED_SINCE` auf den Deploy-Tag setzen. Search Console
|
||||
erst nach Einrichtung des Service-Kontos einschalten.
|
||||
|
|
|
|||
|
|
@ -110,6 +110,7 @@ return [
|
|||
'cost' => 'Was kostet eine Pressemitteilung?',
|
||||
'no_subscription' => 'Ohne Abo veröffentlichen',
|
||||
'change_delete' => 'Meldung löschen oder ändern',
|
||||
'free' => 'Kostenlos veröffentlichen?',
|
||||
],
|
||||
|
||||
// Render-Pflichten aus der Leistungsbeschreibung v0.2 (Slots, Credits,
|
||||
|
|
|
|||
|
|
@ -199,6 +199,7 @@ return [
|
|||
'model_3_cost' => 'nur die tatsächliche Veröffentlichung',
|
||||
'model_4' => 'Kostenlos mit Auflagen',
|
||||
'model_4_cost' => 'keine Gebühr, dafür Einschränkungen bei Links, Bildern oder Sichtbarkeit',
|
||||
'model_4_link' => 'warum es das hier nicht gibt',
|
||||
'models_note' => 'Jedes Modell hat seinen Platz: Ein Abo lohnt sich bei planbarem Volumen, die Einzelabrechnung bei unregelmäßigem. Problematisch ist nicht das Modell, sondern wenn es sich erst nach der Anmeldung zeigt.',
|
||||
|
||||
'check_heading' => 'Woran man Folgekosten erkennt',
|
||||
|
|
@ -248,6 +249,7 @@ return [
|
|||
'related_heading' => 'Weiterlesen',
|
||||
'related_no_sub' => 'Pressemitteilung veröffentlichen ohne Abo',
|
||||
'related_change' => 'Pressemitteilung löschen oder ändern lassen',
|
||||
'related_free' => 'Pressemitteilung kostenlos veröffentlichen — warum nicht bei uns',
|
||||
'related_pricing' => 'Preisübersicht mit allen Tarifen',
|
||||
],
|
||||
|
||||
|
|
@ -348,6 +350,50 @@ return [
|
|||
'related_no_sub' => 'Pressemitteilung veröffentlichen ohne Abo',
|
||||
],
|
||||
|
||||
'free' => [
|
||||
'meta_title' => 'Pressemitteilung kostenlos veröffentlichen – :brand',
|
||||
'meta_description' => 'Kostenlos geht es bei uns nicht — und hier steht, warum. Was kostenlose Presseportale tatsächlich leisten, warum Links dort nicht tragen, wer am Ende zahlt, und was eine Meldung bei uns kostet.',
|
||||
'eyebrow' => 'Veröffentlichen · Kostenlos?',
|
||||
'breadcrumb' => 'Kostenlos veröffentlichen',
|
||||
'title' => 'Pressemitteilung kostenlos veröffentlichen',
|
||||
'lead' => 'Die ehrliche Antwort: Auf presseecho und businessportal24 nicht. Warum das so ist, was kostenlose Portale leisten und worauf Sie dort achten sollten.',
|
||||
|
||||
'short_heading' => 'Die kurze Antwort',
|
||||
'short_p1' => 'Eine Meldung kostet bei uns :net € netto (:gross € brutto), einmalig, ohne Abo. Einen kostenlosen Weg gibt es nicht und wird es nicht geben — das ist eine Grundsatzentscheidung, keine Aktion. Das Konto selbst ist kostenlos; bezahlt wird erst die Veröffentlichung.',
|
||||
'short_p2' => 'Wer ausdrücklich kostenlos veröffentlichen will, findet weiter unten, was er dafür bekommt und was nicht. Wer danach doch hier veröffentlicht, weiß, wofür er zahlt.',
|
||||
|
||||
'delivers_heading' => 'Was kostenlose Portale tatsächlich leisten',
|
||||
'delivers_intro' => 'Kostenlose Presseportale gibt es, und sie tun, was sie versprechen: Die Meldung wird gelistet. Was sie in der Regel nicht tun:',
|
||||
'delivers_1' => 'Prüfen. Ohne Gegenwert kann sich niemand eine Prüfung leisten — die Meldung steht neben allem, was sonst noch kostenlos eingereicht wurde.',
|
||||
'delivers_2' => 'Auffindbar machen. Ein Archiv, in dem jede Meldung gleich viel wert ist, liefert Suchmaschinen keinen Grund, eine bestimmte davon zu zeigen.',
|
||||
'delivers_3' => 'Bleiben. Viele kostenlose Portale werden nicht mehr gepflegt, nehmen keine Einreichungen mehr an oder verschwinden mit den Meldungen. Ein Link auf eine verschwundene Meldung ist kein Beleg mehr.',
|
||||
'delivers_4' => 'Ohne Auflagen auskommen. Üblich sind Grenzen bei Links und Bildern, Werbung um die Meldung herum, eine begrenzte Standzeit oder eine kostenpflichtige Stufe für alles, was über die Grundfunktion hinausgeht.',
|
||||
|
||||
'links_heading' => 'Warum Links aus Presseportalen kaum tragen',
|
||||
'links_p1' => 'Links in Pressemitteilungen sind vom Absender gesetzt, nicht redaktionell empfohlen. Google verlangt deshalb, dass Portale solche Links als <code>sponsored</code> oder <code>nofollow</code> kennzeichnen — und wertet sie nicht als Empfehlung. Das gilt bei uns genauso: Jeder externe Link in einer Meldung trägt hier <code>rel="sponsored nofollow"</code>, unabhängig vom Tarif.',
|
||||
'links_p2' => 'Wer eine Pressemitteilung veröffentlicht, um einen Backlink zu bekommen, bekommt ihn also nirgends in der Form, die er sich erhofft — weder kostenlos noch bezahlt. Was eine Meldung leistet, ist etwas anderes: Sie ist unter einer stabilen Adresse auffindbar, mit Firma, Datum, Kontakt und strukturierten Daten, und sie wird gefunden, wenn jemand nach dem Unternehmen oder dem Anlass sucht.',
|
||||
|
||||
'gate_heading' => 'Warum kostenfreie Annahme und Prüfung sich ausschließen',
|
||||
'gate_p1' => 'Jede Meldung bei uns wird geprüft: automatisiert auf Aufbau, Substanz, Werbeanteil und Rechtliches, bei Bedarf persönlich. Diese Prüfung kostet Zeit — und sie ist der Grund, warum das Archiv als Quelle taugt.',
|
||||
'gate_p2' => 'Kostenlose Annahme zieht Texte an, deren Prüfung und Betrieb Geld kosten, ohne dass ihnen etwas gegenübersteht. Ein Portal, das beides will, landet bei einem von zwei Ergebnissen: Es prüft nicht mehr, oder es finanziert die Prüfung über etwas anderes. Deshalb gibt es bei uns keine kostenlose Einreichung — nicht als Einstieg, nicht als Ausnahme.',
|
||||
|
||||
'pays_heading' => 'Wer bei kostenlosen Angeboten am Ende zahlt',
|
||||
'pays_intro' => 'Ein Portal hat Kosten: Server, Pflege, Moderation. Nimmt es dafür kein Geld vom Absender, kommt es woanders her. Die üblichen Wege:',
|
||||
'pays_1' => 'Werbung neben und in Ihrer Meldung — der Leser Ihrer Nachricht sieht die Anzeigen anderer.',
|
||||
'pays_2' => 'Die kostenlose Stufe als Einstieg: Bild, Link, Sichtbarkeit oder Verbleib gibt es erst in der bezahlten Stufe — der Preis kommt nach der Anmeldung.',
|
||||
'pays_3' => 'Ihre Daten: Firmen- und Kontaktdaten aus Einreichungen sind für Adresshändler und Verteilerbetreiber etwas wert.',
|
||||
'pays_4' => 'Der Leser: Ohne Prüfung steht Ihre Meldung neben Spam, und das färbt auf jede Meldung im Archiv ab — auch auf Ihre.',
|
||||
|
||||
'portals_heading' => 'Kostenlose Presseportale',
|
||||
'portals_intro' => 'Wer genau das sucht, findet hier Portale, die am :date kostenlos Einreichungen angenommen haben. Wir prüfen die Liste, aber nicht täglich — Auflagen und Zustand können sich seitdem geändert haben.',
|
||||
'portals_note' => 'Kein Eintrag ist eine Empfehlung. Wir stehen zu keinem der Portale in einer Geschäftsbeziehung.',
|
||||
|
||||
'cta_heading' => 'Wenn Sie doch hier veröffentlichen wollen',
|
||||
'cta_text' => 'Eine Meldung für :net € netto, geprüft, auf beiden Portalen, dauerhaft unter stabiler Adresse — ohne Abo und ohne Verfall. Was genau enthalten ist, steht unter „Ohne Abo veröffentlichen".',
|
||||
'cta_button' => 'Ohne Abo veröffentlichen',
|
||||
'cta_cost' => 'Was kostet eine Pressemitteilung?',
|
||||
],
|
||||
|
||||
'help' => [
|
||||
'meta_title' => 'Hilfe-Center',
|
||||
'meta_description' => 'Hilfe-Center: Antworten, Anleitungen und direkter Kontakt zum Support-Team.',
|
||||
|
|
@ -377,6 +423,7 @@ return [
|
|||
'topic_account' => 'Konto & Abrechnung',
|
||||
'link_cost' => 'Was kostet eine Pressemitteilung?',
|
||||
'link_no_subscription' => 'Veröffentlichen ohne Abo',
|
||||
'link_free' => 'Kostenlos veröffentlichen?',
|
||||
'link_change_plan' => 'Tarif wechseln',
|
||||
'link_invoices' => 'Rechnungen im Konto abrufen',
|
||||
'link_cancel' => 'Vertrag kündigen',
|
||||
|
|
|
|||
|
|
@ -103,6 +103,7 @@ return [
|
|||
'cost' => 'What does a press release cost?',
|
||||
'no_subscription' => 'Publish without a subscription',
|
||||
'change_delete' => 'Delete or change a release',
|
||||
'free' => 'Publish for free?',
|
||||
],
|
||||
|
||||
// Rendering obligations from the service description (slots/credits/
|
||||
|
|
|
|||
|
|
@ -197,6 +197,7 @@ return [
|
|||
'model_3_cost' => 'only the actual publication',
|
||||
'model_4' => 'Free with conditions',
|
||||
'model_4_cost' => 'no fee, but restrictions on links, images or visibility',
|
||||
'model_4_link' => 'why we do not offer it',
|
||||
'models_note' => 'Each model has its place: a subscription pays off with predictable volume, pay-per-release with irregular volume. The problem is not the model but a model that only shows itself after sign-up.',
|
||||
|
||||
'check_heading' => 'How to spot follow-up costs',
|
||||
|
|
@ -246,6 +247,7 @@ return [
|
|||
'related_heading' => 'Read on',
|
||||
'related_no_sub' => 'Publish a press release without a subscription',
|
||||
'related_change' => 'Have a press release deleted or changed',
|
||||
'related_free' => 'Publish a press release for free — why not with us',
|
||||
'related_pricing' => 'Pricing page with all plans',
|
||||
],
|
||||
|
||||
|
|
@ -346,6 +348,50 @@ return [
|
|||
'related_no_sub' => 'Publish a press release without a subscription',
|
||||
],
|
||||
|
||||
'free' => [
|
||||
'meta_title' => 'Publish a press release for free – :brand',
|
||||
'meta_description' => 'Not free here — and here is why. What free press portals actually deliver, why links there carry no weight, who pays in the end, and what a release costs with us.',
|
||||
'eyebrow' => 'Publishing · Free?',
|
||||
'breadcrumb' => 'Publish for free',
|
||||
'title' => 'Publish a press release for free',
|
||||
'lead' => 'The honest answer: not on presseecho or businessportal24. Why that is, what free portals deliver, and what to look out for there.',
|
||||
|
||||
'short_heading' => 'The short answer',
|
||||
'short_p1' => 'A release costs :net € net (:gross € gross) with us, once, with no subscription. There is no free route and there will not be one — that is a principle, not a promotion. The account itself is free; you pay only for publication.',
|
||||
'short_p2' => 'If you specifically want to publish for free, the sections below show what you get for it and what you do not. If you publish here after all, you know what you are paying for.',
|
||||
|
||||
'delivers_heading' => 'What free portals actually deliver',
|
||||
'delivers_intro' => 'Free press portals exist and they do what they promise: the release gets listed. What they usually do not do:',
|
||||
'delivers_1' => 'Review. Without something in return, nobody can afford a review — your release sits next to everything else that was submitted for free.',
|
||||
'delivers_2' => 'Make it findable. An archive in which every release is worth the same gives search engines no reason to show any particular one.',
|
||||
'delivers_3' => 'Stay. Many free portals are no longer maintained, no longer accept submissions or disappear together with the releases. A link to a vanished release is no longer evidence of anything.',
|
||||
'delivers_4' => 'Come without strings. Limits on links and images, advertising around the release, a limited retention period or a paid tier for anything beyond the basics are the norm.',
|
||||
|
||||
'links_heading' => 'Why links from press portals carry little weight',
|
||||
'links_p1' => 'Links in press releases are placed by the sender, not editorially recommended. Google therefore requires portals to mark such links as <code>sponsored</code> or <code>nofollow</code> — and does not treat them as endorsements. The same applies here: every external link in a release carries <code>rel="sponsored nofollow"</code>, regardless of plan.',
|
||||
'links_p2' => 'Anyone who publishes a press release to obtain a backlink will not get it in the form they hope for anywhere — free or paid. What a release does deliver is something else: it is findable at a stable address, with company, date, contact and structured data, and it is found when someone searches for the company or the occasion.',
|
||||
|
||||
'gate_heading' => 'Why free submission and review are mutually exclusive',
|
||||
'gate_p1' => 'Every release with us is reviewed: automatically for structure, substance, advertising share and legal issues, personally where needed. That review takes time — and it is the reason the archive works as a source.',
|
||||
'gate_p2' => 'Free submission attracts texts whose review and hosting cost money with nothing in return. A portal that wants both ends up in one of two places: it stops reviewing, or it funds the review with something else. That is why there is no free submission here — not as an entry point, not as an exception.',
|
||||
|
||||
'pays_heading' => 'Who pays in the end with free offers',
|
||||
'pays_intro' => 'A portal has costs: servers, maintenance, moderation. If it does not take money from the sender, the money comes from somewhere else. The usual routes:',
|
||||
'pays_1' => 'Advertising next to and inside your release — the reader of your news sees other people\'s ads.',
|
||||
'pays_2' => 'The free tier as a funnel: image, link, visibility or retention are only available in the paid tier — the price arrives after sign-up.',
|
||||
'pays_3' => 'Your data: company and contact data from submissions is worth something to address brokers and distribution operators.',
|
||||
'pays_4' => 'The reader: without review your release sits next to spam, and that rubs off on every release in the archive — including yours.',
|
||||
|
||||
'portals_heading' => 'Free press portals',
|
||||
'portals_intro' => 'If that is what you are looking for: these portals accepted free submissions on :date. We check the list, but not daily — conditions and status may have changed since.',
|
||||
'portals_note' => 'No entry is a recommendation. We have no business relationship with any of these portals.',
|
||||
|
||||
'cta_heading' => 'If you want to publish here after all',
|
||||
'cta_text' => 'One release for :net € net, reviewed, on both portals, permanently at a stable address — no subscription, nothing expires. What exactly is included is explained under "Publish without a subscription".',
|
||||
'cta_button' => 'Publish without a subscription',
|
||||
'cta_cost' => 'What does a press release cost?',
|
||||
],
|
||||
|
||||
'help' => [
|
||||
'meta_title' => 'Help center',
|
||||
'meta_description' => 'Help center: answers, guides and direct contact with the support team.',
|
||||
|
|
@ -375,6 +421,7 @@ return [
|
|||
'topic_account' => 'Account & billing',
|
||||
'link_cost' => 'What does a press release cost?',
|
||||
'link_no_subscription' => 'Publish without a subscription',
|
||||
'link_free' => 'Publish for free?',
|
||||
'link_change_plan' => 'Change plan',
|
||||
'link_invoices' => 'Access invoices in your account',
|
||||
'link_cancel' => 'Cancel contract',
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
|
||||
@php
|
||||
// Roadmap 2.4: Unter-Navigation über der Headline von Preisseite und den
|
||||
// drei Transparenzseiten — damit die Antworten auf „Was kostet das?",
|
||||
// vier Transparenzseiten — damit die Antworten auf „Was kostet das?",
|
||||
// „Geht das ohne Abo?" und „Wie werde ich es wieder los?" neben den
|
||||
// Tarifen stehen. `current` = Routenname der aktuellen Seite.
|
||||
$items = [
|
||||
|
|
@ -12,6 +12,7 @@
|
|||
'was-kostet-eine-pressemitteilung' => __('pricing.transparency_nav.cost'),
|
||||
'pressemitteilung-veroeffentlichen-ohne-abo' => __('pricing.transparency_nav.no_subscription'),
|
||||
'pressemitteilung-loeschen-oder-aendern-lassen' => __('pricing.transparency_nav.change_delete'),
|
||||
'pressemitteilung-kostenlos-veroeffentlichen' => __('pricing.transparency_nav.free'),
|
||||
];
|
||||
@endphp
|
||||
|
||||
|
|
|
|||
|
|
@ -45,6 +45,18 @@
|
|||
</p>
|
||||
@endif
|
||||
|
||||
{{-- 4) Erstquelle gegen Kopie (Roadmap 1d, Anhang 17.09.2026): nur bei
|
||||
Meldungen, die über einen Verteiler eingegangen sind. Technische
|
||||
Tatsache, ohne Verkaufsdruck — kein Preis, kein Angebot. --}}
|
||||
@if ($viaSyndication)
|
||||
<p style="font-size: 12.5px; color: #6b7280;">
|
||||
Zur Einordnung: Diese Meldung ist über einen Verteiler bei uns eingegangen und liegt gleichlautend
|
||||
auch auf anderen Portalen. Für Such- und KI-Systeme hat ein solcher Text keine erkennbare Erstquelle.
|
||||
Eine direkt eingereichte Meldung erscheint dagegen mit strukturierten Daten, geprüften Angaben und
|
||||
einer stabilen Adresse als Erstquelle. Das ist kein Werturteil über diesen Weg, nur der technische Unterschied.
|
||||
</p>
|
||||
@endif
|
||||
|
||||
<div class="note">
|
||||
<p>Bei Fragen erreichen Sie uns über den <a href="{{ config('domains.domain_portal_url') }}/de/hilfe">Hilfe-Bereich auf pressekonto</a>.</p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@
|
|||
'links' => [
|
||||
['label' => __('static.help.link_cost'), 'href' => route('was-kostet-eine-pressemitteilung')],
|
||||
['label' => __('static.help.link_no_subscription'), 'href' => route('pressemitteilung-veroeffentlichen-ohne-abo')],
|
||||
['label' => __('static.help.link_free'), 'href' => route('pressemitteilung-kostenlos-veroeffentlichen')],
|
||||
['label' => __('static.help.link_change_plan'), 'href' => route('preise')],
|
||||
['label' => __('static.help.link_invoices'), 'href' => $publisherUrl.'/login'],
|
||||
['label' => __('static.help.link_cancel'), 'href' => route('kuendigung')],
|
||||
|
|
|
|||
|
|
@ -0,0 +1,86 @@
|
|||
@extends('web.layouts.web-master')
|
||||
|
||||
@php
|
||||
// Roadmap 2.4, Transparenzseite 4 (Anhang 17.09.2026): Wer „kostenlos"
|
||||
// sucht, bekommt die ehrliche Begründung, warum es das hier nicht gibt
|
||||
// (E7) — und am Ende eine geprüfte Liste kostenloser Portale, sofern
|
||||
// config transparency.free_portals gefüllt ist.
|
||||
$params = [
|
||||
'net' => $singleNet,
|
||||
'gross' => $singleGross,
|
||||
];
|
||||
$freePortals = (array) config('transparency.free_portals', []);
|
||||
$checkedAt = config('transparency.free_portals_checked_at');
|
||||
$checkedAt = $checkedAt ? \Illuminate\Support\Carbon::parse((string) $checkedAt) : null;
|
||||
@endphp
|
||||
|
||||
@section('title', __('static.free.meta_title', ['brand' => $brandLabel]))
|
||||
@section('meta_description', __('static.free.meta_description'))
|
||||
|
||||
@section('content')
|
||||
<x-web.static-page
|
||||
:eyebrow="__('static.free.eyebrow')"
|
||||
:title="__('static.free.title')"
|
||||
:lead="__('static.free.lead')"
|
||||
:breadcrumb="__('static.free.breadcrumb')"
|
||||
>
|
||||
<x-slot:aboveTitle>
|
||||
<x-web.transparency-nav current="pressemitteilung-kostenlos-veroeffentlichen" />
|
||||
</x-slot:aboveTitle>
|
||||
|
||||
<div class="pm-body max-w-[760px]">
|
||||
<h2 id="antwort">{{ __('static.free.short_heading') }}</h2>
|
||||
<p>{{ __('static.free.short_p1', $params) }}</p>
|
||||
<p>{{ __('static.free.short_p2') }}</p>
|
||||
|
||||
<h2 id="leistung">{{ __('static.free.delivers_heading') }}</h2>
|
||||
<p>{{ __('static.free.delivers_intro') }}</p>
|
||||
<ul>
|
||||
@foreach ([1, 2, 3, 4] as $item)
|
||||
<li>{{ __('static.free.delivers_'.$item) }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
<h2 id="links">{{ __('static.free.links_heading') }}</h2>
|
||||
<p>{!! __('static.free.links_p1') !!}</p>
|
||||
<p>{{ __('static.free.links_p2') }}</p>
|
||||
|
||||
<h2 id="pruefung">{{ __('static.free.gate_heading') }}</h2>
|
||||
<p>{{ __('static.free.gate_p1') }}</p>
|
||||
<p>{{ __('static.free.gate_p2') }}</p>
|
||||
|
||||
<h2 id="wer-zahlt">{{ __('static.free.pays_heading') }}</h2>
|
||||
<p>{{ __('static.free.pays_intro') }}</p>
|
||||
<ul>
|
||||
@foreach ([1, 2, 3, 4] as $item)
|
||||
<li>{{ __('static.free.pays_'.$item) }}</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
|
||||
@if ($freePortals !== [] && $checkedAt !== null)
|
||||
<h2 id="portale">{{ __('static.free.portals_heading') }}</h2>
|
||||
<p>{{ __('static.free.portals_intro', ['date' => $checkedAt->format('d.m.Y')]) }}</p>
|
||||
<ul>
|
||||
@foreach ($freePortals as $portal)
|
||||
<li>
|
||||
<a href="{{ $portal['url'] }}" rel="nofollow noopener" target="_blank">{{ $portal['name'] }}</a>
|
||||
@if (! empty($portal['note']))
|
||||
— {{ $portal['note'] }}
|
||||
@endif
|
||||
</li>
|
||||
@endforeach
|
||||
</ul>
|
||||
<p>{{ __('static.free.portals_note') }}</p>
|
||||
@endif
|
||||
|
||||
<div class="mt-10 p-6 sm:p-8 bg-ink text-white">
|
||||
<h2 class="font-serif text-[22px] font-semibold m-0 mb-2 text-white">{{ __('static.free.cta_heading') }}</h2>
|
||||
<p class="text-[14px] leading-[1.55] m-0 mb-5 text-white/80">{{ __('static.free.cta_text', $params) }}</p>
|
||||
<div class="flex flex-wrap gap-3">
|
||||
<a href="{{ route('pressemitteilung-veroeffentlichen-ohne-abo') }}" class="inline-flex items-center justify-center px-[18px] py-3 text-[14px] font-semibold bg-brand text-white hover:bg-brand-deep transition-colors no-underline">{{ __('static.free.cta_button') }} →</a>
|
||||
<a href="{{ route('was-kostet-eine-pressemitteilung') }}" class="inline-flex items-center justify-center px-[18px] py-3 text-[14px] font-semibold text-white border border-white/30 hover:bg-white/10 transition-colors no-underline">{{ __('static.free.cta_cost') }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</x-web.static-page>
|
||||
@endsection
|
||||
|
|
@ -55,7 +55,7 @@
|
|||
@foreach ([1, 2, 3, 4] as $model)
|
||||
<tr>
|
||||
<th scope="row">{{ __('static.cost.model_'.$model) }}</th>
|
||||
<td>{{ __('static.cost.model_'.$model.'_cost') }}</td>
|
||||
<td>{{ __('static.cost.model_'.$model.'_cost') }}@if ($model === 4) — <a href="{{ route('pressemitteilung-kostenlos-veroeffentlichen') }}">{{ __('static.cost.model_4_link') }}</a>@endif</td>
|
||||
</tr>
|
||||
@endforeach
|
||||
</tbody>
|
||||
|
|
@ -111,6 +111,7 @@
|
|||
<ul>
|
||||
<li><a href="{{ route('pressemitteilung-veroeffentlichen-ohne-abo') }}">{{ __('static.cost.related_no_sub') }}</a></li>
|
||||
<li><a href="{{ route('pressemitteilung-loeschen-oder-aendern-lassen') }}">{{ __('static.cost.related_change') }}</a></li>
|
||||
<li><a href="{{ route('pressemitteilung-kostenlos-veroeffentlichen') }}">{{ __('static.cost.related_free') }}</a></li>
|
||||
<li><a href="{{ route('preise') }}">{{ __('static.cost.related_pricing') }}</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ $htmlRedirect = static function (string $edition, string $path) {
|
|||
'preise', 'faq', 'veroeffentlichen',
|
||||
'suche', 'newsrooms', 'api',
|
||||
'hilfe', 'gute-pressemitteilung', 'impressum', 'datenschutz', 'agb',
|
||||
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen',
|
||||
'was-kostet-eine-pressemitteilung', 'pressemitteilung-veroeffentlichen-ohne-abo', 'pressemitteilung-loeschen-oder-aendern-lassen', 'pressemitteilung-kostenlos-veroeffentlichen',
|
||||
];
|
||||
|
||||
if (isset($staticAliases[$clean])) {
|
||||
|
|
@ -269,6 +269,7 @@ Route::prefix('{edition}')->whereIn('edition', SetEdition::EDITIONS)->group(func
|
|||
Route::get('was-kostet-eine-pressemitteilung', [TransparencyPageController::class, 'cost'])->name('was-kostet-eine-pressemitteilung');
|
||||
Route::get('pressemitteilung-veroeffentlichen-ohne-abo', [TransparencyPageController::class, 'noSubscription'])->name('pressemitteilung-veroeffentlichen-ohne-abo');
|
||||
Route::get('pressemitteilung-loeschen-oder-aendern-lassen', [TransparencyPageController::class, 'changeOrDelete'])->name('pressemitteilung-loeschen-oder-aendern-lassen');
|
||||
Route::get('pressemitteilung-kostenlos-veroeffentlichen', [TransparencyPageController::class, 'free'])->name('pressemitteilung-kostenlos-veroeffentlichen');
|
||||
Route::view('impressum', 'web.impressum')->name('impressum');
|
||||
|
||||
// Gesetzlicher Kündigungsbutton (§ 312k BGB): öffentliche Bestätigungsseite
|
||||
|
|
|
|||
|
|
@ -111,3 +111,26 @@ test('a hard-bounce suppression is not downgraded to an unsubscribe', function (
|
|||
expect(EmailSuppression::query()->where('email', 'tot@muster.example')->first()->reason)->toBe(EmailSuppressionReason::HardBounce)
|
||||
->and($suppressions->resubscribe('tot@muster.example'))->toBeFalse();
|
||||
});
|
||||
|
||||
test('the published mail explains original source versus copy only for syndicated releases', function () {
|
||||
/** @var TestCase $this */
|
||||
// Roadmap 1d (Anhang 17.09.2026): technische Tatsache, kein Angebot —
|
||||
// und nur dort, wo sie zutrifft.
|
||||
$release = apiReleaseFor('presse@muster.example');
|
||||
|
||||
app(PressReleaseService::class)->publish(tap($release)->update(['status' => 'review']), 'admin');
|
||||
|
||||
Mail::assertQueued(PressReleasePublished::class, function (PressReleasePublished $mail): bool {
|
||||
$html = $mail->render();
|
||||
|
||||
return $mail->viaSyndication
|
||||
&& str_contains($html, 'über einen Verteiler bei uns eingegangen')
|
||||
&& str_contains($html, 'als Erstquelle')
|
||||
&& ! str_contains($html, '€');
|
||||
});
|
||||
|
||||
$direct = PressRelease::factory()->published()->forPortal(Portal::Businessportal24)->create();
|
||||
$directHtml = (new PressReleasePublished($direct->user, $direct))->render();
|
||||
|
||||
expect($directHtml)->not->toContain('über einen Verteiler bei uns eingegangen');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -56,8 +56,36 @@ test('the no-subscription page and the change page render on every host in both
|
|||
'https://pressekonto.test/de/pressemitteilung-loeschen-oder-aendern-lassen',
|
||||
'https://presseecho.test/en/pressemitteilung-loeschen-oder-aendern-lassen',
|
||||
'https://pressekonto.test/en/was-kostet-eine-pressemitteilung',
|
||||
'https://presseecho.test/en/pressemitteilung-kostenlos-veroeffentlichen',
|
||||
]);
|
||||
|
||||
test('the free page answers honestly, names our own link policy and shows the portal list only when configured', function () {
|
||||
/** @var TestCase $this */
|
||||
config()->set('transparency.free_portals', []);
|
||||
|
||||
$response = $this->get('https://businessportal24.test/de/pressemitteilung-kostenlos-veroeffentlichen')->assertSuccessful();
|
||||
|
||||
$response
|
||||
->assertSee('Pressemitteilung kostenlos veröffentlichen')
|
||||
->assertSee('Einen kostenlosen Weg gibt es nicht')
|
||||
->assertSee('<code>rel="sponsored nofollow"</code>', false)
|
||||
->assertSee('Warum kostenfreie Annahme und Prüfung sich ausschließen')
|
||||
->assertSee('Wer bei kostenlosen Angeboten am Ende zahlt')
|
||||
->assertDontSee('Kostenlose Presseportale</h2>', false)
|
||||
->assertSee('aria-current="page">Kostenlos veröffentlichen?</span>', false)
|
||||
->assertSee('/de/pressemitteilung-veroeffentlichen-ohne-abo', false);
|
||||
|
||||
config()->set('transparency.free_portals', [['name' => 'Beispielportal', 'url' => 'https://portal.example', 'note' => 'nur Text, keine Links']]);
|
||||
config()->set('transparency.free_portals_checked_at', '2026-09-17');
|
||||
|
||||
$this->get('https://businessportal24.test/de/pressemitteilung-kostenlos-veroeffentlichen')->assertSuccessful()
|
||||
->assertSee('Kostenlose Presseportale</h2>', false)
|
||||
->assertSee('am 17.09.2026 kostenlos Einreichungen angenommen haben')
|
||||
->assertSee('<a href="https://portal.example" rel="nofollow noopener" target="_blank">Beispielportal</a>', false)
|
||||
->assertSee('nur Text, keine Links')
|
||||
->assertSee('Kein Eintrag ist eine Empfehlung.');
|
||||
});
|
||||
|
||||
test('the change page names the five ways with their prices and points to the self-service entry', function () {
|
||||
/** @var TestCase $this */
|
||||
$this->get('https://businessportal24.test/de/pressemitteilung-loeschen-oder-aendern-lassen')
|
||||
|
|
@ -70,7 +98,7 @@ test('the change page names the five ways with their prices and points to the se
|
|||
->assertSee('Die Meldung steht auf einem anderen Portal?')
|
||||
// Unter-Navigation: aktuelle Seite markiert, Preisseite verlinkt.
|
||||
->assertSee('aria-current="page">Meldung löschen oder ändern</span>', false)
|
||||
->assertSee("/de/preise\" class=", false);
|
||||
->assertSee('/de/preise" class=', false);
|
||||
});
|
||||
|
||||
test('the pages are linked from the pricing page, the help centre and the sitemap', function () {
|
||||
|
|
@ -80,14 +108,20 @@ test('the pages are linked from the pricing page, the help centre and the sitema
|
|||
->assertSee('aria-current="page">Tarife & Preise</span>', false)
|
||||
->assertSee('/de/was-kostet-eine-pressemitteilung', false)
|
||||
->assertSee('/de/pressemitteilung-veroeffentlichen-ohne-abo', false)
|
||||
->assertSee('/de/pressemitteilung-loeschen-oder-aendern-lassen', false);
|
||||
->assertSee('/de/pressemitteilung-loeschen-oder-aendern-lassen', false)
|
||||
->assertSee('/de/pressemitteilung-kostenlos-veroeffentlichen', false);
|
||||
|
||||
$this->get('https://presseecho.test/de/hilfe')->assertSuccessful()
|
||||
->assertSee('/de/pressemitteilung-loeschen-oder-aendern-lassen', false)
|
||||
->assertSee('/de/pressemitteilung-veroeffentlichen-ohne-abo', false);
|
||||
->assertSee('/de/pressemitteilung-veroeffentlichen-ohne-abo', false)
|
||||
->assertSee('/de/pressemitteilung-kostenlos-veroeffentlichen', false);
|
||||
|
||||
$this->get('https://presseecho.test/sitemap.xml')->assertSuccessful()
|
||||
->assertSee('<loc>https://presseecho.test/de/was-kostet-eine-pressemitteilung</loc>', false);
|
||||
->assertSee('<loc>https://presseecho.test/de/was-kostet-eine-pressemitteilung</loc>', false)
|
||||
->assertSee('<loc>https://presseecho.test/de/pressemitteilung-kostenlos-veroeffentlichen</loc>', false);
|
||||
|
||||
$this->get('https://presseecho.test/llms.txt')->assertSuccessful()
|
||||
->assertSee('/de/pressemitteilung-kostenlos-veroeffentlichen', false);
|
||||
|
||||
$this->get('https://pressekonto.test/sitemap.xml')->assertSuccessful()
|
||||
->assertSee('<loc>https://pressekonto.test/de/pressemitteilung-loeschen-oder-aendern-lassen</loc>', false);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue