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:

  1. Teams Kanal → ... → Connectors
  2. "Incoming Webhook" konfigurieren
  3. 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:

  1. Team-Einstellungen → Apps → Outgoing Webhook erstellen
  2. Bot-Name und Callback-URL angeben
  3. 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": `📋 **${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)

  1. Power Virtual Agents öffnen
  2. Neuen Bot erstellen
  3. Topics (Fragen) definieren
  4. Antworten konfigurieren
  5. 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

  1. Microsoft Teams → Send a Message
  2. Microsoft Teams → Create a Channel
  3. Microsoft Teams → List Channels
  4. 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

  1. Incoming Webhook einrichten (schnellster Start)
  2. Erste Benachrichtigung senden
  3. Adaptive Cards für reichere Inhalte
  4. 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.