{
  "entities": {
    "headless-commerce": {
      "label": "Commerce headless",
      "target_density": 0.7,
      "weight": 0.97,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Entité racine de la requête : sans elle, aucune admission au Document Ranking sur « migration headless Shopify »",
      "variants": [
        "commerce headless",
        "headless commerce",
        "headless",
        "architecture headless",
        "e-commerce headless",
        "commerce découplé",
        "approche headless",
        "passer en headless",
        "stack headless"
      ],
      "exclude": []
    },
    "shopify-hydrogen": {
      "label": "Shopify Hydrogen",
      "target_density": 0.6,
      "weight": 0.95,
      "type": "Tool",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Framework React officiel de Shopify pour storefront custom ; co-occurrence quasi systématique avec « migration headless Shopify » dans le corpus 2025-2026",
      "variants": [
        "Hydrogen",
        "Shopify Hydrogen",
        "framework Hydrogen",
        "storefront Hydrogen",
        "Hydrogen 2026"
      ],
      "exclude": [
        "hydrogène",
        "hydrogène vert"
      ]
    },
    "shopify-oxygen": {
      "label": "Shopify Oxygen",
      "target_density": 0.35,
      "weight": 0.86,
      "type": "Tool",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Runtime d'hébergement edge inclus dans les plans Shopify ; décision d'infra incontournable de toute migration Hydrogen",
      "variants": [
        "Oxygen",
        "Shopify Oxygen",
        "hébergement Oxygen",
        "déploiement Oxygen",
        "runtime Oxygen"
      ],
      "exclude": [
        "bol d'oxygène",
        "oxygène",
        "prise d'oxygène"
      ]
    },
    "storefront-api": {
      "label": "Storefront API",
      "target_density": 0.4,
      "weight": 0.9,
      "type": "Tool",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Interface GraphQL par laquelle passe tout front découplé ; c'est le contrat technique qui définit ce qui reste possible ou non après migration",
      "variants": [
        "Storefront API",
        "API Storefront",
        "API GraphQL Shopify",
        "Storefront API GraphQL",
        "Customer Account API"
      ],
      "exclude": []
    },
    "decouplage-front-back": {
      "label": "Découplage frontend / backend",
      "target_density": 0.5,
      "weight": 0.92,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Définition opératoire du headless ; c'est l'entité que le lecteur non technique doit comprendre avant toute décision budgétaire",
      "variants": [
        "découplage",
        "découpler le frontend",
        "découplé",
        "frontend découplé",
        "séparer le front du back",
        "front et back séparés",
        "couche de présentation séparée"
      ],
      "exclude": []
    },
    "theme-liquid": {
      "label": "Thème Liquid",
      "target_density": 0.4,
      "weight": 0.88,
      "type": "Tool",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Point de départ réel de 100 % des migrations : la comparaison Liquid vs headless est le pivot décisionnel de la requête",
      "variants": [
        "Liquid",
        "thème Liquid",
        "template Liquid",
        "moteur de template Liquid",
        "thème natif",
        "storefront Liquid"
      ],
      "exclude": [
        "checkout.liquid",
        "checkout liquid"
      ]
    },
    "shopify-plus": {
      "label": "Shopify Plus",
      "target_density": 0.3,
      "weight": 0.78,
      "type": "Tool",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Palier contractuel qui conditionne quotas API, checkout extensibility avancée et éligibilité réelle au headless",
      "variants": [
        "Shopify Plus",
        "plan Plus",
        "marchand Plus"
      ],
      "exclude": []
    },
    "checkout-shopify": {
      "label": "Checkout Shopify (non découplable)",
      "target_density": 0.3,
      "weight": 0.84,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Limite structurelle du headless Shopify : le tunnel de paiement reste hébergé par Shopify, ce qui invalide la promesse de « contrôle total »",
      "variants": [
        "checkout",
        "tunnel de paiement",
        "checkout Shopify",
        "page de paiement",
        "Shop Pay",
        "checkout hébergé"
      ],
      "exclude": []
    },
    "checkout-extensibility": {
      "label": "Checkout Extensibility",
      "target_density": 0.2,
      "weight": 0.68,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Deadline de dépréciation de checkout.liquid / Shopify Scripts : rarement croisée avec la décision headless alors qu'elle change le calendrier de migration",
      "variants": [
        "Checkout Extensibility",
        "extensibilité du checkout",
        "Checkout UI Extensions",
        "checkout.liquid",
        "Additional Scripts",
        "Shopify Scripts",
        "Checkout Editor"
      ],
      "exclude": []
    },
    "shopify-functions": {
      "label": "Shopify Functions",
      "target_density": 0.15,
      "weight": 0.55,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Remplace la logique remises/livraison côté serveur ; brique obligatoire quand les Scripts disparaissent, quasi absente des guides headless",
      "variants": [
        "Shopify Functions",
        "Functions",
        "fonctions Shopify",
        "discount function"
      ],
      "exclude": []
    },
    "web-pixels": {
      "label": "Web Pixels / tracking serveur",
      "target_density": 0.2,
      "weight": 0.62,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "En headless, tout le tracking injecté via theme.liquid / additional scripts doit être reconstruit : cause n°1 de perte de données post-migration",
      "variants": [
        "Web Pixels",
        "pixel Shopify",
        "Custom Pixel",
        "GTM",
        "Google Tag Manager",
        "pixel Meta",
        "tracking",
        "plan de taggage",
        "server-side tagging"
      ],
      "exclude": []
    },
    "customer-account-extensions": {
      "label": "Customer Account UI extensions",
      "target_density": 0.1,
      "weight": 0.42,
      "type": "Tool",
      "status": "P3",
      "standard_or_surprise": "surprise",
      "justification": "L'espace client est la zone la plus souvent oubliée du périmètre de migration alors qu'elle porte le réachat",
      "variants": [
        "Customer Account UI extensions",
        "espace client",
        "compte client",
        "Customer Accounts",
        "nouveaux comptes clients"
      ],
      "exclude": []
    },
    "ecosysteme-apps-shopify": {
      "label": "Écosystème d'apps Shopify",
      "target_density": 0.3,
      "weight": 0.85,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Les apps front (avis, fidélité, popups) reposent sur des script tags Liquid et cassent en headless : premier poste de dépassement de budget",
      "variants": [
        "apps Shopify",
        "applications Shopify",
        "app store Shopify",
        "script tags",
        "app embeds",
        "extensions de thème",
        "Klaviyo",
        "Yotpo",
        "Rebuy",
        "Okendo",
        "Gorgias"
      ],
      "exclude": []
    },
    "cms-headless": {
      "label": "CMS headless",
      "target_density": 0.35,
      "weight": 0.83,
      "type": "Tool",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Sans CMS branché sur le front découplé, l'équipe marketing perd l'éditeur de sections Shopify et devient plus dépendante qu'avant",
      "variants": [
        "CMS headless",
        "CMS découplé",
        "headless CMS",
        "back-office de contenu",
        "CMS API-first"
      ],
      "exclude": []
    },
    "cms-acteurs-nommes": {
      "label": "Sanity / Contentful / Storyblok",
      "target_density": 0.2,
      "weight": 0.6,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "standard",
      "justification": "Entités nommées attendues par le retrieval sur toute page CMS + Shopify ; leur présence conditionne la reconnaissance d'expertise outillage",
      "variants": [
        "Sanity",
        "Contentful",
        "Storyblok",
        "Builder.io",
        "Strapi",
        "Prismic",
        "Payload"
      ],
      "exclude": [
        "sanity check"
      ]
    },
    "visual-editing": {
      "label": "Visual editing / preview en contexte",
      "target_density": 0.2,
      "weight": 0.72,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Critère qui sépare un CMS qui rend l'autonomie d'un CMS qui la reprend (édition par formulaire vs édition visuelle) ; jamais traité par les guides techniques",
      "variants": [
        "visual editing",
        "édition visuelle",
        "preview",
        "prévisualisation",
        "aperçu en direct",
        "édition en contexte",
        "drag and drop"
      ],
      "exclude": []
    },
    "metaobjects-metafields": {
      "label": "Metaobjects & metafields",
      "target_density": 0.2,
      "weight": 0.65,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Alternative native au CMS externe : modéliser le contenu dans Shopify évite une brique de plus dans la stack, arbitrage rarement posé",
      "variants": [
        "metaobjects",
        "métaobjets",
        "metafields",
        "métachamps",
        "champs personnalisés"
      ],
      "exclude": []
    },
    "autonomie-equipe-marketing": {
      "label": "Autonomie de l'équipe marketing",
      "target_density": 0.55,
      "weight": 0.94,
      "type": "Doctrine",
      "status": "P1",
      "standard_or_surprise": "surprise",
      "justification": "Expertise signature fournie en input : le headless est vendu comme un projet de performance, jamais comme un transfert de pouvoir vers le marketing",
      "variants": [
        "autonomie",
        "autonomie marketing",
        "autonomie de l'équipe marketing",
        "équipe marketing autonome",
        "sans passer par un développeur",
        "sans dépendre des développeurs",
        "en autonomie",
        "self-service marketing"
      ],
      "exclude": []
    },
    "velocite-deploiement": {
      "label": "Vélocité de déploiement",
      "target_density": 0.25,
      "weight": 0.74,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Le vrai KPI d'une migration réussie côté marketing : nombre de mises en production par semaine, pas score Lighthouse",
      "variants": [
        "vélocité",
        "vélocité de déploiement",
        "fréquence de déploiement",
        "mise en production",
        "déployer",
        "CI/CD",
        "preview deployment",
        "branche de preview"
      ],
      "exclude": []
    },
    "ab-testing-frontend": {
      "label": "A/B testing frontend",
      "target_density": 0.25,
      "weight": 0.8,
      "type": "Method",
      "status": "P1",
      "standard_or_surprise": "surprise",
      "justification": "Cœur de l'expertise unique : en Liquid, un test A/B implique un duplicata de thème ; en headless découplé il devient une variante de composant",
      "variants": [
        "A/B testing",
        "test A/B",
        "tests A/B",
        "expérimentation",
        "split test",
        "CRO",
        "itération",
        "tester une variante"
      ],
      "exclude": []
    },
    "feature-flags": {
      "label": "Feature flags",
      "target_density": 0.15,
      "weight": 0.58,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Mécanisme qui permet au marketing d'activer une fonctionnalité sans déploiement ; entité de culture produit importée dans le e-commerce",
      "variants": [
        "feature flag",
        "feature flags",
        "flags",
        "activation progressive",
        "kill switch"
      ],
      "exclude": []
    },
    "design-system-composants": {
      "label": "Design system / bibliothèque de composants",
      "target_density": 0.25,
      "weight": 0.7,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Livrable qui détermine si le marketing peut composer des pages seul après la migration : sans catalogue de blocs, l'autonomie promise n'existe pas",
      "variants": [
        "design system",
        "bibliothèque de composants",
        "composants réutilisables",
        "blocs",
        "catalogue de blocs",
        "component library",
        "Storybook"
      ],
      "exclude": []
    },
    "delai-mise-en-ligne": {
      "label": "Délai de mise en ligne d'une landing page",
      "target_density": 0.2,
      "weight": 0.76,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Métrique propriétaire proposée comme critère d'arbitrage de la migration, à la place du TTFB : mesurable avant / après en jours",
      "variants": [
        "délai de mise en ligne",
        "time to market",
        "délai de publication",
        "vitesse de publication",
        "mettre en ligne une landing page",
        "sortir une page",
        "délai de livraison d'une page"
      ],
      "exclude": []
    },
    "backlog-developpeurs": {
      "label": "Backlog / goulot d'étranglement dev",
      "target_density": 0.25,
      "weight": 0.79,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "surprise",
      "justification": "Formulation du pain point réel du CMO ; le corpus concurrent parle de performance technique et jamais de file d'attente organisationnelle",
      "variants": [
        "backlog",
        "backlog des développeurs",
        "file d'attente",
        "ticket",
        "tickets",
        "goulot d'étranglement",
        "dépendance aux développeurs",
        "sprint",
        "arbitrage de sprint"
      ],
      "exclude": []
    },
    "competence-react-interne": {
      "label": "Compétence React interne",
      "target_density": 0.2,
      "weight": 0.72,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "standard",
      "justification": "Prérequis d'équipe : une migration headless déplace la dette d'un thème vers un recrutement, arbitrage à poser avant le devis",
      "variants": [
        "React",
        "compétence React",
        "développeur React",
        "développeurs React",
        "équipe interne",
        "recrutement",
        "internaliser",
        "TypeScript"
      ],
      "exclude": [
        "react to",
        "react to market"
      ]
    },
    "migration-par-paliers": {
      "label": "Migration par paliers",
      "target_density": 0.3,
      "weight": 0.87,
      "type": "Method",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Méthode recommandée par la documentation Shopify (migrer route par route) ; opposée au big bang qui gèle le marketing plusieurs mois",
      "variants": [
        "migration par paliers",
        "migration progressive",
        "par étapes",
        "route par route",
        "phase par phase",
        "migration incrémentale",
        "big bang",
        "refonte totale"
      ],
      "exclude": []
    },
    "strangler-fig": {
      "label": "Pattern strangler (étranglement progressif)",
      "target_density": 0.15,
      "weight": 0.6,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Pattern d'architecture logicielle (Fowler) transposé au e-commerce : nommer le pattern est un marqueur d'expertise absent du corpus agence",
      "variants": [
        "strangler",
        "strangler fig",
        "pattern d'étranglement",
        "étranglement progressif",
        "cohabitation",
        "coexistence"
      ],
      "exclude": []
    },
    "reverse-proxy-coexistence": {
      "label": "Reverse proxy / cohabitation d'URLs",
      "target_density": 0.15,
      "weight": 0.62,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Mécanique concrète qui permet de faire cohabiter Liquid et headless sur un même domaine sans casser l'historique SEO",
      "variants": [
        "reverse proxy",
        "proxy inverse",
        "proxy",
        "même domaine",
        "sous-domaine",
        "routage",
        "edge routing",
        "Cloudflare Worker"
      ],
      "exclude": []
    },
    "plan-redirections-301": {
      "label": "Plan de redirections 301",
      "target_density": 0.25,
      "weight": 0.8,
      "type": "Method",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Risque SEO n°1 d'une migration : changement de structure d'URL sans mapping exhaustif, entité obligatoire sur toute requête « migration »",
      "variants": [
        "redirections 301",
        "redirection 301",
        "301",
        "plan de redirections",
        "mapping d'URL",
        "structure d'URL",
        "canonical",
        "sitemap",
        "perte de trafic organique"
      ],
      "exclude": []
    },
    "indexation-javascript": {
      "label": "Indexation d'un front JavaScript",
      "target_density": 0.2,
      "weight": 0.75,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Objection SEO systématique du CMO face au headless ; se traite par le rendu serveur, pas par la promesse",
      "variants": [
        "indexation",
        "crawl",
        "crawlabilité",
        "rendu JavaScript",
        "Googlebot",
        "JavaScript SEO",
        "budget de crawl"
      ],
      "exclude": []
    },
    "donnees-structurees-jsonld": {
      "label": "Données structurées JSON-LD",
      "target_density": 0.2,
      "weight": 0.66,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "standard",
      "justification": "En headless, le balisage Product/Offer fourni par le thème disparaît et doit être re-généré : régression SEO fréquente et silencieuse",
      "variants": [
        "données structurées",
        "JSON-LD",
        "schema.org",
        "balisage",
        "rich snippets",
        "Product schema",
        "Merchant Center"
      ],
      "exclude": []
    },
    "core-web-vitals": {
      "label": "Core Web Vitals",
      "target_density": 0.35,
      "weight": 0.86,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Argument commercial dominant du headless ; à traiter pour l'admission au Document Ranking même si la page en conteste la portée",
      "variants": [
        "Core Web Vitals",
        "CWV",
        "LCP",
        "INP",
        "CLS",
        "TTFB",
        "Web Vitals",
        "signaux web essentiels",
        "performance web",
        "vitesse de chargement"
      ],
      "exclude": []
    },
    "lighthouse": {
      "label": "Score Lighthouse",
      "target_density": 0.15,
      "weight": 0.55,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "standard",
      "justification": "Métrique de laboratoire utilisée comme preuve par les agences ; à distinguer explicitement des données terrain CrUX",
      "variants": [
        "Lighthouse",
        "score Lighthouse",
        "PageSpeed Insights",
        "CrUX",
        "données terrain",
        "données de laboratoire"
      ],
      "exclude": []
    },
    "rendu-serveur-ssr": {
      "label": "Rendu côté serveur (SSR)",
      "target_density": 0.3,
      "weight": 0.82,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Condition technique pour que le headless ne dégrade pas le SEO ; entité pivot du passage indexabilité ↔ performance",
      "variants": [
        "SSR",
        "rendu côté serveur",
        "rendu serveur",
        "server-side rendering",
        "streaming SSR",
        "hydratation",
        "React Server Components",
        "rendu statique"
      ],
      "exclude": []
    },
    "cache-edge-invalidation": {
      "label": "Cache edge & invalidation",
      "target_density": 0.2,
      "weight": 0.7,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Point de bascule réel de la performance headless : la vitesse vient de la stratégie de cache, pas du framework",
      "variants": [
        "cache",
        "cache edge",
        "CDN",
        "invalidation",
        "invalidation de cache",
        "stale-while-revalidate",
        "revalidation",
        "ISR",
        "cache-control"
      ],
      "exclude": []
    },
    "edge-runtime-workerd": {
      "label": "Edge runtime (workerd)",
      "target_density": 0.15,
      "weight": 0.6,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Oxygen tourne sur workerd (Cloudflare) et ne supporte pas toutes les API Node : contrainte qui invalide certaines libs choisies en amont",
      "variants": [
        "edge runtime",
        "workerd",
        "Cloudflare Workers",
        "runtime edge",
        "API Node.js",
        "Node.js",
        "worker"
      ],
      "exclude": [
        "edge case",
        "Microsoft Edge"
      ]
    },
    "react-router-v7": {
      "label": "React Router v7",
      "target_density": 0.1,
      "weight": 0.45,
      "type": "Tool",
      "status": "P3",
      "standard_or_surprise": "surprise",
      "justification": "Socle actuel d'Hydrogen après l'abandon de Remix ; marqueur de fraîcheur technique qui date immédiatement un contenu concurrent",
      "variants": [
        "React Router",
        "React Router v7",
        "Remix",
        "framework de routing"
      ],
      "exclude": []
    },
    "versioning-api-trimestriel": {
      "label": "Versioning trimestriel de l'API",
      "target_density": 0.2,
      "weight": 0.73,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Shopify versionne la Storefront API par trimestre : la migration crée une charge de maintenance récurrente que les devis n'affichent pas",
      "variants": [
        "versioning",
        "version de l'API",
        "version d'API",
        "breaking change",
        "breaking changes",
        "dépréciation",
        "montée de version",
        "maintenance récurrente"
      ],
      "exclude": []
    },
    "dette-technique-theme": {
      "label": "Dette technique du thème",
      "target_density": 0.2,
      "weight": 0.68,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Le motif réel de la plupart des migrations n'est pas le headless mais un thème surchargé par cinq ans de patchs : diagnostic à poser avant de vendre l'architecture",
      "variants": [
        "dette technique",
        "thème surchargé",
        "code legacy",
        "legacy",
        "patchs successifs",
        "thème custom vieillissant"
      ],
      "exclude": []
    },
    "tco-cout-total": {
      "label": "Coût total de possession (TCO)",
      "target_density": 0.25,
      "weight": 0.81,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "surprise",
      "justification": "Le CMO arbitre sur un TCO à 3 ans (build + maintenance + recrutement), pas sur un devis de build : angle absent des pages concurrentes",
      "variants": [
        "TCO",
        "coût total de possession",
        "coût total",
        "budget",
        "coût de la migration",
        "enveloppe budgétaire",
        "ROI",
        "amortissement",
        "sur trois ans"
      ],
      "exclude": []
    },
    "budget-maintenance": {
      "label": "Budget de maintenance annuel",
      "target_density": 0.2,
      "weight": 0.7,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Poste que les pages concurrentes n'affichent jamais alors qu'il détermine la viabilité post-lancement (run vs build)",
      "variants": [
        "maintenance",
        "budget de maintenance",
        "coût de maintenance",
        "TMA",
        "coût récurrent",
        "mensualité",
        "après le lancement"
      ],
      "exclude": []
    },
    "gmv-seuil-declenchement": {
      "label": "GMV / seuil de déclenchement",
      "target_density": 0.2,
      "weight": 0.74,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Critère quantitatif d'éligibilité (volume d'affaires, trafic, nombre de marchés) qui permet de dire non à une migration : preuve de non-complaisance",
      "variants": [
        "GMV",
        "volume d'affaires",
        "chiffre d'affaires en ligne",
        "seuil",
        "seuil de déclenchement",
        "critères d'éligibilité",
        "taille de catalogue",
        "nombre de SKU"
      ],
      "exclude": []
    },
    "taux-de-conversion": {
      "label": "Taux de conversion",
      "target_density": 0.25,
      "weight": 0.77,
      "type": "Concept",
      "status": "P1",
      "standard_or_surprise": "standard",
      "justification": "Métrique de sortie attendue par le Head of Growth ; toute preuve de performance doit être reliée à elle ou être disqualifiée",
      "variants": [
        "taux de conversion",
        "conversion",
        "CVR",
        "panier moyen",
        "AOV",
        "revenu par visiteur",
        "RPV",
        "taux d'ajout au panier"
      ],
      "exclude": []
    },
    "shopify-markets-i18n": {
      "label": "Shopify Markets / internationalisation",
      "target_density": 0.15,
      "weight": 0.58,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "standard",
      "justification": "Déclencheur classique de migration headless (multi-pays, multi-devises, routes localisées) et source de complexité de redirections",
      "variants": [
        "Shopify Markets",
        "internationalisation",
        "i18n",
        "multi-devises",
        "multi-pays",
        "hreflang",
        "localisation"
      ],
      "exclude": [
        "marketing",
        "marketplace",
        "market share"
      ]
    },
    "consent-mode-rgpd": {
      "label": "Consent Mode / RGPD",
      "target_density": 0.15,
      "weight": 0.6,
      "type": "Doctrine",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Contexte FR/UE : en headless, la CMP et le Consent Mode v2 sont à recâbler manuellement, sinon perte de mesure et exposition CNIL",
      "variants": [
        "RGPD",
        "Consent Mode",
        "Consent Mode v2",
        "CMP",
        "bandeau cookies",
        "consentement",
        "CNIL",
        "conformité"
      ],
      "exclude": []
    },
    "observabilite-monitoring": {
      "label": "Observabilité / monitoring",
      "target_density": 0.15,
      "weight": 0.6,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "En Liquid, Shopify absorbe les incidents ; en headless, l'erreur 500 est la responsabilité du marchand — brique de run jamais chiffrée",
      "variants": [
        "observabilité",
        "monitoring",
        "supervision",
        "alerting",
        "logs",
        "Sentry",
        "uptime",
        "erreur 500",
        "SLA",
        "astreinte"
      ],
      "exclude": []
    },
    "plan-de-rollback": {
      "label": "Plan de rollback",
      "target_density": 0.15,
      "weight": 0.65,
      "type": "Method",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Condition de réversibilité d'une bascule : garder le thème Liquid publiable pendant N semaines. Aucun concurrent ne documente la sortie de secours",
      "variants": [
        "rollback",
        "plan de rollback",
        "retour arrière",
        "réversibilité",
        "bascule",
        "go / no-go",
        "cutover",
        "fenêtre de bascule"
      ],
      "exclude": []
    },
    "online-store-2-0": {
      "label": "Online Store 2.0 (alternative au headless)",
      "target_density": 0.2,
      "weight": 0.71,
      "type": "Tool",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Sections everywhere + app blocks couvrent une large part des besoins invoqués pour justifier un headless : l'alternative honnête à documenter",
      "variants": [
        "Online Store 2.0",
        "OS 2.0",
        "sections everywhere",
        "app blocks",
        "éditeur de thème",
        "theme editor",
        "thème optimisé",
        "Dawn"
      ],
      "exclude": []
    },
    "app-bloat": {
      "label": "App bloat / scripts tiers",
      "target_density": 0.2,
      "weight": 0.72,
      "type": "Concept",
      "status": "P2",
      "standard_or_surprise": "surprise",
      "justification": "Cause dominante de la lenteur attribuée à Liquid ; l'inversion utile est que supprimer 12 apps produit souvent le gain vendu par la migration",
      "variants": [
        "app bloat",
        "surcharge d'apps",
        "scripts tiers",
        "scripts externes",
        "JavaScript tiers",
        "poids des apps",
        "empilement d'apps",
        "audit d'apps"
      ],
      "exclude": []
    }
  },
  "ngrams": {
    "migration-headless-shopify": {
      "label": "migration headless Shopify",
      "target_count": 6,
      "status": "P1",
      "cooccurrence": "Hydrogen, Storefront API, thème Liquid",
      "variants": [
        "migration headless Shopify",
        "migrer Shopify en headless",
        "migration vers un Shopify headless",
        "passer Shopify en headless",
        "projet de migration headless"
      ]
    },
    "decoupler-le-frontend": {
      "label": "découpler le frontend",
      "target_count": 4,
      "status": "P1",
      "cooccurrence": "Storefront API, autonomie marketing, checkout Shopify",
      "variants": [
        "découpler le frontend",
        "découpler le front",
        "frontend découplé",
        "découplage du frontend"
      ]
    },
    "sans-dependre-des-developpeurs": {
      "label": "sans dépendre des développeurs",
      "target_count": 3,
      "status": "P2",
      "cooccurrence": "autonomie équipe marketing, design system, feature flags",
      "variants": [
        "sans dépendre des développeurs",
        "sans dépendre d'un développeur",
        "sans passer par les développeurs",
        "sans ticket dev",
        "sans solliciter la tech"
      ]
    },
    "theme-liquid-vs-headless": {
      "label": "thème Liquid vs headless",
      "target_count": 3,
      "status": "P1",
      "cooccurrence": "Online Store 2.0, Core Web Vitals, coût total de possession",
      "variants": [
        "Liquid vs headless",
        "thème Liquid ou headless",
        "headless ou thème natif",
        "comparaison Liquid headless"
      ]
    },
    "storefront-personnalise": {
      "label": "storefront personnalisé",
      "target_count": 3,
      "status": "P1",
      "cooccurrence": "Hydrogen, Oxygen, React",
      "variants": [
        "storefront personnalisé",
        "vitrine personnalisée",
        "storefront custom",
        "front personnalisé",
        "custom storefront"
      ]
    },
    "le-checkout-reste-chez-shopify": {
      "label": "le checkout reste chez Shopify",
      "target_count": 2,
      "status": "P1",
      "cooccurrence": "Shop Pay, Checkout Extensibility, limites du headless",
      "variants": [
        "le checkout reste chez Shopify",
        "le checkout reste hébergé par Shopify",
        "vous ne reprenez pas le checkout",
        "le tunnel de paiement reste Shopify"
      ]
    },
    "migration-par-paliers": {
      "label": "migration par paliers",
      "target_count": 4,
      "status": "P1",
      "cooccurrence": "reverse proxy, plan de rollback, route par route",
      "variants": [
        "migration par paliers",
        "migrer par paliers",
        "migration progressive",
        "par étapes successives",
        "route par route"
      ]
    },
    "backlog-des-developpeurs": {
      "label": "backlog des développeurs",
      "target_count": 3,
      "status": "P2",
      "cooccurrence": "délai de mise en ligne, arbitrage de sprint, autonomie marketing",
      "variants": [
        "backlog des développeurs",
        "backlog de la tech",
        "file d'attente des développeurs",
        "backlog produit",
        "priorisation de sprint"
      ]
    },
    "mettre-en-ligne-une-landing-page": {
      "label": "mettre en ligne une landing page",
      "target_count": 3,
      "status": "P2",
      "cooccurrence": "délai de mise en ligne, CMS headless, design system",
      "variants": [
        "mettre en ligne une landing page",
        "publier une landing page",
        "sortir une landing page",
        "créer une page de campagne",
        "lancer une page promo"
      ]
    },
    "tester-sans-toucher-au-theme": {
      "label": "tester sans toucher au thème",
      "target_count": 2,
      "status": "P2",
      "cooccurrence": "A/B testing, feature flags, duplicata de thème",
      "variants": [
        "tester sans toucher au thème",
        "tester sans dupliquer le thème",
        "tester une variante sans déploiement",
        "expérimenter sans casser le thème"
      ]
    },
    "cout-total-de-possession": {
      "label": "coût total de possession",
      "target_count": 3,
      "status": "P2",
      "cooccurrence": "budget de maintenance, versioning API, recrutement React",
      "variants": [
        "coût total de possession",
        "TCO",
        "coût complet sur trois ans",
        "coût réel de la migration"
      ]
    },
    "rendu-cote-serveur": {
      "label": "rendu côté serveur",
      "target_count": 3,
      "status": "P1",
      "cooccurrence": "indexation, Core Web Vitals, cache edge",
      "variants": [
        "rendu côté serveur",
        "rendu serveur",
        "SSR",
        "server-side rendering"
      ]
    },
    "plan-de-redirections": {
      "label": "plan de redirections",
      "target_count": 3,
      "status": "P1",
      "cooccurrence": "301, structure d'URL, trafic organique",
      "variants": [
        "plan de redirections",
        "plan de redirection",
        "matrice de redirections",
        "mapping des redirections",
        "redirections 301"
      ]
    },
    "apps-shopify-incompatibles": {
      "label": "apps Shopify incompatibles",
      "target_count": 3,
      "status": "P1",
      "cooccurrence": "script tags, app embeds, avis clients, fidélité",
      "variants": [
        "apps Shopify incompatibles",
        "apps qui ne fonctionnent pas en headless",
        "applications incompatibles",
        "apps à reconstruire",
        "apps à remplacer"
      ]
    },
    "avant-de-migrer": {
      "label": "avant de migrer",
      "target_count": 3,
      "status": "P2",
      "cooccurrence": "audit d'apps, seuil de déclenchement, dette technique",
      "variants": [
        "avant de migrer",
        "avant d'engager la migration",
        "avant de signer un devis headless",
        "avant de basculer"
      ]
    },
    "audit-des-apps-installees": {
      "label": "audit des apps installées",
      "target_count": 2,
      "status": "P2",
      "cooccurrence": "app bloat, scripts tiers, Core Web Vitals",
      "variants": [
        "audit des apps installées",
        "audit d'apps",
        "inventaire des apps",
        "cartographier les apps"
      ]
    },
    "vitesse-de-publication": {
      "label": "vitesse de publication",
      "target_count": 2,
      "status": "P2",
      "cooccurrence": "vélocité de déploiement, délai de mise en ligne, preview",
      "variants": [
        "vitesse de publication",
        "cadence de publication",
        "fréquence de mise en production",
        "rythme de publication"
      ]
    },
    "vous-navez-pas-besoin-du-headless": {
      "label": "vous n'avez pas besoin du headless",
      "target_count": 2,
      "status": "P2",
      "cooccurrence": "Online Store 2.0, app bloat, seuil de déclenchement",
      "variants": [
        "vous n'avez pas besoin du headless",
        "le headless n'est pas nécessaire",
        "ne migrez pas",
        "renoncer au headless",
        "le headless est un mauvais choix"
      ]
    },
    "reprendre-la-main-sur-le-front": {
      "label": "reprendre la main sur le front",
      "target_count": 2,
      "status": "P2",
      "cooccurrence": "autonomie marketing, design system, visual editing",
      "variants": [
        "reprendre la main sur le front",
        "reprendre le contrôle du front",
        "rendre la main au marketing",
        "redonner la main aux équipes marketing"
      ]
    }
  }
}