New skills covering 10 categories: **Security & Audit**: 007 (STRIDE/PASTA/OWASP), cred-omega (secrets management) **AI Personas**: Karpathy, Hinton, Sutskever, LeCun (4 sub-skills), Altman, Musk, Gates, Jobs, Buffett **Multi-agent Orchestration**: agent-orchestrator, task-intelligence, multi-advisor **Code Analysis**: matematico-tao (Terence Tao-inspired mathematical code analysis) **Social & Messaging**: Instagram Graph API, Telegram Bot, WhatsApp Cloud API, social-orchestrator **Image Generation**: AI Studio (Gemini), Stability AI, ComfyUI Gateway, image-studio router **Brazilian Domain**: 6 auction specialist modules, 2 legal advisors, auctioneers data scraper **Product & Growth**: design, invention, monetization, analytics, growth engine **DevOps & LLM Ops**: Docker/CI-CD/AWS, RAG/embeddings/fine-tuning **Skill Governance**: installer, sentinel auditor, context management Each skill includes: - Standardized YAML frontmatter (name, description, risk, source, tags, tools) - Structured sections (Overview, When to Use, How it Works, Best Practices) - Python scripts and reference documentation where applicable - Cross-platform compatibility (Claude Code, Antigravity, Cursor, Gemini CLI, Codex CLI) Co-authored-by: ProgramadorBrasil <214873561+ProgramadorBrasil@users.noreply.github.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
15 KiB
Features Avancados - WhatsApp Cloud API
Guia dos recursos avancados da WhatsApp Business Platform: Flows, Commerce, Channels, Click-to-WhatsApp Ads e Status Tracking.
Indice
- WhatsApp Flows
- Commerce e Catalogo
- WhatsApp Channels
- Click-to-WhatsApp Ads
- Status Tracking
- Analytics e Reporting
WhatsApp Flows
WhatsApp Flows permite criar formularios interativos multi-tela dentro do WhatsApp. O cliente preenche campos, seleciona opcoes e envia dados sem sair do app.
Quando Usar
- Cadastros e registros
- Agendamentos e reservas
- Pesquisas NPS e feedback
- Selecao de produtos com opcoes
- Formularios de suporte com campos estruturados
- Questionarios de qualificacao de leads
Estrutura JSON de um Flow
Um Flow e composto por screens (telas) com components (campos):
{
"version": "3.0",
"screens": [
{
"id": "SCREEN_1",
"title": "Agendamento",
"data": {},
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Agende sua consulta"
},
{
"type": "TextInput",
"name": "customer_name",
"label": "Seu nome completo",
"required": true,
"input-type": "text"
},
{
"type": "DatePicker",
"name": "appointment_date",
"label": "Data desejada",
"required": true,
"min-date": "1709251200000",
"max-date": "1711929600000"
},
{
"type": "Dropdown",
"name": "service_type",
"label": "Tipo de servico",
"required": true,
"data-source": [
{ "id": "consulta", "title": "Consulta" },
{ "id": "retorno", "title": "Retorno" },
{ "id": "exame", "title": "Exame" }
]
},
{
"type": "Footer",
"label": "Confirmar",
"on-click-action": {
"name": "navigate",
"next": { "type": "screen", "name": "SCREEN_2" },
"payload": {
"customer_name": "${form.customer_name}",
"appointment_date": "${form.appointment_date}",
"service_type": "${form.service_type}"
}
}
}
]
}
},
{
"id": "SCREEN_2",
"title": "Confirmacao",
"terminal": true,
"layout": {
"type": "SingleColumnLayout",
"children": [
{
"type": "TextHeading",
"text": "Confirme seus dados"
},
{
"type": "TextBody",
"text": "Nome: ${data.customer_name}\nData: ${data.appointment_date}\nServico: ${data.service_type}"
},
{
"type": "Footer",
"label": "Confirmar Agendamento",
"on-click-action": {
"name": "complete",
"payload": {
"customer_name": "${data.customer_name}",
"appointment_date": "${data.appointment_date}",
"service_type": "${data.service_type}"
}
}
}
]
}
}
]
}
Componentes Disponiveis
| Componente | Descricao | Campos principais |
|---|---|---|
| TextHeading | Titulo de secao | text |
| TextBody | Texto descritivo | text |
| TextInput | Campo de texto | name, label, input-type |
| TextArea | Area de texto multi-linha | name, label |
| DatePicker | Seletor de data | name, label, min-date, max-date |
| Dropdown | Lista suspensa | name, label, data-source |
| RadioButtonsGroup | Botoes de opcao | name, label, data-source |
| CheckboxGroup | Caixas de selecao | name, label, data-source |
| OptIn | Checkbox de aceite | name, label |
| Footer | Botao de acao/navegacao | label, on-click-action |
Enviar Flow via API
async function sendFlow(to: string, flowId: string, screenId: string): Promise<void> {
await sendMessage({
messaging_product: 'whatsapp',
to,
type: 'interactive',
interactive: {
type: 'flow',
header: { type: 'text', text: 'Agendar Consulta' },
body: { text: 'Preencha o formulário abaixo para agendar.' },
footer: { text: 'Seus dados são protegidos' },
action: {
name: 'flow',
parameters: {
flow_message_version: '3',
flow_id: flowId,
flow_cta: 'Agendar',
flow_action: 'navigate',
flow_action_payload: {
screen: screenId,
data: {}
}
}
}
}
});
}
Receber Resposta do Flow
function handleFlowResponse(message: IncomingMessage): Record<string, any> | null {
if (message.interactive?.type === 'nfm_reply') {
return JSON.parse(message.interactive.nfm_reply.response_json);
// Ex: { customer_name: "João", appointment_date: "2026-03-01", service_type: "consulta" }
}
return null;
}
Criar Flows
Flows podem ser criados de duas formas:
- Visual Builder - No WhatsApp Manager, arrastar e soltar componentes
- JSON Editor - Editar diretamente o JSON para controle total
Commerce e Catalogo
Configurar Catalogo
O catalogo WhatsApp suporta ate 500 produtos vinculados ao seu perfil de negocio.
Configuracao:
- Abra o WhatsApp Manager
- Va para Account Tools → Catalog
- Adicione produtos com: nome, descricao, preco, imagem, URL
Enviar Mensagem de Produto Unico
async function sendSingleProduct(to: string, catalogId: string, productId: string): Promise<void> {
await sendMessage({
messaging_product: 'whatsapp',
to,
type: 'interactive',
interactive: {
type: 'product',
body: { text: 'Confira este produto!' },
footer: { text: 'Responda para comprar' },
action: {
catalog_id: catalogId,
product_retailer_id: productId
}
}
});
}
Enviar Mensagem Multi-Produto
async function sendMultiProduct(
to: string,
catalogId: string,
sections: Array<{ title: string; product_items: Array<{ product_retailer_id: string }> }>
): Promise<void> {
await sendMessage({
messaging_product: 'whatsapp',
to,
type: 'interactive',
interactive: {
type: 'product_list',
header: { type: 'text', text: 'Nossos Produtos' },
body: { text: 'Selecione os produtos que deseja:' },
footer: { text: 'Adicione ao carrinho' },
action: {
catalog_id: catalogId,
sections
}
}
});
}
// Uso:
await sendMultiProduct('5511999999999', 'CATALOG_ID', [
{
title: 'Eletronicos',
product_items: [
{ product_retailer_id: 'SKU_001' },
{ product_retailer_id: 'SKU_002' }
]
},
{
title: 'Acessorios',
product_items: [
{ product_retailer_id: 'SKU_003' },
{ product_retailer_id: 'SKU_004' }
]
}
]);
Checkout In-App
Quando o cliente seleciona produtos e faz checkout, voce recebe via webhook:
{
"type": "order",
"order": {
"catalog_id": "CATALOG_ID",
"product_items": [
{
"product_retailer_id": "SKU_001",
"quantity": 2,
"item_price": 99.90,
"currency": "BRL"
}
],
"text": "Quero esses produtos"
}
}
Sync com Inventario
Para manter o catalogo atualizado:
async def sync_inventory(catalog_id: str, products: list[dict]) -> None:
"""Sincroniza inventario com o catalogo WhatsApp via Commerce Manager API."""
for product in products:
await update_product(
catalog_id=catalog_id,
product_id=product["sku"],
data={
"availability": "in stock" if product["stock"] > 0 else "out of stock",
"price": product["price"] * 100, # Em centavos
"currency": "BRL"
}
)
WhatsApp Channels
WhatsApp Channels e um recurso de broadcasting unidirecional. Voce envia atualizacoes para subscribers ilimitados na aba "Atualizacoes" do WhatsApp.
Caracteristicas
- Unidirecional: Apenas o admin envia, subscribers recebem
- Privacidade do admin: Followers nao veem seu numero pessoal
- Privacidade do subscriber: Admin nao ve numeros dos followers (a menos que salvos como contatos)
- Conteudo: Texto, imagens, videos, stickers, polls
Analytics Disponiveis (30 dias)
| Metrica | Descricao |
|---|---|
| Crescimento | Novos followers vs unfollows |
| Alcance | Quantos viram suas mensagens |
| Engajamento | Reacoes com emoji |
| Resultados de polls | Votos em enquetes |
Melhores Praticas
- Publique conteudo relevante e nao promocional em excesso
- Use polls para engajamento
- Frequencia ideal: 2-5 postagens por semana
- Conteudo exclusivo incentiva follows
Click-to-WhatsApp Ads
Anuncios no Facebook e Instagram com botao que abre conversa no WhatsApp.
Setup no Meta Ads Manager
- Criar campanha com objetivo "Messaging", "Leads" ou "Sales"
- Selecionar "Click to WhatsApp" como destino
- Vincular conta WhatsApp Business
- Configurar mensagem pre-preenchida (greeting + pre-filled message)
Pre-filled Messages
Configure a mensagem que o cliente ve quando abre o chat:
Greeting: "Olá! Obrigado por clicar no nosso anúncio."
Pre-filled: "Oi, vi o anúncio sobre [produto] e gostaria de saber mais!"
Integracao no Webhook
Quando um cliente vem de um anuncio, o webhook inclui dados de referral:
{
"messages": [{
"from": "5511999999999",
"type": "text",
"text": { "body": "Oi, vi o anúncio..." },
"referral": {
"source_url": "https://fb.me/...",
"source_type": "ad",
"source_id": "AD_ID",
"headline": "Titulo do Anuncio",
"body": "Texto do anuncio",
"ctwa_clid": "click_id_para_tracking"
}
}]
}
Tracking de Conversao
function handleAdReferral(message: IncomingMessage): void {
if (message.referral) {
const adData = {
adId: message.referral.source_id,
clickId: message.referral.ctwa_clid,
headline: message.referral.headline,
customerPhone: message.from,
timestamp: new Date()
};
// Registrar lead vindo do anuncio
trackConversion(adData);
// Personalizar atendimento com contexto do anuncio
customizeGreeting(message.from, adData.headline);
}
}
Metricas
- Taxa de abertura: ~99% (mensagens WhatsApp)
- Reducao de custo: Ate 32% menor custo por lead vs formularios
- Aumento: Ate 46% mais mensagens de clientes
Status Tracking
Ciclo de Vida da Mensagem
Enviada (sent) → Entregue ao servidor (delivered) → Entregue ao dispositivo (delivered) → Lida (read)
Status via Webhook
{
"statuses": [
{
"id": "wamid.HBgNNTUxMTk5...",
"status": "delivered",
"timestamp": "1709251200",
"recipient_id": "5511999999999",
"conversation": {
"id": "CONVERSATION_ID",
"origin": { "type": "business_initiated" },
"expiration_timestamp": "1709337600"
},
"pricing": {
"billable": true,
"pricing_model": "CBP",
"category": "utility"
}
}
]
}
Status Possiveis
| Status | Descricao | Confiabilidade |
|---|---|---|
sent |
Mensagem enviada para servidores Meta | Alta |
delivered |
Entregue ao dispositivo do cliente | Alta |
read |
Cliente leu a mensagem (blue check) | Media (pode ser off) |
failed |
Falha na entrega | Alta |
Limitacao Importante
O status read depende de o usuario ter read receipts ativados nas configuracoes do WhatsApp. Muitos usuarios desativam. Use delivered como confirmacao confiavel de entrega.
Implementacao de Tracking
interface MessageStatus {
messageId: string;
to: string;
sentAt: Date;
deliveredAt?: Date;
readAt?: Date;
failedAt?: Date;
failureReason?: string;
}
async function processStatusUpdate(status: WebhookStatus): Promise<void> {
const update: Partial<MessageStatus> = {};
switch (status.status) {
case 'sent':
update.sentAt = new Date(parseInt(status.timestamp) * 1000);
break;
case 'delivered':
update.deliveredAt = new Date(parseInt(status.timestamp) * 1000);
break;
case 'read':
update.readAt = new Date(parseInt(status.timestamp) * 1000);
break;
case 'failed':
update.failedAt = new Date(parseInt(status.timestamp) * 1000);
update.failureReason = status.errors?.[0]?.message;
break;
}
await db.messageStatuses.updateOne(
{ messageId: status.id },
{ $set: update }
);
}
Analytics e Reporting
Metricas Essenciais para Atendimento
| Metrica | Como Calcular | Meta Ideal |
|---|---|---|
| Tempo Primeira Resposta (FRT) | Timestamp resposta - timestamp mensagem | < 5 minutos |
| Tempo Medio de Resolucao | Timestamp fechamento - timestamp inicio | < 30 minutos |
| Taxa de Resolucao no Bot | Resolvidos pelo bot / total | > 60% |
| Taxa de Escalacao | Escalados para humano / total | < 40% |
| CSAT (Satisfacao) | Pesquisa NPS pos-atendimento | > 4.0 / 5.0 |
| Taxa de Entrega | Delivered / sent | > 95% |
| Taxa de Leitura | Read / delivered | > 70% |
| Taxa de Opt-out | Optouts / total da base | < 2% por campanha |
Pesquisa NPS via WhatsApp
async function sendNPSSurvey(to: string): Promise<void> {
await sendMessage({
messaging_product: 'whatsapp',
to,
type: 'interactive',
interactive: {
type: 'button',
body: {
text: 'De 1 a 5, como voce avalia nosso atendimento?\n\n' +
'1 = Muito ruim\n5 = Excelente'
},
action: {
buttons: [
{ type: 'reply', reply: { id: 'nps_1_2', title: '1-2 Ruim' } },
{ type: 'reply', reply: { id: 'nps_3', title: '3 Regular' } },
{ type: 'reply', reply: { id: 'nps_4_5', title: '4-5 Bom' } }
]
}
}
});
}
Dashboard de Analytics
Para analytics avancados, considere integrar com:
- Infobip - Dashboard completo com APIs de reporting
- Trengo - CSAT tracking, response times, trending topics
- Wassenger - Comparacao de agentes, exportacao CSV/JSON/PDF
- Solucao propria - MongoDB/PostgreSQL + Grafana/Metabase