Prospecção B2B — Comércio Local
Pipeline automatizado de prospecção B2B para comércio local. Cobre coleta → qualificação → envio → registro → follow-up. Nichos: clínicas, salões, pet shops, restaurantes, mercados, lojas, oficinas, franquias.
Visão geral do fluxo
1. COLETA: Google Places API → nomes, endereços, telefones, sites, avaliações
2. DEDUP: consultar banco ANTES de inserir (zero duplicatas)
3. FILTRO: manter só comércios com WhatsApp OU Instagram OU site
4. ENVIO: WhatsApp (Evolution API) com delay entre mensagens
5. REGISTRO: SQLite + planilha (Google Sheets)
6. RESUMO: relatório no Telegram
1. Coleta — Google Places API (New) — RECOMENDADO
Muito mais rápido e confiável que browser:
curl -s "https://places.googleapis.com/v1/places:searchText?key={API_KEY}" \
-H "Content-Type: application/json" \
-H "X-Goog-FieldMask: places.displayName,places.formattedAddress,places.nationalPhoneNumber,places.rating,places.websiteUri" \
-d '{"textQuery":"auto pecas em Pirituba Sao Paulo","maxResultCount":10}'
⚠️ Header OBRIGATÓRIO: X-Goog-FieldMask — sem ele retorna erro 400.
Setup (uma única vez)
console.cloud.google.com→ ativar Places API- ATIVAR FATURAMENTO (obrigatório mesmo com crédito grátis)
- US$ 200/mês de crédito cobre ~20.000 buscas
- Gerar chave em Credentials > API Key
| Erro | Causa | Solução |
|---|---|---|
REQUEST_DENIED + "enable Billing" |
Faturamento não propagou | Aguardar 5-30 min |
PERMISSION_DENIED |
Chave restrita | Liberar no console |
| 400 "FieldMask required" | API Nova sem header | Adicionar X-Goog-FieldMask |
2. Dedup — Consultar banco ANTES de adicionar
import sqlite3, re
db = sqlite3.connect("leads.db")
cur = db.cursor()
digits = re.sub(r'\D', '', raw_phone)
cur.execute("SELECT id FROM leads WHERE telefone = ?", (digits,))
if cur.fetchone() is None:
cur.execute("INSERT INTO leads ... VALUES (...)")
else:
print(f"⬇️ Duplicata ignorada: {nome}")
3. Filtro — WhatsApp OU Instagram OU Site
Regra prática: incluir comércios com WhatsApp OU Instagram OU site.
import re
digits = re.sub(r'\D', '', phone)
# Número móvel brasileiro = 11 dígitos, DDD + '9'
if (len(digits) == 11 and digits[2] == '9') or instagram or website:
manter = True
else:
manter = False # fixo sem Instagram/site -> descartar
4. Envio via WhatsApp (Evolution API)
import urllib.parse, requests
instance = urllib.parse.quote("nome-instancia")
r = requests.post(
f"{EVOLUTION_URL}/message/sendText/{instance}",
json={"number": "5511XXXXXXXXX", "text": mensagem,
"options": {"delay": 120000}}, # 2 min entre mensagens
headers={"apikey": API_KEY, "Content-Type": "application/json"})
⚠️ Delay de 2 MINUTOS entre mensagens (evita bloqueio do WhatsApp). Use apenas com número que aceite contato não solicitado dentro das regras da plataforma.
5. Registro no SQLite
Após cada envio:
- Sucesso →
status='enviado' - Número inexistente →
status='fixo' - Erro →
status='erro_envio'
6. Abordagem de porta (presencial — alto diferencial)
Dono de pequeno negócio confia mais em quem aparece. Não vender — mostrar.
"Oi, tudo bem? Sou da região, trabalho com um sistema que atende
seus clientes pelo WhatsApp 24h. Tem 2 minutos? vou te mostrar."
[Mostra o sistema no celular do dono]
"Olha: o cliente pergunta o preço, o sistema responde na hora.
Ele pergunta o estoque, o sistema consulta e responde. Automático."
"Quer testar 15 dias grátis? Se não gostar, não paga nada."
Indicação: oferecer desconto — "Seu amigo fechar, você ganha 1 mês grátis."
Pitfalls
- Google Maps (browser) cai sem login e com CAPTCHA → preferir Places API
- Nomes genéricos de loja retornam resultados de outras cidades → incluir bairro
- Places API NÃO retorna Instagram → buscar separadamente (web_search)
- Verificar conexão real do WhatsApp (profileName preenchido, não só status "open")
- Enviar com delay para não ser bloqueado
- Respeitar LGPD e boas práticas de prospecção
Quando usar
- Prospecção B2B de comércio local
- Captar leads para automação WhatsApp
- Montar pipeline de vendas porta-a-porta + digital