ADR-0049 — Annuaires publics de boutiques et dossiers du haut du classement : des tranches, jamais des chiffres
Code : src/services/directories/, pages sous src/app/(marketing)/intelligence/directory et .../dossier, sitemaps sous src/app/sitemaps. Cadre de rendu : ADR 0047 (rendu par requete, CSP a nonce intacte, chargeurs en…
Statut
Proposé · 2026-10-02
Piliers : growth-web, intelligence
Code : src/services/directories/, pages sous src/app/(marketing)/intelligence/directory
et .../dossier, sitemaps sous src/app/sitemaps. Cadre de rendu : ADR 0047
(rendu par requete, CSP a nonce intacte, chargeurs en unstable_cache).
Contexte
La fiche d'une boutique (/intelligence/stores/[domain]) est noindex depuis
juin 2026 : une page mince par boutique scannee gonflerait l'index. Il manque
pourtant une surface d'acquisition organique honnete : « boutiques qui utilisent
<app> », « boutiques <niche> en <pays> », et un dossier public pour les meilleures
boutiques.
Décision
- Annuaires par niche, pays, theme, application et niche x pays, au-dessus de
l'admission du Store Spy (
spyListingSql,whereOf) : pas de predicat maison. S'y ajoutent trois conditions propres a une page publique : lignesPUBLICseulement, anti-jointure SQL surIntelligenceSuppression(tombstone), et un releve de trafic ou de publicites qui ne compte que s'il est recent (90 et 30 jours). - Garde de contenu mince : un annuaire est indexable s'il liste au moins 12
boutiques dont au moins 8 portent 4 faits mesures sur 6. Sinon il reste servi
(
noindex, follow), sort des sitemaps, et n'est pas lie depuis l'index. Zero resultat, nom absent de l'index mis en cache, page au-dela de 10 : 404 sans requete. Les pages 2 et suivantes sontnoindex, follow. - Dossiers pour les 500 premieres boutiques par trafic mesure et recent. Trafic
et publicites sont affiches en tranches (une decade, une fourchette), avec source
et periode ; jamais un chiffre exact de trafic, de CA, de croissance ou de depense.
La tranche de trafic derive d'un champ payant (plan Pro) : c'est l'exception
voulue de cette surface, et la seule. Les meilleures ventes viennent de la vue
gratuite de la liste (
redactHubStore(store, "free"), deux noms). La FAQ est generee par gabarits a partir des faits mesures ; une question dont le fait manque n'existe pas. - Retrait : le dossier relit la ligne vivante (tombstone, opt-out, listabilite) a
chaque vue, hors cache ; les chunks de sitemap filtrent les tombstones a chaque
fetch ; les chemins de retrait expirent le tag
directories. - Sitemaps : un index
/sitemaps/stores.xmlet des chunks de 5 000 URLs au plus,lastmod=observed_atde la donnee ou absent.robots.txtnomme les deux sitemaps ; le proxy d'image signe du dossier est ouvert aux robots. - IndexNow : coupe tant que
INDEXNOW_KEYn'est pas posee ; une soumission par 6 heures, 1 000 URLs par requete, 3 000 par jour, viaguardedFetch. Declenche en fin du refresh froid quotidien : aucun cron nouveau.
Alternatives écartées
- Cle de cache par langue : les valeurs en cache (domaines, tranches, comptes, codes ISO) sont identiques dans les six langues ; la cle par langue aurait rejoue le meme balayage six fois. Les phrases se fabriquent au rendu.
- Table denormalisee ou colonnes generees (
StoreSpyFacts) : necessite un changement de schema, hors de ce lot. Suivi : voirhub-store-query.ts. - Dossier pour toute boutique : c'est exactement la page mince que la decision de juin 2026 refuse.
- Fiche
/intelligence/stores/[domain]rendue indexable pour le haut du classement : deux URLs pour une boutique ; le dossier est une page distincte, a tranches, et la fiche garde son role de lecture complete.
Conséquences
- Chaque annuaire a froid coute un balayage des lignes listables (quelques dizaines de
milliers, ~1,7 s d'apres
hub-store-query.ts), une fois par heure et par entree. - La fraicheur du catalogue public est de 24 h : si le balayage de vivacite cale, des annuaires et des dossiers sortent des sitemaps puis y reviennent.
- La region d'une boutique est son marche principal (pays du trafic, sinon premier marche declare), pas son siege.