Identifier de nouveaux prospects commerciaux sur le terrain grâce à Places Insights

La génération de prospects B2B conventionnelle repose souvent sur l'achat d'annuaires statiques ou de listes sectorielles pour définir le potentiel d'un territoire. Toutefois, ces ensembles de données statiques de points d'intérêt deviennent obsolètes presque immédiatement. Comme elles manquent souvent d'informations à jour sur l'état opérationnel ou d'une catégorisation précise des types de lieux, les équipes commerciales sur le terrain risquent de perdre un temps précieux à rechercher des entreprises définitivement fermées, mal catégorisées ou ne correspondant pas à leur profil de client idéal.

Ce guide fournit un workflow pour combler cette lacune à l'aide de Places Insights et de l'API Places. En mappant votre portefeuille d'affaires actuel sur les ID de lieu, vous pouvez utiliser BigQuery pour isoler chaque entreprise opérationnelle dans un territoire qui ne figure pas déjà dans votre base de données de gestion de la relation client (CRM). Ce guide vous explique comment créer ce moteur d'exclusion pour fournir une liste de prospects hyperciblée et validée à vos commerciaux.

Diagramme montrant les données CRM existantes traitées à l'aide de l'API Places et de BigQuery Places Insights pour générer de nouveaux prospects validés.

Exemple d'application

Prenons l'exemple d'un fournisseur de points de vente qui prévoit d'étendre ses ventes sur le terrain à New York. En règle générale, l'organisation extrait un rapport sur le nombre total d'établissements de restauration par code postal. Cette approche présente le risque que les commerciaux s'appuient sur des données obsolètes, comme des établissements définitivement fermés, ou sur des prospects non pertinents, comme une cuisine de traiteur privée sans magasin. Imaginez plutôt une approche modernisée utilisant Places Insights, qui tire parti de l'échelle mondiale de Google Maps et de données à jour validées à partir de plusieurs sources. Places Insights est compatible avec près de 500 catégories de lieux et plus de 70 attributs. Vous pouvez ainsi affiner vos prospects avec une grande précision en fonction de types d'établissements spécifiques (comme scandinavian_restaurant), des horaires d'ouverture et des services proposés (comme accepts_credit_cards). En croisant les données de Places Insights avec votre CRM interne, vous pouvez fournir à votre équipe commerciale une liste hyperciblée de prospects à fort potentiel qui n'ont pas encore été contactés.

Solution workflow

Ce guide fournit un framework technique permettant de créer une "carte des prospects" dynamique qui filtre automatiquement votre portefeuille d'affaires actuel, ne laissant que les prospects opérationnels et nouveaux à exploiter par votre équipe commerciale.

Architecture en quatre étapes

  1. Définissez vos types de lieux cibles : associez vos profils de clients idéaux à des types de lieux.
  2. Identifier les zones à fort potentiel : exécutez les fonctions Places Count dans BigQuery pour générer des cartes de densité des entreprises cibles opérationnelles.
  3. Normaliser les données CRM en ID de lieu : traitez les enregistrements CRM non structurés via un pipeline de nettoyage des données, en utilisant les API Address Validation, Geocoding et Places, pour trouver les ID de lieu de vos clients existants.
  4. Excluez les espaces vides : associez vos ID de lieux CRM à vos données Places Insights dans BigQuery pour filtrer dynamiquement les clients existants et générer une liste de prospects inédits.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Projet Google Cloud :

    • Un projet Google Cloud avec facturation activée.
  • Accès aux données :

    • Abonnement Places Insights dans BigQuery.
    • Votre propre ensemble de données CRM (par exemple, une table BigQuery) contenant les noms et adresses des entreprises clientes existantes, qui servira de liste d'exclusion.
  • Google Maps Platform :

  • Autorisations IAM :

    • Assurez-vous que votre compte utilisateur ou de service dispose des rôles IAM suivants pour exécuter des requêtes et gérer votre ensemble de données :
      Rôle ID
      Éditeur de données BigQuery roles/bigquery.dataEditor
      Utilisateur BigQuery roles/bigquery.user
  • Sensibilisation aux coûts :

    • Ce tutoriel utilise des composants Google Cloud facturables. Tenez compte des coûts potentiels liés aux éléments suivants :
      • BigQuery : facturation des emplacements de calcul utilisés ou des données traitées lors de l'exécution des requêtes.
      • Places Insights : facturé en fonction de l'utilisation des requêtes.
      • Google Maps Platform : facturé par requête pour les API Address Validation, Geocoding et Text Search.

Étape 1 : Définissez vos types de lieux cibles

Places Insights prend en charge près de 500 catégories de lieux et plus de 70 attributs (tels que les horaires d'ouverture, les modes de paiement et l'état opérationnel). Interroger l'ensemble de données sans distinction est inefficace et coûteux.

Pour commencer, utilisez un LLM comme Gemini pour traduire vos profils client internes en types de lieux, qui sont utilisés lorsque vous créez une requête pour Places Insights. Cette définition de taxonomie au niveau macro garantit que vos recherches BigQuery ultérieures sont très ciblées, ce qui réduit les frais généraux de traitement informatique.

Par exemple, si vous concevez un workflow pour un système de point de vente, vous pouvez fournir à Gemini la liste des types de lieux et utiliser la requête suivante :

"Agis en tant qu'analyste de marché. Parmi les types de lieux Google Maps compatibles, quels sont les principaux cibles pour un fournisseur de systèmes de point de vente ? Justifie ta décision."

À partir de cette requête, Gemini analysera la taxonomie et renverra un sous-ensemble ciblé de types de lieux pertinents à utiliser dans votre filtre types BigQuery :

Catégorie principale Justification Types de lieux clés
Alimentation et boissons Nécessite un traitement rapide des transactions, la gestion des tables, l'impression des commandes et la gestion des pourboires. restaurant, bar, cafe, coffee_shop
Shopping Nécessite un suivi robuste de l'inventaire, la lecture de codes-barres, le traitement des retours et des intégrations de fidélité. clothing_store, grocery_store, supermarket, convenience_store
Services et Santé et bien-être Nécessite une réservation de rendez-vous, une planification, des profils client et un suivi des commissions intégrés. hair_salon, beauty_salon, spa, massage
Divertissement, loisirs et sports Exige une gestion rapide des affluences de clients, le scan des billets numériques et des ventes de confiseries rapides. movie_theater, amusement_park, bowling_alley, stadium

Dans ce guide, nous allons nous concentrer sur les types de lieux suggérés pour la catégorie Nourriture et boissons.

Étape 2 : Extraire le nombre d'établissements pour identifier les zones à fort potentiel

Pour identifier les opportunités, vous devez d'abord obtenir une vue d'ensemble de la densité des entreprises. Pour ce faire, exécutez les fonctions Places Count (comme PLACES_COUNT_PER_H3 ou PLACES_COUNT_PER_GEO) dans BigQuery.

Bien que vous puissiez interroger directement l'ensemble de données, les fonctions de dénombrement des lieux sont des requêtes SQL prédéfinies et optimisées qui n'appliquent pas le seuil d'agrégation standard de cinq lieux minimum (les requêtes directes standards omettent les lignes comportant entre un et quatre établissements). Toutefois, ces fonctions vous permettent de voir exactement où se trouve même un seul prospect. Il est important de noter que ces fonctions renvoient un tableau contenant jusqu'à 250 ID de lieux par zone géographique à l'aide de la colonne sample_place_ids. Cela fournit à la fois la carte thermique statistique pour vos planificateurs de territoires et les identifiants de base nécessaires à la génération de prospects.

La requête suivante montre comment récupérer dynamiquement un polygone complexe (l'ensemble des limites de la ville de New York) à l'aide d'un ensemble de données public, puis comment transmettre cette zone géographique à la fonction "Nombre de lieux". En utilisant l'index spatial H3 à une résolution plus large (8) dans toute la ville, vous pouvez générer une carte de densité au niveau macro.

De plus, en sélectionnant toutes les colonnes (SELECT *), la fonction renvoie la colonne geography, un polygone représentant la cellule H3. Vous pouvez ainsi importer immédiatement vos résultats BigQuery dans des outils de business intelligence (comme Looker Studio) pour créer des visualisations de cartes remplies qui révèlent visuellement les points chauds du marché.

-- 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;

Visualisation de carte montrant des hexagones H3 verts de différentes opacités au-dessus de New York, indiquant une forte densité d'entreprises à Manhattan.

Comme le montre la visualisation obtenue, il existe des zones à forte densité d'entreprises cibles dans tout Manhattan. Pour le reste de ce document, nous allons nous concentrer sur l'une de ces zones à fort potentiel : celle située près d'Union Square.

Étape 3 : Normalisez vos données CRM en fonction des ID de lieux

Pour effectuer une analyse des exclusions, vous devez d'abord traduire vos enregistrements CRM en ID de lieu. Étant donné que les données CRM sont souvent non structurées, le fait de transmettre du texte brut aux API de recherche génère de faibles taux de correspondance. Utilisez ce pipeline en deux étapes pour nettoyer les adresses, tenir compte de la couverture régionale de l'API et vous assurer d'extraire les bons ID de lieu d'établissement pour BigQuery.

Supposons que vous ayez les cinq clients de restaurant suivants dans votre CRM, situés à New York :

Nom Adresse
Boucherie Union Square 225 Park Ave S, New York, NY 10003, États-Unis
Gramercy Tavern 42 E 20th St, New York, NY 10003, États-Unis
Barn Joo Union Square 35 Union Square W, New York, NY 10003, États-Unis
LOS TACOS No.1 200 Park Ave S, New York, NY 10003, États-Unis
Union Square Cafe 101 E 19th St, New York, NY 10003, États-Unis

Comme ces enregistrements sont constitués de texte non structuré, vous ne pouvez pas les joindre directement aux données Places Insights dans BigQuery. Au lieu de cela, traitez chaque ligne à l'aide du pipeline suivant pour standardiser le texte et extraire l'ID de lieu.

Étape 3a : Nettoyage des adresses et correspondance directe

Commencez par normaliser vos données d'adresse. Choisissez votre API en fonction du pays cible :

Option 1 : API Address Validation

Pour les régions acceptées, transmettez le nom et l'adresse de l'entreprise CRM concaténés à l'API. Inspectez le tableau result.geocode.placeTypes de la réponse :

  • Correspondance d'établissement : si elle contient establishment ou point_of_interest, l'API a correctement résolu l'établissement. Ajoutez placeId à votre ensemble de données et passez à l'enregistrement CRM suivant. Aucun autre appel d'API n'est nécessaire pour cette entrée.
  • Non-Establishment Match : si elle ne contient pas ces types d'établissements, l'API n'a pas pu confirmer définitivement l'entité commerciale. L'ID de lieu renvoyé représente une entité géographique (comme un bâtiment, une rue ou une ville). N'utilisez pas cet ID de lieu pour BigQuery, car vos jointures d'exclusion échoueront. Enregistrez plutôt le result.address.formattedAddress et passez à l'étape 3b.

Option 2 : API Geocoding

Pour les régions non acceptées par l'API Address Validation, transmettez uniquement l'adresse du CRM à l'API Geocoding. N'incluez pas le nom de l'établissement, car l'API Geocoding peut renvoyer des résultats imprévisibles. Extrayez le formattedAddress obtenu et passez à l'étape 3b.

Architecture avancée : gérer les données non structurées avec les LLM

Si vos données CRM sont de très mauvaise qualité (par exemple, si les noms et adresses d'entreprises sont mélangés dans un seul champ de notes en texte libre), prétraitez les enregistrements avec un LLM tel que Gemini. Vous pouvez demander à Gemini d'analyser clairement le nom de l'établissement à partir de l'adresse avant de l'intégrer à ce pipeline.

Étape 3b : Résolvez le problème lié à l'entité juridique

Si l'étape 3a ne renvoie qu'une adresse nettoyée, concaténez-la avec le nom de l'entreprise CRM d'origine et transmettez-la à l'API Text Search. La standardisation de l'adresse en premier lieu améliore considérablement votre taux de correspondance.

Pour optimiser les performances et les coûts, utilisez un masque de champ (X-Goog-FieldMask: places.id) et définissez "pageSize": 1 pour vous assurer que seul l'ID du lieu correspondant le mieux est renvoyé.

Exemple de requête 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'

Sortie du pipeline

Après avoir traité vos enregistrements CRM à l'aide de ce pipeline en deux étapes, que l'ID ait été extrait avec succès à l'étape 3a ou résolu à l'aide de la recherche de texte à l'étape 3b, votre objectif final est d'ajouter une colonne place_id à votre ensemble de données. La table obtenue est maintenant prête à être importée dans BigQuery en tant que liste d'exclusion.

Nom Adresse ID de lieu
Boucherie Union Square 225 Park Ave S, New York, NY 10003, États-Unis ChIJc1Vf7KFZwokR1YL2Rn9oxi8
Gramercy Tavern 42 E 20th St, New York, NY 10003, États-Unis ChIJvSQIgqFZwokRFYQbJdzceSs
Barn Joo Union Square 35 Union Square W, New York, NY 10003, États-Unis ChIJQ7XpyqNZwokRQpVfvGEViWM
LOS TACOS No.1 200 Park Ave S, New York, NY 10003, États-Unis ChIJFZh0PABZwokRVzoJu0o-mLY
Union Square Cafe 101 E 19th St, New York, NY 10003, États-Unis ChIJxTHke6JZwokRCLWVd99eDBw

Étape 4 : Effectuer une analyse d'exclusion des espaces blancs dans BigQuery

Une fois vos clients existants mappés sur des ID de lieu, utilisez les fonctions de décompte des lieux pour trouver les nouveaux prospects.

Dans cet exemple, nous allons rechercher des établissements cibles opérationnels (restaurants, bars, cafés et coffee shops) dans un rayon de 850 mètres autour d'Union Square (40.73595, -73.99043). Pour obtenir une vue plus précise du routage au niveau de la rue, nous allons augmenter la fonction PLACES_COUNT_PER_H3 à la résolution 10.

Étant donné que la fonction renvoie les ID de lieux sous forme de tableau dans la colonne sample_place_ids, nous devons UNNEST le tableau pour placer chaque entreprise potentielle sur sa propre ligne. Nous effectuons ensuite un LEFT JOIN par rapport à nos ID de lieu client connus.

Pour prouver que la logique d'exclusion fonctionne pour cette démonstration, la requête ci-dessous utilise une instruction CASE pour signaler les résultats plutôt que de les filtrer complètement. Il trie également explicitement les clients existants en haut du tableau des résultats afin que vous puissiez vérifier qu'ils ont bien été mis en correspondance.

Requête 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;

Résultats de la requête

Voici un extrait du résultat de la requête, qui montre comment les clients existants sont correctement identifiés et séparés des nouveaux prospects dans les mêmes cellules H3 précises.

Remarquez comment la requête utilise une instruction CONCAT pour construire une URL Maps multiplate-forme, à l'aide de place_id. La colonne actionable_maps_url est alors générée automatiquement, ce qui permet à votre équipe commerciale de disposer d'un lien cliquable instantané pour charger l'établissement exact dans l'application mobile Google Maps ou dans un navigateur.

h3_cell_index place_id lead_status actionable_maps_url
8a2a100d2767fff ChIJQ7XpyqNZwokRQpVfvGEViWM Client existant (à exclure) https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJQ7XpyqNZwokRQpVfvGEViWM
8a2a100d20effff ChIJvSQIgqFZwokRFYQbJdzceSs Client existant (à exclure) https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJvSQIgqFZwokRFYQbJdzceSs
8a2a100d2397fff ChIJc1Vf7KFZwokR1YL2Rn9oxi8 Client existant (à exclure) https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJc1Vf7KFZwokR1YL2Rn9oxi8
8a2a100d2397fff ChIJFZh0PABZwokRVzoJu0o-mLY Client existant (à exclure) https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJFZh0PABZwokRVzoJu0o-mLY
8a2a100d23b7fff ChIJxTHke6JZwokRCLWVd99eDBw Client existant (à exclure) https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJxTHke6JZwokRCLWVd99eDBw
8a2a1072c96ffff ChIJ6atD-WRZwokRULgcZ4TWin8 Nouveau prospect https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJ6atD-WRZwokRULgcZ4TWin8
8a2a1072c96ffff ChIJ09yg-llZwokRKAgp0jg6TCU Nouveau prospect https://www.google.com/maps/search/?api=1&query=Place&query_place_id=ChIJ09yg-llZwokRKAgp0jg6TCU

Visualiser les prospects avec le Kit UI pour Places

Au lieu de fournir une URL Maps brute, vous pouvez transmettre le place_ids directement dans le Kit UI pour Places pour créer un tableau de bord interne riche de génération de prospects pour votre équipe commerciale. Disponibles sur toutes les plates-formes, vous pouvez insérer les composants prédéfinis pour le Web, Android et iOS. Ces composants affichent automatiquement des données de PDI enrichies, comme des photos, des notes et des horaires d'ouverture, sans que vous ayez à écrire de code d'interface utilisateur frontend ni à gérer manuellement les réponses de l'API.

Limites des données

Les fonctions de nombre de lieux renvoient un maximum de 250 ID de lieux par cellule géographique dans le tableau sample_place_ids. Si une zone est extrêmement dense, la liste de prospects générée pour cette cellule spécifique sera limitée à 250. Pour vous assurer de capturer tous les prospects dans les marchés très denses, envisagez les stratégies suivantes :

  • Utilisez des filtres de requête spécifiques : au lieu de regrouper plusieurs types dans une seule requête (comme dans l'exemple ci-dessus), exécutez des requêtes distinctes pour chaque type de lieu.
  • Réduisez la portée spatiale : diminuez la zone de recherche globale en utilisant un geography_radius plus petit ou divisez la zone en buckets plus petits et plus précis en augmentant la résolution H3 (jusqu'à la résolution 11).
  • Ajuster la résolution par densité : lorsque vous analysez des territoires dont la densité de population varie, ajustez dynamiquement la taille de votre recherche pour éviter d'atteindre la limite de 250 ID de lieu. Utilisez une résolution H3 plus large (par exemple, 6 ou 7) ou un geography_radius plus grand dans les zones rurales où les établissements sont dispersés. À l'inverse, utilisez une résolution très précise (par exemple, 10 ou 11) dans les zones urbaines denses pour vous assurer de capturer tous les prospects potentiels sans tronquer votre liste.

Requête de production

Une fois que vous avez vérifié que les clients existants sont correctement identifiés, vous pouvez revenir à la version de production de la requête. Remplacez le bloc SELECT final par la clause WHERE suivante pour filtrer définitivement votre portefeuille d'affaires existant :

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

Gouvernance et conformité de l'architecture

Pour maintenir un système plus performant et conforme, respectez les normes suivantes :

  1. Utilisez les identifiants de lieu comme identifiant permanent : en plus des identifiants de lieu, les Conditions d'utilisation de Google Maps interdisent le stockage ou la mise en cache des données de chaque point d'intérêt renvoyées par l'API Places (comme les numéros de téléphone et les coordonnées).Utilisez les identifiants de lieu comme identifiant permanent pour l'analyse récurrente des espaces blancs.
  2. Assurez-vous que les attributs sont à jour grâce aux appels d'API en temps réel : utilisez les ID de lieu pour effectuer des appels "just-in-time" à l'API Place Details. Vous pourrez ainsi vous assurer que votre commercial dispose des informations les plus récentes sur l'établissement et ses coordonnées. Vous pouvez également, comme indiqué dans le résultat de la requête, créer dynamiquement des URL Google Maps pour fournir à votre équipe commerciale des liens directs vers les fiches d'établissement sur Google Maps.

Conclusion

En standardisant l'ID de lieu comme clé primaire, vous avez réussi à combler le fossé entre l'analyse du marché de haut niveau et les opérations de vente concrètes sur le terrain. Cette architecture contourne les inexactitudes du ciblage conventionnel basé sur la population, utilise l'entreposage de données sans serveur pour les jointures de calcul intensif et respecte strictement les bonnes pratiques de gestion des coûts et de conformité au niveau de l'API.

Actions suivantes

  • Demandez l'accès à l'exemple d'ensemble de données Places Insights.
  • Abonnez-vous à l'ensemble de données Places Insights à l'aide des fiches BigQuery Data Exchange pour accéder aux données d'exemple ou complètes du pays.
  • Consultez la documentation de référence sur les paramètres de filtre pour affiner vos requêtes SQL BigQuery en fonction des attributs et types d'entreprise.
  • Implémentez des recherches dynamiques Places API dans votre application CRM ou de routage des ventes pour afficher des coordonnées à jour et conformes pour les nouveaux prospects générés.

Contributeurs