Un e-commerce SaaS B2B avec 8 000 pages indexées perd 23 % de ses clics branded en trois mois. La cause : deux concurrents directs et un site d'avis comparatif enchérissent sur son nom de marque avec des annonces qui apparaissent systématiquement au-dessus du résultat organique #1. Le CPC moyen de ses mots-clés branded passe de 0,18 € à 1,45 € une fois la compétition installée. Ce scénario n'est pas théorique — c'est le quotidien de dizaines de marques qui considèrent à tort leur branded search comme acquis.
Pourquoi la branded search est votre actif SEO le plus vulnérable
La branded search représente typiquement le trafic avec le taux de conversion le plus élevé d'un site. Un utilisateur qui tape "Datadog pricing" ou "Shopify login" a déjà franchi la phase de découverte. C'est du trafic bottom-of-funnel, quasi transactionnel.
Le problème : Google Ads ne protège pas les marques par défaut. Depuis 2004 pour les États-Unis et 2008 pour l'Europe, Google autorise les annonceurs tiers à enchérir sur des noms de marque concurrents. La seule restriction concerne l'utilisation de la marque dans le texte de l'annonce elle-même (et encore, uniquement si le détenteur de la marque a déposé une plainte trademark auprès de Google — documentation officielle).
L'anatomie d'une attaque branded
Trois profils d'attaquants se distinguent :
Concurrents directs — Ils ciblent vos mots-clés [marque] + alternative, [marque] + vs, [marque] + pricing. Objectif : intercepter les prospects en phase de comparaison.
Sites d'avis et affiliés — Review sites, comparateurs, blogs d'affiliation. Ils enchérissent sur [marque] + avis, [marque] + review. Leur landing page contient un tableau comparatif avec des liens d'affiliation vers vos concurrents.
Revendeurs non autorisés — Fréquent en e-commerce. Ils utilisent votre nom de marque pour vendre des produits à des prix cassés, parfois contrefaits, tout en captant le trafic de vos clients existants.
L'impact ne se limite pas au PPC. Quand un concurrent occupe les positions d'annonce 1 à 3 sur votre branded query, votre résultat organique — même en position 1 — se retrouve poussé below the fold, surtout sur mobile. Le CTR organique de votre propre branded query peut chuter de 60 % à 35 % simplement par la présence d'annonces concurrentes au-dessus.
Structurer vos campagnes branded : architecture et segmentation
La première erreur consiste à regrouper les mots-clés branded dans une campagne fourre-tout avec le reste du compte. Les branded keywords nécessitent une architecture dédiée avec des règles de gestion distinctes.
Architecture recommandée
Structurez vos campagnes branded en trois ad groups distincts :
- Pure brand : le nom de marque seul et ses variantes (fautes d'orthographe, abréviations)
- Brand + navigation :
[marque] login,[marque] support,[marque] dashboard - Brand + commercial :
[marque] pricing,[marque] demo,[marque] vs [concurrent]
Chaque ad group a un objectif différent. Le pure brand vise la protection défensive avec un CPC plancher. Le brand + navigation capture les utilisateurs existants qui passent par Google au lieu de taper l'URL (comportement massif sur mobile). Le brand + commercial est le champ de bataille principal contre les concurrents.
Script Google Ads : alerter sur l'arrivée de concurrents
Le script suivant interroge l'Auction Insights de vos campagnes branded et vous envoie une alerte email dès qu'un nouveau domaine concurrent apparaît ou qu'un concurrent existant dépasse un seuil d'impression share :
// Google Ads Script — Branded Auction Insights Alert
// Vérifie quotidiennement les nouveaux concurrents sur vos campagnes branded
function main() {
const BRANDED_CAMPAIGN_NAME = "Brand - Defense";
const ALERT_EMAIL = "[email protected]";
const IMPRESSION_SHARE_THRESHOLD = 0.15; // Alerte si un concurrent dépasse 15%
const KNOWN_COMPETITORS = [
"concurrent-a.com",
"concurrent-b.com",
"comparateur-xyz.com"
];
const report = AdsApp.report(
`SELECT CampaignName, Domain, SearchImpressionShare,
SearchOverlapRate, PositionAboveRate
FROM AUCTION_INSIGHTS_REPORT
WHERE CampaignName = "${BRANDED_CAMPAIGN_NAME}"
DURING LAST_7_DAYS`
);
const rows = report.rows();
const newCompetitors = [];
const highShareCompetitors = [];
while (rows.hasNext()) {
const row = rows.next();
const domain = row["Domain"];
const impressionShare = parseFloat(row["SearchImpressionShare"]);
const positionAboveRate = parseFloat(row["PositionAboveRate"]);
if (!KNOWN_COMPETITORS.includes(domain) && domain !== "Your domain") {
newCompetitors.push({
domain: domain,
impressionShare: (impressionShare * 100).toFixed(1) + "%",
positionAboveRate: (positionAboveRate * 100).toFixed(1) + "%"
});
}
if (impressionShare > IMPRESSION_SHARE_THRESHOLD) {
highShareCompetitors.push({
domain: domain,
impressionShare: (impressionShare * 100).toFixed(1) + "%",
positionAboveRate: (positionAboveRate * 100).toFixed(1) + "%"
});
}
}
if (newCompetitors.length > 0 || highShareCompetitors.length > 0) {
let body = "=== BRANDED SEARCH ALERT ===\n\n";
if (newCompetitors.length > 0) {
body += "NOUVEAUX CONCURRENTS DÉTECTÉS:\n";
newCompetitors.forEach(c => {
body += ` • ${c.domain} — IS: ${c.impressionShare}, Above Rate: ${c.positionAboveRate}\n`;
});
}
if (highShareCompetitors.length > 0) {
body += "\nCONCURRENTS AU-DESSUS DU SEUIL (>" + (IMPRESSION_SHARE_THRESHOLD * 100) + "% IS):\n";
highShareCompetitors.forEach(c => {
body += ` • ${c.domain} — IS: ${c.impressionShare}, Above Rate: ${c.positionAboveRate}\n`;
});
}
MailApp.sendEmail(ALERT_EMAIL, "[ALERTE] Activité concurrente sur branded search", body);
Logger.log("Alerte envoyée : " + newCompetitors.length + " nouveaux, " + highShareCompetitors.length + " au-dessus du seuil.");
}
}
Ce script tourne en tâche planifiée quotidienne. L'intérêt : vous ne découvrez pas l'attaque trois semaines plus tard en regardant un rapport mensuel. Vous réagissez en 24h.
Le piège du broad match sur le branded
Beaucoup de comptes utilisent du broad match sur les mots-clés branded par facilité. C'est une erreur coûteuse. Un broad match sur votreMarque va matcher sur des requêtes comme alternative à votreMarque, votreMarque problème, voire des requêtes concurrentes si Google juge la sémantique proche.
Utilisez exclusivement de l'exact match et du phrase match sur vos campagnes branded. Ajoutez les variations connues (fautes de frappe, abréviations) manuellement. Le budget défensif branded doit être chirurgical, pas dispersé.
Optimiser les landing pages branded pour écraser la concurrence
Le Quality Score sur les mots-clés branded de votre propre marque devrait être entre 8 et 10. Si ce n'est pas le cas, vous payez un premium inutile. Le levier principal : l'alignement parfait entre le mot-clé, l'annonce et la landing page.
Sitelinks et extensions structurées
Les sitelinks sont votre arme défensive la plus sous-estimée. Ils occupent de l'espace SERP, poussent les résultats concurrents plus bas, et améliorent le CTR. Configurez 8 sitelinks minimum sur vos campagnes branded (Google en affichera 4 à 6 selon le contexte).
Chaque sitelink doit pointer vers une page réelle, optimisée, avec un title tag pertinent et une meta description soignée. Google évalue la qualité de la landing page des sitelinks dans le calcul du Quality Score global.
Schema markup sur les landing pages branded
Renforcez la présence organique de vos pages branded avec du structured data. L'objectif : obtenir des rich results qui augmentent la surface organique et réduisent visuellement l'impact des annonces concurrentes.
<!-- Schema Organization sur la page d'accueil / page marque -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "VotreMarque",
"url": "https://www.votremarque.com",
"logo": "https://www.votremarque.com/images/logo-512.png",
"description": "Plateforme de gestion logistique pour e-commerce — 15 000 marchands actifs.",
"sameAs": [
"https://www.linkedin.com/company/votremarque",
"https://twitter.com/votremarque",
"https://www.crunchbase.com/organization/votremarque"
],
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+33-1-XX-XX-XX-XX",
"contactType": "customer service",
"availableLanguage": ["French", "English"]
},
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "847",
"bestRating": "5"
}
}
</script>
<!-- FAQ Schema pour capter les questions branded -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Combien coûte VotreMarque ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "VotreMarque propose trois formules : Starter à 49€/mois, Pro à 149€/mois, Enterprise sur devis. Tous les plans incluent 14 jours d'essai gratuit."
}
},
{
"@type": "Question",
"name": "VotreMarque propose-t-il une API ?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Oui, une API REST complète est disponible dès le plan Pro, avec documentation OpenAPI et sandbox de test."
}
}
]
}
</script>
L'aggregateRating n'est éligible que si vous collectez réellement des avis sur votre site (pas sur un tiers). Vérifiez dans la Search Console que le structured data est correctement parsé via le rapport "Améliorations" — une erreur de syntaxe et le rich result ne s'affiche pas. Vous pouvez croiser cette vérification avec ce que Google voit réellement sur vos pages.
Monitoring continu : détecter l'attaque avant l'impact
La surveillance des branded queries ne peut pas être un check-up mensuel. Les concurrents lancent et arrêtent leurs campagnes de façon tactique — souvent lors de vos pics de trafic (soldes, lancement produit, conférence sectorielle).
Pipeline de monitoring automatisé
Voici un script Python qui interroge l'API Google Ads quotidiennement et stocke les données Auction Insights dans une base pour analyse de tendance :
#!/usr/bin/env python3
"""
Branded Search Defense Monitor
Collecte quotidienne des Auction Insights sur campagnes branded
et détection d'anomalies via seuils dynamiques.
"""
import os
import json
from datetime import datetime, timedelta
from google.ads.googleads.client import GoogleAdsClient
from google.ads.googleads.errors import GoogleAdsException
import sqlite3
DB_PATH = "/opt/monitoring/branded_defense.db"
CUSTOMER_ID = os.environ["GOOGLE_ADS_CUSTOMER_ID"]
BRANDED_CAMPAIGN_IDS = ["12345678901", "12345678902"] # IDs de vos campagnes branded
def init_db():
conn = sqlite3.connect(DB_PATH)
conn.execute("""
CREATE TABLE IF NOT EXISTS auction_insights (
date TEXT,
campaign_id TEXT,
competitor_domain TEXT,
impression_share REAL,
overlap_rate REAL,
position_above_rate REAL,
top_of_page_rate REAL,
outranking_share REAL,
PRIMARY KEY (date, campaign_id, competitor_domain)
)
""")
conn.commit()
return conn
def fetch_auction_insights(client, customer_id, campaign_id, date_range="LAST_7_DAYS"):
ga_service = client.get_service("GoogleAdsService")
query = f"""
SELECT
campaign.id,
metrics.auction_insight_search_impression_share,
metrics.auction_insight_search_overlap_rate,
metrics.auction_insight_search_position_above_rate,
metrics.auction_insight_search_top_of_page_rate,
metrics.auction_insight_search_outranking_share,
auction_insight.display_domain
FROM auction_insight
WHERE campaign.id = {campaign_id}
AND segments.date DURING {date_range}
"""
return ga_service.search_stream(customer_id=customer_id, query=query)
def detect_anomalies(conn, today_str):
"""Compare les 7 derniers jours avec la baseline des 30 jours précédents."""
cursor = conn.execute("""
SELECT competitor_domain,
AVG(impression_share) as avg_is_7d
FROM auction_insights
WHERE date >= date(?, '-7 days')
GROUP BY competitor_domain
""", (today_str,))
recent = {row[0]: row[1] for row in cursor.fetchall()}
cursor = conn.execute("""
SELECT competitor_domain,
AVG(impression_share) as avg_is_30d,
AVG(impression_share) + 2 * STDEV(impression_share) as upper_bound
FROM auction_insights
WHERE date >= date(?, '-37 days') AND date < date(?, '-7 days')
GROUP BY competitor_domain
""", (today_str, today_str))
baseline = {row[0]: {"avg": row[1], "upper": row[2]} for row in cursor.fetchall()}
alerts = []
for domain, current_is in recent.items():
if domain not in baseline:
alerts.append(f"NEW COMPETITOR: {domain} — IS: {current_is:.1%}")
elif current_is > baseline[domain]["upper"]:
delta = current_is - baseline[domain]["avg"]
alerts.append(
f"SPIKE: {domain} — IS: {current_is:.1%} "
f"(+{delta:.1%} vs baseline {baseline[domain]['avg']:.1%})"
)
return alerts
if __name__ == "__main__":
conn = init_db()
client = GoogleAdsClient.load_from_env()
today = datetime.now().strftime("%Y-%m-%d")
for campaign_id in BRANDED_CAMPAIGN_IDS:
try:
results = fetch_auction_insights(client, CUSTOMER_ID, campaign_id)
# ... insertion en base + détection anomalies
except GoogleAdsException as ex:
print(f"Erreur API Google Ads: {ex.failure.errors[0].message}")
alerts = detect_anomalies(conn, today)
if alerts:
print(f"[{today}] {len(alerts)} alertes branded defense:")
for a in alerts:
print(f" → {a}")
# Envoi Slack/email via webhook
conn.close()
Ce pipeline vous donne une baseline statistique. Sans baseline, vous ne pouvez pas distinguer un concurrent qui teste une enchère pendant 48h d'une attaque structurée qui va vous coûter 30K€ par trimestre.
Croiser PPC et SEO organique
L'erreur classique : traiter le PPC branded et le SEO branded en silos. Quand un concurrent commence à enchérir sur votre marque, le premier signal apparaît souvent côté organique — une baisse de CTR organique sur vos branded queries dans la Search Console, avant même que vous ne regardiez vos rapports Ads.
Surveillez dans Google Search Console le rapport Performance filtré sur vos requêtes de marque. Une chute de CTR organique sans baisse d'impressions organiques est le signal d'alerte : quelqu'un achète de l'espace au-dessus de vous.
Côté technique, assurez-vous que vos meta tags sont irréprochables sur vos pages branded. Un title tag tronqué ou une meta description manquante sur votre page pricing — la page la plus ciblée par les concurrents — c'est du CTR organique offert à l'attaquant. Un outil de monitoring comme SEOGard détecte automatiquement ce type de régression : une meta description qui disparaît après un déploiement, un title tag qui se duplique suite à un bug de template.
Scénario réel : e-commerce mode avec 12 000 SKUs sous attaque branded
Prenons un cas concret. Un e-commerce mode français — appelons-le MaisonTextile — gère 12 000 pages produit, 350 pages catégorie, et reçoit 180 000 visites mensuelles dont 42 % via branded search (organique + direct).
La situation de départ
MaisonTextile ne fait aucun PPC branded. Leur raisonnement : "On est déjà #1 en organique sur notre nom, pourquoi payer ?" En février, trois événements convergent :
- Un concurrent lance une campagne
maisontextile alternativeetmaisontextile avisavec des annonces redirigeant vers un tableau comparatif. - Un affilié achète
maisontextile promoetmaisontextile code réductionavec une landing page listant des codes promo expirés et des liens affiliés vers des concurrents. - Un revendeur non autorisé enchérit sur
maisontextile [catégorie]pour 15 catégories produit.
L'impact mesuré
Sur 6 semaines, les données Google Ads (une fois la campagne défensive lancée en urgence) et Search Console révèlent :
- CTR organique branded : 58 % → 31 % (chute de 27 points)
- Trafic branded total : -19 % sur la période
- Taux de conversion branded : stable (les gens qui arrivent convertissent toujours bien — mais moins de gens arrivent)
- Revenu perdu estimé : 47 000 € sur la période, basé sur le panier moyen de 85 € et un taux de conversion branded de 4,2 %
La riposte structurée
MaisonTextile déploie en 72h :
Campagne branded défensive avec trois ad groups (pure brand, brand + catégorie, brand + commercial). Budget quotidien : 120 € (CPC moyen de 0,35 € sur leurs branded — un dixième du CPC non-branded). Le coût mensuel de la défense : ~3 600 €. Le coût de l'inaction : ~24 000 €/mois de revenu perdu.
Plainte trademark déposée auprès de Google pour interdire l'utilisation de "MaisonTextile" dans le texte des annonces concurrentes. Délai de traitement : 2-3 semaines. Cela n'empêche pas les concurrents d'enchérir sur le mot-clé, mais les force à utiliser des annonces génériques moins performantes.
Optimisation organique agressive : refonte des title tags des 20 pages les plus ciblées (éviter les erreurs classiques), ajout de FAQ schema sur la page pricing et les pages catégorie principales, mise en place de sitelinks manuels dans la Search Console.
Résultat à 3 mois : impression share branded à 92 %, CTR organique remonté à 48 % (pas le niveau initial — la présence d'annonces, même les siennes, cannibalise un peu l'organique), et coût défensif PPC largement compensé par le revenu protégé.
Les trade-offs : quand la défense branded n'est PAS la bonne réponse
La défense PPC branded n'est pas universelle. Plusieurs situations méritent une approche différente.
Quand personne n'enchérit sur votre marque
Vérifiez avec l'Auction Insights. Si votre impression share branded est déjà à 95 %+ sans enchérir, vous dépenseriez de l'argent pour des clics que vous obtenez déjà gratuitement en organique. Le cas classique : les marques B2B de niche avec un volume de recherche branded inférieur à 500/mois. Les concurrents ne considèrent pas le volume suffisant pour enchérir.
Le problème de la cannibalisation
Enchérir sur votre propre marque cannibalise votre CTR organique. Des études internes de Google (le fameux "Search Ads Pause Studies" de 2011) suggéraient que 89 % des clics payants étaient incrémentaux. Cette stat est régulièrement contestée par des analyses indépendantes qui montrent un taux de cannibalisation plus proche de 40-60 % pour les branded queries où la marque est déjà #1 en organique.
Le calcul est simple : si un clic branded PPC vous coûte 0,30 € mais que 50 % de ces clics seraient venus via l'organique gratuit, votre coût effectif par clic incrémental est de 0,60 €. Reste à comparer avec la valeur du clic perdu au profit d'un concurrent. Si votre panier moyen est de 200 € avec un taux de conversion de 5 %, chaque clic branded vaut 10 € en espérance. Payer 0,60 € pour le protéger est trivial.
La question internationale
Pour les marques opérant sur plusieurs marchés, la complexité explose. Un concurrent peut enchérir sur votre marque dans un pays mais pas un autre. Les plaintes trademark sont spécifiques à chaque région Google Ads. La gestion des campagnes branded doit être cohérente à l'international, ce qui implique des budgets dédiés par marché et une coordination entre les équipes locales.
Intégrer la défense branded dans votre stack technique
La défense branded ne vit pas en isolation. Elle s'inscrit dans un écosystème technique plus large.
Synchroniser les changements SEO et PPC
Un déploiement technique peut casser votre défense branded sans que personne ne s'en aperçoive. Scénario fréquent : une migration front-end (par exemple un passage de rendu côté client vers du SSR — un sujet qu'on a couvert en détail) qui modifie les URLs des landing pages de vos campagnes branded. Les annonces pointent soudain vers des 404 ou des redirections, le Quality Score s'effondre, le CPC explose.
Intégrez dans votre checklist de déploiement une vérification systématique des URLs utilisées comme landing pages dans Google Ads. Un simple script CLI peut automatiser cette vérification :
#!/bin/bash
# Vérifie que toutes les landing pages des campagnes branded retournent un 200
# Extraire les URLs depuis un export Google Ads Editor (TSV)
LANDING_PAGES_FILE="branded_landing_pages.tsv"
ALERT_WEBHOOK="https://hooks.slack.com/services/T00000/B00000/XXXXXXX"
echo "=== Branded Landing Pages Health Check ==="
echo "Date: $(date -u +%Y-%m-%dT%H:%M:%SZ)"
ERRORS=0
while IFS=$'\t' read -r campaign adgroup url; do
STATUS=$(curl -o /dev/null -s -w "%{http_code}" -L --max-time 10 "$url")
REDIRECT_URL=$(curl -o /dev/null -s -w "%{url_effective}" -L --max-time 10 "$url")
if [ "$STATUS" != "200" ]; then
echo "ERREUR: $url → HTTP $STATUS (Campaign: $campaign)"
ERRORS=$((ERRORS + 1))
fi
# Vérifier si la page finale est différente (redirect chain)
if [ "$url" != "$REDIRECT_URL" ]; then
echo "REDIRECT: $url → $REDIRECT_URL (Campaign: $campaign)"
fi
# Vérifier que la page n'est pas en noindex
NOINDEX=$(curl -s -L "$url" | grep -i 'noindex' | head -1)
if [ -n "$NOINDEX" ]; then
echo "NOINDEX DÉTECTÉ: $url (Campaign: $campaign)"
echo " → $NOINDEX"
ERRORS=$((ERRORS + 1))
fi
done < "$LANDING_PAGES_FILE"
if [ $ERRORS -gt 0 ]; then
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"🔴 Branded Defense Alert: $ERRORS erreurs détectées sur les landing pages PPC branded. Vérification immédiate requise.\"}" \
"$ALERT_WEBHOOK"
fi
echo "=== Terminé: $ERRORS erreurs ==="
Ce script vérifie trois choses critiques : le code HTTP, la présence de redirections inattendues, et — point souvent oublié — la présence d'une directive noindex qui rendrait la landing page inéligible à un bon Quality Score (Google pénalise les annonces pointant vers des pages bloquées au crawl ou en noindex).
L'évolution PPC : IA, visuels et nouvelles surfaces
La défense branded va se complexifier avec l'évolution des formats publicitaires. Les campagnes Performance Max de Google, qui mélangent Search, Display, YouTube et Shopping dans un seul objet, rendent le contrôle de la branded defense plus opaque. Vous ne pouvez pas facilement exclure les branded queries d'une campagne PMax concurrente. L'IA de Google décide.
La parade : des campagnes branded Search standard distinctes, avec un budget prioritaire, qui "captent" le trafic branded avant que PMax ne le fasse. Google Ads donne la priorité aux campagnes Search en exact match sur les campagnes PMax pour la même requête — mais uniquement si l'exact match est explicitement configuré.
La branded search comme système de défense, pas comme ligne budgétaire
Protéger votre branded search n'est pas une dépense marketing optionnelle. C'est une infrastructure technique de protection du revenu, au même titre que la surveillance de vos backlinks ou le monitoring de vos Core Web Vitals.
La clé : l'automatisation du monitoring (scripts Ads, vérification des landing pages, alertes Auction Insights), une architecture de campagne segmentée, et une synchronisation technique entre vos équipes SEO et PPC. Les marques qui perdent leur branded search ne le perdent pas en un jour — elles le perdent par manque de visibilité sur ce qui se passe dans les SERPs. Un monitoring continu — que ce soit via des scripts maison, SEOGard pour la partie organique et technique, ou une combinaison des deux — est le seul moyen de ne pas découvrir l'attaque après les dégâts.