---
suivi: 1371
date: 2026-08-31
sujet: campagne_depuis_mapping
chantier: leads_marketing
type: fix
statut: poussé
hash: 1323b63e
fichiers:
  - app/Jobs/ProcessMetaLead.php
  - app/Services/MetaLeadIngestionService.php
  - app/Services/MetaLeadBackfillService.php
  - app/Services/MetaCampaignNameBackfillService.php
  - app/Console/Commands/BackfillMetaCampaignNamesCommand.php
  - tests/Unit/MetaCampaignNameFromMappingTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1371_campagne_depuis_mapping.md
---

## PROMPT ENVOYÉ

Option A (#1369) : ne plus appeler getCampaign ; libellé depuis meta_campaign_codes.
Rattrapage rétroactif depuis 17/08, idempotent, sans Meta. programme_id seulement
si mapping peuplé. Pas #948.

## FICHES LUES

- **#1369** — getCampaign HTTP 400 OAuthException #100 malgré ads_read ; jeton OK ;
  data_access_expires_at **2026-10-22** ; pages 60j HECTARE 435 / GEMME 68 / ENVOL 54 ;
  META_PAGE_ACCESS_TOKEN_ENVOL absent.
- **#1368** — mapping 100 % ; meta_campaign_id 100 % ; nom 0 % après 30/07.
- **#1370** — déclenchement explicite (pas de cron).

## SYNTHÈSE

### Partie 1 — Ingestion
- `ProcessMetaLead` : plus d’appel `getCampaign` ; passe `null` à ingest.
- `MetaLeadIngestionService` : après `resolveForLead`, remplit `meta_campaign_name` avec
  `mapping.libelle` ; si pas de mapping → NULL + `Log::warning`.
- `MetaLeadBackfillService` : même politique (plus d’appel getCampaign à l’ingest backfill).
- `MetaGraphService::getCampaign` **conservée** (diag #1369 / usage futur).

### Partie 2 — Rattrapage
```bash
cd /home/hectare-envol/envol.hectare.fr
php artisan meta:campaign-names:backfill --since=2026-08-17
php artisan meta:campaign-names:backfill --since=2026-08-17 --apply
```
Compteurs : traites / renseignes / sautes_deja_renseignes / sans_campaign_id / sans_mapping.
Idempotent. CLI only. Pas de cron. Aucun Graph.

### Partie 3 — programme_id
Non peuplé dans les mappings ici. Si un mapping a un `programme_id`, le rattrapage
l’applique aux leads dont `programme_id` est NULL.

### Signal #948
122 leads 60j sur GEMME/ENVOL vs jeton HECTARE. Avec Option A le **nom** n’en dépend plus.
`getLead` live utilise encore uniquement `META_PAGE_ACCESS_TOKEN` — à surveiller pour les
pages non-HECTARE. Renouveler jeton avant **2026-10-22** (`data_access_expires_at`).

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan journal:sync
php artisan meta:campaign-names:backfill --since=2026-08-17
php artisan meta:campaign-names:backfill --since=2026-08-17 --apply
# Relancer --apply → renseignes=0 (idempotence)
# Vérifier leads id=811 et id=916 (mapping 103 ENVOL 2026 - HERMIONE)
```

Pas de route nouvelle → pas de `route:clear` obligatoire. Pas de front.

## LEÇON

Quand Meta casse un droit Ads, préférer une source ERP déjà peuplée (mapping) plutôt
qu’un second appel Graph. Rattrapage = commande explicite, jamais un side-effect de page.
