Biz Telegram Payment Notify — Realtime-Alarm bei Sepay-Zahlungseingang
Dieses Skill richtet eine Telegram-Bot-Benachrichtigung in Ihren bestehenden Sepay-Webhook in einem Next.js-Projekt ein. Immer wenn ein Kunde erfolgreich Geld auf Ihr mit Sepay verbundenes Bankkonto überweist, sendet der Bot eine Echtzeitnachricht an den Chat des Eigentümers (oder an die Vertriebsgruppe) — mit Name, Telefonnummer, Betrag, Produkt und Zeitstempel.
Philosophie: E-Mail-Autoresponder für Kunden (Resend) und Telegram-Benachrichtigungen für den Eigentümer bedienen zwei unterschiedliche Akteure. E-Mail ist formell für den Kunden. Telegram ist ein "Ping" für den Eigentümer — Sie sind unterwegs, öffnen Telegram und sehen sofort die neue Bestellung, ohne in 100 anderen E-Mails in Gmail suchen zu müssen. Latenz Telegram < 2 Sekunden vs. E-Mail 30-60 Sekunden.
Warum Telegram und nicht Slack/Discord/Zalo: Telegram-Bot-Setup in 5 Minuten (1 Token + 1 Chat-ID), kein Workspace/Server-Admin nötig, kostenlose unbegrenzte Nachrichten, Push-Benachrichtigungen leistungsstärker als E-Mail, native Apps auf iOS/Android/Desktop. Slack benötigt einen Workspace + Einladung. Discord benötigt einen Server + Berechtigungseinrichtung. Zalo OA benötigt ein verifiziertes Geschäftskonto (3-7 Tage Genehmigung) + monatliche Gebühren für aktive Nutzer. Telegram ist der Weg des geringsten Widerstands für Eigentümer-seitige Benachrichtigungen.
Ausgabe: Code-Patch + Bot-Setup-Anleitung Schritt für Schritt + Umgebungsvariablen-Liste + Testplan mit 3 Stufen. Das Skill testet NICHT selbst das Senden von Telegram — es fordert den Benutzer auf, zuerst Bot-Token und Chat-ID einzufügen, da diese Anmeldeinformationen Eigentum des Benutzers sind.
Wann dieses Skill verwenden
- Der Benutzer hat gerade den Sepay-Webhook eingerichtet und möchte in Echtzeit auf Telegram benachrichtigt werden, wenn ein Kunde Geld überweist.
- Der Benutzer hat bereits einen
/api/payment-success(oder ähnlich), der E-Mails mit Resend verarbeitet, und möchte nun eine Telegram-Benachrichtigung PARALLEL hinzufügen — ohne eine neue Route zu erstellen und ohne Logik zu duplizieren. - Der Benutzer sagt "benachrichtigen Sie mich bei neuen Bestellungen" und der Kontext ist eine Verkaufs-Landingpage mit Sepay-Integration.
Verwenden Sie dieses Skill NICHT, wenn:
- Der Benutzer Slack/Discord-Benachrichtigungen wünscht → anderer Anwendungsfall.
- Der Benutzer einen Zalo OA Bot wünscht → erfordert ein verifiziertes Geschäftskonto + andere Kostenstruktur.
- Der Benutzer noch keinen Sepay-Webhook eingerichtet hat (noch kein Bankkonto mit Sepay verbunden, noch keinen Endpunkt zum Empfangen von Webhooks) → dieses Skill richtet Sepay nicht von Grund auf neu ein, es wird nur in den vorhandenen Webhook eingebunden.
- Der Benutzer nur E-Mail-Benachrichtigungen für den Eigentümer wünscht →
biz-email-setuphat bereits E-Mail B (Eigentümer-Benachrichtigung).
Gesamtworkflow (6 Phasen)
Phase 0: VORHANDENE Sepay-Webhook-Route erkennen (Pfad + Framework + Handler-Struktur)
↓
Phase 0.5: Lead-Speicher erkennen (lib/leads-kv.ts von /biz-setup-sepay-payment)
→ vorhanden: Echten KV-Lookup verwenden
→ nicht vorhanden: 2 Optionen anbieten (Raw-Mode ODER zuerst /biz-setup-sepay-payment ausführen)
↓
Phase 1: BENUTZER ANLEITEN, Telegram-Bot zu erstellen (BotFather → Token → Chat-ID)
↓ [GATE — warten auf Benutzereingabe von Token + Chat-ID]
↓
Phase 2: NACHRICHTENFORMAT ENTWERFEN → Vorschau anzeigen → Bestätigung einholen
↓
Phase 3: CODE EINBINDEN (lib/telegram.ts Helper + Integration in Webhook-Handler + Umgebungsvariablen)
↓
Phase 4: TESTPLAN (curl Bot direkt → simulierte Sepay-Payload → Produktionsüberprüfung)
Phase 1 und Phase 4 haben ein Gate, das auf den Benutzer wartet, da manuelle Benutzereingriffe erforderlich sind (Token abrufen, Produktion überprüfen). Phase 0/0.5/2/3 führt das Skill automatisch aus.
Phase 0 — Vorhandenen Sepay-Webhook erkennen
Dieses Skill wird in den vorhandenen Webhook eingebunden, es wird KEINE neue Route erstellt. Zuerst muss der Handler lokalisiert werden.
Webhook-Route suchen — grep mit gängigen Schlüsselwörtern:
# Im Projektstammverzeichnis
grep -r "sepay" --include="*.ts" --include="*.js" --include="*.tsx" -l
grep -r "transferAmount\|transferType\|payment-success\|payment-webhook" --include="*.ts" --include="*.js" -l
3 häufige Szenarien:
| Szenario | Vorhandener Pfad | Aktion |
|---|---|---|
Benutzer verwendet Pipeline biz-email-setup | app/api/payment-success/route.ts (oder pages/api/payment-success.ts) mit vorhandenem Resend, der sendCustomerEmail + sendOwnerEmail aufruft | sendTelegramNotification in dieselbe Promise.allSettled einbinden |
| Benutzer hat Sepay-spezifische Route | app/api/sepay-webhook/route.ts oder app/api/webhook/sepay/route.ts | Nach dem Parsen + Validieren der Sepay-Payload einbinden (Zweig transferType === 'in') |
| Keine Route gefunden | — | STOPP. Benutzer informieren: "Ich habe keine Webhook-Route für Sepay gefunden. Bitte richten Sie zuerst den Sepay-Webhook ein (Bankkonto mit Sepay verbinden → Webhook-URL auf Ihre Domain erstellen) und kommen Sie dann zurück, damit ich Telegram einbinden kann. Oder wenn der Webhook unter einem anderen Endpunkt-Namen liegt, teilen Sie mir bitte den Pfad mit." |
Vorhandenen Handler lesen, um die Struktur zu verstehen:
- Authentifiziert er die Sepay-Anfrage? (Authorization-Header
Apikeyoder HMAC) - Führt er eine Deduplizierung basierend auf
idoderreferenceCodedurch? (Sepay wiederholt den Vorgang bei non-200 → Deduplizierung erforderlich, um doppelte Benachrichtigungen zu vermeiden) - Führt er einen Lead-Lookup basierend auf
contentdurch (Transfernachricht enthält Bestell-ID)? - Antwortformat an Sepay:
{ success: true }oder einfaches200 OK?
Wenn der aktuelle Handler noch keine Deduplizierung durchführt — den Benutzer warnen, aber NICHT blockieren. Das Skill bindet nur Telegram ein, die Deduplizierung ist ein Anliegen der Zahlungslogik. Dem Benutzer vorschlagen, bei Bedarf eine separate Deduplizierung hinzuzufügen.
Phase 0.5 — Lead-Speicher erkennen (KRITISCH)
Der Sepay-Webhook sendet nur content (Text, den der Kunde bei der Überweisung eingefügt hat) + transferAmount + referenceCode. Sepay kennt den Kunden NICHT — es muss ein lokaler Speicher basierend auf content (enthält Bestell-ID) durchsucht werden.
Das Skill überprüft 3 Dinge:
# 1. Prüfen, ob Lead-Speicher-Helper existiert
test -f lib/leads-kv.ts || test -f lib/leads-kv.js && echo "Lead-Speicher: ✓"
# 2. Prüfen, ob Vercel KV Umgebungsvariablen vorhanden sind
grep -E "KV_REST_API_URL|KV_REST_API_TOKEN" .env.local && echo "KV Umgebungsvariablen: ✓"
# 3. Prüfen, ob @vercel/kv installiert ist
grep '"@vercel/kv"' package.json && echo "KV Paket: ✓"
3 Szenarien:
| Szenario | Aktion |
|---|---|
| Alle 3 ✓ — Lead-Speicher bereit | Mit Phase 1 fortfahren, getLeadByOrderId() aus lib/leads-kv.ts im Webhook-Handler verwenden |
| 1+ fehlt — noch nicht eingerichtet | STOPP, Benutzer nach 2 Optionen fragen (siehe unten) |
Wenn etwas fehlt, den Benutzer fragen:
Ich habe festgestellt, dass Sie noch keinen Lead-Speicher (Vercel KV) haben. Der Sepay-Webhook kennt den Kunden nicht — er hat nur den Überweisungstext + den Betrag. Möchten Sie:
Option 1 — Vollständigen Lead-Speicher über
/biz-setup-sepay-paymenteinrichten (empfohlen):
- Dieses Skill richtet Vercel KV ein + erstellt das Grundgerüst lib/leads-kv.ts + bindet das Formular ein, um Leads bei der Registrierung zu speichern
- Kommen Sie dann hierher zurück, damit ich Telegram mit vollständigem Lookup von Name/Telefon/E-Mail des Kunden einbinden kann
- Die Telegram-Benachrichtigung zeigt dann: "Nguyễn Văn A — 0901234567 — [email protected] — 499K — KI-Agent-Kurs"
Option 2 — Raw-Mode: Sepay-Payload direkt an Telegram senden, ohne Lead-Lookup:
- Telegram zeigt nur: "Vietcombank — 499.000₫ — Inhalt: DH001 0901234567 — 14:32"
- Der Eigentümer muss den Kunden anhand des Inhalts erraten und mit dem Resend-E-Mail-Protokoll abgleichen
- Einfach, sofort ausführbar, aber schlechtere Benutzererfahrung
Welche Option bevorzugen Sie?
Wenn der Benutzer Option 1 wählt → Dieses Skill ANHALTEN, /biz-setup-sepay-payment vorschlagen. Nachdem der Benutzer die Einrichtung abgeschlossen hat → zu diesem Skill zurückkehren.
Wenn der Benutzer Option 2 wählt → Mit Phase 1 fortfahren, Raw-Template verwenden (siehe templates/lib-telegram-raw.ts).
Phase 1 — Benutzer anleiten, Telegram-Bot zu erstellen
Lesen Sie references/telegram-bot-setup.md für eine detaillierte Anleitung mit Text-Screenshots. Zusammenfassung der 3 Schritte für den Benutzer:
Schritt 1 — Neuen Bot über @BotFather erstellen
1. Telegram öffnen (mobil/desktop)
2. Suchen: @BotFather → Start drücken
3. Befehl eingeben: /newbot
4. BotFather fragt nach dem Bot-Namen — Anzeigenamen eingeben (z. B. "Bestellungen Marke X")
5. BotFather fragt nach dem Benutzernamen — Benutzernamen eingeben, der auf "_bot" endet (z. B. marke_x_bestellungen_bot) — muss global eindeutig sein
6. BotFather sendet eine Nachricht mit der Zeile:
"Use this token to access the HTTP API: 1234567890:AAxxxxxxxxxxxxxxxxxxxxxx"
7. Token kopieren und hier einfügen.
SICHERHEITSHINWEIS: Dieses Token = volle Kontrolle über den Bot. Nicht in Git committen, nicht öffentlich teilen. Bei versehentlichem Leck → zurück zu @BotFather → /token → /revoke, um einen neuen Token zu erstellen.
Schritt 2 — Chat-ID abrufen
1-zu-1-Chat (nur Eigentümer erhält Benachrichtigungen) — empfohlen für Solopreneure:
1. In Telegram suchen: @userinfobot → Start drücken
2. Der Bot sendet eine Nachricht mit "Id: 123456789" — diese Nummer kopieren.
3. Das ist Ihre Chat-ID.
Gruppenchat (Vertriebsteam erhält gemeinsam Benachrichtigungen) — empfohlen für Teams:
1. Neue Telegram-Gruppe erstellen (oder vorhandene Gruppe verwenden)
2. Auf Gruppennamen klicken → Mitglied hinzufügen → nach dem erstellten Bot suchen (unter @marke_x_bestellungen_bot) → Hinzufügen
3. In der Gruppe eingeben: /start@marke_x_bestellungen_bot (oder eine beliebige Nachricht)
4. Browser öffnen und aufrufen:
https://api.telegram.org/bot<TOKEN>/getUpdates
(<TOKEN> durch Token aus Schritt 1 ersetzen)
5. In der JSON-Antwort "chat":{"id":-1001234567890,...} suchen — diese Nummer kopieren (Minuszeichen nicht vergessen)
6. Das ist die Chat-ID der Gruppe.
Kanal (1-Wege-Rundfunk, keine Diskussion) — Chat-ID beginnt mit -100. Abrufmethode wie bei Gruppe, aber Bot als Admin des Kanals hinzufügen.
Schritt 3 — Für das Skill einfügen
Auf Benutzereingabe warten:
TELEGRAM_BOT_TOKEN=1234567890:AAxxxxxxxxxxxxxxxxxxxxxx
TELEGRAM_CHAT_ID=123456789
WICHTIGES GATE: NICHT mit Phase 2 fortfahren, bis der Benutzer beide Werte eingefügt hat. Wenn der Benutzer sagt "ich habe sie bereits, von woanders" → trotzdem auf Eingabe warten, da sie in Phase 3 in .env.local eingefügt werden müssen.
Phase 2 — Nachrichtenformat entwerfen
Standardformat auf Vietnamesisch, mobilfreundlich (Telegram rendert HTML):
🎉 <b>NEUE BESTELLUNG</b>
👤 <b>{{name}}</b>
📞 {{phone}}
📧 {{email}}
💰 <b>{{amount}}</b> — {{product_name}}
🕐 {{time_vn}}
🔗 Transaktionscode: <code>{{reference_code}}</code>
Nach dem Einfügen der Variablen:
🎉 NEUE BESTELLUNG
👤 Nguyễn Văn A
📞 0901 234 567
📧 [email protected]
💰 499.000₫ — KI-Agent-Kurs
🕐 14:32 14/05/2026
🔗 Transaktionscode: FT26134567890
Vorschau für Benutzer anzeigen, fragen:
- Ist dieses Format in Ordnung? Möchten Sie ein Feld hinzufügen/entfernen? (z. B. UTM-Quelle, Bestellnummer des Tages, Zalo-Link des Kunden)
- Sind zu viele Emojis vorhanden? (Einige Benutzer bevorzugen Klartext)
- Möchten Sie eine Inline-Schaltfläche (CTA) mit Link zum CRM/zu Sheets hinzufügen? (Fortgeschritten — das Skill kann eine Inline-Tastatur hinzufügen)
Formatierungsregeln:
- HTML-Modus (
parse_mode: "HTML") — Telegram unterstützt<b>,<i>,<u>,<code>,<pre>,<a href>. KEINE Unterstützung für<br>—\nverwenden. - Betragsformat VN:
499.000₫(Punkt als Tausendertrennzeichen, mit₫am Ende) ODER charmant499K/1.99Mfür eine schönere Darstellung. Ausoffer.jsonvoice-Einstellung lesen, falls vorhanden. - Telefonformat:
0901 234 567(3-3-3-Abstand) — einfacher auf dem Handy zu scannen. - Zeit VN:
HH:mm dd/mm/yyyy— Vietnam-Zeit (UTC+7) einstellen, nicht UTC. - Emoji-Spam vermeiden (>5 Emojis/Nachricht → verringert den professionellen Eindruck).
Phase 3 — Code einbinden
3 Änderungen:
3.1 Hilfsfunktion lib/telegram.ts erstellen
templates/lib-telegram.ts (TypeScript) oder templates/lib-telegram.js (vanilla JS) lesen. Inhalt:
// lib/telegram.ts
type TelegramPayload = {
name: string;
phone: string;
email: string;
amount: number; // VND, Rohzahl (z. B. 499000)
productName: string;
referenceCode?: string;
};
export async function sendTelegramNotification(payload: TelegramPayload): Promise<void> {
const token = process.env.TELEGRAM_BOT_TOKEN;
const chatId = process.env.TELEGRAM_CHAT_ID;
if (!token || !chatId) {
console.error('[telegram] TELEGRAM_BOT_TOKEN oder TELEGRAM_CHAT_ID fehlt');
return; // Nicht werfen — Telegram-Fehler darf die Zahlungsantwort nicht blockieren
}
const text = formatMessage(payload);
try {
const res = await fetch(`https://api.telegram.org/bot${token}/sendMessage`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
chat_id: chatId,
text,
parse_mode: 'HTML',
disable_web_page_preview: true,
}),
});
if (!res.ok) {
const errBody = await res.text();
console.error(`[telegram] Senden fehlgeschlagen: ${res.status} ${errBody}`);
}
} catch (err) {
console.error('[telegram] Netzwerkfehler:', err);
// Swallow — Telegram-Fehler soll keinen Sepay-Retry verursachen
}
}
function formatMessage(p: TelegramPayload): string {
const amountStr = p.amount.toLocaleString('vi-VN') + '₫';
const phoneStr = p.phone.replace(/(\d{4})(\d{3})(\d{3})/, '$1 $2 $3');
const now = new Date().toLocaleString('vi-VN', {
timeZone: 'Asia/Ho_Chi_Minh',
day: '2-digit', month: '2-digit', year: 'numeric',
hour: '2-digit', minute: '2-digit',
});
return [
'🎉 <b>NEUE BESTELLUNG</b>',
'',
`👤 <b>${escapeHtml(p.name)}</b>`,
`📞 ${phoneStr}`,
`📧 ${escapeHtml(p.email)}`,
`💰 <b>${amountStr}</b> — ${escapeHtml(p.productName)}`,
`🕐 ${now}`,
p.referenceCode ? `\n🔗 Transaktionscode: <code>${escapeHtml(p.referenceCode)}</code>` : '',
].filter(Boolean).join('\n');
}
function escapeHtml(s: string): string {
return s.replace(/[<>&]/g, c => ({ '<': '<', '>': '>', '&': '&' }[c]!));
}
Warum Fehler schlucken: Sepay wiederholt den Webhook, wenn ein non-200 empfangen wird. Wenn ein Telegram-Timeout/-Ausfall den Webhook zum Absturz bringt → Sepay wiederholt → jeder Wiederholungsversuch sendet erneut eine E-Mail + protokolliert die Zahlung erneut → der Benutzer erhält 5 E-Mails + 5 Telegram-Benachrichtigungen für eine einzige Bestellung. Telegram ist ein Best-Effort-Seitenkanal, kein kritischer Pfad.
3.2 In Sepay-Webhook-Handler einbinden
Den vorhandenen Handler lesen, die Stelle für die Zahlungsabwicklung finden (nach dem Parsen der Sepay-Payload + Validierung transferType === 'in'). Hinzufügen:
// app/api/payment-success/route.ts (oder ähnlich)
import { sendTelegramNotification } from '@/lib/telegram';
import { sendCustomerEmail, sendOwnerEmail } from '@/lib/resend'; // falls vorhanden
export async function POST(req: Request) {
const payload = await req.json();
// [Vorhanden] Sepay-Authentifizierung validieren + Payload parsen
if (payload.transferType !== 'in') {
return Response.json({ success: true }); // ausgehende Überweisung ignorieren
}
// [Vorhanden] Lead anhand des Inhalts (enthält Bestell-ID) oder referenceCode suchen
const lead = await lookupLeadByTransferContent(payload.content);
// [NEU] 3 Seiteneffekte parallel ausführen — Telegram-Fehler blockiert E-Mail nicht
await Promise.allSettled([
sendCustomerEmail(lead),
sendOwnerEmail(lead),
sendTelegramNotification({
name: lead.name,
phone: lead.phone,
email: lead.email,
amount: payload.transferAmount,
productName: lead.productName,
referenceCode: payload.referenceCode,
}),
]);
return Response.json({ success: true });
}
Grund für die Verwendung von Promise.allSettled anstelle von Promise.all:
Promise.alllehnt ab, wenn IRGENDEIN Promise fehlschlägt → der Handler wirft einen Fehler → Sepay erhält 500 → Wiederholung → doppelte E-Mail.Promise.allSettledwartet, bis alle Promises abgeschlossen sind (egal ob aufgelöst oder abgelehnt), ohne einen Fehler zu werfen. So kann Telegram fehlschlagen, ohne die 200er-Antwort an Sepay zu blockieren.
3.3 Umgebungsvariablen aktualisieren
# .env.local
# --- ZU HINZUFÜGEN ---
TELEGRAM_BOT_TOKEN=dein_bot_token_hier
TELEGRAM_CHAT_ID=deine_chat_id_hier
# --- ENDE ---
# Bestehende Variablen bleiben erhalten
SEPAY_API_KEY=
RESEND_API_KEY=
KV_REST_API_URL=
KV_REST_API_TOKEN=
.gitignore aktualisieren (bestätigen, dass .env.local bereits vorhanden ist; falls nicht, hinzufügen).
Benutzer daran erinnern, die Werte aus Schritt 1 einzufügen und die Umgebungsvariablen auf der Produktionsplattform (Vercel/Netlify) zu konfigurieren.
Phase 4 — Testplan
Stufe 1: Direkter Telegram-Bot-Test
# Testen Sie den Bot direkt mit dem Token (unabhängig von der App)
curl -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" \
-H "Content-Type: application/json" \
-d '{
"chat_id": "<CHAT_ID>",
"text": "🧪 Testbenachrichtigung von Ihrem Next.js-Skill",
"parse_mode": "HTML"
}'
Erwartet: Nachricht in Telegram-Chat erhalten. Wenn nicht → Token/Chat-ID prüfen, ob der Benutzer den Bot gestartet hat.
Stufe 2: Simulierte Sepay-Payload
# Sepay-Webhook-Payload simulieren
curl -X POST http://localhost:3000/api/payment-success \
-H "Content-Type: application/json" \
-d '{
"id": 12345,
"referenceCode": "TEST_REF",
"transferAmount": 499000,
"transferType": "in",
"content": "DH001 0901234567"
}'
Erwartet:
200 OKAntwort- Telegram-Nachricht empfangen (korrektes Format)
- Resend-E-Mail gesendet (falls konfiguriert)
- Keine Fehler in der Serverkonsole (außer möglicher Telegram-Warnungen)
Stufe 3: Produktionsüberprüfung
# Echte Zahlung tätigen (oder Sepay-Dashboard verwenden, um eine Testzahlung zu simulieren)
# Überprüfung:
# 1. Telegram-Benachrichtigung innerhalb von 3 Sekunden nach Zahlungseingang
# 2. Informationen korrekt (Name, Telefon, Betrag, Produkt)
# 3. Sepay erhält 200 (keine Wiederholungen)
# 4. Vorhandener E-Mail-Flow funktioniert weiterhin
# 5. Prüfen, ob keine doppelten Nachrichten gesendet werden
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| Keine Telegram-Benachrichtigung | Falscher Token/Chat-ID | sendMessage API direkt mit curl testen (Stufe 1) |
| Doppelte Benachrichtigungen | Sepay wiederholt aufgrund von non-200 | Prüfen, ob Promise.allSettled verwendet wird KEIN Promise.all |
| Telegram sagt "chat not found" | Bot wurde vom Benutzer nicht gestartet | Benutzer muss /start in 1-zu-1 Chat oder Bot zur Gruppe hinzufügen |
| Fehler „Cannot find module '@/lib/telegram'" | Pfad falsch | Relativen Pfad prüfen, ggf. zu ../../lib/telegram korrigieren |
| Keine E-Mail gesendet | Resend-Konfigurationsproblem | Die E-Mail-Pipeline im Log prüfen (nicht Teil dieses Skills) |
Dateien, die dieses Skill erstellt/ändert
| Datei | Aktion | Beschreibung |
|---|---|---|
lib/telegram.ts | ERSTELLT | Hilfsfunktion zum Senden von Telegram-Benachrichtigungen |
app/api/payment-success/route.ts (oder ähnlich) | GEÄNDERT | sendTelegramNotification parallel zu E-Mails eingebunden |
.env.local | GEÄNDERT | TELEGRAM_BOT_TOKEN und TELEGRAM_CHAT_ID hinzugefügt |
Ausgelagerte Kompetenzen
| Bereich | Grund |
|---|---|
| Sepay-Webhook-Setup von Grund auf | Dieses Skill bindet nur in vorhandene Webhooks ein, es erstellt keine neuen |
| Lead-Speicher-Einrichtung (Vercel KV) | Separates Skill /biz-setup-sepay-payment oder Raw-Mode verwenden |
| E-Mail-Vorlagenanpassung | Vorhandener Resend-Flow bleibt unverändert |
| Zahlungs-Deduplizierung | Anliegen der Zahlungslogik, nicht Teil von Telegram-Benachrichtigungen |