A geração de leads convencional de empresa para empresa geralmente depende da compra de diretórios estáticos ou listas do setor para definir o potencial do território. No entanto, esses conjuntos de dados estáticos de pontos de interesse (POI) ficam desatualizados quase imediatamente. Como muitas vezes não têm status operacional atualizado ou categorização granular por tipo de lugar, as equipes de vendas externas correm o risco de perder tempo valioso buscando empresas permanentemente fechadas, categorizadas incorretamente ou irrelevantes para o perfil de cliente ideal.
Este guia fornece um fluxo de trabalho para reduzir essa lacuna usando o Places Insights e a API Places. Ao mapear sua carteira de negócios atual para os IDs de lugar, é possível usar o BigQuery para isolar todas as empresas operacionais em um território que ainda não está no seu banco de dados de gerenciamento de relacionamento com o cliente (CRM). Este guia mostra como criar esse mecanismo de exclusão para entregar uma lista de leads hipersegmentada e verificada aos seus representantes de vendas.

Exemplo de aplicativo
Imagine um provedor de ponto de venda (PDV) planejando uma expansão de vendas externas na cidade de Nova York. Normalmente, a organização extrai um relatório sobre o total de estabelecimentos de alimentos e bebidas por CEP. Essa abordagem traz o risco de os representantes de vendas confiarem em dados desatualizados, como locais permanentemente fechados ou leads irrelevantes, como uma cozinha de catering particular sem uma loja física.
Imagine uma abordagem moderna usando o Insights de Lugares, que aproveita a escala global do Google Maps e dados atualizados validados em várias fontes.
O Insights de Lugares é compatível com quase 500 categorias de lugares e mais de 70 atributos. Assim, você pode refinar seus clientes em potencial com alta precisão com base em tipos de empresas específicos (como scandinavian_restaurant), horários de funcionamento e serviços oferecidos (como accepts_credit_cards). Ao fazer uma referência cruzada entre o Insights de Lugares e seu CRM interno, você pode fornecer à sua equipe de vendas uma lista altamente segmentada de clientes em potencial não contatados.
Fluxo de trabalho da solução
Este guia fornece uma estrutura técnica para criar um "Mapa de leads" dinâmico que filtra automaticamente sua carteira de negócios atual, deixando apenas leads operacionais e totalmente novos para sua equipe de vendas buscar.
A arquitetura de quatro etapas
- Defina seus tipos de lugar de destino:mapeie os perfis de clientes ideais para tipos de lugar.
- Identificar áreas de alto potencial:execute funções de contagem de lugares no BigQuery para gerar mapas de calor de densidade de empresas operacionais segmentadas.
- Normalizar dados do CRM para IDs de lugar:processe registros não estruturados do CRM usando um pipeline de limpeza de dados com as APIs Address Validation, Geocoding e Places para encontrar os IDs de lugar dos seus clientes atuais.
- Realizar exclusão de espaços em branco: combine os IDs de lugar do CRM com os dados do Insights de Lugares no BigQuery para filtrar dinamicamente os clientes atuais e gerar uma lista de leads totalmente novos.
Pré-requisitos
Antes de começar, verifique se você tem o seguinte:
Projeto do Google Cloud:
- Ter um projeto do Google Cloud com o faturamento ativado.
Acesso a dados:
- Assinatura do Insights de Lugares no BigQuery.
- Seu próprio conjunto de dados de CRM (por exemplo, uma tabela do BigQuery) com nomes e endereços comerciais de clientes atuais para usar como lista de exclusão.
Plataforma Google Maps:
- Uma chave de API.
- As seguintes APIs estão ativadas para sua chave:
Permissões do IAM:
- Verifique se sua conta de usuário ou de serviço tem os seguintes papéis do IAM para executar consultas e gerenciar seu conjunto de dados:
Papel ID Editor de dados do BigQuery roles/bigquery.dataEditorUsuário do BigQuery roles/bigquery.user
- Verifique se sua conta de usuário ou de serviço tem os seguintes papéis do IAM para executar consultas e gerenciar seu conjunto de dados:
Conscientização de custos:
- Neste tutorial, usamos componentes faturáveis do Google Cloud. Esteja ciente dos
custos potenciais relacionados a:
- BigQuery:há cobrança pelos slots de computação usados ou pelos dados processados durante a execução da consulta.
- Insights de lugares:cobrados com base no uso da consulta.
- Plataforma Google Maps:cobrada por solicitação para a API Address Validation, API Geocoding e API Text Search.
- Neste tutorial, usamos componentes faturáveis do Google Cloud. Esteja ciente dos
custos potenciais relacionados a:
Etapa 1: definir os tipos de lugar de destino
O Insights de Lugares é compatível com quase 500 categorias de lugares e mais de 70 atributos, como horário de funcionamento, tipos de pagamento e status operacional. Consultar o conjunto de dados inteiro indiscriminadamente é ineficiente e caro.
Como uma etapa fundamental, use um LLM como o Gemini para traduzir seus perfis de clientes internos em Tipos de lugar, usados ao criar uma consulta para o Insights de Lugares. Essa definição de taxonomia em nível macro garante que suas pesquisas subsequentes do BigQuery sejam altamente segmentadas, reduzindo a sobrecarga de processamento de computação.
Por exemplo, se você estiver criando um fluxo de trabalho para um sistema de ponto de venda, poderá fornecer ao Gemini a lista de tipos de lugar e usar o seguinte comando:
"Você é um analista de mercado. Dos tipos de lugares do Google Maps compatíveis, quais são os principais destinos de um provedor de sistema de ponto de venda? Justifique sua decisão."
Com base nesse comando, o Gemini analisaria a taxonomia e retornaria um subconjunto segmentado de tipos de lugares relevantes para usar no filtro types do BigQuery:
| Categoria principal | Justificativa | Principais tipos de lugares |
|---|---|---|
| Alimentos e bebidas | Exige processamento rápido de transações, gerenciamento de mesas, emissão de tíquetes de pedidos e manuseio de gorjetas. | restaurant, bar, cafe, coffee_shop |
| Shopping | Precisa de rastreamento de inventário robusto, leitura de código de barras, processamento de devoluções e integrações de fidelidade. | clothing_store, grocery_store, supermarket, convenience_store |
| Serviços e saúde e bem-estar | Requer agendamento de horários, perfis de clientes e acompanhamento de comissões integrados. | hair_salon, beauty_salon, spa, massage |
| Entretenimento, recreação e esportes | Exige atendimento rápido de clientes, leitura de ingressos digitais e vendas rápidas de concessões. | movie_theater, amusement_park, bowling_alley, stadium |
Para os fins deste guia, vamos nos concentrar nos tipos de lugares sugeridos para a categoria Comida e bebida.
Etapa 2: extrair contagens de empresas para identificar áreas de alto potencial
Para identificar áreas de oportunidade, primeiro você precisa de uma visão geral da densidade de negócios. Para isso, execute funções de contagem de lugares (como PLACES_COUNT_PER_H3 ou PLACES_COUNT_PER_GEO) no BigQuery.
Embora seja possível consultar o conjunto de dados diretamente, as funções de contagem de lugares são consultas SQL predefinidas e otimizadas que não aplicam o limite de agregação padrão de cinco lugares mínimos. As consultas diretas padrão omitem linhas com uma a quatro empresas, mas essas funções permitem ver exatamente onde existe até mesmo um único cliente em potencial. É importante lembrar que essas funções retornam uma matriz de até 250 IDs de lugar por área geográfica usando a coluna sample_place_ids. Isso fornece o mapa de calor estatístico para os planejadores de território e os identificadores fundamentais necessários para a geração de leads.
A consulta a seguir demonstra como recuperar dinamicamente um polígono complexo (todo o limite da cidade de Nova York) usando um conjunto de dados público e transmitindo essa geografia para a função "Places Count". Ao usar o índice espacial H3 em uma resolução mais ampla (8) em toda a cidade, é possível gerar um mapa de densidade em nível macro.
Além disso, ao selecionar todas as colunas (SELECT *), a função retorna a coluna geography, um polígono que representa a célula H3. Isso permite importar imediatamente os resultados do BigQuery para ferramentas de business intelligence (como o Looker Studio) e criar visualizações de mapa preenchidas que revelam visualmente os pontos de interesse do mercado.
-- Illustrative logic: Extracting target business counts per H3 cell across New York City
DECLARE geo GEOGRAPHY;
-- Get the geography for New York City using the Overture Maps public dataset
SET geo = (SELECT geometry FROM `bigquery-public-data.overture_maps.division_area`
WHERE country = 'US' AND subtype = 'locality' AND names.primary = 'New York' LIMIT 1);
SELECT *
FROM `YOUR_PROJECT_NAME.places_insights___us.PLACES_COUNT_PER_H3`(
JSON_OBJECT(
'geography', geo,
'h3_resolution', 8,
'types',['restaurant', 'bar', 'cafe', 'coffee_shop'],
'business_status', ['OPERATIONAL']
)
)
ORDER BY count DESC;

Como mostrado na visualização resultante, há áreas de alta densidade de empresas-alvo em toda Manhattan. No restante deste documento, vamos ampliar e concentrar nossos esforços de geração de leads em uma dessas zonas de alto potencial: a área perto da Union Square.
Etapa 3: normalizar os dados do CRM para IDs de lugar
Para fazer uma análise de exclusão, primeiro traduza seus registros de CRM em IDs de lugar. Como os dados de CRM geralmente não são estruturados, transmitir texto bruto para APIs de pesquisa gera taxas de correspondência ruins. Use esse pipeline de duas etapas para limpar endereços, considerar a cobertura da API regional e garantir que você extraia os IDs corretos de estabelecimento para o BigQuery.
Suponha que você tenha os seguintes cinco clientes de restaurantes no seu CRM em Nova York:
| Nome do local | Endereço |
|---|---|
| Boucherie Union Square | 225 Park Ave S, New York, NY 10003, Estados Unidos |
| Gramercy Tavern | 42 E 20th St, Nova York, NY 10003, Estados Unidos |
| Barn Joo Union Square | 35 Union Square W, New York, NY 10003, Estados Unidos |
| LOS TACOS No.1 | 200 Park Ave S, Nova York, NY 10003, Estados Unidos |
| Union Square Cafe | 101 E 19th St, New York, NY 10003, Estados Unidos |
Como esses registros consistem em texto não estruturado, não é possível uni-los diretamente aos dados do Insights de Lugares no BigQuery. Em vez disso, processe cada linha pelo seguinte pipeline para padronizar o texto e extrair o ID de lugar.
Etapa 3a: limpeza de endereços e correspondência direta
Primeiro, padronize os dados de endereço. Escolha a API com base no país de destino:
Opção 1: API Address Validation
Para regiões aceitas, transmita o nome e o endereço comerciais concatenados do CRM para a API. Inspecione a matriz result.geocode.placeTypes da resposta:
- Correspondência de estabelecimento:se contiver
establishmentoupoint_of_interest, a API resolveu a empresa. Anexe esteplaceIdao seu conjunto de dados e passe para o próximo registro de CRM. Nenhuma outra chamada de API é necessária para esta entrada. - Correspondência não estabelecida:se não contiver esses tipos de empresa, a API não poderá confirmar definitivamente a entidade empresarial. O ID de lugar retornado representa uma característica geográfica (como um prédio, uma rua ou uma cidade). Não use esse ID de lugar no BigQuery, porque ele vai falhar nas junções de exclusão. Em vez disso, salve o
result.address.formattedAddresse prossiga para a Etapa 3b.
Opção 2: API Geocoding
Para regiões indisponíveis para o Address Validation, transmita apenas o endereço do CRM para a API Geocoding. Não inclua o nome da empresa, porque a API Geocoding pode retornar resultados imprevisíveis. Extraia o formattedAddress resultante e siga para a etapa 3b.
Arquitetura avançada: como processar dados não estruturados com LLMs
Se os dados do CRM forem muito ruins, como nomes e endereços de empresas misturados em um único campo de observações de texto livre, pré-processe os registros com um LLM como o Gemini. Você pode pedir para o Gemini analisar o nome da empresa do local antes de inserir os dados no pipeline.
Etapa 3b: resolver a entidade comercial
Se a Etapa 3a retornar apenas um endereço limpo, concatene-o com o nome da empresa do CRM original e transmita para a API Text Search. Padronizar o endereço primeiro melhora significativamente sua taxa de correspondência.
Para otimizar o desempenho e o custo, use uma máscara de campo (X-Goog-FieldMask:
places.id) e defina "pageSize": 1 para garantir que apenas o ID de lugar da principal correspondência seja retornado.
Exemplo de solicitação de Text Search:
curl -X POST -d '{
"textQuery" : "Gramercy Tavern 42 E 20th St, New York, NY 10003-1324, USA",
"pageSize": 1
}' \
-H 'Content-Type: application/json' -H 'X-Goog-Api-Key: YOUR_API_KEY' \
-H 'X-Goog-FieldMask: places.id' \
'https://places.googleapis.com/v1/places:searchText'
Saída do pipeline
Depois de processar os registros do CRM usando esse pipeline de duas etapas, seja o ID extraído com sucesso na etapa 3a ou resolvido usando a Pesquisa de texto na etapa 3b, o objetivo final é anexar uma nova coluna place_id ao conjunto de dados. Essa tabela resultante agora está pronta para ser enviada ao BigQuery como sua lista de exclusão.
| Nome do local | Endereço | ID do lugar |
|---|---|---|
| Boucherie Union Square | 225 Park Ave S, New York, NY 10003, Estados Unidos | ChIJc1Vf7KFZwokR1YL2Rn9oxi8 |
| Gramercy Tavern | 42 E 20th St, Nova York, NY 10003, Estados Unidos | ChIJvSQIgqFZwokRFYQbJdzceSs |
| Barn Joo Union Square | 35 Union Square W, New York, NY 10003, Estados Unidos | ChIJQ7XpyqNZwokRQpVfvGEViWM |
| LOS TACOS No.1 | 200 Park Ave S, Nova York, NY 10003, Estados Unidos | ChIJFZh0PABZwokRVzoJu0o-mLY |
| Union Square Cafe | 101 E 19th St, New York, NY 10003, Estados Unidos | ChIJxTHke6JZwokRCLWVd99eDBw |
Etapa 4: realizar uma análise de exclusão de espaços em branco no BigQuery
Com os clientes atuais mapeados para IDs de lugar, use as funções de contagem de lugares para encontrar os novos leads.
Neste exemplo, vamos pesquisar empresas de destino operacional (restaurantes, bares, cafés e cafeterias) em um raio de 850 metros da Union Square (40.73595, -73.99043). Para ter uma visão mais granular do roteamento no nível da rua, vamos aumentar a função PLACES_COUNT_PER_H3 para a resolução 10.
Como a função retorna os IDs de lugar como uma matriz na coluna sample_place_ids, precisamos UNNEST a matriz para colocar cada empresa em potencial em uma linha separada. Em seguida, realizamos um LEFT JOIN em relação aos IDs de lugar conhecidos dos clientes.
Para provar que a lógica de exclusão funciona nesta demonstração, a consulta abaixo usa uma instrução CASE para sinalizar os resultados em vez de filtrá-los completamente.
Ela também classifica explicitamente os clientes atuais na parte superior da tabela de resultados para que você possa verificar se eles foram correspondidos.
A consulta SQL
WITH existing_customers AS (
-- 1. Simulate the uploaded CRM table
SELECT * FROM UNNEST([
'ChIJc1Vf7KFZwokR1YL2Rn9oxi8', -- Boucherie Union Square
'ChIJvSQIgqFZwokRFYQbJdzceSs', -- Gramercy Tavern
'ChIJQ7XpyqNZwokRQpVfvGEViWM', -- Barn Joo Union Square
'ChIJFZh0PABZwokRVzoJu0o-mLY', -- LOS TACOS No.1
'ChIJxTHke6JZwokRCLWVd99eDBw' -- Union Square Cafe
]) AS place_id
),
target_area_businesses AS (
-- 2. Query Places Insights for target businesses in the radius
SELECT
h3_cell_index,
place_id
FROM `places_insights___us.PLACES_COUNT_PER_H3`(
JSON_OBJECT(
'geography', ST_GEOGPOINT(-73.99043, 40.73595),
'geography_radius', 850,
'h3_resolution', 10,
'types',['restaurant', 'bar', 'cafe', 'coffee_shop'],
'business_status', ['OPERATIONAL']
)
),
UNNEST(sample_place_ids) AS place_id
)
-- 3. The "Proof" Output: Flag them instead of filtering them out
SELECT
t.h3_cell_index,
t.place_id,
-- Flag whether the LEFT JOIN found a match in the CRM table
CASE
WHEN e.place_id IS NOT NULL THEN 'Existing Customer (To Be Excluded)'
ELSE 'Net-New Lead'
END AS lead_status,
CONCAT('https://www.google.com/maps/search/?api=1&query=Place&query_place_id=', t.place_id) AS actionable_maps_url
FROM target_area_businesses t
LEFT JOIN existing_customers e
ON t.place_id = e.place_id
ORDER BY
-- Explicitly sort the existing customers to the top (0 comes before 1)
CASE WHEN e.place_id IS NOT NULL THEN 0 ELSE 1 END ASC;
Resultados da consulta
Confira um trecho da saída da consulta, mostrando como os clientes atuais são identificados e separados dos novos leads nas mesmas células H3 granulares.
Observe como a consulta usa uma instrução CONCAT para construir um URL do Maps multiplataforma usando place_id. Isso gera automaticamente a coluna actionable_maps_url, fornecendo à sua equipe de vendas um link instantâneo e clicável para carregar a empresa exata no app Google Maps para dispositivos móveis ou em um navegador.
h3_cell_index |
place_id |
lead_status |
actionable_maps_url |
|---|---|---|---|
| 8a2a100d2767fff | ChIJQ7XpyqNZwokRQpVfvGEViWM | Cliente atual (a ser excluído) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJQ7XpyqNZwokRQpVfvGEViWM |
| 8a2a100d20effff | ChIJvSQIgqFZwokRFYQbJdzceSs | Cliente atual (a ser excluído) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJvSQIgqFZwokRFYQbJdzceSs |
| 8a2a100d2397fff | ChIJc1Vf7KFZwokR1YL2Rn9oxi8 | Cliente atual (a ser excluído) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJc1Vf7KFZwokR1YL2Rn9oxi8 |
| 8a2a100d2397fff | ChIJFZh0PABZwokRVzoJu0o-mLY | Cliente atual (a ser excluído) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJFZh0PABZwokRVzoJu0o-mLY |
| 8a2a100d23b7fff | ChIJxTHke6JZwokRCLWVd99eDBw | Cliente atual (a ser excluído) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJxTHke6JZwokRCLWVd99eDBw |
| 8a2a1072c96ffff | ChIJ6atD-WRZwokRULgcZ4TWin8 | Novo lead | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJ6atD-WRZwokRULgcZ4TWin8 |
| 8a2a1072c96ffff | ChIJ09yg-llZwokRKAgp0jg6TCU | Novo lead | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJ09yg-llZwokRKAgp0jg6TCU |
Visualizar leads com o Kit de Interface do Places
Em vez de fornecer um URL bruto do Maps, é possível transmitir o place_ids diretamente para o Kit de interface do Places e criar um painel interno de geração de leads avançado para sua equipe de vendas.
Disponíveis em várias plataformas, você pode inserir os componentes pré-criados para
Web,
Android
e
iOS.
Esses componentes mostram automaticamente dados avançados de PDI, como fotos, classificações e horário de funcionamento, sem exigir que você escreva código de interface do usuário de front-end ou processe respostas da API manualmente.
Limites de dados
As funções de contagem de lugares retornam um máximo de 250 IDs de lugar por célula geográfica na matriz sample_place_ids. Se uma área for extremamente densa, a lista de leads gerada para essa célula específica será limitada a 250. Para capturar todos os leads em mercados de alta densidade, considere as seguintes estratégias:
- Use filtros de consulta específicos:em vez de agrupar vários tipos em uma consulta (como no exemplo acima), execute consultas separadas para cada tipo de lugar individual.
- Reduza o escopo espacial:diminua a área de pesquisa geral usando um
geography_radiusmenor ou divida a área em intervalos menores e mais granulares aumentando a resolução H3 (até a resolução 11). - Ajustar a resolução por densidade:ao analisar territórios com densidades populacionais variadas, ajuste dinamicamente o tamanho da pesquisa para evitar atingir o limite de 250 IDs de lugar. Use uma resolução H3 mais ampla (por exemplo, 6 ou 7) ou um
geography_radiusmaior em áreas rurais onde as empresas estão espalhadas. Por outro lado, use uma resolução altamente granular (por exemplo, 10 ou 11) em áreas urbanas densas para capturar todos os leads em potencial sem truncar sua lista.
Consulta de produção
Depois de verificar se os clientes atuais foram identificados, é possível
reverter para a versão de produção da consulta. Substitua o bloco SELECT final pela seguinte cláusula WHERE para filtrar permanentemente sua carteira de negócios atual:
SELECT
t.h3_cell_index,
t.place_id,
CONCAT('https://www.google.com/maps/search/?api=1&query=Place&query_place_id=', t.place_id) AS actionable_maps_url
FROM target_area_businesses t
LEFT JOIN existing_customers e
ON t.place_id = e.place_id
WHERE e.place_id IS NULL; -- Filters out the CRM matches
Governança e compliance de arquitetura
Para manter um sistema de alta performance e em conformidade, siga estes padrões:
- IDs de lugar como seu identificador persistente:além do ID de lugar, os Termos de Serviço do Google Maps proíbem o armazenamento ou o cache dos dados individuais de PDI retornados da API Places (como números de telefone e detalhes de contato).Use IDs de lugar como seu identificador persistente para análise recorrente de espaços em branco.
- Garanta a atualização dos atributos com chamadas de API em tempo real:use IDs de lugar para fazer chamadas "just-in-time" para a API Place Details e garantir que seu vendedor tenha as informações comerciais e de contato mais atualizadas do local. Como alternativa, conforme demonstrado na saída da consulta, você pode construir dinamicamente URLs do Google Maps para fornecer à sua equipe de vendas links diretos para os perfis das empresas no Google Maps.
Conclusão
Ao padronizar o ID de lugar como sua chave primária, você conseguiu diminuir a distância entre a análise de mercado de alto nível e as operações de vendas práticas e de nível básico. Essa arquitetura ignora as imprecisões da segmentação convencional com base na população, usa o data warehouse sem servidor para junções computacionais pesadas e segue rigorosamente as práticas recomendadas de gerenciamento de custos e compliance na camada de API.
Próximas ações
- Solicite acesso ao conjunto de dados de amostra do Insights de Lugares.
- Inscreva-se no conjunto de dados do Insights de Lugares usando as listagens do BigQuery Data Exchange para acessar os dados de amostra ou de um país inteiro.
- Consulte a referência de parâmetros de filtro para ajustar suas consultas SQL do BigQuery com base em atributos e tipos de negócios.
- Implemente pesquisas dinâmicas da API Places no seu CRM ou aplicativo de encaminhamento de vendas para expor detalhes de contato atualizados e em conformidade para os novos leads gerados.
Colaboradores
- Henrik Valve | Engenheiro de DevX