La generación de clientes potenciales convencional de empresa a empresa suele depender de la compra de directorios estáticos o listas de la industria para definir el potencial del territorio. Sin embargo, estos conjuntos de datos de puntos de interés (POI) estáticos se vuelven obsoletos casi de inmediato. Como a menudo carecen de un estado operativo actualizado o de una categorización detallada del tipo de lugar, los equipos de ventas en terreno corren el riesgo de perder tiempo valioso buscando empresas que están cerradas de forma permanente, mal categorizadas o que no son relevantes para su perfil de cliente ideal.
En esta guía, se proporciona un flujo de trabajo para superar esa brecha con Places Insights y la API de Places. Si asignas tu cartera de clientes actual a los IDs de lugar, puedes usar BigQuery para aislar cada empresa operativa en un territorio que aún no se encuentre en tu base de datos de administración de relaciones con el cliente (CRM). En esta guía, se muestra cómo crear ese motor de exclusión para entregar una lista de clientes potenciales hipersegmentada y verificada a tus representantes de campo.

Aplicación de ejemplo
Considera un proveedor de puntos de venta (PdV) que planea una expansión de ventas en terreno en la ciudad de Nueva York. Por lo general, la organización generaría un informe sobre la cantidad total de establecimientos de alimentos y bebidas por código postal. Este enfoque conlleva el riesgo de que los representantes de ventas se basen en datos obsoletos, como ubicaciones cerradas de forma permanente, o en clientes potenciales irrelevantes, como una cocina de catering privada sin una tienda.
Imagina un enfoque modernizado que utilice Estadísticas de Lugares, que aprovecha la escala global y los datos actualizados de Google Maps validados en múltiples fuentes.
Places Insights admite casi 500 categorías de lugares y más de 70 atributos, lo que te permite definir mejor tus clientes potenciales con alta precisión en función de tipos de empresas específicos (como scandinavian_restaurant), horarios de atención y ofertas de servicios (como accepts_credit_cards). Si cruzas los datos de Places Insights con tu CRM interno, puedes proporcionar a tu equipo de ventas una lista de clientes potenciales de alto potencial y sin contacto hipersegmentada.
Flujo de trabajo de la solución
En esta guía, se proporciona un marco de trabajo técnico para crear un "Mapa de clientes potenciales" dinámico que filtre automáticamente tu cartera de clientes actual y deje solo los clientes potenciales operativos y completamente nuevos para que tu equipo de ventas los capte.
La arquitectura de cuatro pasos
- Define tus tipos de lugares objetivo: Asigna tus perfiles de clientes ideales a tipos de lugares.
- Identifica áreas con gran potencial: Ejecuta funciones de recuento de lugares en BigQuery para generar mapas de densidad de los negocios objetivo operativos.
- Normaliza los datos del CRM en IDs de lugar: Procesa los registros no estructurados del CRM a través de una canalización de limpieza de datos, utilizando las APIs de Address Validation, Geocoding y Places, para encontrar los IDs de lugar de tus clientes existentes.
- Realiza la exclusión de espacios en blanco: Une los IDs de lugar de tu CRM con tus datos de Estadísticas de Lugares en BigQuery para filtrar de forma dinámica los clientes existentes y generar una lista de clientes potenciales nuevos.
Requisitos previos
Antes de comenzar, asegúrate de tener lo siguiente:
Proyecto de Google Cloud:
- Un proyecto de Google Cloud con facturación habilitada.
Acceso a los datos:
- Suscripción a Places Insights en BigQuery
- Tu propio conjunto de datos del CRM (p.ej., una tabla de BigQuery) que contiene los nombres y las direcciones comerciales de los clientes existentes para que actúe como tu lista de exclusión.
Google Maps Platform:
- Una clave de API
- Las siguientes APIs están habilitadas para tu clave:
Permisos de IAM:
- Asegúrate de que tu cuenta de usuario o de servicio tenga los siguientes roles de IAM para ejecutar consultas y administrar tu conjunto de datos:
Rol ID Editor de datos de BigQuery roles/bigquery.dataEditorUsuario de BigQuery roles/bigquery.user
- Asegúrate de que tu cuenta de usuario o de servicio tenga los siguientes roles de IAM para ejecutar consultas y administrar tu conjunto de datos:
Conocimiento de los costos:
- En este instructivo, se usan componentes facturables de Google Cloud. Ten en cuenta los costos potenciales relacionados con lo siguiente:
- BigQuery: Se cobra por las ranuras de procesamiento utilizadas o los datos procesados durante la ejecución de la consulta.
- Estadísticas de Places: Se cobran según el uso de las búsquedas.
- Google Maps Platform: Se cobra por solicitud para las APIs de Address Validation, Geocoding y Text Search.
- En este instructivo, se usan componentes facturables de Google Cloud. Ten en cuenta los costos potenciales relacionados con lo siguiente:
Paso 1: Define los tipos de lugares objetivo
Places Insights admite casi 500 categorías de lugares y más de 70 atributos (como horarios de atención, tipos de pago y estado operativo). Consultar todo el conjunto de datos de forma indiscriminada es ineficiente y costoso.
Como paso fundamental, usa un LLM como Gemini para traducir tus perfiles de clientes internos en tipos de lugares, que se usan cuando se crea una búsqueda para Estadísticas de Lugares. Esta definición de taxonomía a nivel macro garantiza que las búsquedas posteriores de BigQuery sean altamente segmentadas, lo que reduce la sobrecarga del procesamiento de la computación.
Por ejemplo, si diseñas un flujo de trabajo para un sistema de punto de venta, puedes proporcionar a Gemini la lista de tipos de lugares y usar la siguiente instrucción:
"Actúa como analista de mercado. De los tipos de lugares de Google Maps admitidos, ¿cuáles son los objetivos principales para un proveedor de sistemas de punto de venta? Justifica tu decisión".
Según esta instrucción, Gemini analizaría la taxonomía y devolvería un subconjunto específico de tipos de lugares relevantes para usar en tu filtro de BigQuery types:
| Categoría principal | Justificación | Tipos de lugares clave |
|---|---|---|
| Comidas y bebidas | Requiere un procesamiento rápido de transacciones, administración de mesas, emisión de tickets de pedidos y manejo de propinas. | restaurant, bar, cafe, coffee_shop |
| Compras | Necesita un seguimiento de inventario sólido, escaneo de códigos de barras, procesamiento de devoluciones e integraciones de lealtad. | clothing_store, grocery_store, supermarket, convenience_store |
| Servicios y salud y bienestar | Requiere la integración de reservas de citas, programación, perfiles de clientes y seguimiento de comisiones. | hair_salon, beauty_salon, spa, massage |
| Entretenimiento, recreación y deportes | Exige un manejo rápido de las multitudes de clientes, el escaneo de boletos digitales y la venta rápida de concesiones. | movie_theater, amusement_park, bowling_alley, stadium |
A los efectos de esta guía, nos enfocaremos en los tipos de lugares sugeridos para la categoría Comida y bebida.
Paso 2: Extrae los recuentos de empresas para identificar áreas con gran potencial
Para identificar las áreas de oportunidad, primero necesitas una visión general de la densidad de las empresas. Para ello, ejecuta funciones de recuento de lugares (como PLACES_COUNT_PER_H3 o PLACES_COUNT_PER_GEO) en BigQuery.
Si bien puedes consultar el conjunto de datos directamente, las funciones de recuento de lugares son consultas SQL predefinidas y optimizadas que no aplican el umbral de agregación estándar de 5 lugares como mínimo (las consultas directas estándar omitirán las filas con entre 1 y 4 empresas; sin embargo, estas funciones te permiten ver exactamente dónde existe incluso un solo cliente potencial). Es fundamental destacar que estas funciones devuelven un array de hasta 250 IDs de lugar por área geográfica con la columna sample_place_ids. Esto proporciona el mapa de calor estadístico para los planificadores de tu territorio y los identificadores fundamentales necesarios para la generación de clientes potenciales.
En la siguiente consulta, se muestra cómo recuperar de forma dinámica un polígono complejo (todo el límite de la ciudad de Nueva York) con un conjunto de datos públicos y, luego, pasar esa ubicación geográfica a la función Places Count. Si utilizas el índice espacial H3 con una resolución más amplia (8) en toda la ciudad, puedes generar un mapa de densidad a nivel macro.
Además, si seleccionas todas las columnas (SELECT *), la función devuelve la columna geography, un polígono que representa la celda H3. Esto te permite importar de inmediato tus resultados de BigQuery a herramientas de inteligencia empresarial (como Looker Studio) para crear visualizaciones de mapas completas que revelen visualmente los puntos críticos del 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 se puede ver en la visualización resultante, hay áreas de alta densidad de empresas objetivo en todo Manhattan. En el resto de este documento, nos enfocaremos en una de estas zonas de alto potencial: el área cercana a Union Square.
Paso 3: Normaliza tus datos de CRM según los IDs de lugar
Para realizar un análisis de exclusión, primero debes traducir tus registros del CRM a IDs de lugar. Dado que los datos del CRM suelen no estar estructurados, pasar texto sin procesar a las APIs de búsqueda genera tasas de coincidencias bajas. Usa esta canalización de dos pasos para limpiar direcciones, tener en cuenta la cobertura regional de la API y garantizar que extraigas los IDs de lugar de establecimiento correctos para BigQuery.
Supongamos que tienes los siguientes 5 clientes de restaurantes en tu CRM, ubicados en la ciudad de Nueva York:
| Nombre del lugar | Dirección |
|---|---|
| Boucherie Union Square | 225 Park Ave S, Nueva York, NY 10003, Estados Unidos |
| Gramercy Tavern | 42 E 20th St, Nueva York, NY 10003, Estados Unidos |
| Barn Joo Union Square | 35 Union Square W, Nueva York, NY 10003, Estados Unidos |
| LOS TACOS No.1 | 200 Park Ave S, Nueva York, NY 10003, Estados Unidos |
| Union Square Cafe | 101 E 19th St, Nueva York, NY 10003, Estados Unidos |
Dado que estos registros constan de texto no estructurado, no puedes unirlos directamente con los datos de Places Insights en BigQuery. En su lugar, procesa cada fila a través de la siguiente canalización para estandarizar el texto y extraer el ID de lugar.
Paso 3a: Limpieza de direcciones y coincidencias directas
Primero, estandariza los datos de tu dirección. Elige tu API según el país objetivo:
Opción 1: API de Address Validation
En el caso de las regiones admitidas, pasa el nombre y la dirección de la empresa del CRM concatenados a la API. Inspecciona el array result.geocode.placeTypes de la respuesta:
- Coincidencia de establecimiento: Si contiene
establishmentopoint_of_interest, la API resolvió correctamente la empresa. Agrega esteplaceIda tu conjunto de datos y pasa al siguiente registro del CRM. No se necesitan más llamadas a la API para esta entrada. - Non-Establishment Match: Si no contiene esos tipos de empresas, la API no pudo confirmar de forma definitiva la entidad comercial. El ID de lugar que se devuelve representa un elemento geográfico (como un edificio, una calle o una ciudad). No uses este ID de lugar para BigQuery, ya que fallarán tus uniones de exclusión. En su lugar, guarda el
result.address.formattedAddressy continúa con el paso 3b.
Opción 2: API de Geocoding
En el caso de las regiones que no son compatibles con la API de Address Validation, solo pasa la dirección del CRM a la API de Geocoding. No incluyas el nombre de la empresa, ya que la API de Geocoding puede devolver resultados impredecibles. Extrae el archivo formattedAddress resultante y continúa con el paso 3b.
Arquitectura avanzada: Cómo controlar datos no estructurados con LLMs
Si tus datos de CRM son muy deficientes, por ejemplo, si los nombres y las direcciones de las empresas se mezclan en un solo campo de notas de texto libre, preprocesa los registros con un LLM como Gemini. Puedes indicarle a Gemini que analice claramente el nombre de la empresa a partir de la ubicación antes de ingresarlos en esta canalización.
Paso 3b: Resuelve la entidad comercial
Si el paso 3a solo devuelve una dirección depurada, concaténala con el nombre de la empresa del CRM original y pásala a la API de Text Search. Estandarizar la dirección primero mejora significativamente tu porcentaje de coincidencias.
Para optimizar el rendimiento y el costo, usa una máscara de campo (X-Goog-FieldMask:
places.id) y establece "pageSize": 1 para garantizar que solo se devuelva el ID del lugar de la mejor coincidencia.
Ejemplo de solicitud 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'
Salida de la canalización
Después de procesar tus registros del CRM a través de esta canalización de dos pasos, ya sea que el ID se haya extraído correctamente en el paso 3a o se haya resuelto con la Búsqueda de texto en el paso 3b, tu objetivo final es agregar una nueva columna place_id a tu conjunto de datos. Esta tabla resultante ahora está lista para subirse a BigQuery como tu lista de exclusión.
| Nombre del lugar | Dirección | ID de lugar |
|---|---|---|
| Boucherie Union Square | 225 Park Ave S, Nueva York, NY 10003, Estados Unidos | ChIJc1Vf7KFZwokR1YL2Rn9oxi8 |
| Gramercy Tavern | 42 E 20th St, Nueva York, NY 10003, Estados Unidos | ChIJvSQIgqFZwokRFYQbJdzceSs |
| Barn Joo Union Square | 35 Union Square W, Nueva York, NY 10003, Estados Unidos | ChIJQ7XpyqNZwokRQpVfvGEViWM |
| LOS TACOS No.1 | 200 Park Ave S, Nueva York, NY 10003, Estados Unidos | ChIJFZh0PABZwokRVzoJu0o-mLY |
| Union Square Cafe | 101 E 19th St, Nueva York, NY 10003, Estados Unidos | ChIJxTHke6JZwokRCLWVd99eDBw |
Paso 4: Realiza el análisis de exclusión de espacios en blanco en BigQuery
Una vez que tus clientes existentes estén asociados a IDs de lugar, utiliza las funciones de recuento de lugares para encontrar los clientes potenciales nuevos.
En este ejemplo, buscaremos empresas objetivo operativas (restaurantes, bares, cafeterías y cafeterías) en un radio de 850 metros de Union Square (40.73595, -73.99043). Para obtener una vista más detallada de las rutas a nivel de la calle, aumentaremos la función PLACES_COUNT_PER_H3 a una resolución de 10.
Como la función devuelve los IDs de lugar como un array en la columna sample_place_ids, debemos UNNEST el array para colocar cada empresa potencial en su propia fila. Luego, realizamos una búsqueda de LEFT JOIN en los IDs de Place de nuestros clientes conocidos.
Para demostrar que la lógica de exclusión funciona en esta demostración, la siguiente consulta usa una instrucción CASE para marcar los resultados en lugar de filtrarlos por completo.
También ordena explícitamente los clientes existentes en la parte superior de la tabla de resultados para que puedas verificar que se hayan correlacionado correctamente.
La consulta en 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 de la consulta
A continuación, se incluye un fragmento del resultado de la búsqueda que muestra cómo se identifican y separan correctamente los clientes existentes de los clientes potenciales nuevos en las mismas celdas H3 detalladas.
Observa cómo la consulta utiliza una instrucción CONCAT para construir una URL de Maps multiplataforma con place_id. Esto genera automáticamente la columna actionable_maps_url, lo que le proporciona a tu equipo de ventas un vínculo instantáneo en el que se puede hacer clic para cargar la empresa exacta en la app de Google Maps para dispositivos móviles o en un navegador.
h3_cell_index |
place_id |
lead_status |
actionable_maps_url |
|---|---|---|---|
| 8a2a100d2767fff | ChIJQ7XpyqNZwokRQpVfvGEViWM | Cliente existente (para excluir) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJQ7XpyqNZwokRQpVfvGEViWM |
| 8a2a100d20effff | ChIJvSQIgqFZwokRFYQbJdzceSs | Cliente existente (para excluir) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJvSQIgqFZwokRFYQbJdzceSs |
| 8a2a100d2397fff | ChIJc1Vf7KFZwokR1YL2Rn9oxi8 | Cliente existente (para excluir) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJc1Vf7KFZwokR1YL2Rn9oxi8 |
| 8a2a100d2397fff | ChIJFZh0PABZwokRVzoJu0o-mLY | Cliente existente (para excluir) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJFZh0PABZwokRVzoJu0o-mLY |
| 8a2a100d23b7fff | ChIJxTHke6JZwokRCLWVd99eDBw | Cliente existente (para excluir) | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJxTHke6JZwokRCLWVd99eDBw |
| 8a2a1072c96ffff | ChIJ6atD-WRZwokRULgcZ4TWin8 | Cliente potencial nuevo | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJ6atD-WRZwokRULgcZ4TWin8 |
| 8a2a1072c96ffff | ChIJ09yg-llZwokRKAgp0jg6TCU | Cliente potencial nuevo | https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJ09yg-llZwokRKAgp0jg6TCU |
Visualiza clientes potenciales con el kit de IU de Places
En lugar de proporcionar una URL de Maps sin procesar, puedes pasar el objeto place_ids directamente al kit de IU de Places para crear un panel interno enriquecido de generación de clientes potenciales para tu equipo de ventas.
Puedes usar los componentes prediseñados disponibles en todas las plataformas para Web, Android y iOS.
Estos componentes muestran automáticamente datos enriquecidos de PDI, como fotos, calificaciones y horarios de atención, sin necesidad de que escribas código de IU de frontend ni manejes las respuestas de la API de forma manual.
Límites de datos
Las funciones de recuento de lugares devuelven un máximo de 250 IDs de lugar por celda geográfica en el array sample_place_ids. Si un área es extremadamente densa, la lista de clientes potenciales generada para esa celda específica se limitará a 250. Para asegurarte de captar todos los clientes potenciales en mercados muy densos, considera las siguientes estrategias:
- Usa filtros de búsqueda específicos: En lugar de agrupar varios tipos en una sola búsqueda (como en el ejemplo anterior), ejecuta búsquedas separadas para cada tipo de lugar individual.
- Reduce el alcance espacial: Disminuye el área de búsqueda general con un
geography_radiusmás pequeño o divide el área en segmentos más pequeños y detallados aumentando la resolución de H3 (hasta la resolución 11). - Ajuste de la resolución por densidad: Cuando analices territorios con diferentes densidades de población, ajusta de forma dinámica el tamaño de tu búsqueda para no alcanzar el límite de 250 IDs de lugar. Usa una resolución de H3 más amplia (p.ej., 6 o 7) o un
geography_radiusmás grande en áreas rurales donde las empresas están dispersas. Por el contrario, usa una resolución muy detallada (p.ej., 10 u 11) en áreas urbanas densas para asegurarte de captar todos los clientes potenciales sin truncar tu lista.
Consulta de producción
Una vez que verifiques que los clientes existentes se identifican correctamente, puedes volver a la versión de producción de la consulta. Reemplaza el bloque SELECT final por la siguiente cláusula WHERE para filtrar de forma permanente tu cartera de clientes existente:
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
Administración y cumplimiento de la arquitectura
Para mantener un sistema de mayor rendimiento y cumplimiento, respeta estos estándares:
- IDs de lugar como identificador persistente: Además del ID de lugar, las Condiciones del Servicio de Google Maps prohíben almacenar en caché o guardar los datos de PDI individuales que se devuelven de la API de Places (como números de teléfono y detalles de contacto).Usa los IDs de lugar como identificador persistente para el análisis recurrente de espacios en blanco.
- Garantiza la actualización de los atributos con llamadas a la API en tiempo real: Usa IDs de lugar para realizar llamadas "justo a tiempo" a la API de Place Details y asegurarte de que tu vendedor tenga la información de contacto y de la empresa más actualizada del lugar. Como alternativa, tal como se muestra en el resultado de la búsqueda, puedes crear de forma dinámica URLs de Google Maps para proporcionar a tu equipo de ventas vínculos directos a los Perfiles de Negocio en Google Maps.
Conclusión
Al estandarizar el ID de lugar como clave principal, lograste cerrar la brecha entre el análisis de mercado de alto nivel y las operaciones de ventas prácticas a nivel local. Esta arquitectura evita las imprecisiones de la segmentación convencional basada en la población, utiliza el almacenamiento de datos sin servidores para las uniones computacionales pesadas y se adhiere estrictamente a las prácticas recomendadas de administración de costos y cumplimiento en la capa de la API.
Próximas acciones
- Solicita acceso al conjunto de datos de muestra de Places Insights.
- Suscríbete al conjunto de datos de Places Insights a través de las fichas de intercambio de datos de BigQuery para acceder a los datos de muestra o a los datos completos del país.
- Revisa la referencia de los parámetros de filtro para ajustar tus consultas de SQL de BigQuery en función de los atributos y tipos de la empresa.
- Implementa búsquedas dinámicas de la API de Places en tu CRM o aplicación de distribución de clientes potenciales para exponer los detalles de contacto actualizados y que cumplen con las políticas para los clientes potenciales nuevos generados.
Colaboradores
- Henrik Valve | Ingeniero de DevX