Conversão de Webhooks do Microsoft Teams para Fluxos no Power Automate

Introdução
Com o fim dos Webhook Connectors clássicos do Microsoft Teams, muitas organizações descobriram que seus alertas e integrações críticas pararam de chegar aos canais. Felizmente, é possível migrar seus Webhooks existentes para os novos padrões do Teams sem reescrever sistemas inteiros. A seguir, mostramos como adaptar rapidamente um payload MessageCard para Adaptive Card e manter o seu fluxo no Power Automate funcionando.

Índice

Por que os Webhooks Clássicos Estão Sendo Descontinuados?

Desde 2024 a Microsoft vem sinalizando que o esquema MessageCard está obsoleto. A partir de 2025, apenas cartões no formato Adaptive Card v1.0+ são aceitos pelos canais do Teams. A mudança traz recursos de acessibilidade, personalização responsiva e maior segurança, mas deixa muitas integrações quebradas.

Efeito imediato nos fluxos Power Automate

Fluxos que utilizam o gatilho When an HTTP request is received e o conector Post adaptive card in a chat or channel podem falhar quando o corpo recebido não apresenta um array attachments com o tipo correto. A mensagem de erro mais comum é:

foreach expression … 'attachments' is of type 'Null'

Estudo de Caso: Webhook 1 x Webhook 2

Em nossa organização, dois Webhooks coexistiam:

  • Webhook 1 – Enviava payload MessageCard. Não era possível alterar o código fonte.
  • Webhook 2 – Um script Python que foi facilmente ajustado para Adaptive Card (anexando o campo contentType: application/vnd.microsoft.card.adaptive).

Objetivo: transformar o Webhook 1 dentro do próprio fluxo, sem mexer no sistema emissor.

Estratégias de Migração Comparadas

EstratégiaComo aplicarObservações
Transformar no FlowApós o gatilho, adicione uma ação Compose (ou Parse JSON) que receba o corpo original. Monte manualmente o array attachments contendo um objeto com contentType: application/vnd.microsoft.card.adaptive e mova os campos relevantes do MessageCard. Encaminhe o resultado para Post adaptive card in a chat or channel.Exemplo real no repositório GitHub (issue #3920) sobre Prometheus Alertmanager.
Atualizar a integração de origemCaso o serviço emissor já ofereça um novo conector (ex.: Jira Cloud ≥ 24 ago 2024), crie um webhook direto para o Teams já com Adaptive Card.Costuma exigir configurar credenciais do Teams e, em alguns serviços, licença Teams Premium.
Camada intermediáriaSubstitua o endpoint original por uma Função Azure ou Logic App que converta MessageCard → Adaptive Card e, em seguida, chame o fluxo Power Automate.Útil quando o Flow não pode ser modificado e o sistema emissor está fora do seu controle.

Passo a Passo: Convertendo dentro do Flow

1. Preparar o gatilho

Crie ou edite um fluxo existente com o gatilho When an HTTP request is received. Copie e cole o esquema JSON mínimo para aceitar qualquer MessageCard:

{
  "type": "object",
  "properties": {
    "@type": { "type": "string" },
    "themeColor": { "type": "string" },
    "title": { "type": "string" },
    "text": { "type": "string" },
    "sections": { "type": "array" },
    "potentialAction": { "type": "array" }
  }
}

2. Compor o Adaptive Card

Insira uma ação Compose com o conteúdo abaixo (adapte ao seu caso):

{
  "type": "message",
  "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "version": "1.5",
        "body": [
          {
            "type": "TextBlock",
            "size": "Medium",
            "weight": "Bolder",
            "text": "@{triggerBody()?['title']}"
          },
          {
            "type": "TextBlock",
            "wrap": true,
            "text": "@{triggerBody()?['text']}"
          }
        ],
        "actions": [
          {
            "type": "Action.OpenUrl",
            "title": "Abrir Detalhes",
            "url": "@{items('LoopActions')?['url']}"
          }
        ]
      }
    }
  ]
}

3. Publicar no Teams

Adicione a ação Post adaptive card in a chat or channel, aponte para o canal desejado e passe a saída da ação Compose como corpo da mensagem.

4. Aproveitando complexidade existente

Caso o seu MessageCard possua seções múltiplas ou botões (potentialAction), crie um Apply to each que percorra esses arrays e gere componentes TextBlock ou Action.OpenUrl equivalentes.

Por dentro da transformação de esquema

O elemento mais importante é garantir que o seu objeto final possua attachments[0].contentType exatamente igual a application/vnd.microsoft.card.adaptive. Se esse campo estiver ausente, o conector do Teams tentará tratar o corpo como texto simples.

Dica de desempenho

Prefira Compose a Parse JSON quando quiser apenas reorganizar dados. O Parse JSON faz validação adicional e pode cair em rate limits se você receber milhares de eventos.

Atualizando a integração de origem

Quando você controla o sistema que gera o Webhook, migrar logo na fonte costuma ser o caminho mais limpo. Por exemplo, ao usar Jira Automation:

  1. Crie um novo Outgoing Webhook e aponte para https://outlook.office.com/webhook/….
  2. Troque a opção MessageCard por Adaptive Card (Jira oferece um modelo desde agosto de 2024).
  3. Simule o gatilho e revise no Designer de Adaptive Cards se o visual está alinhado às diretrizes de marca.

Quando usar uma Camada Intermediária

Se seu fluxo estiver congelado em produção, mas o emissor é um SaaS sem opção de upgrade, crie uma Função Azure serverless.

module.exports = async function (context, req) {
  const msg = req.body;
  const card = {
    type: 'message',
    attachments: [{
      contentType: 'application/vnd.microsoft.card.adaptive',
      content: {
        $schema: 'http://adaptivecards.io/schemas/adaptive-card.json',
        version: '1.5',
        body: [
          { type: 'TextBlock', text: msg.title, weight: 'Bolder' },
          { type: 'TextBlock', text: msg.text, wrap: true }
        ]
      }
    }]
  };
  await fetch(process.env.POWERFLOWURL, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify(card)
  });
  context.res = { status: 202 };
};

Desse modo, nenhum serviço precisa saber que houve alteração de formato; a transformação é transparente.

Boas Práticas para Migração em Massa

  • Biblioteca única – Centralize a lógica de conversão (JavaScript, Python ou Logic Apps) e reutilize em todos os fluxos.
  • Documentação de mapeamento – Registre cada campo original → novo campo. Facilita futuras atualizações para versões do Adaptive Card.
  • Logs detalhados – Inclua Run history no Power Automate e, quando usar Funções Azure, envie métricas para o Application Insights.
  • Ambiente de teste – Publique cartões em um canal privado antes de subir para produção. Isso garante que quebras de layout ou caracteres especiais sejam detectados.

Checklist Rápido de Conversão

#ItemOK?
1attachments[0].contentType presente 
2Versão do esquema $schema → “1.5” 
3Texto principal no campo body[0].text 
4Botões convertidos em Action.OpenUrl 
5Validação no Designer 

Perguntas Frequentes (FAQ)

O MessageCard será totalmente bloqueado?
Sim. Desde setembro de 2025 o Teams recusa qualquer novo cartão MessageCard. Flows existentes que geram mensagens simples sem cartões continuam.

Preciso do Teams Premium para postar Adaptive Cards?
Não. A criação de cartões é gratuita. Apenas algumas automações nativas (ex.: aprovações avançadas) exigem licenças adicionais.

Consigo mandar HTML puro?
O conector “Post message” aceita texto markdown e menções, mas não aceita HTML. Qualquer estrutura visual deve ser um Adaptive Card.

Conclusão

Migrar de MessageCard para Adaptive Card pode parecer complexo, mas na prática envolve:

  1. Identificar Webhooks que ainda usam o formato antigo;
  2. Escolher a estratégia (transformar no Flow, atualizar origem ou criar camada intermediária);
  3. Executar testes em ambiente controlado;
  4. Monitorar e documentar o processo para novas integrações.

Com essas etapas, você não só mantém a continuidade dos seus alertas como também se prepara para explorar recursos avançados de interatividade que o novo modelo oferece, como entrada de dados, temas dinâmicos e suporte aprimorado a dispositivos móveis.

Índice