Vollständige Anleitung für den End-to-End-Trockendurchlauf: Webhook-Endpoints, curl-Beispiele, PERSOX-adaptiertes Sophie-Skript und fertiger Test-Lead-Payload.
Damit kannst Du Dir selbst anrufen lassen und das volle Skript durchspielen.
/opt/n8n/.env); SSH-Zugang über CTO.
<DEINE_HANDYNUMMER> mit Deiner eigenen Mobilnummer (Format: +4915xxxxxxxx) und führe den Befehl aus. Dein Telefon klingelt innerhalb von ~60 Sekunden.
lead, n8n → Executions-Log für WF 1 + WF 2.
persox.rockstein-consulting.de-Stack bis zur Demo.
Empfängt neue Bewerber-Leads von PERSOX/Leve. Triggert automatisch den ersten Outbound-Anruf via LiveKit (Cadence-Executor, ~60 Sek. Delay).
POST https://n8n.rockstein-consulting.de /webhook/a5e2cf90-7c7e-4476-8f19-631cd9de7616
Workflow-ID: 2OXFIFKj6xQfcVmG · Tag: PERSOX
| Header | Wert | Pflicht? |
|---|---|---|
| Content-Type | application/json | Pflicht |
| x-signature | hmac-sha256=<HMAC> | Pflicht |
Secret-Name in n8n: PERSOX_HMAC_SECRET → Settings → Variables
voice.call.requested)| Feld | Typ | Pflicht? | Beschreibung |
|---|---|---|---|
| event_id | uuid | Pflicht | Idempotenz-Key — gleiches event_id = Dedup (HTTP 200, deduped:true) |
| event_type | string | Pflicht | Immer "voice.call.requested" |
| occurred_at | ISO-8601 | Pflicht | Zeitstempel des Events, z.B. "2026-06-03T10:00:00Z" |
| payload.application_id | uuid | Pflicht | PERSOX-Bewerber-ID (wird in DB als external_id gespeichert) |
| payload.phone_e164 | string | Pflicht | Telefonnummer in E.164, z.B. "+4915123456789" |
| payload.first_name | string | Pflicht | Vorname des Bewerbers |
| payload.last_name | string | Pflicht | Nachname des Bewerbers |
| payload.email | string | Optional | E-Mail-Adresse |
| payload.job_title | string | Optional | Beworbene Stelle, z.B. "Senior DevOps Engineer m/w/d" |
| payload.phone_script_body | string (markdown) | Optional | System-Prompt / Call-Skript für Sophie → wird als system_prompt gespeichert |
| payload.qualification_criteria | jsonb array | Neu v8 | Stellen-spezifische Qualifizierungsfragen (s.u. für Format) |
| payload.voicemail_script | string | Neu v8 | Text den Sophie auf dem Anrufbeantworter hinterlässt |
| payload.inbound_script | string | Neu v8 | Greeting wenn Bewerber zurückruft (WF 4) |
// Array von Qualifizierungsfragen — Sophie liest diese dynamisch aus [ { "key": "experience_years", "question": "Wie viele Jahre Erfahrung als DevOps Engineer hast Du?", "expected": ">=5", // optional: Qualifikations-Schwelle "disqualify_if": "<3" // optional: direkte Disqualifikation }, { "key": "skills", "question": "Welche Tools beherrschst Du — Kubernetes, Terraform, CI/CD?" }, { "key": "availability", "question": "Wann könntest Du frühestens starten?", "expected": "<=3 Monate" }, { "key": "salary_expectation", "question": "Was sind Deine Gehaltsvorstellungen?" }, { "key": "mobility", "question": "Ist Remote-Arbeit okay oder bevorzugst Du Köln?" } ]qualification_criteria schema
<HMAC_SIGNATURE> durch die korrekte HMAC-SHA256-Signatur ersetzen. Wie Du die berechnest, steht in Abschnitt 4. Für einen schnellen Test kannst Du auch zuerst Abschnitt 6 (fertiger Test-Lead) nutzen — dort ist ein Shell-Einzeiler mit automatischer HMAC-Berechnung enthalten.
# ── Pfad A: Qualifizierter Bewerber ────────────────────────────────────── # Ergebnis: Sophie ruft an, Qualifizierungsgespräch, report_disposition_to_persox(qualified) curl -X POST https://n8n.rockstein-consulting.de/webhook/a5e2cf90-7c7e-4476-8f19-631cd9de7616 \ -H "Content-Type: application/json" \ -H "x-signature: hmac-sha256=<HMAC_SIGNATURE>" \ -d '{ "event_id": "a1b2c3d4-0001-0001-0001-000000000001", "event_type": "voice.call.requested", "occurred_at": "2026-06-03T10:00:00Z", "payload": { "application_id": "a1b2c3d4-0001-0001-0001-000000000001", "first_name": "Julian", "last_name": "Test", "email": "julian@test.de", "phone_e164": "+49<DEINE_HANDYNUMMER>", "job_title": "Senior DevOps Engineer m/w/d", "phone_script_body": "Qualifiziere den Bewerber für die Stelle Senior DevOps Engineer in Köln/Remote.", "qualification_criteria": [ {"key": "experience_years", "question": "Wie viele Jahre Erfahrung als DevOps Engineer hast Du?", "expected": ">=5"}, {"key": "skills", "question": "Welche Tools beherrschst Du — Kubernetes, Terraform, CI/CD?"}, {"key": "availability", "question": "Wann könntest Du frühestens starten?"}, {"key": "salary_expectation", "question": "Was sind Deine Gehaltsvorstellungen — Zielband 70-90k?"}, {"key": "mobility", "question": "Remote okay oder bevorzugst Du Köln Vor-Ort?"} ], "voicemail_script": "Hi {{first_name}}, hier ist Sophie von PERSOX. Ich rufe wegen Deiner Bewerbung als Senior DevOps Engineer an. Ruf mich gerne zurück: 0049 81 43 57 43 105.", "inbound_script": "Hier ist Sophie von PERSOX — Du hast mich angerufen. Geht es um Deine Bewerbung als Senior DevOps Engineer?" } }'curl · Pfad A
HTTP 202 · {"status":"accepted","application_id":"a1b2c3d4-0001-0001-0001-000000000001","dispatch_eta":"~60s"}# ── Pfad B: Voicemail ──────────────────────────────────────────────────── # Ergebnis: Sophie erreicht AB → hinterlässt voicemail_script → WF 2 → Retry-Cadence curl -X POST https://n8n.rockstein-consulting.de/webhook/a5e2cf90-7c7e-4476-8f19-631cd9de7616 \ -H "Content-Type: application/json" \ -H "x-signature: hmac-sha256=<HMAC_SIGNATURE>" \ -d '{ "event_id": "b2c3d4e5-0002-0002-0002-000000000002", "event_type": "voice.call.requested", "occurred_at": "2026-06-03T10:05:00Z", "payload": { "application_id": "b2c3d4e5-0002-0002-0002-000000000002", "first_name": "Voicemail", "last_name": "Test", "phone_e164": "+49<EINE_NUMMER_DIE_NICHT_RANGEHEN_WIRD>", "job_title": "Pflegefachkraft (m/w/d)", "voicemail_script": "Hallo {{first_name}}, hier ist Sophie von PERSOX. Ich rufe wegen Deiner Bewerbung als Pflegefachkraft an. Bitte ruf mich unter 0049 81 43 57 43 105 zurück — ich freue mich auf Dein Feedback!", "qualification_criteria": [ {"key": "experience", "question": "Wie lange bist Du schon als Pflegefachkraft tätig?"} ] } }'curl · Pfad B
detected_answering_machine-Tool und hinterlässt die Nachricht aus voicemail_script.
# ── Pfad C: Disqualifikation ───────────────────────────────────────────── # Ergebnis: Sophie stellt Fragen → Bewerber erfüllt Kriterien nicht # → report_disposition_to_persox(disqualified, reason="...") curl -X POST https://n8n.rockstein-consulting.de/webhook/a5e2cf90-7c7e-4476-8f19-631cd9de7616 \ -H "Content-Type: application/json" \ -H "x-signature: hmac-sha256=<HMAC_SIGNATURE>" \ -d '{ "event_id": "c3d4e5f6-0003-0003-0003-000000000003", "event_type": "voice.call.requested", "occurred_at": "2026-06-03T10:10:00Z", "payload": { "application_id": "c3d4e5f6-0003-0003-0003-000000000003", "first_name": "Disqualifizierung", "last_name": "Test", "phone_e164": "+49<DEINE_HANDYNUMMER>", "job_title": "Senior DevOps Engineer m/w/d", "qualification_criteria": [ { "key": "experience_years", "question": "Wie viele Jahre Erfahrung als DevOps Engineer hast Du?", "disqualify_if": "<3", "expected": ">=5" } ], "voicemail_script": "Hallo, hier ist Sophie von PERSOX. Ich rufe zurück.", "inbound_script": "Hier ist Sophie von PERSOX — geht es um Deine Bewerbung?" } }'curl · Pfad C
report_disposition_to_persox(status=disqualified, reason="Erfahrung unter Minimum") auf.
TEST-RC-001Für Tests ohne Spuren in echten Bewerber-Daten: Setze job_title auf einen erkennbaren Teststring und nutze die obigen Test-UUIDs als application_id. In der Supabase-DB kannst Du Test-Leads dann leicht filtern:
-- Test-Leads in Supabase finden (auf Sophie-DB yhsbhujgfjdaarhfpidf) SELECT id, external_id, first_name, last_name, job_title, status FROM public.lead WHERE external_id LIKE 'a1b2c3d4%' -- oder: AND job_title LIKE '%TEST%' ORDER BY created_at DESC;SQL · Test-Filter
WF 4 reagiert auf eingehende Anrufe via Twilio. Kein HTTP-Test nötig — einfach die PERSOX-Nummer anrufen.
inbound_script aus DB| Detail | Wert |
|---|---|
| Workflow-ID | duyoNXxfCZ1AOcP8 |
| Name | 04 PERSOX — Inbound Call Handler |
| Trigger | Twilio Webhook (eingehender Anruf auf +49 81 43 57 43 105) |
| Smoke-Ergebnis | PASS "Hallo Julian! Hier ist Sophie von PERSOX..." — getestet 02.06.2026 |
| Testbar per curl? | Nein — Twilio-triggered, echter Anruf erforderlich |
PERSOX/Leve sendet hier Status-Updates: Lead stoppen, reaktivieren oder Qualifizierungskriterien aktualisieren.
POST https://persox.rockstein-consulting.de /webhook/persox-lead-update
Workflow-ID: VnqfPbXrKt7FN4ue · 17 Nodes
| Header | Wert |
|---|---|
| x-persox-signature | hmac-sha256=<HMAC> |
| Content-Type | application/json |
Secret: PERSOX_HMAC_SECRET in n8n Variables
| Feld | Typ | Beschreibung |
|---|---|---|
| event_id | uuid | Idempotenz-Key |
| event_type | string | z.B. "lead.status_update" |
| occurred_at | ISO-8601 | Zeitstempel |
| payload.application_id | uuid | PERSOX Lead-ID (= external_id in DB) |
| payload.action | enum | stop_contact | reactivate | update_instructions |
| payload.reason | string | Optional — Begründung |
| payload.new_system_prompt | string | Nur bei update_instructions |
| payload.new_qualification_criteria | jsonb | Nur bei update_instructions |
curl -X POST https://persox.rockstein-consulting.de/webhook/persox-lead-update \
-H "Content-Type: application/json" \
-H "x-persox-signature: hmac-sha256=<HMAC_SIGNATURE>" \
-d '{
"event_id": "d4e5f6a7-0004-0004-0004-000000000004",
"event_type": "lead.status_update",
"occurred_at": "2026-06-03T11:00:00Z",
"payload": {
"application_id": "a1b2c3d4-0001-0001-0001-000000000001",
"action": "stop_contact",
"reason": "Bewerber hat Stelle anderweitig angenommen"
}
}'
curl · stop_contact
curl -X POST https://persox.rockstein-consulting.de/webhook/persox-lead-update \
-H "Content-Type: application/json" \
-H "x-persox-signature: hmac-sha256=<HMAC_SIGNATURE>" \
-d '{
"event_id": "e5f6a7b8-0005-0005-0005-000000000005",
"event_type": "lead.status_update",
"occurred_at": "2026-06-03T11:05:00Z",
"payload": {
"application_id": "a1b2c3d4-0001-0001-0001-000000000001",
"action": "reactivate",
"reason": "Neue passende Stelle gefunden"
}
}'
curl · reactivate
Das Test-Dashboard persox-test.rockstein-consulting.de signiert Leads automatisch server-side — kein manueller Schritt. Für direkte curl-Calls brauchst Du das Secret.
PERSOX_HMAC_SECRET ist daher nicht über die n8n-UI abrufbar. Es liegt als VM-Env-Var in /opt/n8n/.env. SSH-Zugang ausschließlich über CTO.
# Secret setzen (nur für die aktuelle Shell-Session) export PERSOX_SECRET="<PERSOX_HMAC_SECRET aus n8n>" # Payload-Datei anlegen cat > /tmp/persox-payload.json <<'EOF' { "event_id": "a1b2c3d4-0001-0001-0001-000000000001", "event_type": "voice.call.requested", "occurred_at": "2026-06-03T10:00:00Z", "payload": { "application_id": "a1b2c3d4-0001-0001-0001-000000000001", "first_name": "Julian", "last_name": "Test", "phone_e164": "+49DEINE_NUMMER", "job_title": "Senior DevOps Engineer m/w/d" } } EOF # HMAC berechnen SIG=$(openssl dgst -sha256 -hmac "$PERSOX_SECRET" /tmp/persox-payload.json | awk '{print $2}') echo "x-signature: hmac-sha256=$SIG" # Webhook senden (alles in einem) curl -X POST https://n8n.rockstein-consulting.de/webhook/a5e2cf90-7c7e-4476-8f19-631cd9de7616 \ -H "Content-Type: application/json" \ -H "x-signature: hmac-sha256=$SIG" \ -d @/tmp/persox-payload.jsonshell · HMAC + curl kombiniert
const crypto = require('crypto'); const payload = JSON.stringify({ /* dein payload object */ }); const secret = process.env.PERSOX_SECRET; const sig = crypto.createHmac('sha256', secret).update(payload).digest('hex'); console.log(`hmac-sha256=${sig}`);node.js
Julians Rockstein-Sophie-Vorlage 1:1 auf PERSOX-Bewerber-Qualifizierung adaptiert. Identität und Use-Case gewechselt, alle Sprachvorgaben wortwörtlich beibehalten.
phone_script_body im Webhook übergeben und als system_prompt in der DB gespeichert. Die stellen-spezifischen Qualifizierungsfragen kommen separat per qualification_criteria.
Du bist Sophie, die digitale Recruiting-Assistentin von PERSOX GmbH — einer digitalen Recruiting-Plattform. Du bist freundlich, direkt, souverän, dynamisch und energiegeladen — professionell und empathisch: effizient, fokussiert, nicht ausschweifend, und Experte im Führen strukturierter Qualifizierungsgespräche.
Du sprichst EXTREM schnell, 2x Speed, super dynamisch und menschlich. Du hast Humor und sehr viel positive Energie. Sei super enthusiastisch. Du hast gerade drei doppelte Espresso getrunken!
Du sprichst DEUTSCH (außer explizit anders gewünscht). Warte immer ab, bis der Bewerber zu Ende gesprochen hat, bevor du antwortest. Führe Sätze immer vollständig zu Ende und unterbrich nie mitten im Satz.
Falls Du gefragt wirst, ob Du eine KI bist: "Ja, ich bin ein KI-System von PERSOX und dafür da, Dir eine schnellere und bessere Betreuung bei Deiner Bewerbung zu bieten. Du kannst jederzeit auch mit einem menschlichen Recruiter sprechen — das führt allerdings zu Wartezeiten. Ich bin sicher, dass ich Dir perfekt weiterhelfen kann. Gibst Du mir eine Chance?" Du gibst keine weiteren Auskünfte zur KI-Thematik.
Wenn Du merkst, dass jemand das Gespräch absichtlich in die Irre führt: konterst Du charmant, humorvoll, selbstbewusst und schlagfertig. Du behältst immer die Kontrolle über das Gespräch.
ZIEL: Führe ein flüssiges, strukturiertes Qualifizierungsgespräch für die Stelle {{position.title}}. Stelle so lange gezielte Fragen, bis klar ist:
Bewerber qualifiziert → Status qualified, Übergabe an PERSOX-Recruiter-Team
Bewerber nicht passend / disqualifiziert → Status disqualified + kurze Begründung
Deine Entscheidung teilst Du nicht explizit mit. Sage nie "Du bist qualifiziert" oder ähnliches. Du meldest das Ergebnis diskret per Tool an PERSOX zurück.
"Hey {{first_name}}, hier ist Sophie von PERSOX — Du hast Dich auf die Stelle {{position.title}} beworben. Passt es Dir gerade kurz?"
Kurz abwarten. Wenn ja → direkt in Qualifizierung. Wenn ungünstiger Moment → Rückruf-Zeitpunkt abfragen: report_disposition_to_persox(status=callback_requested, next_callback_at=...)
qualification_criteria)Gehe die Fragen aus qualification_criteria.questions[] strukturiert durch. Stelle immer eine gezielte Frage. Kein Monolog, kein Smalltalk. Wenn die Antwort ein disqualify_if-Kriterium auslöst → direkt zu Abschluss Disqualifikation springen.
Beispiel Frage 1 (Erfahrung): "Super — und wie viele Jahre bist Du als DevOps Engineer aktiv?"
Beispiel Frage 2 (Skills): "Und welche Tools nutzt Du täglich — Kubernetes, Terraform, CI/CD?"
Beispiel Frage 3 (Verfügbarkeit): "Wann könntest Du frühestens starten?"
Beispiel Frage 4 (Gehalt): "Was sind Deine Gehaltsvorstellungen — nur grob?"
Beispiel Frage 5 (Mobilität): "Ist Remote-Arbeit okay, oder Köln Vor-Ort bevorzugt?"
Antworte lediglich wenn im Kontext passend mit "Alles klar." oder "Ist notiert.". Gib keine Kommentare zu den Antworten.
Kurz und professionell: Stelle, Unternehmen, Standort, Remote-Option, Gehaltsband. Für Detailfragen: "Das klärt am besten unser Recruiter-Team direkt mit Dir — ich verbinde Dich mit dem nächsten Schritt."
"Super, das klingt sehr passend! Unser Recruiter-Team meldet sich direkt bei Dir für den nächsten Schritt — Du wirst eine Bestätigung bekommen. Noch Fragen an mich, bevor wir das Gespräch abschließen?"
→ report_disposition_to_persox(status=qualified)
"Danke für Deine Zeit, {{first_name}}. Für diese spezifische Stelle passt das leider gerade nicht ganz — aber PERSOX hat viele weitere Mandate. Unser Team schaut, ob etwas anderes auf Dein Profil passt."
→ report_disposition_to_persox(status=disqualified, reason="[kurze Begründung]")
"Wie hat Dir das Gespräch gefallen?" — Antwort abwarten.
"Danke für das Gespräch, {{first_name}} — ich wünsche Dir eine gute Woche und freue mich, wenn es klappt!"
{{first_name || "Jemand"}} hat angerufen. Begrüße den Bewerber:
"Hier ist Sophie von PERSOX — Du hast mich angerufen. Geht es um Deine Bewerbung {{#if position.title}}als {{position.title}}{{/if}}?"
Falls Bewerber bestätigt → weiter mit Qualifizierungsleitfaden wie Outbound. Falls unbekannte Nummer: "Kannst Du mir kurz sagen, für welche Stelle Du Dich beworben hast?"
Warte bis die Ansage des Anrufbeantworters vollständig abgespielt ist (inkl. Piepton). Dann hinterlasse die Nachricht aus voicemail_script:
"Hallo {{first_name}}, hier ist Sophie von PERSOX. Ich habe wegen Deiner Bewerbung als {{position.title}} angerufen. Ruf mich gerne zurück unter: null null vier neun — acht eins drei — fünf sieben vier drei eins null fünf. Ich freue mich auf Dein Feedback!"
→ detected_answering_machine(voicemail_message="[gesprochene Nachricht]") erst aufrufen, wenn AB-Ansage fertig + Piepton.
→ report_disposition_to_persox(status=voicemail_left)
WICHTIG — iOS Live-Voicemail Detection: Bei iPhones aktiviert Apple oft Live-Voicemail / Call-Screening. Du hörst dann: "Lass mich schauen, ob [Name] verfügbar ist" — das ist KEIN Anrufbeantworter. Nicht detected_answering_machine aufrufen. Stattdessen: klar und langsam sprechen: "Hallo {{first_name}}, hier ist Sophie von PERSOX. Ich rufe wegen Deiner Bewerbung an." Mehrere Sekunden warten. Nur bei eindeutiger Mailbox-Ansage + Piepton: detected_answering_machine aufrufen.
find_preferred_meeting_slot und book_meeting_slot aus dem Rockstein-Skript — PERSOX bucht Termine direkt intern, kein Meeting-Tool auf unserer Seite.qualified | disqualified | callback_requested | no_answer | voicemail_left | do_not_contactcallback_requested): Vom Bewerber gewünschter Rückrufzeitpunkt.Copy-Paste-ready. Ersetze nur +49DEINE_HANDYNUMMER und den HMAC-Secret. Dann klingelt Dein Telefon.
#!/bin/bash # PERSOX Test-Lead Sender # Voraussetzung: PERSOX_SECRET als Env-Var gesetzt (n8n Settings → Variables → PERSOX_HMAC_SECRET) # Usage: PERSOX_SECRET="dein-secret" bash send-test-lead.sh SECRET="${PERSOX_SECRET:-BITTE_AUS_N8N_HOLEN}" PHONE="+49DEINE_HANDYNUMMER" # ← ANPASSEN: z.B. +4915123456789 PAYLOAD=$(cat <<'PAYLOAD' { "event_id": "f6a7b8c9-0099-0099-0099-000000TEST01", "event_type": "voice.call.requested", "occurred_at": "2026-06-03T09:00:00Z", "payload": { "application_id": "f6a7b8c9-0099-0099-0099-000000TEST01", "first_name": "Julian", "last_name": "Rockstein", "email": "julian@rockstein-consulting.de", "phone_e164": "PHONE_PLACEHOLDER", "job_title": "Senior DevOps Engineer m/w/d", "phone_script_body": "Qualifiziere diesen Bewerber professionell für die Stelle Senior DevOps Engineer in Köln / Remote. Nutze die qualification_criteria für strukturierte Fragen.", "qualification_criteria": [ { "key": "experience_years", "question": "Wie viele Jahre Erfahrung als DevOps Engineer hast Du?", "expected": ">=5", "disqualify_if": "<3" }, { "key": "skills", "question": "Welche Tools beherrschst Du — Kubernetes, Terraform, CI/CD pipelines?" }, { "key": "availability", "question": "Wann könntest Du frühestens starten?", "expected": "<=3 Monate" }, { "key": "salary_expectation", "question": "Was sind Deine Gehaltsvorstellungen — das Zielband liegt bei 70 bis 90k?" }, { "key": "mobility", "question": "Ist Remote-Arbeit für Dich okay oder bevorzugst Du Köln vor Ort?" } ], "voicemail_script": "Hallo Julian, hier ist Sophie von PERSOX. Ich rufe wegen Deiner Bewerbung als Senior DevOps Engineer an. Ruf mich gerne zurück: null null vier neun — acht eins drei — fünf sieben vier drei eins null fünf. Ich freue mich auf Dein Feedback!", "inbound_script": "Hier ist Sophie von PERSOX — Du hast mich angerufen. Geht es um Deine Bewerbung als Senior DevOps Engineer?" } } PAYLOAD ) # Telefonnummer einsetzen PAYLOAD=$(echo "$PAYLOAD" | sed "s|PHONE_PLACEHOLDER|$PHONE|g") # HMAC berechnen SIG=$(echo -n "$PAYLOAD" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}') echo "Sende Test-Lead..." echo "Phone: $PHONE" echo "Signature: hmac-sha256=$SIG" echo "" curl -s -X POST \ "https://n8n.rockstein-consulting.de/webhook/a5e2cf90-7c7e-4476-8f19-631cd9de7616" \ -H "Content-Type: application/json" \ -H "x-signature: hmac-sha256=$SIG" \ -d "$PAYLOAD" | python3 -m json.tool echo "" echo "Dein Telefon sollte in ~60 Sekunden klingeln."bash · vollständiges Test-Script
application_id f6a7b8c9-0099-0099-0099-000000TEST01 ist bewusst als Test-ID gewählt. In Supabase filterbar via: WHERE external_id LIKE '%TEST01%'. Ein zweiter Test mit derselben ID gibt HTTP 200 + deduped:true zurück (kein neuer Anruf). Für weitere Tests einfach event_id und application_id incrementieren (TEST02, TEST03...).
So verifizierst Du dass alles durchgelaufen ist.
| Was prüfen | Wo | Erwartetes Ergebnis |
|---|---|---|
| HTTP Response | curl-Output | {"status":"accepted","application_id":"...","dispatch_eta":"~60s"} |
| Lead in DB | Supabase → Tabelle public.lead → filtern nach external_id |
Alle 12 Felder befüllt, status=new |
| Cadence-Job | Supabase → Tabelle public.cadence_jobs |
action_type=call, status=pending, attempt_number=1 |
| n8n Execution | n8n.rockstein-consulting.de → Executions → WF "01 PERSOX WF1" | Execution grün, alle Nodes durchgelaufen |
| Anruf | Dein Telefon | Klingelt innerhalb ~60 Sek (Cadence-Executor-Intervall) |
| Was prüfen | Wo | Erwartetes Ergebnis |
|---|---|---|
| Lead-Status | Supabase → public.lead |
status entspricht dem report_disposition-Status (qualified/disqualified/voicemail_left/...) |
| WF 2 Execution | n8n → Executions → WF "hyz8J9zL4lVF8JRb" | Post-Call-Processing durchgelaufen, Leve-Callback gesendet |
| Leve-Callback | PERSOX Mock-Endpoint (bis Cut-Over: Mock-UI Tab 2) | Leve-Schema-Event mit korrektem Status |
| Was prüfen | Wo | Erwartetes Ergebnis |
|---|---|---|
| stop_contact | Supabase → public.lead |
stop_contact=true |
| Cadence gecancelt | Supabase → public.cadence_jobs |
status=cancelled für alle Jobs dieses Leads |
-- Supabase SQL Editor (Projekt yhsbhujgfjdaarhfpidf) -- Test-Leads anzeigen SELECT external_id, first_name, last_name, job_title, status, qualification_criteria IS NOT NULL AS has_criteria, stop_contact, created_at FROM public.lead WHERE external_id LIKE '%TEST%' ORDER BY created_at DESC LIMIT 10; -- Cadence-Jobs für Test-Lead SELECT l.external_id, c.action_type, c.status, c.attempt_number, c.scheduled_at FROM public.cadence_jobs c JOIN public.lead l ON c.lead_id = l.id WHERE l.external_id LIKE '%TEST%' ORDER BY c.created_at DESC;SQL · Verifikation