Zum Inhalt springen
Erfolgsgeist Automatisierung für kleine Betriebe

Erfolgsgeist · Ratgeber

Termine per Telegram in den Google Kalender eintragen, mit Bestätigung per Knopfdruck

Stand:

Ein Kunde ruft an, während Sie unterwegs sind, und Sie sagen einen Termin zu. Die Kalender-App zu öffnen, den Tag zu suchen und alles einzutippen dauert. Schneller ist eine Nachricht an den eigenen Telegram-Bot: morgen 15 Uhr Zahnarzt. Der Bot antwortet mit dem, was er verstanden hat, und zwei Knöpfen. Erst wenn Sie auf Anlegen tippen, steht der Termin in Ihrem Google Kalender.

Dieser Ratgeber zeigt, wie Sie das mit dem Automatisierungswerkzeug n8n selbst bauen, ohne KI und ohne API-Kosten. Er richtet sich an alle, die unterwegs Termine zusagen und Telegram ohnehin offen haben. Und er erklärt, warum der Bestätigungsknopf kein Beiwerk ist, sondern der wichtigste Teil.

Auf dieser Seite: Beispiel · Warum bestätigen · Aufbau in n8n · Fallen · Was es nicht kann · Kosten · Ausbau

So sieht das im Chat aus

Ein Beispiel mit erfundenen Terminen, geschrieben an einem Montag, dem 26. Oktober:

Sie:  morgen 15 Uhr Zahnarzt
Bot:  Ich lege an:
      Di 27.10.2026, 15:00–16:00 · Zahnarzt
      Passt das?
      [ ✅ Anlegen ]  [ ✖ Verwerfen ]

Sie tippen auf ✅ Anlegen. Der Vorschlag wird ersetzt durch:
Bot:  Angelegt:
      Di 27.10.2026, 15:00–16:00 · Zahnarzt

Sie:  morgen um 3 Zahnarzt
Bot:  03:00 oder 15:00? Bitte mit „Uhr“ schicken,
      etwa: um 15 Uhr
Sie:  morgen um 15 Uhr Zahnarzt
Bot:  Ich lege an:
      Di 27.10.2026, 15:00–16:00 · Zahnarzt
      Passt das?
      [ ✅ Anlegen ]  [ ✖ Verwerfen ]

Verwerfen legt nichts an. Ist sich der Bot nicht sicher, schlägt er gar nichts vor, sondern fragt nach.

Warum erst ein Vorschlag

Ein Bot, der Nachrichten mit festen Regeln liest, hat Ränder. „Kaffee morgen 4 Uhr Oma“ liest er als 04:00, gemeint war vermutlich 16 Uhr. Ein Bot, der sofort einträgt, schreibt diesen Fehler still in Ihren Kalender, und Sie bemerken ihn erst, wenn es zu spät ist. Mit dem Vorschlag sehen Sie Datum, Uhrzeit und Titel, bevor etwas gespeichert wird. Ein Fehlgriff kostet dann einen Tipp auf Verwerfen und eine neue Nachricht.

Dasselbe gilt für KI-Assistenten, die Termine aus freiem Text lesen: Auch sie liegen manchmal daneben. Die Bestätigung ist deshalb unabhängig davon sinnvoll, wie der Text gelesen wird. Kein Termin ohne Knopfdruck.

Der Aufbau in n8n, Schritt für Schritt

n8n gibt es als Cloud-Dienst und zum Selbstbetrieb auf einem eigenen Rechner oder Server. Anders als ein Zeitplan braucht dieser Ablauf keinen Takt: Telegram ruft n8n bei jeder Nachricht und jedem Knopfdruck selbst auf. Selbst betrieben muss Ihr n8n dafür per HTTPS aus dem Internet erreichbar sein.

  1. Eigenen Bot anlegen. Schicken Sie in Telegram an @BotFather den Befehl /newbot, wählen Sie einen Namen und kopieren Sie den Bot-Token. Den Token tragen Sie in n8n einmal als Telegram-Zugang ein (Credential, Feld Access Token); alle Telegram-Knoten dieses Ablaufs nutzen denselben Zugang. Nehmen Sie einen Bot nur für diesen Ablauf: Telegram liefert die Nachrichten eines Bots an genau eine Adresse. Schicken dürfen dagegen beliebig viele Abläufe über denselben Bot.
  2. Auslöser (Knoten Telegram Trigger): Unter Trigger On wählen Sie Message und Callback Query. Das Erste sind Ihre Nachrichten, das Zweite die Knopfdrücke. Stellen Sie außerdem in den Workflow-Einstellungen unter Timezone Ihre Zeitzone ein, etwa Europe/Berlin.
  3. Einstellungen (Knoten Edit Fields, hier „Einstellungen“ genannt): drei Felder, chat_id (Ihre Chat-ID, siehe unten), calendar_id (primary für Ihren Hauptkalender) und zeitzone (Europe/Berlin).
  4. Weiche (Knoten If): Ist im Auslöser ein Knopfdruck angekommen (prüfen Sie dazu, ob {{ $('Telegram Trigger').item.json.callback_query ? 'knopf' : 'nachricht' }} gleich knopf ist), geht es zu Schritt 7, sonst zu Schritt 5.
  5. Nachricht lesen (Knoten Code): prüft, ob die Nachricht aus Ihrem Chat kommt, liest Datum, Uhrzeit und Titel und merkt sich den Vorschlag. Angelegt wird hier nichts. Den Code zeigt der erste Ausschnitt unter dieser Liste.
  6. Vorschlag oder Rückfrage senden. Ein Knoten If prüft {{ $json.aktion }} auf vorschlag. Im Ja-Zweig schickt ein Knoten Telegram (Send Message) den Text {{ $json.text }} an {{ $json.chat }}, mit Reply Markup Inline Keyboard und zwei Knöpfen in einer Zeile. Die Callback Data finden Sie je Knopf unter dessen Additional Fields: „✅ Anlegen“ bekommt ok:{{ $json.id }}, „✖ Verwerfen“ bekommt no:{{ $json.id }}. Im Nein-Zweig schickt ein zweiter Telegram-Knoten nur den Text, ohne Knöpfe. In beiden stellen Sie unter Additional Fields den Parse Mode auf HTML und schalten Append n8n Attribution aus; warum, steht unten bei den Fallen.
  7. Knopf lesen (Knoten Code): sucht den gemerkten Vorschlag, schließt ihn und entscheidet, ob angelegt wird. Code im zweiten Ausschnitt. Daran hängen zwei Knoten: ein Knoten Telegram mit Callback → Answer Query und der Query ID {{ $json.query_id }}, der Telegram den Knopfdruck quittiert, und ein Knoten If, der {{ $json.aktion }} auf anlegen prüft.
  8. Termin anlegen (Knoten Google Calendar, Event → Create), nur im Ja-Zweig: Kalender By ID per Ausdruck {{ $('Einstellungen').item.json.calendar_id }}, Start {{ $json.start }}, End {{ $json.ende }}, unter Additional Fields Summary {{ $json.titel }} und ID {{ $json.id }}. Setzen Sie in den Knoteneinstellungen On Error auf Continue, damit ein Fehler bei Google als Meldung im Chat ankommt statt still im Protokoll. Als Zugang legen Sie im Knoten einen Google-Kalender-Zugang an (Google Calendar OAuth2 API); bei n8n Cloud genügt Sign in with Google. Selbst betrieben brauchen Sie dafür einen eigenen OAuth-Client in der Google Cloud Console. Steht dessen App dort im Veröffentlichungsstatus Testing, läuft die Anmeldung nach 7 Tagen ab, und der Bot meldet danach bei jedem Termin „Nicht sicher, ob angelegt“. Für den Dauerbetrieb stellen Sie die App auf In production.
  9. Vorschlag ersetzen (Knoten Telegram, Message → Edit Message Text): Chat-ID {{ $('Knopf lesen').item.json.chat }}, Message-ID {{ $('Knopf lesen').item.json.message_id }}, Reply Markup None, damit die Knöpfe verschwinden, Parse Mode HTML. Hinter dem Google-Knoten lautet der Text {{ $json.htmlLink ? $('Knopf lesen').item.json.text : 'Nicht sicher, ob angelegt. Bitte im Kalender nachsehen.' }}. Für den Nein-Zweig aus Schritt 7 legen Sie einen zweiten solchen Knoten mit dem Text {{ $('Knopf lesen').item.json.text }} an und davor einen Knoten If, der nur weiterlässt, wenn dieser Text nicht leer ist.
  10. Veröffentlichen und Chat-ID holen. Veröffentlichen Sie den Workflow (Publish) und schicken Sie dem Bot eine Nachricht. Unter Executions steht dann ein Lauf; im Auslöser finden Sie unter message.chat.id Ihre Chat-ID. Tragen Sie sie in „Einstellungen“ ein und veröffentlichen Sie erneut. Seit n8n 2.0 bleibt eine Änderung ein Entwurf, bis Sie wieder veröffentlichen.

Der Code des Knotens „Nachricht lesen“ (Modus Run Once for All Items; die Knotennamen müssen zu Ihren passen). Er versteht bewusst wenig: heute, morgen, übermorgen oder ein Datum wie 26.10., dazu eine Uhrzeit wie 15:30 oder 15 Uhr. Ein „am“ vor dem Datum und ein „um“ vor der Uhrzeit gehören dazu und landen nicht im Titel: Zahnarzt am 27.10. um 15 Uhr ergibt den Titel „Zahnarzt“. Alles andere wird zur Rückfrage, auch 15.30 Uhr mit Punkt.

const s = $('Einstellungen').first().json;
const nachricht = $('Telegram Trigger').first().json.message || {};
const chat = String(nachricht.chat?.id ?? '');
// fremder Chat: keine Antwort, kein Vorschlag
if (chat !== String(s.chat_id)) return [];
const frage = text => [{ json: { aktion: 'frage', chat, text } }];
const jetzt = DateTime.now().setZone(s.zeitzone);
let rest = ' ' + String(nachricht.text || '').replace(/\s+/g, ' ') + ' ';
const nimm = re => {
  const t = re.exec(rest);
  if (t) rest = rest.replace(t[0], ' ');
  return t;
};

// Datum: heute, morgen, übermorgen, 26.10. oder 26.10.2026;
// ein „am“ davor gehört zum Datum, nicht zum Titel
const wort = nimm(/ (heute|übermorgen|morgen) /i);
const datum = wort ? null
  : nimm(/ (?:am )?(\d{1,2})\.(\d{1,2})\.(\d{4})? /i);
// Uhrzeit: 15:30, 15:30 Uhr oder 15 Uhr, auch mit „um“ davor
const zeit = nimm(/ (?:um )?(\d{1,2}):(\d{2})(?: ?Uhr)? /i)
  || nimm(/ (?:um )?(\d{1,2}) ?Uhr /i);
const titel = rest.trim();
// „um 3“ ohne „Uhr“: früh oder nachmittags? Lieber fragen
const nackt = !zeit && / um ([1-9]|1[01]) /i.exec(rest);
if (nackt) {
  const h = Number(nackt[1]);
  const hh = String(h).padStart(2, '0');
  return frage(`${hh}:00 oder ${h + 12}:00? Bitte mit „Uhr“ schicken, `
    + `etwa: um ${h + 12} Uhr`);
}
if (!(wort || datum) || !zeit || !titel) {
  return frage('Bitte mit Datum, Uhrzeit und Titel schicken, '
    + 'etwa: morgen 15 Uhr Zahnarzt');
}
const stunde = Number(zeit[1]), minute = Number(zeit[2] || 0);
let tag;
if (wort) {
  const plus = { heute: 0, morgen: 1, 'übermorgen': 2 };
  tag = jetzt.startOf('day')
    .plus({ days: plus[wort[1].toLowerCase()] });
} else {
  tag = DateTime.fromObject({
    year: Number(datum[3] || jetzt.year),
    month: Number(datum[2]),
    day: Number(datum[1]),
  }, { zone: s.zeitzone });
  // ohne Jahr und schon vorbei: nächstes Jahr
  if (!datum[3] && tag.isValid && tag < jetzt.startOf('day')) {
    tag = tag.plus({ years: 1 });
  }
}
if (!tag.isValid || stunde > 23 || minute > 59) {
  return frage('Dieses Datum oder diese Uhrzeit gibt es nicht.');
}
const start = tag.set({ hour: stunde, minute });
if (start <= jetzt) return frage('Dieser Zeitpunkt ist schon vorbei.');
const ende = start.plus({ minutes: 60 });

// merken; die ID besteht nur aus 0-9 und a-v,
// so nimmt Google sie als Termin-ID
const daten = $getWorkflowStaticData('global');
daten.vorschlaege = daten.vorschlaege || {};
const tagMs = 24 * 3600 * 1000;
for (const [k, v] of Object.entries(daten.vorschlaege)) {
  // nach 24 Stunden verfallen
  if (Date.now() - v.t > tagMs) delete daten.vorschlaege[k];
}
const id = Date.now().toString(32)
  + Math.random().toString(32).slice(2, 8);
const esc = x => x.replace(/&/g, '&amp;')
  .replace(/</g, '&lt;').replace(/>/g, '&gt;');
const wann = start.setLocale('de').toFormat('ccc d.M.yyyy, HH:mm')
  + '–' + ende.toFormat('HH:mm');
const zeile = esc(wann + ' · ' + titel);
daten.vorschlaege[id] = {
  t: Date.now(), chat, titel,
  start: start.toISO(), ende: ende.toISO(), zeile,
};
return [{ json: {
  aktion: 'vorschlag', chat, id,
  text: 'Ich lege an:\n' + zeile + '\nPasst das?',
} }];

Der Code des Knotens „Knopf lesen“, ebenfalls im Modus Run Once for All Items:

const s = $('Einstellungen').first().json;
const q = $('Telegram Trigger').first().json.callback_query;
const chat = String(q.message.chat.id);
// Knopf aus einem fremden Chat: nichts tun
if (chat !== String(s.chat_id)) return [];
const daten = $getWorkflowStaticData('global');
const [knopf, id] = String(q.data).split(':');
const v = (daten.vorschlaege || {})[id];
const basis = { query_id: q.id, chat, message_id: q.message.message_id };
const raus = (aktion, text) => [{ json: { ...basis, aktion, text } }];
if (!v || v.chat !== chat) {
  return raus('abgelaufen', 'Abgelaufen, nichts angelegt. '
    + 'Bitte den Termin noch einmal schicken.');
}
if (v.erledigt) return raus('erledigt', '');
// erst schließen, dann anlegen: ein späterer Klick findet ihn erledigt
v.erledigt = true;
if (knopf !== 'ok') return raus('verworfen', 'Verworfen.');
if (DateTime.fromISO(v.start) <= DateTime.now()) {
  return raus('vorbei', 'Nicht angelegt: Der Termin liegt inzwischen '
    + 'in der Vergangenheit.');
}
return [{ json: {
  ...basis, aktion: 'anlegen', id, titel: v.titel,
  start: v.start, ende: v.ende, text: 'Angelegt:\n' + v.zeile,
} }];

Probieren Sie es danach im veröffentlichten Workflow aus: morgen 15 Uhr Test schicken, Vorschlag lesen, Anlegen tippen und den Testtermin im Google Kalender ansehen und wieder löschen. Unter Executions stehen dann zwei Läufe, einer für die Nachricht und einer für den Knopf. Warum Sie dafür nicht den Testknopf im Editor nehmen sollten, steht gleich als erste Falle.

Die Fallen, an denen der Nachbau scheitert

Ein Testlauf im Editor macht den Bot stumm

Telegram kennt je Bot nur eine Adresse, an die es Nachrichten liefert. Starten Sie am veröffentlichten Workflow einen Testlauf im Editor (Execute workflow), trägt n8n dort die Test-Adresse ein. Danach bekommt der veröffentlichte Workflow keine Nachrichten mehr, und der Bot schweigt. Abhilfe: den Workflow mit Unpublish deaktivieren und mit Publish wieder veröffentlichen. Nur erneut veröffentlichen reicht nicht, denn einen unveränderten Auslöser meldet n8n dabei nicht neu an. Wollen Sie im Editor testen, deaktivieren Sie den Workflow vorher und veröffentlichen ihn danach wieder, oder Sie nehmen einen zweiten Bot nur zum Testen.

Dazu kommt: Den Workflow-Speicher, in dem der Vorschlag wartet, sichert n8n nur in echten Läufen eines veröffentlichten Workflows, nicht in Testläufen. Ein Vorschlag aus einem Testlauf ist beim Tippen unbekannt, und der Bot meldet „Abgelaufen“.

Der Knopf trägt höchstens 64 Bytes

Die Daten hinter einem Telegram-Knopf (Callback Data) dürfen höchstens 64 Bytes lang sein. Titel, Datum und Uhrzeit passen da oft nicht hinein. Deshalb trägt der Knopf nur ok: oder no: und eine kurze ID; der eigentliche Vorschlag wartet im Workflow-Speicher ($getWorkflowStaticData). n8n bezeichnet diesen Speicher als experimentell und warnt, dass er bei sehr vielen Läufen kurz hintereinander unzuverlässig sein kann. Für die Nachrichten einer Person reicht er. Wer mehr Last erwartet, nimmt eine Datentabelle von n8n.

Ohne Quittung dreht sich der Knopf weiter

Nach einem Knopfdruck zeigt Telegram eine Ladeanzeige, bis der Bot den Druck quittiert (answerCallbackQuery). Telegram verlangt die Quittung auch dann, wenn Sie gar keinen Hinweis anzeigen wollen. Fehlt der Knoten Answer Query aus Schritt 7 oder hat er einen anderen Telegram-Zugang als der Auslöser, sieht es aus, als hinge der Bot.

Doppelt getippt ergibt doppelte Termine

Wer zweimal schnell auf Anlegen tippt, darf nicht zwei Termine bekommen. Der Code schließt den Vorschlag deshalb, bevor der Google-Knoten läuft. Ein Klick, der nach dem Ende des ersten Laufs ankommt, findet ihn erledigt. Den Workflow-Speicher sichert n8n allerdings erst am Ende eines Laufs. Kommt der zweite Tipp, während der erste Lauf noch auf Google wartet, findet er den Vorschlag noch offen. Für diesen Fall ist die ID des Vorschlags zugleich die ID des Termins bei Google: Einen zweiten Termin mit derselben ID im selben Kalender lehnt Google in aller Regel ab. Eine Garantie gibt Google dafür nicht; es schreibt selbst, dass eine doppelte ID nicht in jedem Fall schon beim Anlegen erkannt wird. Erlaubt sind für die ID nur die Kleinbuchstaben a bis v und die Ziffern 0 bis 9, mindestens 5 und höchstens 1024 Zeichen. Genau so baut der Code die ID.

Den abgelehnten zweiten Versuch meldet n8n allerdings nur als allgemeinen Fehler. Deshalb sagt der Bot nach einem Fehler „Nicht sicher, ob angelegt“ statt „Nicht angelegt“: Der Termin kann trotzdem im Kalender stehen.

Der Google-Knoten ersetzt die Daten

Nach dem Knoten Google Calendar enthält $json den angelegten Termin, nicht mehr die Chat-ID und die Nummer der Nachricht. Wer im Knoten danach {{ $json.chat }} schreibt, bekommt nichts. Deshalb holt Schritt 9 die Werte ausdrücklich aus „Knopf lesen“: {{ $('Knopf lesen').item.json.chat }}.

Fremde Chats auch beim Knopf prüfen

Jeder, der den Benutzernamen Ihres Bots kennt, kann ihm schreiben. Beide Code-Knoten prüfen deshalb die Chat-ID, der eine bei Nachrichten, der andere bei Knopfdrücken. Mehr braucht es nicht, damit Fremde nichts anlegen können.

Im Auslöser können Sie unter Restrict to Chat IDs zusätzlich Ihre Chat-ID eintragen. Was dieser Filter aussortiert, startet gar keinen Lauf und kostet damit keine Ausführung. Setzen Sie ihn aber nur, wenn Ihr n8n mindestens Version 2.30 hat und Sie den Auslöser in dieser oder einer neueren Version eingefügt haben. Erst seit 2.30 (Knotenversion 1.4 des Telegram Trigger) prüft der Filter auch Knopfdrücke richtig. In älteren Versionen sortiert er jeden Knopfdruck aus: Es startet kein Lauf, es kommt keine Quittung, und der Knopf dreht sich endlos. Ein Auslöser, den Sie vor 2.30 eingefügt haben, behält seine alte Knotenversion auch nach einem Update. Lassen Sie das Feld dann leer, oder fügen Sie den Auslöser neu ein. Die Prüfung im Code wirkt in jeder Version. Tragen Sie den Filter außerdem erst ein, wenn Sie Ihre Chat-ID kennen (Schritt 10): Mit dem Filter kommt nur noch durch, was aus genau diesem Chat stammt.

Zeitzone und Zeitumstellung

Rechnen Sie Uhrzeiten mit einem Zeitzonennamen wie Europe/Berlin, nie mit festen Versätzen wie „+1 Stunde“. Sonst liegt jeder Termin nach der Zeitumstellung eine Stunde daneben. Der Code nutzt dafür die Bibliothek Luxon, die im Code-Knoten von n8n bereitsteht. Eine Uhrzeit, die es wegen der vorgestellten Uhr nicht gibt (2:30 Uhr am letzten Sonntag im März), verschiebt Luxon auf 3:30 Uhr. Auch das sehen Sie im Vorschlag, bevor etwas angelegt wird.

In den beiden Umstellungsnächten sieht außerdem die Anzeige ungewohnt aus. Im März zeigt ein Termin um 1:30 Uhr „01:30–03:30“, weil die Uhr dazwischen eine Stunde springt. Im Oktober gibt es 2:30 Uhr zweimal; Luxon nimmt die erste, noch in Sommerzeit, und der Vorschlag zeigt „02:30–02:30“. In beiden Fällen wird trotzdem ein Termin von einer Stunde angelegt, denn Beginn und Ende tragen ihren Versatz zur Weltzeit mit.

Parse Mode und die n8n-Zeile

Ohne eigene Einstellung schickt der Telegram-Knoten von n8n im alten Markdown-Modus und hängt „This message was sent automatically with n8n“ an. Im Markdown-Modus lässt ein einzelnes _, *, ` oder [ im Termintitel die ganze Nachricht scheitern. Deshalb Parse Mode auf HTML und die Zeile aus, wie in Schritt 6. Im HTML-Modus müssen Sie &, < und > im Titel maskieren; das erledigt esc im Code.

Was dieser Ablauf nicht kann

  • Kein freies Gespräch. Eine Nachricht ist ein Termin. „Nächste Woche irgendwann vormittags“ versteht er nicht, und das soll er auch nicht raten.
  • Keine Serien, keine Einladungen, kein Ort, keine eigenen Erinnerungen. Der Termin bekommt die Standard-Erinnerungen Ihres Kalenders. Eine Wiederholung stellen Sie danach im Kalender ein.
  • Kein Rückgängig-Befehl. Einen angelegten Termin ändern oder löschen Sie im Google Kalender.
  • Feiertage rechnet er nicht aus. Auf „Weihnachten 18 Uhr Essen“ antwortet der Kern oben mit einer Rückfrage; schreiben Sie das Datum.
  • In einer Gruppe darf jedes Mitglied Vorschläge schicken und Knöpfe tippen, wenn Sie die Chat-ID der Gruppe eintragen.
  • Kundendaten: Schreiben Sie Namen oder Telefonnummern von Kunden in den Termin, laufen diese Daten über Telegram, Ihr n8n und Google. Überlegen Sie vorher, ob das für Ihren Betrieb in Ordnung ist; im Zweifel fragen Sie eine Fachperson. Oft reicht ein Kürzel im Titel.

Was der Betrieb kostet

  • n8n Cloud hat keinen Gratis-Tarif, nur eine kostenlose Probezeit. Der kleinste Tarif, Starter, kostet laut n8n.io 20 € im Monat bei jährlicher Zahlung und enthält 2.500 Ausführungen im Monat (Stand 29. Oktober 2026).
  • Selbst betriebenes n8n (Community Edition) ist kostenlos, braucht aber einen Rechner oder Server, der rund um die Uhr läuft und per HTTPS aus dem Internet erreichbar ist.
  • Ausführungen: Jede Nachricht und jeder Knopfdruck ist eine Ausführung. Ein angelegter Termin kostet also zwei, ein verworfener ebenfalls zwei, eine Rückfrage eine. 30 Termine im Monat sind etwa 60 Ausführungen. Nachrichten Fremder zählen mit, außer Sie setzen den Filter Restrict to Chat IDs; das geht gefahrlos erst ab n8n 2.30 (siehe Fremde Chats). Einen Zeitplan, der Ausführungen im Leerlauf verbraucht, gibt es hier nicht.
  • Google Kalender und Telegram sind für diesen Zweck kostenlos. Eine KI oder einen API-Schlüssel mit Kosten braucht der Ablauf nicht.

Was eine ausgebaute Fassung zusätzlich abfangen sollte

Der Kern oben versteht bewusst wenig, und für den Anfang ist das richtig. Wer ihn ausbaut, trifft auf die folgenden Fälle. An jedem müsste eine Regel raten, und der Grundsatz bleibt derselbe: kein Termin ohne Knopfdruck, lieber nachfragen als raten.

  • Weitere Datumsangaben: Wochentage wie Freitag, in 3 Tagen oder 3. November. Wer auch englisch schreibt, braucht tomorrow 3pm dentist und sollte Rückfragen in der Sprache der Nachricht bekommen.
  • Spannen und Dauer: 18-20 Uhr, eine Dauer wie für 45 min und Termine über Mitternacht wie 22-1 Uhr, deren Ende am nächsten Tag liegt.
  • Ganztägige und mehrtägige Termine wie Urlaub 3.11.-7.11.: Google zählt bei ganztägigen Terminen das Enddatum nicht mit. Damit der 7. November noch dazugehört, muss das Ende auf dem 8. November liegen.
  • Rückfragen statt Raten: morgen um 3 fängt der Kern schon ab. Ebenso unklar sind ein Feiertag als Datum wie Weihnachten 18 Uhr Essen, auf den der Kern nur allgemein nachfragt, und ein unklares Ende wie morgen 10 bis Mittag Kurs. Mit „Uhr“ ist es eindeutig: morgen 10 Uhr bis Mittag Kurs kann als 10 bis 12 Uhr gelten.
  • Nach einem Fehler nachsehen: Scheitert das Anlegen, kann der Termin trotzdem bei Google stehen (siehe Doppelklick oben). Ein zweiter Knoten Google Calendar (Event → Get) sucht ihn dann über seine ID. Findet er ihn, kann der Bot sicher „Angelegt“ melden statt „Nicht sicher“.
  • Ein Prüfskript: Je mehr Regeln, desto leichter verschiebt eine neue unbemerkt einen alten Fall; gerade „um“ und „am“ landen schnell im Titel. Spielen Sie deshalb eine Liste von Testsätzen durch, von der Nachricht bis zur Bestätigung, und vergleichen Sie jedes Ergebnis mit dem erwarteten. Telegram und Google brauchen Sie dafür nicht: Der Code läuft auch außerhalb von n8n in Node.js mit Luxon, wenn Sie $() und $getWorkflowStaticData nachbilden.

Passt dazu: die Tagesübersicht am Morgen

Dieser Bot trägt ein. Was am Tag ansteht, schickt Ihnen ein zweiter Ablauf morgens als eine Nachricht, aus allen Ihren Kalendern und mit dem Wetter. Wie das geht, steht im Ratgeber Termine morgens per Telegram.

Quellen

Abgerufen am 29. Oktober 2026. Erfolgsgeist ist mit Google, Telegram und n8n nicht verbunden; die Namen stehen hier nur, um zu sagen, womit der Ablauf arbeitet.