Outbound-Kampagne mit n8n

10m
Zuletzt aktualisiert: 29.7.2026

In dieser Anleitung baust du in n8n eine Outbound-Kampagne. Eine Kontaktliste in Google Sheets wird Zeile für Zeile abgearbeitet, dein smao Assistent ruft jeden Kontakt an, und das Ergebnis des Gesprächs landet automatisch zurück in der Tabelle. Am Ende steht bei jedem Kontakt, ob er erreicht wurde, was im Gespräch herausgekommen ist und wann der letzte Versuch war.

Die vier Teile des Workflows

Kontaktliste

Ein Google Sheet hält pro Kontakt die Rufnummer, den Status, die Zahl der Versuche und den Zeitpunkt des letzten Anrufs.

Anruf auslösen

n8n läuft über alle offenen Kontakte und schickt pro Kontakt einen Anruf an die smao API. Zwischen zwei Anrufen liegt eine Pause.

Anruf auswerten

Nach dem Gespräch fragt n8n die Anrufdaten ab und erkennt am Transkript, ob der Kontakt abgenommen und gesprochen hat.

Ergebnis zurückschreiben

Eine Anrufanalyse in smao kategorisiert das Gespräch und schickt das Ergebnis per Webhook an n8n, das damit die Tabelle aktualisiert.

Kontaktliste vorbereiten

Die Tabelle ist Datenquelle und Ergebnisspeicher in einem. n8n liest daraus die offenen Kontakte und schreibt nach jedem Anruf in dieselbe Zeile zurück.

Schritt 1

Google Sheet anlegen

Screenshot: Google Sheet mit den Spalten Link, phone, status, retry_count und last_attempt

Lege ein Google Sheet mit den folgenden Spalten in der ersten Zeile an. Trage darunter deine Kontakte ein, jeweils mit dem Status pending und retry_count auf 0.

SpalteInhalt
phoneZielrufnummer, z. B. +49123673727
statusBearbeitungsstand des Kontakts, Startwert pending
retry_countZahl der Anrufversuche, Startwert 0
last_attemptZeitstempel des letzten Versuchs, bleibt zunächst leer
LinkLink zum Anrufprotokoll, bleibt zunächst leer

Kontakte in n8n lesen

Der erste Teil des Workflows holt alle offenen Kontakte aus der Tabelle und übergibt sie einzeln an den weiteren Ablauf.

Schritt 2

Google Sheets verbinden

Erstelle in n8n über new Credential ein Credential vom Typ Google Sheets OAuth2 API und melde dich mit deinem Google-Konto an. Erstelle anschließend einen neuen Workflow und wähle bei Add first step die Google Sheets Node mit der Action Get row(s) in sheet.

Schritt 3

Dokument, Sheet und Filter setzen

Screenshot: Google Sheets Node mit Filter auf status pending

Wähle unter Document deine Tabelle und unter Sheet das Tabellenblatt. Füge unter Filters einen Filter mit Column status und Value pending hinzu, damit nur offene Kontakte gelesen werden. Mit Execute step prüfst du direkt, ob die Zeilen ankommen.

Schritt 4

Node umbenennen

Der Workflow bekommt später mehrere Google-Sheets-Nodes. Benenne diese Node deshalb um: Rechtsklick auf die Node, Rename, und als Namen Read contacts setzen. Auf diesen Namen greifen spätere Nodes zu.

Schritt 5

Kontakte einzeln durchlaufen

Hänge dahinter eine Loop Over Items Node und benenne sie in Loop Over Contacts um. Sie hat zwei Ausgänge: done wird erreicht, wenn alle Kontakte abgearbeitet sind, loop gibt den jeweils nächsten Kontakt aus.

API-Schlüssel in smao erstellen

n8n spricht die smao API mit einem API-Schlüssel an. Diesen legst du in deinem smao Dashboard an.

Schritt 6

API-Schlüssel-Seite öffnen

Screenshot: Seite API-Schlüssel in den smao Einstellungen

Wechsle in smao zu Einstellungen und dort zu API-Schlüssel. Details zu Rollen und Verwaltung findest du im Artikel API-Keys.

Schritt 7

Schlüssel anlegen

Screenshot: Dialog zum Erstellen eines API-Schlüssels mit Name und Rolle

Klicke auf + API-Schlüssel, gib einen Namen ein und wähle die Rolle Admin. Mit Erstellen wird der Schlüssel angelegt und angezeigt. Kopiere ihn.

Anruf über die API auslösen

Pro Kontakt schickt n8n eine Anfrage an die smao API, die den Anruf startet.

Schritt 8

HTTP Request Node anhängen

Screenshot: HTTP Request Node mit Generic Credential Type und Bearer Auth

Hänge an den loop-Ausgang der Loop Over Contacts Node eine HTTP Request Node. Setze Authentication auf Generic Credential Type und Generic Auth Type auf Bearer Auth.

Schritt 9

Credential mit dem API-Schlüssel anlegen

Screenshot: Bearer Auth Credential mit eingetragenem Token

Klicke auf Set up credential und trage als Bearer Token den kopierten API-Schlüssel ein, ohne das Wort „Bearer“ davor. n8n ergänzt das selbst. Speichere das Credential, du verwendest es später ein zweites Mal.

Schritt 10

Methode und URL setzen

Screenshot: HTTP Request Node mit Methode POST und der API-URL

Setze in der Node die Methode auf POST und trage die URL des Anruf-Endpunkts ein.

POST https://api.smao.ai/api/v1/calls
Schritt 11

Body befüllen

Screenshot: Body Parameters mit assistant_phone und to

Schalte Send Body ein, setze Body Content Type auf JSON und Specify Body auf Using Fields Below. Lege zwei Body-Felder an. Benenne die Node danach in Outbound Call um.

FeldWert
assistant_phoneTelefonnummer des Assistenten, der anrufen soll, z. B. +49302204402064
to{{ $('Read contacts').item.json.phone }}
Schritt 12

Pause zwischen den Anrufen

Screenshot: Wait Node mit 2 Minuten Wartezeit

Hänge hinter die Outbound Call Node eine Wait Node mit Wait Amount 2 und Wait Unit Minutes und benenne sie in Wait 2 min um. Verbinde ihren Ausgang zurück mit der Loop Over Contacts Node, damit der nächste Kontakt startet. Ohne diese Pause laufen die Anrufe in das Rate Limit der API.

Ergebnis des Anrufs auswerten

Der zweite Zweig hinter dem Anruf wartet das Gespräch ab, holt die Anrufdaten aus der API und schreibt einen ersten Status in die Tabelle. Er läuft parallel zur Kontaktschleife.

Schritt 13

Gesprächsende abwarten

Ziehe vom Ausgang der Outbound Call Node eine zweite Verbindung in eine weitere Wait Node, diesmal mit 5 Minuten, und benenne sie Wait 5 min. Damit ist das Gespräch mit hoher Sicherheit beendet, bevor die Anrufdaten abgefragt werden.

Schritt 14

Anrufdaten abfragen

Screenshot: HTTP Request Node mit GET-Abfrage der Anrufdaten

Hänge dahinter eine HTTP Request Node mit der Methode GET. Setze Authentication wieder auf Generic Credential Type mit Bearer Auth und wähle das zuvor angelegte Credential aus. Die URL enthält die Call-ID aus der Antwort des Anrufs. Benenne die Node in Track Call um.

text
https://api.smao.ai/api/v1/calls/{{$('Outbound Call').item.json.data.call_id}}
Schritt 15

Tabellenzeile erneut lesen

Screenshot: Google Sheets Node mit Filter auf die Telefonnummer des Kontakts

Rechtsklick auf die Read contacts Node vom Anfang, Copy, und die Kopie hinter Track Call einfügen. Benenne sie in Reread contact data um und ändere den Filter: Column phone mit dem Wert {{ $('Loop Over Contacts').item.json.phone }}. Damit liegt der aktuelle Stand der Zeile vor, auch wenn sie zwischenzeitlich geändert wurde.

Schritt 16

Erreichbarkeit aus dem Transkript ableiten

Screenshot: Code Node mit JavaScript zur Auswertung des Transkripts

Füge eine Code Node mit der Action Code in JavaScript ein und benenne sie Evaluate if caller talked. Das Skript liest das Transkript des Anrufs und leitet daraus den Status ab.

javascript
const transcript = $('Track Call').first().json.data.transcript || [];
const notPickedUp = transcript.length === 0
const hasUserTurn = transcript.some(msg => msg.role === 'user');

return {status: (notPickedUp ? "not_picked_up" : !hasUserTurn ? 'not_talked' : $input.first().json.status)};
StatusBedeutung
not_picked_upDas Transkript ist leer, der Anruf wurde nicht angenommen
not_talkedEs gibt ein Transkript, aber keinen Beitrag des Angerufenen
bisheriger StatusDer Angerufene hat gesprochen. Der Status bleibt unverändert, bis die Anrufanalyse das Gesprächsergebnis liefert
Schritt 17

Status in die Tabelle schreiben

Screenshot: Google Sheets Node mit Update Row und den Werten für phone, status und last_attempt

Füge eine Google Sheets Node mit der Action Update row in sheet ein und benenne sie Update status. Wähle Dokument und Tabellenblatt, setze Column to match on auf phone und trage unter Values to Update die folgenden Werte ein.

SpalteWert
phone (using to match){{$('Loop Over Contacts').item.json.phone}}
status{{ $('Evaluate if caller talked').item.json.status }}
last_attempt{{$now.toISO()}}

Zwischenstand

Screenshot: Workflow mit Kontaktschleife, Anruf und Auswertungszweig

Der Workflow arbeitet jetzt die Kontaktliste ab, ruft an und hält fest, ob jemand erreicht wurde. Was im Gespräch besprochen wurde, kommt im nächsten Teil dazu.

Gesprächsergebnis per Webhook zurückgeben

Eine Anrufanalyse in smao wertet jedes Gespräch aus und schickt das Ergebnis an einen Webhook in n8n. Dieser zweite Workflow-Teil hat einen eigenen Trigger und läuft unabhängig von der Kontaktschleife.

Schritt 18

Webhook-Trigger anlegen

Screenshot: Webhook Trigger mit POST, Path smao-post-call und Header Auth

Klicke im Canvas auf +, wähle Add another Trigger und füge einen On webhook call Trigger hinzu. Setze HTTP Method auf POST, Path auf smao-post-call und Authentication auf Header Auth. Lege über Set up credential ein Credential mit dem Namen X-Smao-Secret und einem selbst gewählten geheimen Wert an.

Schritt 19

Anrufanalyse in smao erstellen

Screenshot: Anrufanalyse in smao mit eigener Variable und Advanced Webhook

Wechsle in smao zu Automationen und dort zu Anrufanalyse, erstelle eine neue Analyse und lege unter Eigene Felder die Variable call_outcome mit diesem Prompt an.

text
Analysiere das Gespräch und ordne das Ergebnis exakt einer der folgenden Kategorien zu. Gib ausschließlich den Kategorie-Schlüssel zurück, keinen weiteren Text:

callback_agreed, do_not_call, no_interest, wrong_number, other

Wähle callback_agreed nur, wenn ein konkreter Rückruftermin oder eine explizite Zusage genannt wurde.
Wähle do_not_call, wenn der Angerufene ausdrücklich sagt, dass er nicht mehr kontaktiert werden möchte.
Wähle wrong_number, wenn die erreichte Person nicht die Zielperson ist und die Nummer falsch zugeordnet ist.
KategorieBedeutung
callback_agreedKonkreter Rückruftermin oder explizite Zusage
do_not_callAngerufener möchte nicht mehr kontaktiert werden
no_interestKein Interesse am Angebot
wrong_numberErreichte Person ist nicht die Zielperson
otherAlle übrigen Gesprächsverläufe

Füge im Editor die Node Webhook / Advanced Webhook hinzu und verbinde sie mit dem Startpunkt. Trage als URL die Test URL aus dem n8n-Trigger ein und setze die HTTP-Methode auf POST. Der Header trägt dasselbe Secret wie das Header-Auth-Credential in n8n.

json
{
  "X-Smao-Secret": "dein-geheimes-secret"
}

Im Body übergibst du die Rufnummer des Anrufers, den Link zum Anrufprotokoll und das Ergebnis der Analyse:

json
{
  "phone": "@callerPhoneNumber",
  "link": "@callLogUrl",
  "call_outcome": "@call_outcome"
}
Schritt 20

Analyse dem Assistenten zuweisen

Screenshot: Anrufanalyse beim Assistenten hinterlegen

Speichere die Analyse. Öffne dann unter Assistenten den Assistenten, der die Anrufe führt, und hinterlege die neue Analyse unter Automationen bei Anrufanalysen. Erst danach wird sie nach Gesprächen dieses Assistenten ausgeführt.

Schritt 21

Kontakt zum Webhook-Aufruf lesen

Screenshot: Google Sheets Node mit Filter auf die Telefonnummer aus dem Webhook

Zurück in n8n: Kopiere die Reread contact data Node und füge sie hinter den Webhook-Trigger ein. Ändere den Filterwert der Spalte phone auf {{$json.body.phone}} und benenne die Node in Read contact data um. Damit steht der aktuelle retry_count des Kontakts zur Verfügung.

Schritt 22

Ergebnis in die Tabelle schreiben

Screenshot: Google Sheets Node mit den Werten aus dem Webhook

Kopiere die Update status Node und füge sie hinter Read contact data ein. Passe die Werte an, sodass sie aus dem Webhook-Aufruf kommen.

SpalteWert
phone (using to match){{$('Webhook').item.json.body.phone}}
Link{{$('Webhook').item.json.body.link}}
status{{$('Webhook').item.json.body.call_outcome}}
retry_count{{ $json.retry_count + 1 }}
last_attempt{{$now.toISO()}}

Testen und live schalten

Beide Teile des Workflows sind fertig. Vor dem Livegang testest du sie einmal gemeinsam durch.

Schritt 23

Workflow testen

Screenshot: fertiger n8n-Workflow mit Kontaktschleife und Webhook-Zweig

Starte den oberen Teil über Execute workflow. Der erste Kontakt wird angerufen.

Schritt 24

Production URL eintragen und veröffentlichen

Screenshot: Production URL im Webhook-Trigger

Wenn der Test durchgelaufen ist, kopiere im Webhook-Trigger die Production URL und ersetze damit in der smao Anrufanalyse die Test URL. Klicke in n8n oben rechts auf Publish.

Kampagne starten

Screenshot: Kontaktliste mit Status, Zeitstempel und Link je Kontakt

Ein Klick auf Execute workflow arbeitet die Kontaktliste ab. Nach jedem Gespräch stehen in der Tabelle das Gesprächsergebnis, der Zeitpunkt des Versuchs, die Zahl der Versuche und der Link zum Anrufprotokoll.