Handbuch
Preisrechner-Funnel für WordPress · Version 2.1.1 · Stand: 26. August 2026
1. Überblick
Ein Besucher öffnet eine Seite mit dem Shortcode
[energo_rechner], klickt sich durch die Schritte und sieht
laufend seinen Preis. Am Ende gibt er seine Kontaktdaten ein und sendet
ab. Dann passiert Folgendes:
- Spamprüfung — Honeypot, Mindest-Ausfüllzeit, Rate-Limit
- Der Server rechnet den Preis neu — der Browserwert ist nur Anzeige
- E-Mail an Sie, mit der kompletten Konfiguration
- Projekt in HERO anlegen
- Scheitert HERO, kommt die Anfrage trotzdem per E-Mail an, plus Warnmail
Grundsätze
| Kein Build-Schritt | Reines PHP, Vanilla-JavaScript, CSS. Kein npm, kein React. Dateien hochladen, fertig. |
| Kein Lead geht verloren | Die E-Mail geht immer zuerst raus. Jeder HERO-Weg hat eine Rückfallebene. |
| Der Server bestimmt den Preis | Bei frei konfigurierbaren Funnels darf der Browser den Preis nicht diktieren. |
| Nichts lädt von fremden Servern | Keine Schriften, keine Skripte, kein CDN. |
| Rückwärtskompatibel | Der Shortcode ohne Argumente zeigt immer den mitgelieferten Funnel wie am ersten Tag. |
Technischer Aufbau
Browser WordPress HERO
─────── ───────── ────
Funnel-Engine (JS) ←── Funnel-Definition (JSON)
rendert den Funnel
rechnet den Preis Preisberechnung (PHP)
POST /wp-json/ ──→ rechnet nach ──→ GraphQL
energo/v1/lead E-Mail raus oder Lead-API
Die Preisberechnung existiert zweimal: einmal im Browser für die Anzeige und einmal in PHP als maßgebliche Fassung. Beide müssen dasselbe Ergebnis liefern; die Reihenfolge der Rechenschritte ist vertraglich festgelegt.
2. Installation
Per FTP
Den Plugin-Ordner mit allen Dateien hochladen nach
wp-content/plugins/. Rechte: Ordner 755,
Dateien 644. Kein zweiter Ordner innerhalb des
ersten — das ist der häufigste Installationsfehler.
Über das Backend
Plugins → Installieren → Plugin hochladen → ZIP wählen → Aktivieren.
Aktualisieren
Alle Dateien ersetzen. Einstellungen, gespeicherte Funnels und Designs bleiben erhalten. Vorher eine Sicherung anlegen, besonders bei einem Sprung über eine Hauptversion.
Prüfen, ob es läuft
Nach dem Aktivieren erscheint im Backend ein gelber Hinweis, dass kein HERO-Token hinterlegt ist. Dieser Hinweis ist an dieser Stelle das gewünschte Ergebnis — er beweist, dass der Code ausgeführt wird. Er verschwindet, sobald ein Token eingetragen ist.
Voraussetzungen
| WordPress | 6.0 oder neuer |
| PHP | 8.0 oder neuer |
| REST-API | erreichbar (Standard) |
| funktionierender Mailversand | |
| HERO | Konto mit API-Token — optional |
| Page-Builder | Oxygen, Elementor, Block-Editor, Classic |
3. Konfiguration
Backend-Menü
Preisrechner
├── Funnel Übersicht, anlegen, duplizieren, löschen, bearbeiten
└── Lizenz Lizenzschlüssel und Stufe
Einstellungen
└── Preisrechner HERO-Anbindung, Preise, Benachrichtigung
Konstanten in der wp-config.php
Konstanten haben immer Vorrang vor den Backend-Einstellungen. Ist eine gesetzt, wird das zugehörige Feld im Backend gesperrt und zeigt an, woher der Wert stammt.
define('ENERGO_HERO_TOKEN', 'ihr-hero-api-token');
define('ENERGO_HERO_MEASURE', 'KLI');
define('ENERGO_HERO_STATUS', 201);
define('ENERGO_LEAD_MAIL_TO', 'info@ihre-domain.de');
| Weitere Konstante | Bedeutung |
|---|---|
ENERGO_HERO_TOKEN_FILE | Pfad zu einer Datei außerhalb des Webroots, die nur den Token enthält |
ENERGO_TRUSTED_PROXY | Nur setzen, wenn wirklich ein Proxy davorsteht — siehe Rate-Limiting |
DISALLOW_FILE_EDIT | WordPress-eigene Konstante, schaltet den Plugin-Editor ab |
Der API-Token: wo er hingehört
Der Token wird zur Laufzeit in dieser Reihenfolge gesucht, der erste Treffer gewinnt:
| # | Quelle | Bewertung |
|---|---|---|
| 1 | Umgebungsvariable | Am sichersten. Steht in keiner Projektdatei, in keinem Backup |
| 2 | Konstante in der wp-config.php | Gut, aber die Datei liegt im Webroot und landet in Backups |
| 3 | Datei außerhalb des Webroots | Gut, wenn ein Ordner oberhalb des Webroots verfügbar ist |
| 4 | Backend-Einstellung | Bequem, aber der Token liegt in der Datenbank |
Umgebungsvariable setzen — PHP-FPM (pool.d/www.conf):
env[ENERGO_HERO_TOKEN] = ihr-hero-api-token
Apache (vHost):
SetEnv ENERGO_HERO_TOKEN "ihr-hero-api-token"
Bei Plesk und cPanel gibt es dafür ein Feld „Umgebungsvariablen“ in den PHP-Einstellungen der Domain.
Was nie passieren darf
- Der Token gehört nie ins JavaScript, in ein
data--Attribut oder in eine Datei unter/wp-content/uploads/. Alles dort ist per URL abrufbar. - Nicht in einer eigenen, im Backend einsehbaren Options-Zeile ablegen.
- Nicht ins Git-Repository committen.
Der eigentliche Schutz ist strukturell: der Browser sieht den Token nie. Er ruft nur den Lead-Endpunkt auf der eigenen Domain auf; erst der Server spricht mit HERO.
4. Der Funnel-Editor
Einbinden
[energo_rechner] erster aktiver Funnel
[energo_rechner funnel="waerme"] bestimmter Funnel
[energo_rechner privacy="https://…"] abweichender Datenschutz-Link
[energo_rechner email="info@…"] abweichende Kontaktadresse
In Oxygen Builder: ein Shortcode-Element einfügen und den Shortcode eintragen. Überschrift und Einleitungstext baut man wie gewohnt darum herum — dieser Text zählt dann auch für Suchmaschinen.
Aufbau des Editors
Zweispaltig: links der Aufbau, rechts eine mitlaufende Live-Vorschau.
Funnel
└── Schritt (bis zu 12) per Ziehen sortierbar
└── Feld (bis zu 12) ein Feldtyp je Feld
└── Option (bis zu 12) nur bei Auswahl-Feldtypen
Feldtypen
| Bezeichnung | Wofür |
|---|---|
| Auswahlkarten | Große Kacheln, etwa für die Paketauswahl |
| Segmente | Drei nebeneinanderliegende Kurzoptionen |
| Liste mit Preisangabe | Untereinander, mit Betrag rechts |
| Ja/Nein-Schalter | Eine Zusatzleistung an oder aus |
| Zahleneingabe | Eine Zahl mit Einheit |
| Schieberegler | Zahl zwischen Minimum und Maximum |
| Zahlengruppe | Mehrere Zahlenfelder, Anzahl folgt einer Variablen |
Variablen und Platzhalter
Optionen können Variablen setzen, andere Felder lesen sie. So folgt die Zahl der Raumfelder dem gewählten Paket:
Option "Multi-Split Duo" → vars: { rooms: 2, included_line: 25, range_max: 45 }
Feld "Raumgrößen" → count: "{{rooms}}"
Feld "Leitungsweg" → min: "{{included_line}}", max: "{{range_max|45}}"
| Schreibweise | Bedeutung |
|---|---|
{{name}} | Wert der Variablen |
{{name|ersatz}} | Wert, sonst der Ersatzwert |
{price:name} | Wert als Währung formatiert |
{qty} {value} | In Preis-Beschriftungen: Menge bzw. Betrag |
Rücksetzregel: Ändert sich eine Variable, die ein Feld für Minimum, Maximum, Schrittweite oder Anzahl benutzt, fällt dieses Feld auf seinen Vorgabewert zurück. Genau so verhält sich der Rechner beim Paketwechsel.
Grenzen
| Funnels | 20 |
| Schritte je Funnel | 12 |
| Felder je Schritt | 12 |
| Optionen je Feld | 12 |
| Zahlenfelder je Gruppe | 12 |
| Zeilen in der Leistungsliste | 40 |
5. Preislogik
Preiswirkungen
Jede Option und jedes preisrelevante Feld hat genau eine Wirkung:
| Bezeichnung | Rechnung |
|---|---|
| kein Preiseinfluss | — |
| Grundpreis | setzt den Grundpreis |
| fester Zuschlag | + Betrag |
| Betrag je Einheit über X | (Wert − X) × Betrag, nie negativ |
| Prozent | Grundpreis × Prozent / 100 |
| nur Hinweis | „Preis nach Prüfung“ — kein Betrag, löst Prüfung aus |
Reihenfolge der Berechnung
- Grundpreis aus allen wirksamen Grundpreis-Wirkungen
- Zuschläge in Reihenfolge der Schritte und Felder
- Prozent rechnet auf den Grundpreis, nicht auf die laufende Summe
- Gesamt = Grundpreis + Zuschläge, gerundet auf zwei Nachkommastellen
Prüfungs-Kennzeichen
Das Kennzeichen wird gesetzt, sobald eine dieser Bedingungen zutrifft:
- eine gewählte Option hat den Schalter „löst technische Prüfung aus“
- eine Hinweis-Wirkung („Preis nach Prüfung“) ist aktiv
- eine hinterlegte Prüfbedingung trifft zu, etwa „Raum größer als 40 m²“
Es steht dann in der Betreffzeile der E-Mail und im HERO-Logbuch.
Serverseitige Nachrechnung
Ab Version 2.0.0 schickt der Browser die Funnel-Kennung und den Zustand mit. Der Server rechnet mit derselben Definition nach und verwendet seinen Wert für E-Mail und HERO. Weicht der Browserwert um mehr als einen Cent ab, steht das auffällig in der Benachrichtigungs-E-Mail. Anfragen ohne Funnel-Kennung werden wie bisher behandelt — ältere eingebettete Seiten funktionieren also weiter.
6. Design-Bereich
Der Design-Abschnitt sitzt im Funnel-Editor und wirkt je Funnel. Mehrere Funnels mit unterschiedlichem Aussehen können auf derselben Seite stehen.
| Gruppe | Werte |
|---|---|
| Vorlagen | vier Startpunkte: kräftig, hell, dunkel, neutral |
| Farben | Akzent, Akzent dunkel, Akzent hell, Text, Grauton, Linien, Flächen, Papier |
| Schrift | vier systemeigene Stapel plus eigener Stapel, Größenskala 85–130 %, Überschriftenstärke |
| Formen | Eckenrundung, Kartenrundung, Knopfrundung, Schattierung |
| Layout | maximale Breite 480–1180 px, Dichte normal / kompakt / luftig |
Wie es technisch funktioniert
Das Frontend-Stylesheet arbeitet mit CSS-Variablen. Der Design-Bereich überschreibt sie am Wurzelelement des Funnels, nicht global:
<div class="ekr" data-ekr-funnel="klima" style="--ekr-orange:#0b6b8a; …">
Nur Abweichungen werden ausgegeben. Ein Funnel ohne
eigenen Design-Block erzeugt ein leeres
style-Attribut. Die Rückwärtskompatibilität ist damit keine
Behauptung, sondern eine leere Zeichenkette.
Kontrastprüfung
Der Editor rechnet Farbpaare nach WCAG durch und warnt bei weniger als 4,5:1 — mit konkretem Text wie „Textfarbe auf Hintergrund: 3,1:1 — zu wenig, empfohlen sind 4,5:1“.
Bekannte Ausnahme: Die kräftige Vorlage erfüllt WCAG AA nicht vollständig — weiße Schrift auf der Akzentfarbe liegt bei 2,7:1. Das ist gewachsener Bestand; ihn zu korrigieren hieße, das Aussehen zu ändern. Die anderen drei Vorlagen erfüllen AA auf jedem Textpaar, mit einem niedrigsten Wert von 5,7:1.
Schriften
Auswählbar sind vier systemeigene Stapel plus ein eigener Stapel für
Schriften, die Ihr Theme ohnehin lädt. Keine externen
Schriftquellen — Begründung siehe Datenschutz.
Ein eigener Stapel wird verworfen, sobald er url(,
@import, //, spitze Klammern, Semikolon oder
geschweifte Klammern enthält. Das schützt zugleich davor, dass jemand
über das Textfeld aus der CSS-Deklaration ausbricht.
7. HERO-Anbindung
Zwei Schnittstellen, unterschiedliche Fähigkeiten
| Lead-API | GraphQL | |
|---|---|---|
| Gewerk | ja, als Kürzel | ja, als numerische ID |
| Projekttyp | gibt es nicht | ja |
| Projektschritt | ja | ja |
| Kunde anlegen | automatisch über E-Mail | muss separat passieren |
Die Lead-API kennt kein Projekttyp-Feld — über sie angelegte Projekte landen immer im Standard-Projekttyp des Kontos. Nur GraphQL kann den Typ bestimmen.
Wie das Plugin entscheidet
Projekttyp-ID gesetzt?
├── nein → Lead-API
└── ja → GraphQL
├── Erfolg → fertig
└── Fehlschlag → Lead-API als Rückfallebene
+ Hinweis-Mail mit der Fehlermeldung
Der Lead geht in keinem Fall verloren. Er liegt dann nur im Standard-Projekttyp statt im gewünschten.
GraphQL-Ablauf
- Kontakt per E-Mail suchen
- Falls nicht vorhanden, anlegen
- Projekt anlegen mit Projekttyp, Schritt, Gewerk, Adresse und der Konfiguration als Notiz
Selbstkonfigurierend: HERO dokumentiert weder die Eingabefelder für das Anlegen eines Kontakts noch die Filterargumente der Kontaktsuche. Das Plugin liest sie zur Laufzeit aus dem Schema Ihres Kontos und sendet nur Felder, die es wirklich gibt. Die Erkenntnisse werden einen Tag zwischengespeichert.
Einrichten
- Einstellungen → Preisrechner öffnen
- „Projekttypen und Gewerke laden“ — reine Leseabfrage, legt nichts an
- Projekttyp und Gewerk aus den Auswahllisten wählen, speichern
- „Testprojekt in HERO anlegen“ — legt ein echtes Testprojekt an
- Testprojekt in HERO wieder löschen
Projektstatus
| Code | Basis-Status | Für die Lead-API |
|---|---|---|
| 201 | Neu – Erstkontakt | dokumentiert |
| 400 | Vor-Ort-Termin | dokumentiert |
| 501 | Planung | nur kontospezifisch |
| 601 | Angebotserstellung | dokumentiert |
| 602 | Angebot versendet | nur kontospezifisch |
| 701 | Detailgespräch | nur kontospezifisch |
| 801 | Auftragsvergabe | dokumentiert |
| 1101 | Umsetzungsbeginn | nur kontospezifisch |
| 1111 | In Umsetzung | dokumentiert |
| 1150 | Kundenrechnung | nur kontospezifisch |
| 2000 | Abgeschlossen | nur kontospezifisch |
| 2100 | Archiviert | nur kontospezifisch |
Die HERO-Dokumentation führt nur fünf Status als für die Lead-API zulässig. Die übrigen existieren im Konto, sind für die Schnittstelle aber nicht zugesichert — vor dem Einsatz einmal testen.
Verhalten, das man kennen sollte
- Dedupliziert wird über die E-Mail-Adresse. Existiert der Kunde schon, hängt HERO das Projekt an den bestehenden Kunden.
- Doppelte Telefonnummern blockieren nichts; HERO ergänzt nur einen Hinweis im Logbuch.
- Gesperrte E-Mail-Domains weist HERO als Fehler ab, ohne HTTP-Fehlercode. Das Plugin prüft deshalb ausdrücklich das Statusfeld der Antwort — ein reiner Statuscode-Check würde solche Leads stillschweigend verlieren.
- Der API-Schlüssel wird auf einen Mitarbeiter ausgestellt. Alle über die Schnittstelle angelegten Projekte erscheinen als von dieser Person erstellt, und das lässt sich nachträglich nicht ändern.
Feldzuordnung
| Formular | HERO |
|---|---|
| Name | Vor- und Nachname, am letzten Leerzeichen getrennt |
| Kunden-E-Mail — Pflichtfeld, zugleich Dublettenerkennung | |
| Telefon | Mobil bei 015/016/017, sonst Festnetz; normalisiert auf +49… |
| Straße und Hausnummer | Straßenfeld (Hausnummer darf enthalten sein) |
| PLZ | eigenes Feld — Pflichtfeld |
| Ort | eigenes Feld |
| gesamte Konfiguration | Logbucheintrag bzw. Partner-Notiz |
| Herkunft | Quelle, Unterquelle, Medium und eigene Lead-ID |
PLZ und Ort sind bewusst getrennte Felder: HERO braucht die PLZ als eigenes Pflichtfeld. Straße und Hausnummer bleiben dagegen zusammen — ein Zerlegen wäre fehleranfällig ohne jeden Nutzen.
8. Sicherheit und Missbrauchsschutz
Der Lead-Endpunkt muss öffentlich erreichbar sein, sonst könnte das Formular ihn nicht aufrufen. Deshalb ist er mehrfach abgesichert:
| Schutz | Wirkung |
|---|---|
| Limit je IP | 5 Anfragen in 10 Minuten |
| Limit je E-Mail | 3 in 1 Stunde — stoppt Wiederholungen über wechselnde IPs |
| Globaler Not-Aus | 60 pro Stunde insgesamt, danach Abweisung plus Warn-Mail |
| Honeypot | Verstecktes Feld; ausgefüllt = Bot, Antwort trotzdem „erfolgreich“ |
| Mindest-Ausfüllzeit | Unter 3 Sekunden = kein Mensch |
| Pflichtfeldprüfung | Ohne gültige E-Mail und PLZ kein HERO-Aufruf |
Rate-Limiting
Das Rate-Limit läuft vor dem Honeypot. Sonst könnte ein Bot beliebig oft anklopfen, ohne Budget zu verbrauchen.
Proxy-Header werden nur ausgewertet, wenn die Proxy-Konstante
gesetzt ist. Header wie X-Forwarded-For kann jeder
in seiner eigenen Anfrage frei setzen. Ohne echten Proxy aktiviert, wäre
das IP-Limit wirkungslos — jede Anfrage sähe aus wie eine neue IP.
Umgekehrt gilt: Kommt später ein Proxy oder Cloudflare davor,
muss die Konstante gesetzt werden, sonst sehen alle
Besucher wie eine einzige IP aus und werden gemeinsam ausgesperrt.
Festes statt rollierendes Zeitfenster. Wer gebremst
wurde, kommt nach Ablauf garantiert wieder rein; weitere Versuche
verlängern die Sperre nicht. Sonst sperrt sich ein hektisch klickender
Kunde selbst dauerhaft aus. Abgewiesene Anfragen bekommen einen
Retry-After-Header.
Editor und REST
Alle Funnel-Routen prüfen die Administratorrechte und den REST-Nonce. Ein nicht angemeldeter Besucher kann Funnels weder lesen noch ändern. Gespeicherte Texte werden beim Ausgeben maskiert, Design-Farbwerte vor der Ausgabe validiert. Ungültige Werte werden verworfen, nicht ersetzt — ein stillschweigend eingesetztes Schwarz wäre schlimmer, weil es niemand bemerkt.
Ein WordPress-Nonce für das öffentliche Formular wäre der naheliegende Gedanke, ist hier aber die falsche Wahl: Bei aktivem Seiten-Cache wird er mitgecacht und läuft nach zwölf Stunden ab — dann scheitern echte Anfragen. Als nächster Ausbaustufe vorgesehen ist stattdessen ein unsichtbarer Captcha-Ersatz ohne Cookie-Banner-Thema.
9. Datenschutz
Keine externen Schriften
Es werden keine Schriften von fremden Servern geladen. Kein Google Fonts, kein Adobe Fonts, kein CDN. Grund: Das LG München I hat am 20.01.2022 (Az. 3 O 17493/20) entschieden, dass das dynamische Einbinden von Google Fonts ohne Einwilligung gegen die DSGVO verstößt. Es folgte eine Abmahnwelle. Zulässig sind ausschließlich systemeigene Schriftstapel und selbst gehostete Schriftdateien.
Was das Plugin von außen lädt
Nichts. Alle Skripte, Styles und Schriften kommen vom eigenen Server. Die einzige ausgehende Verbindung geht an HERO — und nur serverseitig, wenn eine Anfrage abgesendet wurde.
Was gespeichert wird
| Inhalt | Lebensdauer |
|---|---|
| Funnel-Definitionen samt Design | dauerhaft |
| Schema-Version | dauerhaft |
| Einstellungen, ggf. HERO-Token | dauerhaft |
| Lizenzschlüssel | dauerhaft |
| Rate-Limit-Zähler, HERO-Schema, Projekttypen | Minuten bis eine Woche |
Keine eigenen Datenbanktabellen. Kundendaten werden nicht im Plugin gespeichert — sie gehen per E-Mail raus und nach HERO.
Einwilligung im Formular
Das Kontaktformular enthält eine Pflicht-Checkbox mit Verweis auf Ihre Datenschutzerklärung. Da die Daten automatisch nach HERO fließen, sollte diese die Weitergabe an den Auftragsverarbeiter abdecken.
10. Technische Referenz
REST-Endpunkte
Alle unter dem Namensraum energo/v1.
| Methode | Route | Zugang |
|---|---|---|
| POST | /lead | öffentlich, rate-limitiert |
| GET | /funnels | Administrator |
| GET | /funnels/<id> | Administrator |
| POST | /funnels | Administrator |
| DELETE | /funnels/<id> | Administrator |
| POST | /funnels/<id>/duplicate | Administrator |
| POST | /funnels/preview | Administrator |
Nutzlast des Lead-Endpunkts
{
"funnelId": "klima",
"state": { "package": "multi2", "line_length": 30, "pump": true },
"name": "…", "email": "…", "phone": "…",
"address": "…", "postalCode": "…", "city": "…", "note": "…",
"website": "", "formStartedAt": 1787170930000,
"totalValue": 8672.92,
"pageUrl": "…", "utmSource": "…", "utmMedium": "…", "utmCampaign": "…"
}
website ist der Honeypot und muss leer sein.
totalValue ist nur Anzeige — maßgeblich ist, was der Server
aus funnelId und state errechnet.
JavaScript-Schnittstellen
window.EnergoFunnel = {
render(mountElement, definition, options), // {endpoint, privacyUrl, email, preview}
calculate(definition, state), // {base, surcharges[], total, needsReview}
summaryLines(definition, state),
boot()
}
window.EnergoDesign = {
DEFAULTS, PRESETS,
vars(design), // nur die Abweichungen von der Vorgabe
apply(element, design) // setzt und raeumt Inline-Variablen
}
calculate() funktioniert ohne DOM — dadurch lässt sich die
Preislogik unabhängig von der Anzeige prüfen.
Ladereihenfolge
Die Plugin-Bausteine werden in fester Reihenfolge geladen: Vorgaben → Datenhaltung → Design → Mehrfunnel-Betrieb → REST → Editor → Design-Oberfläche → Lizenz. Jede Datei wird abgesichert geladen; fehlt ein Baustein, läuft der Lead-Endpunkt auf dem einfachen Weg weiter.
11. Fehlersuche
„Diese Plugindatei existiert nicht“
Meist ein doppelter Ordner — der Plugin-Ordner liegt noch einmal in sich selbst. Per FTP prüfen und den inneren Ordner eine Ebene hochziehen. Zweite Ursache: ein veralteter Aktivierungs-Link aus dem Browserverlauf. Die Plugin-Seite frisch über das Menü aufrufen, nicht die Fehlerseite neu laden — ein Reload schickt dieselbe fehlerhafte Anfrage erneut.
Der Rechner erscheint unformatiert
Das Stylesheet wird zu spät ausgeliefert. Ab Version 1.5.1 meldet das Plugin CSS und JavaScript bereits beim Seitenaufbau an, inklusive Erkennung für Oxygen, das Seiteninhalte in eigenen Meta-Feldern ablegt. Kommt es trotzdem vor: Cache leeren und einmal hart neu laden.
Gewerk steht auf „UNB“
Es fehlt die numerische Gewerk-ID. Das Kürzel allein nutzt nur die Lead-API; GraphQL braucht die Zahl. In den Einstellungen „Projekttypen und Gewerke laden“ und das Gewerk aus der Auswahlliste wählen — das setzt beides gleichzeitig.
Projekt landet im falschen Projekttyp
Die Anlage lief über die Lead-API, nicht über GraphQL. Entweder ist keine Projekttyp-ID gesetzt, oder GraphQL ist gescheitert. Im zweiten Fall liegt eine Hinweis-Mail mit der genauen Fehlermeldung im Postfach.
Kein HERO-Projekt, aber E-Mail kam an
Genau so ist es gedacht. Die Warn-Mail nennt den Grund. Häufig: falsche IDs, fehlende GraphQL-Rechte am Token, oder eine gesperrte E-Mail-Domain.
Design bleibt nach Vorlagenwechsel stehen
Behoben in 2.1.1 — die gesetzten Variablen werden beim Wechsel abgeräumt.
Preis in der E-Mail weicht vom Rechner ab
Genau dafür gibt es die Meldung. Der Server hat mit derselben Definition nachgerechnet und ein anderes Ergebnis bekommen. Beide Zahlen melden.
Diagnose-Werkzeuge im Backend
| Knopf | Wirkung |
|---|---|
| Projekttypen und Gewerke laden | reine Leseabfrage, füllt die Auswahllisten |
| Testprojekt in HERO anlegen | legt ein echtes Projekt an, anschließend löschen |
| Schema auslesen | zeigt Abfragen und Felder des HERO-Kontos, ohne Zugangsdaten |
Nach jedem Update empfehlen wir: eine Testanfrage durchklicken und den Preis in der E-Mail mit dem im Rechner angezeigten vergleichen.
12. Versionen
| Version | Was dazukam |
|---|---|
| 1.0 | Vanilla-Neubau, Shortcode, Lead-Endpunkt, HERO Lead-API |
| 1.1 | Token-Ablage in vier Stufen, dreistufiges Rate-Limit |
| 1.2 | Lead-API nach der echten HERO-Dokumentation korrigiert |
| 1.3 | Projektstatus geprüft, Gewerk mit Rückfallwert |
| 1.4 | Shortcode statt manuellem Einbinden, Assets im Plugin |
| 1.5 | Einstellungsseite, Preise im Backend, Verbindungstest |
| 1.6 | GraphQL für den Projekttyp, Schema-Diagnose |
| 1.7 | Projekttypen als Auswahlliste, selbstkonfigurierende Abfragen |
| 1.8 | Gewerk als Auswahlliste, ID und Kürzel in einem Schritt |
| 2.0 | Visueller Funnel-Editor, mehrere Funnels, serverseitiger Preis |
| 2.1 | Design-Bereich mit Live-Vorschau |
Noch Fragen offen?
Schreiben Sie uns, was Sie rechnen lassen wollen — wir sagen Ihnen ehrlich, ob der Funnel-Editor das abbildet.