Compléter les tarifs manquants
Ce manuel s'adresse aux SUPER_ADMIN qui maintiennent la cohérence tarifaire du catalogue. La queue Tarifs à compléter centralise toutes les publicités détectées sur un AdFormat dont le prix brut n'a pas encore été saisi.
Pourquoi cette feature
Quand l'IA rattache une ad à un AdFormat dont priceGrossCents IS NULL, le pipeline pose le drapeau ad.pricingMissing = true. Ces ads sont parfaitement valides pour F06 Verify et le SuperFilter, mais elles bloquent le reporting budgétaire : le module Analytics > Budget ne peut pas calculer le chiffre d'affaires cumulé tant qu'un prix catalogue n'est pas défini.
La Pricing Queue résout ce problème en regroupant les ads par AdFormat : saisir un prix sur le format déflag automatiquement toutes les ads rattachées en une seule transaction SQL.
À savoir
La permission adformat.manage.pricing est exclusive à ROLE_SUPER_ADMIN. La gouvernance voit les formats sans prix dans son catalogue mais ne peut pas les éditer : séparation des pouvoirs entre structure éditoriale (gouvernance) et conditions commerciales (super-admin).
Workflow détaillé
1. Ouvrir la Pricing Queue
Depuis le menu Backstage, cliquez sur Tarifs à compléter (icône triangle d'alerte). L'URL directe est /backstage/pricing-queue.

2. Filtrer par magazine
Le dropdown en haut de page liste les magazines ayant au moins une ad pricingMissing. Sélectionnez par exemple Le Quotidien Médical. Un badge global affiche le nombre total d'ads orphelines pour ce magazine.

3. Identifier les formats problématiques
La grille affiche une carte par AdFormat concerné, avec :
- Libellé du format et code, ex.
Pleine page quadri (FULL_PAGE_QUADRI). - Compteur d'ads orphelines (ex.
23 ads sans prix). - Canonique associé.
- Période de validité (
valid_from→valid_until).
Les cartes sont triées par compteur décroissant : attaquez en priorité les formats à fort volume d'ads bloquées.

4. Définir le prix
Cliquez sur Définir le tarif sur une carte. La modale pricing classique s'ouvre avec quatre champs :
- Prix brut (
priceGrossCents) : tarif affiché avant remise régie, en centimes, HT. - Prix net (
priceNetCents) : tarif réellement facturé, qui reflète déjà la majoration position le cas échéant. - Coefficient premium (
premiumCoefficient) : facultatif et purement documentaire, ex.1.3000pour une 4e de couv. - Devise :
EURpar défaut.

Validez avec Enregistrer. Le backend exécute une transaction :
UPDATE ad_format SET price_gross_cents = ?, price_net_cents = ? WHERE id = ?UPDATE ad SET pricing_missing = FALSE WHERE ad_format_ref_id = ? AND pricing_missing = TRUE
Les 23 ads déflaggent en une seule requête DQL, et le module Analytics les prend immédiatement en compte.
5. Confirmer la disparition de la carte
La carte disparaît de la queue dès que le compteur tombe à zéro. Le toast Tarif enregistré — 23 ads déflaggées confirme l'effet.

Sources du prix
Trois voies alimentent le champ priceGrossCents d'un AdFormat :
- Saisie manuelle via la Pricing Queue ou l'écran Catalogue — usage ponctuel.
- Upload d'une grille tarifaire via Uploader une grille tarifaire — usage annuel, bulk.
- Héritage magazine : si un format
PARENTexiste sur le magazine avec un prix, un format enfant sans prix peut hériter via le menu Dupliquer depuis dans le catalogue.
Les trois voies écrivent dans la même colonne et déclenchent le même déflag automatique.
Cas limites
Format archivé
Si un AdFormat passe en statut archived avant qu'un prix ne soit saisi, ses ads orphelines restent pricingMissing = true mais le format disparaît de la Pricing Queue. Repassez-le temporairement en active pour saisir le prix, puis re-archivez.
Plusieurs versions temporelles d'un même format
Un même code peut exister en plusieurs versions (valid_from=2025-01-01, valid_from=2026-01-01). Chaque version est une carte distincte dans la queue. Le prix saisi sur la version 2026 ne déflag que les ads des numéros 2026 ; les ads 2025 restent sur la version 2025.
Ad rattachée à un format d'un autre magazine
Impossible par construction : la FK Ad.ad_format_ref_id → AdFormat.id et la contrainte AdFormat.magazine_id garantissent la cohérence. Si vous rencontrez une incohérence (ad héritée d'une ancienne migration), passez par la queue Triage IA pour ré-affecter l'ad.
Ad pricingMissing mais format avec prix
Cela peut arriver sur les ads historiques si le déflag bulk a échoué (ex. timeout). Cliquez sur Forcer le déflag dans le menu contextuel de la carte : la transaction est rejouée.
FAQ
Prix brut vs prix net : lequel saisir d'abord ?
Les deux sont requis pour déflagger. Le prix brut correspond au tarif affiché dans la grille commerciale de la régie, le prix net au tarif réellement facturé après remise régie catalogue (pas les remises annonceur, qui sont hors scope catalogue).
Pourquoi le toggle de la Pricing Queue montre encore des ads après déflag ?
Le compteur peut avoir un décalage de 30 secondes dû au cache TanStack Query. Cliquez sur Rafraîchir ou naviguez vers un autre magazine puis revenez.
Les ads en statut pending sont-elles déflaggées ?
Oui, le déflag est indépendant du statut éditorial. Une ad pending, approved ou excluded voit son drapeau pricingMissing basculer à false dès qu'un prix brut est posé sur son AdFormat.
Comment voir l'historique des changements de prix ?
Chaque modification est auditée (adformat.pricing.updated). Consultez Observabilité > Audit log et filtrez par event_type = adformat.pricing.updated pour tracer les changements.
Puis-je saisir un prix à zéro ?
Oui, 0 est une valeur valide (format offert, échange marchandise). Le déflag s'applique normalement et l'Analytics comptabilise une recette nulle sur ces ads.
Conversion de devise ?
Pas de conversion automatique en v1. Si vous changez la devise d'un AdFormat de EUR vers CHF, re-saisissez les montants en centimes dans la nouvelle devise. Les reports multi-devises arriveront dans un module Facturation ultérieur.
Liens utiles
- Uploader une grille tarifaire — alimenter les prix en bulk
- Cataloguer un format publicitaire — saisie manuelle unitaire
- Triage IA — traiter les ads sans
AdFormatrattaché - Dashboard apprentissage IA — mesurer la santé globale du catalogue