agent-vendas
Especificação completa do agente de Vendas.
Resumo executivo
Converte leads qualificados em clientes pagantes via WhatsApp. Apresenta produtos com base em interesse, trata objeções comuns (preço, tempo, confiança), aplica descontos dentro de alçada, gera link de pagamento no momento certo. Reduz dependência de SDR humano para fechamento de vendas de ticket médio.
Mercado e ICP
Setores ideais
- Infoprodutos (cursos, mentorias, consultorias)
- E-commerce com WhatsApp como canal principal
- Beleza/estética (procedimentos pontuais)
- Serviços recorrentes (planos, assinaturas)
- Atacado B2B (catálogos de revenda)
- Telecom e energia (planos personalizados)
Cliente NÃO ideal
- Vendas com ciclo > 90 dias (use SDR + humano)
- Ticket muito alto (R$ 100k+) onde relacionamento é tudo
- Produtos custom highly-tailored (cada venda é única)
Ticket que justifica
- Mínimo R$ 200 (abaixo, custo do agente não compensa)
- Sweet spot: R$ 500 a R$ 5.000
- Alto valor (R$ 10k+): vale, mas com handoff humano em momentos críticos
Casos de uso típicos
Caso 1: Curso online (Reverso Academy)
- Lead qualificado vem do agent-sdr ou direto do anúncio
- agent-vendas apresenta curso premium ou básico
- Trata objeções com cases reais
- Gera link Hotmart com parcelamento
- Acompanha 24h após link gerado
Caso 2: Clínica de estética
- Lead pergunta sobre procedimento
- Agente apresenta opções (avaliação gratuita + procedimento)
- Tratamento de objeções (preço, recuperação, eficácia)
- Agenda avaliação ou já fecha procedimento
- Gera link de sinal
Caso 3: Atacado B2B
- Cliente recorrente pergunta sobre produtos
- Agente consulta catálogo e estoque
- Monta carrinho com upsell baseado em histórico
- Calcula frete e fecha pedido
- Gera link de pagamento com prazo do plano
Estrutura específica do código
Arquivos que MUDAM em relação ao template
agent-vendas/├── src/│ ├── prompts/│ │ ├── system_base.md ← ESPECÍFICO: prompt de vendas│ │ └── fragments/│ │ ├── tratamento_objecoes.md│ │ ├── alçada_desconto.md│ │ ├── upsell_logic.md│ │ └── fechamento.md│ ││ ├── tools/│ │ ├── consultar_catalogo.py ← ESPECÍFICO│ │ ├── consultar_estoque.py ← ESPECÍFICO│ │ ├── gerar_link_pagamento.py ← ESPECÍFICO│ │ ├── aplicar_desconto.py ← ESPECÍFICO│ │ ├── reservar_produto.py ← ESPECÍFICO│ │ ├── enviar_proposta.py ← ESPECÍFICO│ │ └── _registry.py│ ││ ├── flows/│ │ ├── apresentacao_produto.py ← ESPECÍFICO│ │ ├── tratamento_objecao.py ← ESPECÍFICO│ │ ├── upsell_crosssell.py ← ESPECÍFICO│ │ ├── fechamento.py ← ESPECÍFICO│ │ └── follow_up_carrinho.py ← ESPECÍFICO│ ││ └── config/│ └── default_config.yaml ← Específico de vendas│├── eval/│ └── datasets/│ ├── casos_baseline.jsonl ← Casos de venda│ └── casos_objecoes.jsonl ← 30+ objeções comuns│└── tenants/_template/ ├── config.yaml ← Tem seção 'vendas' └── knowledge/ ├── produtos.md ← OBRIGATÓRIO E DETALHADO ├── precos.md ├── politica_desconto.md ├── politica_devolucao.md ├── garantias.md ├── cases.md ← Para argumentação └── objecoes_respondidas.md ← Banco de respostasTools específicas
consultar_catalogo
@tool@trace_tool("consultar_catalogo")async def consultar_catalogo( busca: str, categoria: Optional[str] = None, faixa_preco: Optional[str] = None, *, tenant: dict) -> str: """ Busca produtos no catálogo via RAG semântico.
USE QUANDO: cliente pergunta sobre produto específico ou genérico. NÃO USE QUANDO: você já apresentou e cliente está decidindo. """ rag = RAGRetriever(collection=tenant.rag.collection)
filter_dict = {} if categoria: filter_dict["categoria"] = categoria
results = await rag.search( query=busca, filter=filter_dict, top_k=3 )
if not results: return "Nenhum produto encontrado para essa busca."
return format_products_for_llm(results)gerar_link_pagamento
@tool@trace_tool("gerar_link_pagamento")async def gerar_link_pagamento( lead_id: str, produto_id: str, valor_total: float, parcelas: int = 1, desconto_aplicado: float = 0, *, tenant: dict) -> str: """ Gera link de pagamento via gateway configurado.
USE QUANDO: cliente confirmou intenção de compra. NÃO USE QUANDO: cliente ainda está no estágio de dúvidas.
Valida: - Parcelamento dentro do permitido - Desconto dentro da alçada - Produto em estoque """ # Validações if parcelas > tenant.vendas.parcelamento.max_parcelas: return f"Parcelamento máximo permitido: {tenant.vendas.parcelamento.max_parcelas}x"
if desconto_aplicado > tenant.vendas.politica_desconto.max_percent: return f"Desconto acima da alçada. Use handoff_humano para aprovação."
# Gera link gateway = GatewayFactory.create(tenant) link = await gateway.create_payment_link( amount=valor_total, installments=parcelas, product_id=produto_id, metadata={ "lead_id": lead_id, "agent": "vendas", "discount": desconto_aplicado } )
# Registra no CRM crm = CRMFactory.create(tenant) await crm.add_note(lead_id, f"Link gerado: R$ {valor_total} ({parcelas}x)") await crm.move_to_stage(lead_id, "link_enviado")
return f"Link de pagamento: {link}"aplicar_desconto
@tool@trace_tool("aplicar_desconto")async def aplicar_desconto( lead_id: str, percentual: float, motivo: str, *, tenant: dict) -> str: """ Aplica desconto se dentro da alçada.
USE QUANDO: cliente pediu desconto explicitamente. NÃO USE COMO: incentivo proativo (não ofereça antes do cliente pedir).
Alçada: até {max_alcada}%. Acima, retorna erro e exige handoff. """ max_alcada = tenant.vendas.politica_desconto.max_percent
if percentual > max_alcada: return ( f"Desconto de {percentual}% acima da alçada ({max_alcada}%). " f"Use handoff_humano com motivo='aprovação desconto'." )
# Registra crm = CRMFactory.create(tenant) await crm.add_custom_field(lead_id, "desconto_negociado", percentual) await crm.add_note(lead_id, f"Desconto {percentual}% — motivo: {motivo}")
return f"Desconto de {percentual}% aprovado. Use no link de pagamento."Fluxo de tratamento de objeção
OBJECOES_PADRAO = { "preco": { "abordagem": "reframe_valor", "instrucao": "Reconheça a preocupação, contextualize o investimento, conecte ao resultado esperado. Use case concreto se disponível.", "exemplos_resposta": [ "Entendo. Vou te dar uma perspectiva: nossos alunos que aplicam o método retornam o investimento em média em 90 dias com um único projeto. O João, por exemplo, recuperou em 45 dias.", ] }, "tempo": { "abordagem": "flexibilidade_async", "instrucao": "Mostre como o produto se adapta à rotina do cliente. Aulas gravadas, materiais offline, prazo flexível.", "exemplos_resposta": [ "Faz sentido. Por isso o curso é 100% assíncrono. Você assiste quando puder, no seu ritmo. Temos alunos que terminaram em 1 mês e outros em 6 meses.", ] }, "confianca": { "abordagem": "garantia_e_cases", "instrucao": "Use prova social específica e mencione garantia/política de devolução.", "exemplos_resposta": [ "Entendo, é um receio legítimo. Por isso temos garantia de 7 dias — se não gostar, devolvemos sem perguntas. Posso te mostrar 3 cases de pessoas com perfil parecido com o seu?", ] }, "vou_pensar": { "abordagem": "qualificar_real_objecao", "instrucao": "Não pressione. Pergunte qual é a dúvida específica que precisa resolver. Mantenha porta aberta.", "exemplos_resposta": [ "Faz total sentido pensar com calma. Posso te perguntar uma coisa? Tem algo específico que te deixaria mais seguro pra decidir? Posso te ajudar com essa questão.", ] },}
class TratamentoObjecaoFlow: @staticmethod def identificar_objecao(message: str) -> Optional[str]: """Classifica tipo de objeção via Claude Haiku.""" # ... usa LLM para classificar pass
@staticmethod def get_estrategia(tipo_objecao: str) -> dict: return OBJECOES_PADRAO.get(tipo_objecao, {})System prompt template
# IdentidadeVocê é {{agente_nome}}, {{agente_cargo}} da {{nome_empresa}}.Atende clientes potenciais via WhatsApp de forma {{tom}}.
# Empresa{{empresa_descricao}}
# Seu objetivoConverter o lead interessado em cliente apresentando produto adequado, tratando objeções e gerando link de pagamento no momento certo.
# Como você atua1. Entenda o nível de interesse e perfil do lead2. Apresente o produto mais adequado (não empurre o mais caro)3. Esclareça dúvidas com base na knowledge base4. Trate objeções com argumentos baseados em casos reais5. Identifique sinal de compra e mova para fechamento6. Gere link de pagamento com forma adequada7. Acompanhe 24h se não comprou
# Suas ferramentas- **consultar_catalogo**: busca produtos- **consultar_estoque**: verifica disponibilidade- **gerar_link_pagamento**: cria link no gateway- **aplicar_desconto**: dentro da alçada ({{max_desconto}}%)- **enviar_proposta**: para vendas mais elaboradas- **handoff_humano**: para negociações complexas
# Política de desconto- Alçada padrão: até {{max_desconto}}%- Acima disso, transfira para humano- Nunca ofereça desconto proativamente — só se cliente pedir
# Tratamento de objeções comuns
**"Tá caro"**:Reconheça → contextualize valor → conecte ao resultado → use case real.
**"Preciso pensar"**:Aceite sem pressionar → pergunte qual dúvida específica → ofereça material para análise.
**"Não tenho tempo"**:Mostre flexibilidade do produto → exemplifique com aluno que tinha mesma situação.
**"Não confio que funciona"**:Use prova social → mencione garantia → ofereça falar com aluno atual.
# Sinais de compra (quando avançar para fechamento)- "Como faço para começar?"- "Qual o link?"- "Aceita parcelamento?"- "Quero o premium" / "Quero o básico"- Pergunta sobre prazo de início
# Regras invioláveis{{include: fragments/regras_invioneis.md}}
# Quando transferir para humano- Cliente quer negociar valor fora da alçada- Pedido customizado/B2B grande- Reclamação grave- Problemas técnicos com pagamento
# Tom{{include: fragments/tom_{{tom}}.md}}Configuração default
agent_type: vendasdefault_model: claude-sonnet-4-7default_temperature: 0.75 # um pouco mais criativo para tratar objeções
vendas: politica_desconto: max_percent: 15 requer_aprovacao_acima: 10 nunca_ofereca_proativamente: true
parcelamento: max_parcelas: 12 juros_a_partir: 4
follow_up: apos_link_horas: 24 max_tentativas: 2 intervalo_entre_tentativas_horas: 48
upsell: enabled: true apresentar_apos_decisao: true max_upsells_por_conversa: 1
rag: default_top_k: 5 default_threshold: 0.70
response: delay_between_messages_ms: 1500 max_messages_per_minute: 20KPIs e métricas
| Métrica | Como medir | Meta |
|---|---|---|
| Taxa de conversão | % conversas que viraram venda | 8-25% |
| Ticket médio | R$ por venda | Cliente-específico |
| Tempo até fechamento | Horas entre 1ª msg e link gerado | < 48h |
| Taxa de objeções resolvidas | % objeções que viraram venda | > 40% |
| Taxa de carrinho abandonado | Link gerado mas não pago | < 30% |
| Taxa de handoff | % conversas que viraram humano | < 20% |
| Custo por venda | Tokens gastos / vendas fechadas | Variável |
Pricing sugerido
| Item | Faixa |
|---|---|
| Setup único | R$ 5.000 a R$ 8.000 |
| Mensalidade | R$ 1.500 a R$ 2.500 |
| Volume API | Pass-through Claude + 30% |
Tempo de implementação
| Fase | Duração |
|---|---|
| Briefing detalhado e levantamento | 5 dias |
| Mapear catálogo no Qdrant | 5 dias |
| Configurar gateway + integrar | 4 dias |
| Customizar prompts e tools | 5 dias |
| Mapear objeções comuns + scripts | 3 dias |
| Testes internos | 4 dias |
| Calibração com vendas reais | 7 dias |
| Total no primeiro cliente | 4-5 semanas |
| Em clientes seguintes | 1-2 semanas |