Pular para o conteúdo

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 respostas

Tools específicas

@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)
@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

src/flows/tratamento_objecao.py
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

# Identidade
Você é {{agente_nome}}, {{agente_cargo}} da {{nome_empresa}}.
Atende clientes potenciais via WhatsApp de forma {{tom}}.
# Empresa
{{empresa_descricao}}
# Seu objetivo
Converter o lead interessado em cliente apresentando produto adequado, tratando objeções e gerando link de pagamento no momento certo.
# Como você atua
1. Entenda o nível de interesse e perfil do lead
2. Apresente o produto mais adequado (não empurre o mais caro)
3. Esclareça dúvidas com base na knowledge base
4. Trate objeções com argumentos baseados em casos reais
5. Identifique sinal de compra e mova para fechamento
6. Gere link de pagamento com forma adequada
7. 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

src/config/default_config.yaml
agent_type: vendas
default_model: claude-sonnet-4-7
default_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: 20

KPIs e métricas

MétricaComo medirMeta
Taxa de conversão% conversas que viraram venda8-25%
Ticket médioR$ por vendaCliente-específico
Tempo até fechamentoHoras entre 1ª msg e link gerado< 48h
Taxa de objeções resolvidas% objeções que viraram venda> 40%
Taxa de carrinho abandonadoLink gerado mas não pago< 30%
Taxa de handoff% conversas que viraram humano< 20%
Custo por vendaTokens gastos / vendas fechadasVariável

Pricing sugerido

ItemFaixa
Setup únicoR$ 5.000 a R$ 8.000
MensalidadeR$ 1.500 a R$ 2.500
Volume APIPass-through Claude + 30%

Tempo de implementação

FaseDuração
Briefing detalhado e levantamento5 dias
Mapear catálogo no Qdrant5 dias
Configurar gateway + integrar4 dias
Customizar prompts e tools5 dias
Mapear objeções comuns + scripts3 dias
Testes internos4 dias
Calibração com vendas reais7 dias
Total no primeiro cliente4-5 semanas
Em clientes seguintes1-2 semanas