> ## Documentation Index
> Fetch the complete documentation index at: /help/llms.txt
> Use this file to discover all available pages before exploring further.

# Microsoft Teams

> Post to a Microsoft Teams channel from a Kerux campaign through a Teams Workflows webhook.

> [!NOTE]
>
> **Pro plan.** Microsoft Teams works through HTTP steps (and event rules that call a webhook), which are part of Pro and Agency (and the free trial). Anything you already have keeps working on every plan. See [Plans and billing](/help/account/billing.md).

When a contact replies, books or needs you, a **Webhook / HTTP** step posts a card in the Teams channel you pick. Teams receives it through its **Workflows** app.

> [!NOTE]
>
> **How it connects:** a Teams Workflows webhook URL. Microsoft's docs point to Workflows for incoming webhooks while the old Office 365 connectors are retired ([Create incoming webhooks with Workflows](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook)). The card below follows the Adaptive Card format the template expects; check it with your template on the first test.

## 1. Create the workflow in Teams

In Teams, open **Workflows**, pick the template **Post to a channel when a webhook request is received**, choose the team and channel, and copy the URL it gives you. The URL holds its own key: keep it private.

## 2. Add the step in Kerux

A contact who replies leaves the campaign (the **When the contact replies** box). In that box, add **Send to another campaign** and pick a one-step "Replied: tell Teams" campaign. Its step is a **Webhook / HTTP** step with no connection:

```json theme={null}
{
  "method": "POST",
  "url": "PASTE_THE_TEAMS_WORKFLOW_URL",
  "bodyType": "json",
  "body": {
    "type": "message",
    "attachments": [
      {
        "contentType": "application/vnd.microsoft.card.adaptive",
        "content": {
          "type": "AdaptiveCard",
          "version": "1.4",
          "body": [
            { "type": "TextBlock", "weight": "Bolder", "text": "{{contact.full_name}} ({{contact.company}}) replied on LinkedIn" },
            { "type": "TextBlock", "wrap": true, "text": "{{contact.linkedin_url}}" }
          ]
        }
      }
    ]
  }
}
```

Teams answers `202 Accepted` and posts the card.

For booked meetings, start a small campaign with the **Meeting booked** Kerux event and post `{{meeting.start}}` and `{{meeting.title}}` the same way.

## Test with one contact

In the one-step campaign's **Builder**, click **Test** to open **Test on one contact** and check the channel.

## Common errors

> [accordion] 202, but nothing appears in the channel
>
> The workflow accepted the request but couldn't read the card. Open the flow's run history in Teams (**Workflows**) to see why; usually the body isn't the Adaptive Card shape the template expects.

> [accordion] 401 or 404
>
> The URL was copied incompletely or the workflow was deleted. Copy it again from the workflow.

Related: [Slack](/help/integrations/slack.md), [Rules](/help/integrations/rules.md), [Webhook steps](/help/integrations/webhook-steps.md).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.