| name | audit-business |
| description | Audit complet de la presence digitale d'un business local — GMB, site web, pixels, pubs, SEO local, reseaux sociaux, concurrents — avec generation d'un rapport HTML brande client |
| triggers | ["audit-business","audit digital","audit presence","analyser un business"] |
SKILL: audit-business
Audit complet de la presence digitale d'un business local.
9 etapes. 1 rapport HTML client. Deploy optionnel sur Vercel.
Duree estimee: 15-30 minutes par audit.
Vue d'ensemble
ETAPE 0: Setup initial → Playwright + config agence (premiere fois seulement)
ETAPE 1: Identification → Trouver le business sur Google Maps
ETAPE 2: Scan GMB → Fiche Google, avis, concurrents
ETAPE 3: Scan site web + pixels → HTML, PageSpeed, tracking, screenshots
ETAPE 4: Scan publicites → Meta Ads Library, Google Ads, TikTok
ETAPE 5: SEO local → Position Google, on-page, NAP
ETAPE 6: Reseaux sociaux → Instagram, Facebook
ETAPE 7: Analyse concurrents → Delta avec top 3 locaux
ETAPE 8: Generation rapport HTML → 1 fichier HTML client
ETAPE 9: Deploy (optionnel) → Lien Vercel public
ETAPE 0 — SETUP INITIAL (premiere utilisation seulement)
A. Verifier Playwright MCP
Lire ~/.claude.json (ou ~/.config/claude/claude_desktop_config.json selon le systeme). Chercher @playwright/mcp dans les mcpServers.
Si absent — executer automatiquement ces commandes bash DANS L'ORDRE :
npm install -g @playwright/mcp@latest
npx playwright install chromium --with-deps
Puis afficher ce message exact :
Playwright installe avec succes.
ACTION REQUISE : Ferme completement Claude Code et relance-le.
Ensuite, retape ta commande : /audit-business [Nom], [Ville]
Et STOP — ne pas continuer jusqu'au redemarrage.
Si present — continuer.
B. Verifier config agence
Lire ~/.claude/audit-agency-config.json.
Si absent — poser ces questions UNE PAR UNE et attendre la reponse :
- "Quel est le nom de ton agence ?"
- "URL de ton logo ? (optionnel — appuie sur Entree pour passer)"
- "Couleur principale de ton agence ? (ex: #B8860B — Entree pour defaut or)"
- "Site web de ton agence ? (ex: monagence.fr — Entree pour passer)"
- "Cle API Google Places ? (OPTIONNEL — permet d'eviter les CAPTCHAs sur Google Maps. Sans elle, Playwright sera utilise mais peut etre bloque. Cree-la gratuitement sur console.cloud.google.com > APIs > Places API > Credentials. Entree pour passer.)"
- "Token Vercel ? (OPTIONNEL — permet de publier le rapport sur un lien web. Cree-le sur vercel.com/account/tokens. Entree pour passer.)"
- "Token Meta Ads API ? (OPTIONNEL mais RECOMMANDE — permet de verifier si le business fait de la publicite sur Facebook/Instagram via l'API officielle, sans risque d'etre bloque. Guide de creation juste en dessous. Entree pour passer.)"
GUIDE CREATION TOKEN META ADS (pour les debutants) :
Afficher ce message mot pour mot si l'utilisateur demande comment faire :
Pour creer ton token Meta Ads (gratuit, 10 minutes) :
1. Va sur developers.facebook.com
2. Connecte-toi avec ton compte Facebook personnel
3. Clique sur "Mes applications" en haut a droite
4. Clique "Creer une application"
5. Choisis "Autre" → "Aucun" → donne un nom (ex: "Audit Tool")
6. Une fois l'app creee, va dans Parametres > Basique
7. Copie l'ID de l'application (App ID)
8. Clique sur "Afficher" a cote de Cle secrete de l'app (App Secret)
9. Ton token = APP_ID|APP_SECRET (avec le caractere | entre les deux)
Exemple : 1234567890|abcdef1234567890abcdef
C'est tout — gratuit, pas de verification requise pour l'API Ads Library.
Sauvegarder dans ~/.claude/audit-agency-config.json :
{
"agence": {
"nom": "[reponse 1]",
"logo_url": "[reponse 2 ou null]",
"couleur": "[reponse 3 ou #B8860B]",
"site": "[reponse 4 ou null]"
},
"google_places_api_key": "[reponse 5 ou null]",
"vercel_token": "[reponse 6 ou null]",
"meta_app_token": "[reponse 7 ou null]",
"tarifs": {
"creation_site": "500-1500 EUR",
"refonte_mobile": "300-800 EUR",
"seo_local": "200-500 EUR/mois",
"google_ads": "300 EUR setup + budget pub",
"gestion_reseaux": "149-299 EUR/mois",
"optimisation_gmb": "299 EUR one shot",
"visuels_ia": "149 EUR/mois",
"strategie_avis": "99-199 EUR/mois"
}
}
Confirmer : "Config sauvegardee. On demarre l'audit !"
ETAPE 1 — IDENTIFICATION DU BUSINESS
Input accepte
/audit-business Boulangerie Martin, Lyon
/audit-business https://boulangerie-martin.fr
/audit-business Boulangerie Martin (sans ville — demander la ville)
Si Google Places API key presente dans config
Appeler l'API Places (New) :
curl -s -X POST "https://places.googleapis.com/v1/places:searchText" \
-H "Content-Type: application/json" \
-H "X-Goog-Api-Key: [key]" \
-H "X-Goog-FieldMask: places.displayName,places.formattedAddress,places.rating,places.userRatingCount,places.websiteUri,places.regularOpeningHours,places.photos,places.id,places.primaryType,places.types" \
-d '{"textQuery": "[Nom] [Ville]", "languageCode": "fr", "regionCode": "FR"}'
Si pas de Google Places API key
Playwright — ouvrir https://www.google.com/maps/search/[Nom]+[Ville] — screenshot — extraire visuellement : adresse, note, avis, site.
Verification identite
Afficher l'adresse trouvee et demander confirmation si plusieurs resultats.
Data a stocker
business_name, business_address, business_city,
business_domain (extrait du site si present),
business_place_id
ETAPE 2 — SCAN GMB COMPLET
Si Google Places API key presente
Recuperer via API Places :
rating — note exacte
userRatingCount — nombre d'avis
regularOpeningHours — horaires complets
photos — nombre de photos
websiteUri — site web
primaryType + types — categories
Concurrents via Places API :
Appeler searchText avec "[type de business] [ville]" — recuperer les 5 premiers resultats — extraire note + nombre d'avis + nom pour chacun.
Si pas d'API
Playwright sur Google Maps :
- Screenshot de la fiche
- Extraire visuellement note, avis, photos presentes (compter), horaires, description
- Chercher les concurrents dans le pack local (3 premiers)
Analyser les reponses aux avis
Playwright navigue sur la fiche — ouvre les avis — scrolle les 10 premiers — compte combien ont une reponse du proprietaire.
Data a stocker
gmb_rating, gmb_review_count, gmb_photos_count,
gmb_has_hours, gmb_has_description,
gmb_response_ratio (ex: "4/10"),
gmb_competitors (array de 3: {nom, rating, review_count})
ETAPE 3 — SCAN SITE WEB + PIXELS
Si business_domain trouve :
A. curl du HTML source
curl -sL --max-time 10 -A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" "https://[domain]" -o /tmp/audit_source.html
Analyser le HTML brut :
- HTTPS : URL commence par
https:// ?
- Meta Pixel : chercher
fbq( ou fbevents.js ou facebook.net/en_US/fbevents — extraire l'ID si trouve (pattern fbq('init', '[0-9]+'))
- Google Ads : chercher
AW-[0-9]+ — extraire l'ID
- GTM : chercher
GTM-[A-Z0-9]+ — extraire l'ID (noter : GTM peut charger d'autres pixels)
- TikTok : chercher
ttq. ou tiktok.com/i18n/pixel
- Snapchat : chercher
snaptr( ou sc-static.net
- Stack : detecter
wp-content = WordPress, shopify = Shopify, wix.com = Wix, squarespace = Squarespace
- Schema.org : chercher
application/ld+json ou schema.org
- Meta title : extraire contenu de
<title>
- Meta description : extraire contenu de
<meta name="description"
B. Playwright pour analyse visuelle
- Screenshot desktop (1280x800)
- Screenshot mobile (375x812) — verifier si le contenu s'adapte
- Mesurer si numero/bouton contact visible sans scroller (above the fold)
- Si GTM detecte — executer la page entiere avec Playwright et re-scanner les network requests pour detecter les pixels charges dynamiquement
C. PageSpeed Insights API (aucune cle requise)
curl -s "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://[domain]&strategy=mobile" -o /tmp/pagespeed_[slug].json && python3 -c "
import json, sys
try:
d = json.load(open('/tmp/pagespeed_[slug].json'))
if 'lighthouseResult' not in d:
print('NON_VERIFIE')
sys.exit()
cats = d['lighthouseResult']['categories']
audits = d['lighthouseResult']['audits']
perf = int(cats['performance']['score'] * 100)
lcp = audits.get('largest-contentful-paint', {}).get('displayValue', 'N/A')
fcp = audits.get('first-contentful-paint', {}).get('displayValue', 'N/A')
print(f'Score mobile: {perf}/100')
print(f'LCP: {lcp}')
print(f'FCP: {fcp}')
except Exception as e:
print('NON_VERIFIE')
"
Extraire : score performance mobile, LCP, FCP.
Si erreur ou quota depasse → stocker website_score_mobile: "Non verifie (quota API)" et continuer sans bloquer.
D. Logo client
curl -sI "https://logo.clearbit.com/[domain]" | grep "HTTP/"
Si 200 — logo trouve — URL = https://logo.clearbit.com/[domain]
Si 404 — logo_url = null
Si pas de site
Stocker has_website: false — argument de vente majeur.
Data a stocker
has_website, website_url, website_https, website_score_mobile,
pixels: {
meta: {present, id},
google_ads: {present, id},
gtm: {present, id},
tiktok: {present},
snapchat: {present}
},
website_has_schema, website_meta_title, website_meta_desc,
website_stack, website_contact_visible, website_lcp,
client_logo_url (Clearbit ou null)
ETAPE 4 — SCAN PUBLICITES ACTIVES
Meta Ads Library
Si meta_app_token present dans la config → utiliser l'API officielle (fiable, aucun risque de blocage) :
curl -s "https://graph.facebook.com/v19.0/ads_archive?access_token=[meta_app_token]&search_terms=[nom+business]&ad_reached_countries=FR&ad_active_status=ACTIVE&fields=id,ad_delivery_start_time,ad_creative_bodies&limit=5"
- Si le JSON retourne des resultats →
meta_ads_active: true
- Si le JSON est vide
{"data":[]} → meta_ads_active: false
- Si erreur API (token invalide, etc.) → noter
meta_ads_active: "non_verifie" et passer
Si pas de meta_app_token → Playwright sur la page publique :
https://www.facebook.com/ads/library/?active_status=active&ad_type=all&country=FR&q=[nom+business]&search_type=keyword_unordered
- Anti-detection headers basiques (Accept-Language: fr-FR)
- Screenshot de la page
- Chercher visuellement si des annonces sont presentes
- Si bloque/CAPTCHA →
meta_ads_active: "non_verifie" et passer
NOTE pour les debutants : Sans meta_app_token, cette etape peut echouer a cause des protections anti-bot de Facebook. C'est normal — le reste de l'audit reste valide. Pour fiabiliser, creer un token Meta (guide dans ETAPE 0).
Google Ads (Search)
Playwright en navigation privee (incognito context) :
https://www.google.com/search?q=[metier]+[ville]&gl=fr&hl=fr
- Screenshot des resultats
- Chercher les divs avec
[data-text-ad] ou le label "Sponsorise"
- Compter les annonces sponsorisees
- Le business analyse est-il dans les annonces sponsorisees ?
- Si CAPTCHA detecte — noter
google_ads_scan: "captcha_bloquant" et passer
TikTok Ads Library
Playwright — https://library.tiktok.com/ads?region=FR&keyword=[nom+business]
- Screenshot
- Annonces actives ? —
tiktok_ads_active
Analyse croisee pixels vs pubs
| Situation | Verdict |
|---|
| Meta Pixel installe + Meta Ads active | Ils font de la pub FB/Insta correctement |
| Meta Pixel installe + ZERO pub active | Pixel installe mais pas de campagne (argent depense en setup, zero resultat) |
| Meta Pixel absent + pub active | Pub sans tracking — impossible de mesurer les resultats |
| Rien du tout | Pas de pub digitale |
ETAPE 5 — SEO LOCAL
Position sur Google Search
Playwright (incognito) — https://www.google.com/search?q=[type_business]+[ville]&gl=fr&hl=fr
- Screenshot
- Le business apparait-il dans les resultats organiques ? Position ?
- Est-il dans le Pack Local (3 resultats avec carte) ?
- Si CAPTCHA — noter "non_verifie" et passer
Analyse SEO on-page (depuis le HTML deja recupere)
website_meta_title : contient le nom du business ET la ville ?
website_meta_desc : presente et descriptive ?
- Schema.org LocalBusiness : present ?
- H1 visible : contient les mots-cles metier + ville ?
NAP Consistency
Extraire depuis le site web (HTML source) :
- Numero de telephone : chercher pattern
+33 ou 0[1-9][ .-]?[0-9]{2}
- Adresse : chercher Schema.org ou balises contact
Comparer avec l'adresse/tel de la fiche GMB.
Si differents — nap_inconsistency: true — probleme SEO local silencieux.
ETAPE 6 — RESEAUX SOCIAUX
Instagram
Playwright — chercher sur Google : site:instagram.com "[nom business]" "[ville]"
- Si profil trouve — naviguer dessus
- Verifier bio : contient la ville du business ? Si non — "Aucun compte verifie"
- Si confirme : noter date du dernier post visible, regularite apparente, qualite visuelle (subjective : amateur/correct/pro)
- Screenshot du profil
Facebook
Meme logique. Playwright — chercher site:facebook.com "[nom business]" "[ville]"
- Verifier que la page correspond au bon business (adresse/ville dans les infos)
- Date dernier post, avis sur la page Facebook si presents
REGLE ABSOLUE
Si la bio/page ne mentionne pas clairement la bonne ville — ecrire "Aucun compte [reseau] trouve et verifie pour ce business." JAMAIS analyser un compte non confirme.
ETAPE 7 — ANALYSE CONCURRENTS
Utiliser les donnees deja recuperees a l'etape 2 (top 3 concurrents du pack local).
Pour chacun des 3 concurrents, faire une analyse rapide :
- A-t-il un site web ? (chercher dans les resultats Google Maps)
- Sa note + nombre d'avis vs notre client
- Est-il dans le Pack local ?
- Fait-il de la pub ? (verifier dans les resultats "Sponsorise" de l'etape 5)
Generer le delta : Ce que les concurrents font et que notre client ne fait PAS.
ETAPE 8 — GENERATION DU RAPPORT HTML
Lire la config agence depuis ~/.claude/audit-agency-config.json.
Creer le dossier ~/Desktop/Audits/ si absent.
Generer 1 fichier HTML standalone (ZERO dependance externe sauf Google Fonts CDN) :
~/Desktop/Audits/audit-[nom-business-slug]-CLIENT.html
DESIGN DU RAPPORT
:root {
--gold: [couleur agence depuis config, defaut #B8860B];
--gold-light: [version claire automatique];
--bg: #FFFFFF;
--text: #000000;
--text-muted: #666666;
--green: #10b981;
--red: #ef4444;
--orange: #f59e0b;
--card-border: rgba(0,0,0,0.08);
}
Police : Inter depuis Google Fonts CDN.
Filigrane : nom de l'agence (depuis config) en diagonal, opacity 0.05, sur toute la page.
LOGO AGENCE — REGLE ABSOLUE :
- La cover est toujours sur fond sombre (#111 ou similaire)
- Le logo agence doit etre TOUJOURS visible sur fond sombre
- Appliquer systematiquement
filter: brightness(10) saturate(0) sur le logo agence dans la cover → le rend blanc pur, lisible sur n'importe quel fond sombre
- Si la config contient un SVG local (
/Users/...), le lire et l'embedder en base64 dans le HTML pour etre standalone
- Ne JAMAIS afficher le logo sur fond sombre sans ce filtre
STRUCTURE DU RAPPORT CLIENT
Le rapport CLIENT est un document commercial — pas un audit technique. Structure simple, 3 blocs uniquement.
Structure rapport CLIENT
COVER :
- Logo agence (avec filtre blanc sur fond sombre) + logo client
- Titre : "Analyse de votre presence digitale — [Nom Business]"
- Date et ville
- Score global visuel (jauge ou cercle, pas de chiffre brut)
BLOC 1 — CE QUI FONCTIONNE BIEN
- Liste des points positifs detectes (max 5 bullets)
- Ton valorisant — ce sont des acquis a conserver
- Exemples : "Votre site est bien adapte aux smartphones", "Votre fiche Google est bien renseignee"
- Inclure des screenshots pertinents pour illustrer
BLOC 2 — CE QUI PEUT ETRE AMELIORE
- Liste des points faibles detectes (max 5 bullets)
- Ton neutre et factuel — pas alarmiste, pas infantilisant
- Exemples : "Votre restaurant n'apparait pas quand un habitant cherche 'restaurant japonais Rennes'", "Votre compte Instagram n'a pas ete mis a jour depuis plusieurs mois"
- REGLE : N'inclure QUE les points qu'on a reellement verifies. Si non verifie = absent du rapport. Jamais de "non verifie" visible.
- Inclure des screenshots pour montrer concretement le probleme
BLOC 3 — LES AXES DE DEVELOPPEMENT
- Liste des axes d'amelioration (max 5)
- Format : titre de l'axe + 1 phrase d'impact business
- INTERDIT : prix, tarifs, fourchettes — c'est le role du commercial lors de l'appel
- INTERDIT : nommer les methodes ("cartes NFC", "Meta Pixel", "campagne retargeting") — rester sur l'objectif
- INTERDIT : expliquer comment on va faire — on vend la direction, pas la methode
- Exemples corrects :
- "Ameliorer votre visibilite sur les recherches locales" (pas "installer Schema.org")
- "Developper votre acquisition d'avis clients" (pas "mettre des cartes NFC")
- "Activer votre presence publicitaire en ligne" (pas "installer le Meta Pixel et lancer des campagnes retargeting")
FOOTER :
- Coordonnees agence
- "Ce document a ete prepare exclusivement pour [Nom Business]" — sentiment d'exclusivite
- Pas de mention du prix, pas de CTA direct — l'appel de closing se fait a cote
Regles de ton CLIENT
- Phrases courtes, simples, directes
- Jamais de jargon technique (SEO, pixel, GTM, LCP, schema, etc.)
- Toujours "vous" / "votre" — jamais "nous" sauf pour "nous avons analyse"
- Le client doit sentir que ce rapport a ete fait POUR LUI, pas genere en masse
- Chaque point doit etre illustre par un screenshot ou une donnee concrete
ETAPE 9 — DEPLOY (optionnel, demande a chaque audit)
A la fin de la generation :
Rapport genere :
~/Desktop/Audits/audit-[nom]-CLIENT.html
Veux-tu publier ce rapport sur un lien web ? (oui/non)
Si oui
- Verifier que la CLI Vercel est installee :
which vercel — si absent, npm install -g vercel
- Verifier que l'utilisateur est connecte :
vercel whoami — si non connecte, vercel login
- Creer un dossier temporaire et y copier le rapport CLIENT :
mkdir -p /tmp/audit-[nom-slug]-deploy
cp ~/Desktop/Audits/audit-[nom]-CLIENT.html /tmp/audit-[nom-slug]-deploy/index.html
- Deployer avec la CLI Vercel (pas l'API — l'API ne permet pas de creer de projet) :
cd /tmp/audit-[nom-slug]-deploy && vercel --yes --prod 2>&1 | tail -5
- Extraire l'URL
https://audit-[nom-slug]-deploy.vercel.app depuis la sortie CLI
- Retourner l'URL au client
NOTE IMPORTANTE : Ne PAS utiliser l'API Vercel REST (v2/files ou v13/deployments) pour creer un nouveau projet — elle retourne systematiquement 403 forbidden meme avec un token valide. La CLI Vercel est la seule methode fiable pour un premier deploiement.
Si non
"Ton rapport est pret dans ~/Desktop/Audits/"
REGLES NON-NEGOCIABLES
- ZERO donnee inventee — Si non verifie, ecrire "Non verifie" ou "Non accessible lors de l'audit"
- Verifier l'identite du business — Toujours confirmer adresse avant d'analyser
- Reseaux sociaux — Si la bio ne mentionne pas la bonne ville, ecrire "Aucun compte trouve"
- Pas de followers — Ne jamais noter le nombre de followers (peut etre achete)
- UNE recommandation prioritaire — Pas 10. La plus urgente, la plus impactante.
- Pas d'estimation financiere en euros — Impact qualitatif uniquement ("vous perdez des clients", pas "vous perdez 3000 EUR/mois")
- Navigation privee pour Google Search — Toujours
- Si CAPTCHA — noter "Non accessible (protection anti-bot)" et passer
CALCUL DU SCORE
Score GMB /10
- Note > 4.5 ET > 100 avis = 10
- Note > 4.0 ET > 50 avis = 7
- Note > 3.5 OU < 50 avis = 5
- Pas de fiche ou < 20 avis = 2
- Retrancher 1 point si < 3 reponses aux avis sur 10
- Retrancher 1 point si < 5 photos
Score Site /10
- Pas de site = 0
- Site present : base 5
- HTTPS = +1
- Score mobile > 80 = +1
- Contact visible = +1
- Stack pro (pas Wix) = +1
- Schema.org present = +1
Score Tracking/Pub /10
- Aucun pixel, aucune pub = 0
- Au moins 1 pixel installe = +3
- Pub active sur au moins 1 canal = +3
- Pixel ET pub coherents = +2
- Multi-canal (2+ reseaux) = +2
Score SEO /10
- Pack local present = +4
- Page 1 Google = +3
- Meta title/desc optimises = +2
- Schema.org = +1
Score Reseaux /10
- Aucun compte verifie = 0
- 1 compte actif (< 1 mois) = 5
- 2 comptes actifs = 7
- Contenu de qualite pro = +2
- Posts reguliers (< 2 semaines) = +1
Score global
Moyenne des 5 scores.
MAPPING AGENTS
| Etape | Agent | Pourquoi |
|---|
| 0 Setup | tate | Config infra, Playwright |
| 1 Identification | storm | Recherche, Google Places |
| 2 GMB | storm | Scan, data extraction |
| 3 Site web | tate + light | Tate = analyse technique, Light = QA securite |
| 4 Publicites | storm | Scan ads libraries |
| 5 SEO | storm | Analyse positionnement |
| 6 Reseaux | storm | Recherche profils sociaux |
| 7 Concurrents | storm + ghost | Storm = data, Ghost = analyse strategique |
| 8 Rapport | dre + tasha | Dre = HTML/design, Tasha = copy client vulgarisee |
| 9 Deploy | tate | Vercel API |
DOSSIER DE SORTIE
~/Desktop/Audits/
├── audit-[nom-business-slug]-CLIENT.html
└── screenshots/
├── gmb-[nom].png
├── site-desktop-[nom].png
├── site-mobile-[nom].png
├── meta-ads-[nom].png
├── google-search-[nom].png
├── instagram-[nom].png
└── facebook-[nom].png