Tutorials

Microsoft Teams Bot erstellen: Automatisierung ohne Code mit n8n und Make.com

Schritt-für-Schritt Anleitung zum Erstellen eines Teams Bots ohne Code.

16 min Lesezeit

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.

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"

    }

    ]

    }

    }

    ]

    }

    }

    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": 📋 <strong>${tickets.length} offene Tickets</strong>,

    "wrap": true

    },

    {

    "type": "TextBlock",

    "text": 📅 <strong>${meetings.length} Meetings heute</strong>,

    "wrap": true

    },

    {

    "type": "TextBlock",

    "text": ⏰ <strong>${deadlines.length} anstehende Deadlines</strong>,

    "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 };

    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": "<strong>Wichtig:</strong> Das ist _formatierter_ Text mit Link"

    }

    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 <em> 60 </em> 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

    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
  • Wir unterstützen Sie bei der Teams-Automatisierung – von der Einrichtung bis zum produktiven Bot.

    Sie haben Fragen zur Automatisierung?

    Unsere Experten helfen Ihnen, die richtigen Entscheidungen für Ihr Unternehmen zu treffen.