Anbinden
Integrationen
Einsendungen an Slack, Discord, Telegram oder einen eigenen Webhook schicken, signiert und mit Wiederholung. Dazu Zapier, Make, n8n und Google Sheets.

Unter Integrationen schickst du jede Einsendung zusätzlich an Slack, Discord, Telegram oder eine eigene URL. Das geht für ein einzelnes Formular oder als Standard für alle Formulare einer Website. Für Slack und Discord trägst du die Webhook-URL aus deren Einstellungen ein, für Telegram den Bot-Token von @BotFather und die Chat-ID.
Antwortet das Ziel nicht mit 2xx, versuchen wir es nach 1, 5 und 30 Minuten sowie nach 2 und 6 Stunden erneut, also sechsmal in etwa neun Stunden. Jede Integration hat ein Protokoll der letzten 30 Tage. Fehlgeschlagene Zustellungen kannst du dort 7 Tage lang erneut senden, so lange behalten wir den Inhalt verschlüsselt, auch wenn das Formular nichts speichert. Mit „Testen“ schickst du eine Beispiel-Einsendung.
Slack, Discord und Telegram stehen außerhalb der EU. Wenn du sie anbindest, gibst du die Einsendungen selbst an diese Anbieter weiter. Nenn sie in deiner Datenschutzerklärung und schließ mit ihnen einen eigenen AVV ab.
Webhook
Ein Webhook bekommt jede Einsendung als JSON per POST: { event: "submission.created", created_at, form: { id, name }, data, files }. Dazu kommen die Header Mailiy-Event, Mailiy-Delivery (eindeutige ID, gleich bei Wiederholungen) und Mailiy-Signature. Nur HTTPS-Ziele mit öffentlicher IP sind erlaubt, Weiterleitungen werden nicht verfolgt, Timeout 10 Sekunden.
Mailiy-Signature sieht so aus: t=1767225600,v1=… Dabei ist v1 der HMAC-SHA256 von „t.body“ mit dem Secret (whsec_…), das du beim Webhook im Dashboard findest. So prüfst du ihn in Node:
import { createHmac, timingSafeEqual } from "node:crypto";
// header: Mailiy-Signature, body: the raw request body as a string
const [t, v1] = header.split(",").map((part) => part.split("=")[1]);
const expected = createHmac("sha256", secret).update(`${t}.${body}`).digest("hex");
const valid =
v1.length === expected.length &&
timingSafeEqual(Buffer.from(v1), Buffer.from(expected)) &&
Date.now() / 1000 - Number(t) < 300;Zapier, Make, n8n
Leg dort einen Trigger „Webhook“ an (Zapier: Webhooks by Zapier → Catch Hook, Make: Custom webhook, n8n: Webhook-Node mit POST), kopier die URL und trag sie in Mailiy als Webhook ein. Mit „Testen“ bekommt der Dienst eine Beispiel-Einsendung, aus der er die Felder übernimmt.
Google Sheets
Öffne die Tabelle, dann Erweiterungen → Apps Script, und füg diesen Code ein. Unter Bereitstellen → Neue Bereitstellung wählst du „Web-App“, „Ausführen als: ich“ und „Zugriff: Jeder“. Die URL der Web-App trägst du in Mailiy als Webhook ein. Jede Einsendung wird eine neue Zeile.
function doPost(e) {
const event = JSON.parse(e.postData.contents);
SpreadsheetApp.getActiveSheet().appendRow([
event.created_at,
event.form.name,
...Object.values(event.data),
]);
return ContentService.createTextOutput("ok");
}Du brauchst einen anderen Dienst? Unter Integrationen kannst du ihn anfragen.