Un nom d'entreprise, une période, un rapport complet.
Vous tapez le nom du client et la période (3, 6, 12 mois ou dates libres). En 10 à 15 secondes, n8n va chercher les chiffres dans GA4, Google Business Profile, SayRank, la base des formulaires et Google Maps, puis renvoie le rapport HTML complet aux couleurs Saycom.
Ce que vous donnez
Le nom du client tel qu'il est dans EXPORT_SAYRANK, et la période. La comparaison avec l'année précédente (N-1) est calculée toute seule.
Ce que fait le système
Il vérifie la demande, retrouve le client, choisit le bon compte Google, interroge 6 sources en parallèle, puis cherche les concurrents.
Ce que vous recevez
Une page HTML prête à montrer ou imprimer. Si une source est en panne, le rapport sort quand même, avec la case concernée vide.
Le parcours d'une demande
Chaque bloc est cliquable : il ouvre la fiche du workflow correspondant, avec tous ses nodes.
Qui fait quoi, node par node
Choisissez un workflow, puis cliquez ou survolez un node : le panneau explique son rôle en clair et donne le détail technique pour le dev.
D'où vient chaque chiffre du rapport
Une ligne par source de données : le workflow qui la lit, et les variables du rapport qu'elle remplit. Les noms en majuscules sont les cases du template.
Les variables sont toutes calculées dans le node Compute derived de WF0, à partir des réponses brutes. Les flags HAS_… affichent ou masquent un bloc entier du rapport.
Quand ça ne passe pas
Deux familles bien séparées : la demande est fausse (le système refuse avec un message clair), ou une source est en panne (le rapport sort quand même).
1. La demande est refusée
Réponse JSON {error, message, field, details}. Le front doit se baser sur error, qui ne change jamais.
2. Une source tombe : rapport dégradé, pas d'échec
Les 6 appels de collecte et l'appel SerpApi sont réglés sur onError = continueRegularOutput. Une source en panne laisse sa case vide (— ou 0) ou masque son bloc.
Maintenance
Les gestes courants, les règles à ne pas casser et les points encore ouverts.
Ajouter un compte Google
Un nouveau client branché sur un compte Google que n8n ne connaît pas encore.
- Créer le credential dans n8n : Google Analytics OAuth2 pour GA4, Google OAuth2 API pour GBP. Garder la convention de nom :
Google Analytics account - <email>etGoogle account - <partie avant @>. - Dans sub-ga4-call : ajouter une règle au Switch
ga4_email(égalité exacte, sensible à la casse, sur l'email complet), dupliquer un nodeGA4 - …, lui donner le nouveau credential, le brancher sur une nouvelle entrée du Merge (augmenter son nombre d'entrées). - Dans sub-gbp-call : même chose sur le Switch
gbp_email, mais la règle compare la partie avant le @ (gbp_email_local). - Remplir
email_ga4/email_gbpet les IDs du client dans EXPORT_SAYRANK, puis lancer un rapport test.
Attention : les Switch n'ont pas de sortie par défaut. Un email absent des règles ne lève pas d'erreur, la source revient simplement vide dans le rapport.
Modifier le template ou WF0
- Le template rendu est
template-suivi-client-v4.html, mais il est régénéré parretokenize_v4.pydepuistemplate-v4-new.html. Une retouche faite à la main sur le fichier rendu est perdue à la régénération : passer par unrep()dans le script. - Déployer avec
deploy_v4.py wf6(ouwf0,form). Le script ré-encode le template en base64 dansRender mustache, fait un PUT sur l'ID live (pas de doublon) et écrit d'abord un backupbackup-live-<ID>-<slot>.json. Option--dry-runpour voir sans écrire. - Les identifiants n8n se chargent depuis
.env(jamais commité). - Le backup est l'état d'avant le déploiement. Pour auditer ce qui tourne vraiment, relire le workflow live via l'API (
GET /api/v1/workflows/<id>).
deploy_v4.py ne couvre que WF0, WF6 et WF-Form. WF1 à WF4 et les deux sub-workflows se modifient dans l'éditeur n8n (ou via redeploy.py).
Règles à ne pas casser
- Ne jamais toucher au workflow legacy
k4gIRb1GRvKc15sW(ancien rapport Google Slides, environ 250 nodes). Il ne fait pas partie de ce système. - EXPORT_SAYRANK est la seule source de vérité pour les clients (sheet
1AO6prkiy1oL55Z4ibgya9gc2EgKQ4atiRHmK3qqArY0, onglets « Feuille 1 » et « Liste entreprise Sayrank »). Les anciennes sheets d'inventaire GA4 et GBP sont obsolètes. - Pas de mode
keypairpour des paramètres de requête répétés dans un node HTTP : n8n dédoublonne les clés. Les 8dailyMetricsGBP sont donc écrits en dur dans l'URL (nodeLookupde WF2). - Les nodes Execute Workflow portent l'ID du sub-workflow en dur. Si un sub-workflow est recréé, il faut repatcher ces IDs (
patch_subwf_refs.py) avant d'activer. - Mustache, pas Handlebars : Handlebars plante dans le sandbox n8n. Pas de
{{littéral dans le JS du template. - Les noms des nodes comptent : le code lit d'autres nodes par leur nom (
$('Lookup unique'),$('Merge KPIs')…). Renommer un node casse ces références.