Microsoft Teams ist aus dem Arbeitsalltag nicht mehr wegzudenken. Aber wussten Sie, dass Sie eigene Bots erstellen können – ohne zu programmieren? In diesem Guide zeigen wir, wie Sie Teams-Bots für Benachrichtigungen, Interaktionen und Automatisierung bauen.

Bevor Sie weiterlesen
Lohnt sich Automation bei Ihnen überhaupt? Machen Sie die 5-Minuten-Analyse — Score, Reifegrad und eine ehrliche Einordnung, ob dieser Weg für Ihre Situation taugt. Kostenlos, Report per Mail.
5-Min-Analyse starten →

Warum einen Teams Bot?

Typische Use Cases:

Use CaseBeschreibung
BenachrichtigungenServer-Alerts, Bestellungen, Tickets
Interaktive AktionenGenehmigungen, Umfragen, Feedback
InformationsabrufStatus abfragen, Daten suchen
Prozess-TriggerWorkflows aus Teams starten

Vorteile:

  • Direkt im Arbeitskontext (ähnlich wie bei einem Slack Bot)
  • Keine zusätzliche App nötig
  • Hohe Akzeptanz bei Nutzern

Teams Messaging-Optionen

1. Incoming Webhooks (Einfachste Variante)

Nur für Benachrichtigungen – keine Interaktion.

Einrichten:

  • Teams Kanal → ... → Connectors
  • "Incoming Webhook" konfigurieren
  • Namen vergeben, URL kopieren
  • Nachricht senden (n8n):

    // Node: HTTP Request
    {
      "method": "POST",
      "url": "https://outlook.office.com/webhook/abc123...",
      "headers": { "Content-Type": "application/json" },
      "body": {
        "@type": "MessageCard",
        "@context": "http://schema.org/extensions",
        "themeColor": "0076D7",
        "summary": "Neue Bestellung",
        "sections": [{
          "activityTitle": "Bestellung #12345",
          "facts": [
            { "name": "Kunde", "value": "Max Mustermann" },
            { "name": "Betrag", "value": "149,00 €" }
          ],
          "markdown": true
        }]
      }
    }

    2. Outgoing Webhooks

    Teams sendet Nachrichten an Ihren Endpoint.

    Einrichten:

  • Team-Einstellungen → Apps → Outgoing Webhook erstellen
  • Bot-Name und Callback-URL angeben
  • HMAC Token für Verifizierung speichern
  • Nachrichten empfangen (n8n):

    // Node: Webhook
    // Teams sendet bei @Mention
    
    {
      "type": "message",
      "text": "<at>BotName</at> Wie ist der Serverstatus?",
      "from": {
        "name": "Max Mustermann"
      },
      "channelId": "19:abc123..."
    }

    3. Bot Framework (Vollwertig)

    Für komplexe Interaktionen – erfordert Azure Bot Service. Falls Sie n8n als Automatisierungsplattform nutzen möchten, hilft Ihnen unser n8n Tutorial für Anfänger beim Einstieg.

    Workflow 1: Server-Monitoring Alerts

    Der Workflow

    Uptime Monitor (Server Down)
            ↓
        Teams Webhook:
        "⚠️ Server ist nicht erreichbar!"
            ↓
        Mit Action Buttons:
        [Acknowledge] [Escalate]

    Adaptive Cards für reichhaltige Nachrichten

    // Node: HTTP Request
    {
      "method": "POST",
      "url": "{{ $env.TEAMS_WEBHOOK_URL }}",
      "body": {
        "type": "message",
        "attachments": [
          {
            "contentType": "application/vnd.microsoft.card.adaptive",
            "content": {
              "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
              "type": "AdaptiveCard",
              "version": "1.4",
              "body": [
                {
                  "type": "TextBlock",
                  "size": "Large",
                  "weight": "Bolder",
                  "text": "⚠️ Server Alert",
                  "color": "Attention"
                },
                {
                  "type": "FactSet",
                  "facts": [
                    { "title": "Server", "value": "{{ $json.server }}" },
                    { "title": "Status", "value": "{{ $json.status }}" },
                    { "title": "Zeit", "value": "{{ $now }}" }
                  ]
                }
              ],
              "actions": [
                {
                  "type": "Action.OpenUrl",
                  "title": "Dashboard öffnen",
                  "url": "https://monitoring.ihre-domain.de"
                }
              ]
            }
          }
        ]
      }
    }

    Selbst bauen oder bauen lassen?
    Wir implementieren diesen Workflow für Sie — fertig getestet in 1-4 Wochen. Festpreisangebot in 24h.
    Angebot anfragen →

    Workflow 2: Genehmigungs-Workflow

    Der Workflow

    Neue Urlaubsanfrage
            ↓
        Teams an Vorgesetzten:
        "Max möchte Urlaub vom 15.-20.01."
        [Genehmigen] [Ablehnen]
            ↓
        Vorgesetzter klickt
            ↓
        n8n Webhook empfängt Antwort
            ↓
        HR-System aktualisieren
        Mitarbeiter benachrichtigen

    Adaptive Card mit Actions

    {
      "type": "AdaptiveCard",
      "version": "1.4",
      "body": [
        {
          "type": "TextBlock",
          "size": "Large",
          "weight": "Bolder",
          "text": "🏖️ Urlaubsanfrage"
        },
        {
          "type": "FactSet",
          "facts": [
            { "title": "Mitarbeiter", "value": "{{ $json.employeeName }}" },
            { "title": "Von", "value": "{{ $json.startDate }}" },
            { "title": "Bis", "value": "{{ $json.endDate }}" },
            { "title": "Tage", "value": "{{ $json.days }}" }
          ]
        }
      ],
      "actions": [
        {
          "type": "Action.Http",
          "title": "✅ Genehmigen",
          "method": "POST",
          "url": "https://n8n.ihre-domain.de/webhook/vacation-approve",
          "body": "{ \"requestId\": \"{{ $json.requestId }}\", \"action\": \"approve\" }"
        },
        {
          "type": "Action.Http",
          "title": "❌ Ablehnen",
          "method": "POST",
          "url": "https://n8n.ihre-domain.de/webhook/vacation-approve",
          "body": "{ \"requestId\": \"{{ $json.requestId }}\", \"action\": \"reject\" }"
        }
      ]
    }

    Webhook für Antwort

    // Node: Webhook - Empfängt Klick
    const { requestId, action } = $json;
    
    if (action === 'approve') {
      await updateHRSystem(requestId, 'approved');
      await notifyEmployee(requestId, 'Ihr Urlaub wurde genehmigt!');
    } else {
      await updateHRSystem(requestId, 'rejected');
      await notifyEmployee(requestId, 'Ihr Urlaub wurde leider abgelehnt.');
    }
    
    // Karte aktualisieren
    return {
      statusCode: 200,
      type: "application/json",
      body: {
        // Aktualisierte Karte
      }
    };

    Workflow 3: Tägliche Zusammenfassung

    Der Workflow

    Schedule (täglich 9:00)
            ↓
        Daten sammeln:
        - Offene Tickets
        - Heutige Meetings
        - Anstehende Deadlines
            ↓
        Teams: Zusammenfassung senden

    Implementation

    // Daten sammeln
    const tickets = await getOpenTickets();
    const meetings = await getTodaysMeetings();
    const deadlines = await getUpcomingDeadlines();
    
    // Adaptive Card erstellen
    const card = {
      "type": "AdaptiveCard",
      "version": "1.4",
      "body": [
        {
          "type": "TextBlock",
          "size": "Large",
          "weight": "Bolder",
          "text": "☀️ Guten Morgen! Hier ist Ihr Tages-Briefing"
        },
        {
          "type": "TextBlock",
          "text": `📋 **${tickets.length} offene Tickets**`,
          "wrap": true
        },
        {
          "type": "TextBlock",
          "text": `📅 **${meetings.length} Meetings heute**`,
          "wrap": true
        },
        {
          "type": "TextBlock",
          "text": `⏰ **${deadlines.length} anstehende Deadlines**`,
          "wrap": true
        }
      ],
      "actions": [
        {
          "type": "Action.OpenUrl",
          "title": "Dashboard öffnen",
          "url": "https://dashboard.ihre-domain.de"
        }
      ]
    };

    Workflow 4: Interaktiver FAQ-Bot

    Mit Power Virtual Agents (Low-Code)

  • Power Virtual Agents öffnen
  • Neuen Bot erstellen
  • Topics (Fragen) definieren
  • Antworten konfigurieren
  • In Teams veröffentlichen
  • Mit n8n (Custom)

    Teams Outgoing Webhook
    (User fragt: "Wie beantrage ich Urlaub?")
            ↓
        Text analysieren (Keywords)
            ↓
        Switch:
        ├─ "urlaub" → Urlaubs-Anleitung
        ├─ "passwort" → Passwort-Reset-Info
        ├─ "vpn" → VPN-Anleitung
        └─ sonst → "Ich habe das nicht verstanden"
            ↓
        Antwort an Teams senden

    Implementation

    // Node: Code - FAQ Matching
    const message = $json.text.toLowerCase();
    
    const faqs = {
      'urlaub': 'Urlaub beantragen Sie über das HR-Portal unter hr.firma.de/urlaub',
      'passwort': 'Passwort zurücksetzen: IT-Portal → Self-Service → Passwort',
      'vpn': 'VPN-Zugang: Laden Sie den Client von vpn.firma.de herunter',
      'krankmeldung': 'Krankmeldung: Bitte an hr@firma.de mit AU-Bescheinigung'
    };
    
    let response = 'Entschuldigung, dazu habe ich keine Information. Wenden Sie sich an IT-Support.';
    
    for (const [keyword, answer] of Object.entries(faqs)) {
      if (message.includes(keyword)) {
        response = answer;
        break;
      }
    }
    
    return { response };

    Schulung oder Implementierung?
    Ob Sie es selbst lernen oder von uns umsetzen lassen wollen — wir bieten beides. Individuelle Workshops ab 2h oder fertige Lösungen.
    Optionen ansehen →

    Make.com: Teams Module

    Verfügbare Module

  • Microsoft Teams → Send a Message
  • Microsoft Teams → Create a Channel
  • Microsoft Teams → List Channels
  • Microsoft Teams → Watch Messages (Trigger)
  • Beispiel-Szenario

    Microsoft Teams (Watch Messages)
            ↓
        Filter: Enthält "hilfe"
            ↓
        OpenAI: Antwort generieren
            ↓
        Microsoft Teams: Reply

    Graph API für erweiterte Funktionen

    Direktnachricht senden

    // Node: HTTP Request
    {
      "method": "POST",
      "url": "https://graph.microsoft.com/v1.0/users/{{ $json.userId }}/chats/{{ $json.chatId }}/messages",
      "headers": {
        "Authorization": "Bearer {{ $json.accessToken }}",
        "Content-Type": "application/json"
      },
      "body": {
        "body": {
          "content": "Hallo! Hier ist eine wichtige Nachricht."
        }
      }
    }

    Chat erstellen

    // 1:1 Chat mit User erstellen
    {
      "method": "POST",
      "url": "https://graph.microsoft.com/v1.0/chats",
      "body": {
        "chatType": "oneOnOne",
        "members": [
          {
            "@odata.type": "#microsoft.graph.aadUserConversationMember",
            "roles": ["owner"],
            "user@odata.bind": "https://graph.microsoft.com/v1.0/users/user1@firma.de"
          },
          {
            "@odata.type": "#microsoft.graph.aadUserConversationMember",
            "roles": ["owner"],
            "user@odata.bind": "https://graph.microsoft.com/v1.0/users/user2@firma.de"
          }
        ]
      }
    }

    Nachrichtenformate

    Einfache Nachricht

    {
      "text": "Hallo, das ist eine einfache Nachricht!"
    }

    Mit Markdown

    {
      "text": "**Wichtig:** Das ist _formatierter_ Text mit [Link](https://example.com)"
    }

    MessageCard (Legacy)

    {
      "@type": "MessageCard",
      "@context": "http://schema.org/extensions",
      "summary": "Zusammenfassung",
      "themeColor": "0076D7",
      "title": "Titel der Nachricht",
      "sections": [
        {
          "facts": [
            { "name": "Fakt 1", "value": "Wert 1" }
          ]
        }
      ],
      "potentialAction": [
        {
          "@type": "OpenUri",
          "name": "Mehr erfahren",
          "targets": [
            { "os": "default", "uri": "https://example.com" }
          ]
        }
      ]
    }

    Adaptive Card (Modern)

    Adaptive Cards bieten mehr Flexibilität:

    • Eingabefelder
    • Dropdowns
    • Datum-Picker
    • Actions mit HTTP Callbacks

    Best Practices

    1. Nicht zu viele Nachrichten

    // Batching: Mehrere Events sammeln
    const events = await collectEvents(5 * 60 * 1000); // 5 Min
    
    if (events.length > 0) {
      await sendDigest(events);
    }

    2. Klare Actionable Messages

    // Schlecht
    { "text": "Es ist etwas passiert." }
    
    // Gut
    {
      "title": "🔴 Server webserver-01 ist ausgefallen",
      "text": "Seit 10:30 Uhr nicht erreichbar",
      "actions": [
        { "title": "Dashboard", "url": "..." },
        { "title": "Logs", "url": "..." }
      ]
    }

    3. Fehlerbehandlung

    try {
      await sendTeamsMessage(message);
    } catch (error) {
      if (error.status === 429) {
        // Rate Limit
        await wait(60000);
        await sendTeamsMessage(message);
      } else {
        // Fallback: E-Mail senden
        await sendEmail(message);
      }
    }

    Kosten

    LösungKosten
    Incoming WebhooksKostenlos
    Power Virtual AgentsAb 170€/Monat
    Azure Bot ServicePay-per-use
    n8n/Make.comAb 9€/Monat

    Stand: August 2026. Anbieterpreise ändern sich — prüfen Sie die aktuellen Konditionen beim Anbieter.

    Fazit

    Microsoft Teams Bots sind ein mächtiges Werkzeug:

    • Benachrichtigungen direkt im Arbeitskontext
    • Interaktive Workflows (Genehmigungen, etc.)
    • FAQ-Bots für Self-Service

    Weiterführende Artikel

    Nächste Schritte

  • Incoming Webhook einrichten (schnellster Start)
  • Erste Benachrichtigung senden
  • Adaptive Cards für reichere Inhalte
  • Actions für Interaktivität hinzufügen
  • Als erfahrene Automatisierungsagentur unterstützen wir Sie bei der Teams-Automatisierung – von der Einrichtung bis zum produktiven Bot. Jetzt Kontakt aufnehmen.