Documentation menu

Antworten & Webhooks

Alles, was Empfänger zurücksenden — Abstimmungsstimmen, Formularabsendungen, Bewertungen, Drehungen — wird pro Projekt gesammelt. Es fließt auf zwei Wegen zu Ihnen zurück: eine Pro-Empfänger-Antworten-Ansicht im Dashboard und ein optionaler Webhook, der jede Interaktion in dem Moment, in dem sie eintrifft, an Ihren eigenen Endpunkt pusht.

Pro-Empfänger-Antworten im Dashboard

Öffnen Sie Dashboard → Ihre E-Mail → Antworten. Jede von der E-Mail gesammelte Interaktion wird nach Empfänger gruppiert und mit der Datenquelle des Projekts verknüpft. Jede Gruppe zeigt, wer geantwortet hat — seine E-Mail-Adresse und die weiteren Felder seiner Zeile — neben was er getan hat: welcher Block, welche Aktion, die übermittelten Werte und wann.

Die Zuordnung funktioniert über dieselben signierten Tokens, die auch Live-Ansicht-Links schützen. Wenn eine E-Mail anhand einer Datenquelle personalisiert wird, tragen die Links jedes Empfängers ein an seine Zeile gebundenes Token, und Interaktionen, die mit einem gültigen Token eintreffen, werden dieser Zeile zugeordnet. Interaktionen, die ohne Token eintreffen (zum Beispiel eine Abstimmungsstimme aus einer ohne Personalisierung versendeten E-Mail), zählen trotzdem — sie werden in einer separaten Gruppe Anonym aufgeführt.

Die rohe Ereignisliste ist paginiert (neueste zuerst): Sobald Sie die letzte Seite geladen haben, ruft eine Aktion Mehr laden ältere Ereignisse ab. Alles darunter — Zusammenfassungen, Histogramme, der Trichter und der Trend — bleibt von dieser Paginierung unberührt; es ist vorab berechnet und deckt stets die vollständige Historie des Projekts ab.

Bestellungen, Fulfillment und Rückerstattungen

Jedes Projekt mit einem Produkt-Block erhält auf seiner Antworten-Seite eine Bestellungen-Tabelle — eine Zeile pro Checkout, mit Käufer, Betrag, Status und Zeitpunkt der Aufgabe.

  • In dem Moment, in dem eine Zahlung durchgeht, wird der Käufer automatisch benachrichtigt: der Lieferinhalt eines digitalen Produkts oder eine Bestätigung, dass eine physische Bestellung auf dem Weg zum Fulfillment ist.
  • Klicken Sie bei physischen Bestellungen auf Als erfüllt markieren, sobald Sie sie versandt haben — MailInApp übernimmt den Versand nicht selbst, sendet dem Käufer aber in dem Moment, in dem Sie den Schalter umlegen, eine Versandbenachrichtigung.
  • Klicken Sie bei jeder bezahlten Bestellung auf Rückerstattung, um die Belastung über Ihr verbundenes Stripe-Konto rückgängig zu machen; der Käufer erhält eine Bestätigung der Rückerstattung per E-Mail. Dieselbe E-Mail geht automatisch hinaus, wenn ein Verkauf genau dann durchgeht, wenn die letzte Einheit ausverkauft ist — MailInApp erstattet dem Käufer, statt still zu überverkaufen.
  • Käufer kontaktieren öffnet ein Support-Ticket, vorausgefüllt mit dem Kontext dieser Bestellung — der schnellste Weg, einen Käufer direkt etwas zu fragen.

Zweckgesteuerte Kennzahl im Kopf

Falls für ein Projekt ein Zweck festgelegt ist (Umfrage, Aktion, Newsletter oder Event), führt die Antworten-Seite mit der einen Zahl, die diesem Zweck am wichtigsten ist: Antwortrate für Umfragen, Empfänger engagiert für Aktionen und Öffnungen erfasst für Newsletter und Events. Transaktionale Projekte und Projekte ohne festgelegten Zweck springen direkt zum Trichter und den Zusammenfassungen weiter unten. Ändern oder löschen Sie den Zweck jederzeit über das Dropdown neben dem Seitentitel; es wirkt sich nur darauf aus, welche Zahl hervorgehoben wird, niemals darauf, was erfasst wird.

CSAT-, CES- und NPS-Zusammenfassungen

Jeder Bewertungs-Block erhält oberhalb der Empfängerliste eine Zusammenfassung: Antwortanzahl, Durchschnitt und ein Histogramm (die Verteilung hinter dem Durchschnitt — ein Durchschnitt von 4,1 verbirgt, ob es sich um lauter 4er oder eine Mischung aus 5ern und 1ern handelt). NPS-artige Blöcke zeigen statt eines bloßen Durchschnitts die Anzahl der Promotoren/Passiven/Detraktoren sowie den Score von −100…100. Eine Aufschlüsselung der Antwortverteilung leistet dasselbe für Abstimmungs-Blöcke, nach Option.

Über den Zusammenfassungen sitzt ein Engagement-Trichter (Gesendet → Geöffnet (ca.) → Geantwortet). Ein Pro-Block-Antworttrend-Diagramm (Tages- oder Wochenbuckets) zeigt den Durchschnitt über die Zeit — der Wert einer wiederkehrenden Umfrage liegt in der Trendlinie, nicht in einer einzelnen Momentaufnahme. Es wird erst gerendert, sobald ein Block mindestens zwei Datenbuckets aufweist.

Umfragefragen-Zusammenfassungen

Jeder Formular-Block erhält eine Pro-Frage-Zusammenfassung, genau wie Bewertungs- und Abstimmungs-Blöcke. Multiple-Choice-, Checkbox-, lineare-Skala- und Sterne-Bewertungs-Fragen erhalten ein Balkendiagramm der Optionsanzahlen; Freitext-Fragen (Kurztext, Langtext, E-Mail, Zahl, Telefon, Datum) erhalten eine Antwortanzahl plus eine Handvoll Beispielantworten. Mehrseitige Umfragen fassen sich genauso zusammen wie einseitige — eine Übermittlung zählt erst, wenn jede Seite abgeschlossen wurde, sodass eine abgebrochene Umfrage nie als Teilantwort erscheint.

Diese Abstimmungs-, Bewertungs- und Umfragefragen-Ergebnisse sind keine Sackgasse — jedes davon lässt sich direkt in einer künftigen E-Mail darstellen, indem Sie einen Diagramm-Block an „Kampagnenantwort“ binden, ganz ohne manuelle Neueingabe. Siehe Diagramme an echte Daten binden.

Hausaufgaben & Notenbuch

Jeder Aufgaben-Block mit mindestens einer Erledigung oder Abgabe erhält eine Statistikkarte (Erledigungen, verspätete Erledigungen, Abgaben) oberhalb einer Notenbuch-Tabelle. Die Tabelle hat eine Zeile pro Lernenden und eine Spalte pro Aufgabe, die „Erledigt“ oder die abgegebene Antwort in Grün zeigt, oder in Rot, falls sie nach dem Fälligkeitsdatum des Blocks eintraf. Aufgaben ohne bisherige Antworten überladen die Tabelle nicht. Wie jede andere Zusammenfassung ist sie vorab berechnet und deckt die vollständige Historie eines Projekts ab, und beide CSV-Exporte enthalten eine Aufgabenspalte pro Block.

Klick-Heatmap

Unterhalb der Zusammenfassungen rankt eine Klick-Heatmap jeden Block mit einfachen Links — Buttons, verlinkte Bilder, Social-Icons — nach Klickanzahl, mit einer Balkenlänge und Intensität, die auf das relative Volumen skaliert ist. Siehe wie Klicks getrackt werden für das, was zählt und was nicht.

Scroll-Tiefe-Trichter

Ein Scroll-Tiefe-Trichter zeigt, welcher Anteil der Live-Ansicht-Besucher jeden 25-/50-/75-/100-%-Meilenstein der Seite erreicht hat, sodass Sie erkennen können, ob Menschen früh abspringen oder bis zum Ende lesen. Er spiegelt nur Besuche der gehosteten Live-Ansicht wider, nicht die versendete E-Mail selbst — siehe Scroll-Tiefe dafür, warum.

A/B-Tests & automatische Gewinner

Der Versand mit mehr als einer Variante (siehe Senden) fügt der Antworten-Seite einen Variantenvergleich hinzu: Öffnungsrate, Klickrate und Antwortrate nebeneinander für jede Variante, mit dem aktuellen Spitzenreiter, gekennzeichnet nach der Kennzahl, die der Test verwendet hat. Jedem Empfänger wird deterministisch anhand seiner E-Mail-Adresse eine Variante zugewiesen, sodass erneute Versände und Wiederholungsversuche nie neu mischen, wer welche gesehen hat. Die Ergebnisse sind für das Projekt kumulativ und decken jeden je durchgeführten A/B-Versand ab, nicht nur den jüngsten.

Eine Variante ist nicht auf Betreffzeilenformulierungen beschränkt; sie kann auch die Absenderidentität oder den gesamten Projektinhalt austauschen. Die eigenen Abstimmungs-/Quiz-/RSVP-Antworten und Öffnungen einer inhaltlich variierenden Variante werden auf der eigenen Antworten-Seite dieses Projekts erfasst, statt in diesen Vergleich einzufließen, da die Interaktionsvalidierung eine Übermittlung an genau das Projekt bindet, aus dem sie gerendert wurde. Das Vergleichspanel verlinkt stattdessen dorthin, statt eine irreführende Null anzuzeigen.

Gewinner automatisch wählen verwandelt einen manuellen A/B-Test in einen selbstlaufenden. Wählen Sie einen Testanteil (z. B. 20 % der Liste, aufgeteilt auf Varianten, versenden), wie lange vor der Entscheidung gewartet werden soll und nach welcher Kennzahl entschieden wird: Öffnung, Klick, In-E-Mail-Antwort oder Umsatz. In-E-Mail-Antwort (Abschluss von Abstimmung/Quiz/RSVP) ist die empfohlene Voreinstellung, da sie im Gegensatz zum Öffnungstracking nicht von Apples Mail Privacy Protection betroffen ist.

Sobald die Wartezeit verstrichen ist, wählt MailInApp die Variante mit der besten Pro-Empfänger-Rate. Das ist niemals eine rohe Gesamtzahl, sodass eine Variante, die im Test einfach an mehr Personen versendet wurde, nicht allein aufgrund des Volumens als Gewinner erscheinen kann. Der Gewinner wird an alle vom anfänglichen Test zurückgehaltenen Empfänger versendet. Ist das Ergebnis ein Unentschieden oder war die Stichprobe zu klein, greift MailInApp auf Variante 1 zurück und kennzeichnet dies deutlich, statt jemals einen falschen Gewinner zu erklären. Das Statusbanner auf der Antworten-Seite zeigt genau, in welchem Zustand sich ein Test befindet: noch in der Entscheidung, entschieden, unentschieden oder Stichprobe zu klein.

Versandzeit-Optimierung

Verfügbar ab Pro. Statt dass alle in einem Versand gleichzeitig hinausgehen, betrachtet Zum jeweils besten Zeitpunkt jedes Empfängers senden die eigene Öffnungszeit-Historie jedes Kontakts — zu welcher Tagesstunde, in UTC, er tatsächlich am häufigsten Mail von Ihnen geöffnet hat. Es hält seine Nachricht bis zu dieser Stunde zurück. Wer noch nicht genug Öffnungshistorie für ein verlässliches Signal hat, fällt direkt auf einen gewöhnlichen sofortigen Versand zurück.

Es gilt in gleicher Weise für einen manuellen Versand, einen wiederkehrenden Zeitplan und den eigenen Versandschritt einer Journey; ein Zeitplan versendet weiterhin ohne Signal zu seiner eigenen konfigurierten Stunde an alle, passend zum Verhalten vor der Optimierung. Es kann derzeit nicht mit einem Automatischer-Gewinner-Test im selben Versand kombiniert werden, da ein aufgeschobener Empfänger bis zur Entscheidung über einen Gewinner nicht mitgezählt würde.

Nach einem Feld aufschlüsseln

Nutzen Sie Aufschlüsseln nach, um dieselben Zusammenfassungen nach einem beliebigen Feld Ihrer Datenquelle zu bündeln — durchschnittlicher CSAT pro Agent, NPS pro Tarif und so weiter. Empfänger, deren Zeile seit dem Versand gelöscht oder verkleinert wurde, werden unter (unbekannt) gebündelt; erzeugt ein Freitextfeld mehr als 20 unterschiedliche Werte, fließen die kleinsten Bündel in eine abschließende Gruppe Sonstige, damit die Ansicht nicht ausufert.

CSV-Export

CSV herunterladen auf der Antworten-Seite exportiert eine breite Datei mit einer Zeile pro Empfänger: jedes Datenquellenfeld, der Zeitpunkt der ersten Öffnung sowie eine Spalte pro interaktivem Block (mit dessen Frage als Überschrift). Follow-up-Antworten erhalten ihre eigene Spalte <Frage> — Follow-up. Ein zweiter Export für Rohereignisse liefert eine Zeile pro Ereignis (Empfänger, Block, Aktion, Wert, Zeitstempel) für Analysten, die stattdessen das lange Format wünschen.

Umfrage-Lebenszyklus

Ein Projekt kann ein Enddatum und/oder eine Antwortobergrenze (maxResponses) haben. Sobald eines von beidem erreicht ist, werden neue Interaktionsereignisse abgelehnt — die Live-Ansicht zeigt statt der interaktiven Blöcke einen Hinweis zum Abschluss, statischer Inhalt wird jedoch weiterhin angezeigt —, und die Antworten-Seite zeigt an, ob die Umfrage derzeit geschlossen ist. Nichts wird rückwirkend gefiltert: bereits erfasste Antworten bleiben in Ihren Daten erhalten.

In-App-Niedrigwert-Alarme

Über das lowScore-Flag des Webhooks hinaus (unten) kann ein Projekt eine Handvoll E-Mail-Adressen auflisten, die direkt benachrichtigt werden sollen — kein Zapier-/Make-Schritt erforderlich. Sobald eine Bewertungsantwort den konfigurierten Schwellenwert ihres Blocks unter- oder überschreitet, mailt MailInApp diesen Adressen (über Ihre eigenen SMTP-Einstellungen) die Frage, den Score, die Identität des Empfängers, sofern bekannt, sowie einen Link direkt zur Antworten-Seite. Ist kein SMTP-Relay konfiguriert, wird der Alarm still übersprungen — der Webhook feuert weiterhin. Alarme sind pro Projekt und Stunde gedeckelt, damit ein Schwall niedriger Bewertungen Ihr Relay nicht überfluten kann.

Zusammenfassungen neu aufbauen

Zusammenfassungen, der Trichter und der Trend werden aus einem vorab berechneten Pro-Projekt-Aggregat bedient, das mit eintreffenden Ereignissen aktualisiert wird — sodass sie unabhängig davon schnell bleiben, wie viel Historie ein Projekt hat. Zeigt ein Projekt unerwartet niedrige oder Null-Gesamtwerte, hat es wahrscheinlich Antworten gesammelt, bevor dieses Aggregat für es existierte; klicken Sie einmal auf Zusammenfassungen neu aufbauen auf seiner Antworten-Seite, um seine vollständige Ereignishistorie in das Aggregat einzuspielen. Neue Projekte benötigen dies nie.

Webhooks

Wenn Sie die Daten lieber in Ihren eigenen Systemen landen lassen möchten — einem CRM, einer Tabelle, einem Automatisierungstool —, konfigurieren Sie auf derselben Antworten-Seite einen Webhook: geben Sie eine HTTPS-URL ein und klicken Sie auf Aktivieren.

Zwei Dinge geschehen:

  1. Ihnen wird ein Signiergeheimnis (whsec_…) angezeigt — kopieren Sie es sofort, es wird nur dieses eine Mal angezeigt. Es wird serverseitig gespeichert und danach überall maskiert, wie alle Zugangsdaten in MailInApp.
  2. Ab diesem Zeitpunkt wird jede Interaktion, unmittelbar nachdem sie erfasst wurde, als JSON an Ihre URL gePOSTet.

Sie können das Geheimnis jederzeit rotieren (ein neues wird geprägt und einmal angezeigt) oder den Webhook entfernen.

Payload

{
  "type": "interaction.received",
  "projectId": "abc123",
  "event": {
    "campaignId": "abc123",
    "blockId": "poll-1",
    "blockType": "poll",
    "action": "vote",
    "value": { "option": "Blue" },
    "recipient": "row:3",
    "projectId": "abc123",
    "receivedAt": 1752480000000
  },
  "recipient": {
    "key": "row:3",
    "row": { "email": "[email protected]", "first_name": "Ada" }
  },
  "lowScore": false
}
  • event.value ist die gesammelte Dateninformation selbst — die gewählte Abstimmungsoption, die Feldwerte des Formulars, die Anzahl der Sterne.
  • recipient ist null für anonyme Interaktionen. Bei zugeordneten ist key der Zeilenindex des Empfängers in Ihrer Datenquelle ("row:3" = vierte Zeile).
  • recipient.row — die vollständige Datenzeile des Empfängers — ist bei gehosteten Datenquellen enthalten. Bei Quellen vom API-Typ rufen wir Ihren Endpunkt nicht bei jeder Interaktion auf; verknüpfen Sie auf Ihrer Seite über den Zeilenindex.
  • lowScore ist true, wenn das Ereignis eine rate-Aktion auf einem Bewertungs-Block ist, deren Wert auf oder unter dem konfigurierten Alarmschwellenwert dieses Blocks liegt — das Signal, nach dem eine Zapier-/Make-Automatisierung (oder Ihr eigener In-App-Alarm) filtert, um eine Support-Führungskraft zu alarmieren. Es wird bei Nicht-Bewertungs-Ereignissen ganz weggelassen, oder wenn für den Block kein Schwellenwert konfiguriert ist.

Signaturen verifizieren

Jede Zustellung wird signiert, damit Ihr Endpunkt bestätigen kann, dass sie tatsächlich von MailInApp stammt. Zwei Header werden gesendet:

| Header | Inhalt | | --- | --- | | X-MailInApp-Timestamp | Wann die Zustellung signiert wurde, in epochalen Millisekunden | | X-MailInApp-Signature | v1= gefolgt von hex HMAC-SHA256(secret, timestamp + "." + rawBody) |

Berechnen Sie die erwartete Signatur aus dem rohen Anfragekörper (vor jeglichem JSON-Parsing) und vergleichen Sie sie mit einem zeitkonstanten Vergleich. Das Ablehnen veralteter Zeitstempel blockiert wiederholte Zustellungen (Replay):

import { createHmac, timingSafeEqual } from "node:crypto";

function isValidDelivery(headers, rawBody, secret) {
  const timestamp = headers["x-mailinapp-timestamp"];
  const given = Buffer.from(headers["x-mailinapp-signature"] ?? "");
  const expected = Buffer.from(
    "v1=" +
      createHmac("sha256", secret)
        .update(`${timestamp}.${rawBody}`)
        .digest("hex"),
  );
  if (given.length !== expected.length || !timingSafeEqual(given, expected)) {
    return false;
  }
  // Reject deliveries signed more than 5 minutes ago (replay protection).
  return Math.abs(Date.now() - Number(timestamp)) < 5 * 60 * 1000;
}

Zustellsemantik

  • Der erste Versuch erfolgt sofort, danach wird automatisch wiederholt. Zustellungen laufen nach 5 Sekunden in ein Timeout; alles, was kein 2xx-Antwortcode ist (ein Timeout, ein Verbindungsfehler oder ein Fehlerstatus), gilt als Fehlschlag. Das Ereignis wird immer zuerst in MailInApp gespeichert, sodass bei einer verpassten Zustellung nichts verloren geht — behandeln Sie den Webhook als Echtzeitsignal und die Antworten-Ansicht als maßgebliche Quelle.
  • Automatische Wiederholungsversuche mit Backoff. Eine fehlgeschlagene Zustellung wird in wachsenden Abständen erneut versucht — etwa 1 Minute, 5 Minuten, 30 Minuten, 2 Stunden, dann 6 Stunden — gegen die aktuelle URL und das aktuelle Geheimnis Ihres Webhooks, sodass ein rotiertes Geheimnis oder eine aktualisierte URL automatisch übernommen wird. Schlagen alle Wiederholungsversuche weiterhin fehl, stoppt die Zustellung von selbst mit weiteren Versuchen, wird aber nie verworfen.
  • Manuelles erneutes Zustellen. Jede Zustellung, die weiterhin fehlschlägt (in Wiederholung oder erschöpft), erscheint unter Fehlgeschlagene Zustellungen auf der Antworten-Seite, mit dem Grund des letzten Fehlschlags und einem Button Erneut zustellen — nützlich direkt nachdem Sie das behoben haben, was auf Ihrer Seite kaputt war, statt auf den nächsten geplanten Wiederholungsversuch zu warten.
  • Nie im Weg des Empfängers. Zustellungen erfolgen, nachdem die Interaktion des Empfängers bestätigt wurde; ein langsamer oder defekter Endpunkt kann seine Stimme oder Übermittlung nicht verzögern oder zum Scheitern bringen.
  • Schnell antworten. Geben Sie zügig jeden 2xx-Status zurück und erledigen Sie aufwendige Verarbeitung asynchron.

Hinweis zum Vertrauen: Die Interaktions-Endpunkte sind notwendigerweise öffentlich (ein Posteingang kann sich nicht authentifizieren), daher sind anonyme Ereignisse absichtlich unauthentifiziert. Zugeordnete Ereignisse sind durch signierte Empfänger-Tokens geschützt. Verifizieren Sie die Zustellsignatur, und behandeln Sie event.value als Nutzereingabe.