# Workflows n8n — Fidulia
> Documentation des workflows déployés · Agent 70
> Instance : n8n Cloud · Timezone : Europe/Paris

---

## _ERROR-HANDLER — créé le 2026-06-23

- **Déclencheur :** Error Trigger (capte les erreurs de tous les autres workflows)
- **Flux :** Error Trigger → Gmail (alerte fabien@fabien-massavie.com)
- **Bases Notion concernées :** aucune (logging Notion à ajouter quand la base « Erreurs n8n » existera)
- **Cron :** —
- **Dernière modif :** 2026-07-16 — branché sur les 5 workflows actifs (Settings → Error Workflow)
- **Statut :** ✅ PUBLIÉ + branché sur les 5 workflows actifs : Veille — Scrape & File d'attente (6h) · VEILLE-DIGEST-EMAIL · Veille CGP - Queue API (webhooks) · Veille CGP - Perplexity (vendredi 8h) · Veille — Queue API (webhooks) · credential Gmail OK

---

## VEILLE-DIGEST-EMAIL — créé le 2026-06-23 ⭐ WORKFLOW ACTIF

> Architecture (MAJ 02/07/2026) : TROIS routines Claude Code tournent chaque matin lun-ven et produisent chacune leur section dans un fichier d'assemblage commun, sur la machine :
> - `prospection-fidulia-batch` (5h36) → section "📊 Prospection"
> - `verification-acceptations-linkedin` (6h07) → section "✅ Invitations acceptées"
> - `veille-matin-fidulia` (7h09, dernière à tourner) → ajoute "💬 À commenter aujourd'hui" + "📰 Veille du jour", puis fait l'**unique push** du jour vers n8n
>
> n8n (serveur Hostinger, sans accès au disque local) ne fait que mise en forme + envoi d'**un seul email combiné**. n8n ne lit PAS LinkedIn ni les fichiers locaux.

- **Déclencheur :** Webhook POST `https://n8n.srv1258257.hstgr.cloud/webhook/veille-digest-fidulia`
- **Flux :** Webhook (reçoit `{markdown, subject}`) → Markdown→HTML (destinationKey `html`) → Gmail (email brief unique)
- **Fichier d'assemblage partagé :** `Agents/70-Agent-Automatisation/routine/DIGEST-DUJOUR-[date].md` — créé par la 1ère routine du matin qui tourne, complété par les suivantes, lu et poussé par la dernière (`veille-matin-fidulia`)
- **Garde-fous :** chaque routine vérifie si le fichier existe déjà avant d'écrire (append, jamais écraser) ; si une routine amont a échoué, sa section est absente et remplacée par une mention neutre plutôt que de bloquer l'envoi
- **Auth webhook :** None (v1, URL secrète) — durcissement Header Auth possible
- **Statut :** ✅ PUBLIÉ (actif) · Gmail OK · un seul email/matin, un seul expéditeur du push (`veille-matin-fidulia`)
- **Lien routines :** `~/.claude/scheduled-tasks/prospection-fidulia-batch/SKILL.md` · `~/.claude/scheduled-tasks/verification-acceptations-linkedin/SKILL.md` · `~/.claude/scheduled-tasks/veille-matin-fidulia/SKILL.md` (assemble + push, via `Agents/70-Agent-Automatisation/routine/ROUTINE-VEILLE-MATIN.md` ÉTAPE 5)
- **Ancienne architecture (jusqu'au 29/06/2026)** : `veille-linkedin-matin` (7h01) + `veille-strategie-interaction` (6h54), désormais désactivées, remplacées par `veille-matin-fidulia`

---

## VEILLE-RSS-MATIN — créé le 2026-06-23 (⚠️ SUPERSÉDÉ par VEILLE-DIGEST-EMAIL)

> Première approche RSS→Claude. Abandonnée : ne reproduisait pas la vraie veille LinkedIn (RSS ≠ fil LinkedIn). Conservé inactif comme référence. Peut être supprimé.

- **Déclencheur :** Schedule — `30 6 * * 1-5` (lun-ven 6h30 Europe/Paris)
- **Flux :** Schedule → Sources RSS → Lecture RSS → Filtre 48h+bundle → Claude API → Extraire HTML → Gmail (brief 7h00)
- **Bases Notion concernées :** aucune en v1 (logging des choix client = Phase 1b)
- **API externe :** Anthropic `claude-sonnet-4-6` (HTTP Request, credential Header Auth « x-api-key »)
- **Sources :** Google Alerts (RSS) + TechCrunch / Wired / MIT Tech Review / The Verge
- **Cron :** `30 6 * * 1-5`
- **Dernière modif :** 2026-06-23 — création + correctifs (strip ```html, sujet sans emoji, attribution n8n off)
- **Statut :** ✅ IMPORTÉ + testé 2× avec succès (mail propre reçu) · credentials Gmail + Anthropic OK · ⏳ non activé (à publier) · ⏳ flux Google Alerts à ajouter
- **Credential Anthropic :** Header Auth « x-api-key » créé · modèle claude-sonnet-4-6
- **Test 2026-06-23 :** 90 articles RSS → 1 retenu (filtre honnête, sources test = presse tech)

---

## Veille — Scrape & File d'attente (6h) — refonte asynchrone + segmentation le 2026-07-17

> Workflow historique de la veille LinkedIn (export : `Agents/70-Agent-Automatisation/n8n/veille-scrape-file.json`). Refonte complète le 17/07/2026 suite aux échecs quotidiens depuis le 14/07.

- **Déclencheur :** Schedule — `0 6 * * 1-5` (lun-ven 6h Europe/Paris)
- **Flux :** Schedule → Lire Profils (Sheet) → Préparer input Apify (segmentation) → **POST /runs Apify → [Wait 60 s → GET statut → Switch] en boucle → GET dataset** → Normaliser → Lire Historique → Filtrer → File-à-traiter (PENDING) + Historique
- **Cause de la refonte :** l'endpoint `run-sync-get-dataset-items` a un plafond dur de **300 s côté Apify** ; le batch (318 profils depuis l'expansion du 10/07) dépassait 5 min → erreur systématique à 6h du 14 au 17/07, alors que les runs Apify réussissaient en arrière-plan. Le timeout de l'acteur (console Apify) est sans effet : il ne s'applique ni à l'endpoint sync, ni aux runs lancés via API.
- **Segmentation par rôle** (nœud « Préparer input Apify », colonne `role` du Sheet Veille) — **revue le 21/07/2026** :
  | Segment | Rôles | Profils | Cadence |
  |---|---|---|---|
  | CHAUD | REACH-FR, NICHE-FR, NICHE-CGP-FR | 61 | quotidien lun-ven |
  | CURATION | CURATION, **AUTORITÉS-INTL** | 175 | **quotidien lun-ven** |
  | FROID | **CRÉATEURS-INTL**, CONCURRENTS | 82 | lundi, mercredi, vendredi |
  Rôle vide/inconnu → CHAUD (aucune source perdue en silence). Jour calé sur Europe/Paris via `$now.setZone()`. Trace `_segmentation` (compteurs par segment) visible dans l'input Apify de chaque exécution.
- **Changement de cadence du 21/07/2026 (« option A »)** — motif : `CURATION` et `AUTORITÉS-INTL` sont les **seuls rôles produisant des items citables** (la doctrine anti-dérive interdit de citer un influenceur). Leur cadence réduite (lun/mer/ven et lundi) laissait le lot du **mardi et du jeudi 100 % influenceurs**, donc une section « Veille du jour » structurellement vide — cause principale des digests sans rien de notable. Ces deux rôles passent en quotidien (batch **61 → 236 profils**).
  `CRÉATEURS-INTL` (72, flux partage gelé) et `CONCURRENTS` (10, monitoring Agent 12) basculent dans FROID à lun/mer/ven : ils n'apportent aucune source citable, les passer en quotidien aurait été du volume pur. `CRÉATEURS-INTL` conserve donc sa cadence d'origine.
  Alternative écartée : ajouter une confirmation Perplexity au digest du matin. Chiffré le 21/07 — coût dérisoire (Sonar 1 $/M tokens ≈ 0,07 $/mois, latence 6 s/appel mesurée) mais rendement faible : un appel Perplexity ne produit pas un item citable, il produit un candidat qui exige encore une vérification WebFetch (test réel : les 3 items renvoyés attribuaient France Num / Bpifrance / INSEE à des URLs de blogs tiers). Estimation : 1 item confirmé tous les 2-3 jours. À reconsidérer si le digest reste maigre après une semaine d'option A.
- **Flags de maintenance dans le code** : `TEST_LIMIT` (tronquer la liste pour un test), `POSTED_LIMIT` (élargir la fenêtre pour un rattrapage), `FORCE_ALL_SEGMENTS` (ignorer la cadence). Valeurs prod : `0` / `'24h'` / `false`.
- **Fix `role` du 2026-07-21** (nœud « Préparer la File-à-traiter ») : le rôle du profil **n'existe pas dans la réponse Apify** (c'est une colonne du Sheet Profils), il était donc perdu à la normalisation et n'atteignait jamais la File-à-traiter ni la routine. Le nœud reconstruit désormais la carte rôle depuis `$('Lire la liste de profils')` : **match principal sur l'URL** (normalisée : minuscules, sans protocole/www/query/slash final, réduite à `in/<slug>` ou `company/<slug>`), **repli sur le nom d'auteur normalisé** (minuscules, accents décomposés, alphanumérique seul) car certains slugs du Sheet sont périmés — LinkedIn renvoie la vanity URL courante. Aucun match → `role` vide → CHAUD par défaut en aval. **Colonne `role` ajoutée à l'onglet File-à-traiter** (N1) : sans elle l'auto-mapping de l'append supprimait le champ.
  - Validation sur données réelles du 21/07 : **24/25 profils résolus** (22 par URL, 2 par nom — Amélie Starace et Marie DAULON, slugs Sheet périmés). Le 25e (L'EQUIPE) n'est pas une source suivie → repli CHAUD correct.
  - Run de vérification 21/07 : 15 posts écrits, rôles corrects (REACH-FR ×14, NICHE-CGP-FR ×1 — Pauline Gonzales). File relue : `{'REACH-FR': 14, 'NICHE-CGP-FR': 1}` là où elle renvoyait `{'<absent>': 28}` avant.
  - ⚠️ **Dette connexe non traitée** : l'onglet File-à-traiter contient des **lignes dupliquées** pour un même `postId` (11 doublons sur 39 le 21/07). Le nœud « Marquer DONE » (appendOrUpdate) ne met à jour que la **première** ligne correspondante, donc les doublons restent PENDING et sont resservis le lendemain. À traiter séparément.
- **Gestion d'erreur :** statut Apify FAILED/TIMED-OUT/ABORTED → Stop And Error (capté par `_ERROR-HANDLER`). Retry on Fail (3/2s) sur tous les nœuds réseau.
- **Bases : ** Google Sheet `1Nvg…` (onglets Profils / Historique / File-à-traiter)
- **Tests 17/07 :** run technique 5 profils ✅ (boucle 1 tour, dédup 635 lignes, écritures OK) · run de rattrapage complet (318 profils, `postedLimit week`, `maxPosts 3`, tous segments) pour récupérer la veille perdue des 14→17/07
- **Dernière modif :** 2026-07-17 — refonte asynchrone + segmentation (Agent 70)

---

## Backlog (roadmap AUDIT-FLUX-2026-06-23.md)

| Workflow | Phase | Statut |
|---|---|---|
| VEILLE-LINKEDIN-HASHTAGS (RSS.app) | S2-3 | À faire |
| VEILLE-INTERACTION-CLOUD (PhantomBuster/Apify) | S3-4 | À faire |
| Boucle interactive email → webhook → Notion → génération | 1b | À concevoir |
| LOG-NOTION (décisions client) | S1-1b | À faire |
| GCAL-LATER (alerte « traiter plus tard ») | S1-1b | À faire |
| PROSPECTION-SEQUENCE (J+3/J+7) | J+60 | À faire |
| ONBOARDING-CLIENT | J+60 | À faire |
| REPORTING-MENSUEL | J+90 | À faire |
