Hook

On a fetché /.well-known/ucp sur 83 boutiques DTC françaises mid-market. 45 sont confirmées Shopify. 41 exposent un manifest UCP parsable. Sur ces 41, 0 ne passe la validation au-delà du minimum spec. Et le plus troublant : les 41 manifests sont structurellement identiques au bit près. Mêmes 8 capabilities, mêmes 2 handlers de paiement, tailles de fichier dans une fenêtre de 83 bytes (3600-3683). Aucune marque française n’a customisé son manifest. Le marché FR n’a pas commencé à toucher à UCP.

Cet article décrit la méthodologie, les cinq patterns d’erreur observés, pourquoi Shopify laisse ces trous, et le fix concret par pattern. La donnée brute (02-manifests-raw.json, 03-validation.json) et les scripts de reproduction sont publiés à la fin.

Méthodologie

L’étude a été conduite le 28 avril 2026, sur la spec UCP 2026-04-08.

Sourcing. 83 candidates DTC/mid-market FR sélectionnées pour leur visibilité dans le marché : mode (Sézane, Polène, Asphalte, Loom, Rouje, Jacquemus, Maison Kitsuné, Ami Paris…), beauté (Typology, La Rosée, Respire, Oh My Cream, Buly 1803…), foyer (Tediber, Emma…), accessoires (Cabaïa, Bobbies, Izipizi, Jimmy Fairly…), kids (Bonton, La Petite Étoile…). Marques connues à des stades variés : du small brand (Loom, Caval, Patine) aux Shopify Plus (Sézane, Rouje, Jacquemus).

Confirmation Shopify. Pour chaque domaine, GET de la homepage avec User-Agent identifiable et inspection des marqueurs HTML (cdn.shopify.com, Shopify.theme, shopify-section, ShopifyAnalytics) et des headers (x-shopify-shop-id, x-shopify-stage, powered-by). Sur 83 candidates, 45 sont fingerprintées Shopify. Les 38 restantes sont sur Salesforce Commerce Cloud (Petit Bateau, Aigle, Repetto, Le Coq Sportif, Le Tanneur), Magento, ou des stacks custom — exclues du périmètre.

Fetch manifest. Pour chaque domaine confirmé Shopify, GET https://{domain}/.well-known/ucp avec timeout 12s, redirect follow, concurrency 5. Capture du status HTTP, content-type, body, durée, et chaîne de redirection. Stockage brut dans 02-manifests-raw.json.

Validation 3 niveaux. Trois niveaux dérivés de la spec 2026-04-08, du moins exigeant au plus exigeant :

Les scripts de validation sont open : scripts/fetch-manifests.ts et scripts/validate.ts, tout en TypeScript natif Node 22 sans dépendance npm. Tu peux relancer toi-même.

Honnêteté méthodologique. La spec 2026-04-08 n’impose pas formellement merchant ou signing_keys au top-level. Notre L2 mesure la qualité attendue d’un marchand qui veut être correctement représenté par un agent IA — pas un strict respect spec. C’est volontaire. Un manifest L1-only est techniquement valide mais sémantiquement vide pour un agent.

Le résultat global

NiveauBoutiques qui passent%
L0 (présence + parsable)41 / 4591 %
L1 (structurel)41 / 4591 %
L2 (identité & customisation)0 / 450 %
L3 (network & crypto)0 / 450 %

41 manifests sur 41 sont byte-identiques au niveau structurel. Mêmes versions supportées (2026-01-23 et 2026-04-08), mêmes 8 capabilities, mêmes 2 payment handlers (com.google.pay et dev.shopify.card), tailles de 3600 à 3683 bytes. La seule chose qui varie d’un shop à l’autre, c’est le subdomain *.myshopify.com dans les URLs des endpoints. Le reste est un template.

Quatre boutiques Shopify ne passent pas L0 : trois retournent du HTML (la page 404 du thème) au lieu d’un JSON, et une retourne explicitement 404. Ces shops sont invisibles aux agents IA au sens UCP, soit parce qu’Agentic Storefronts est désactivé en admin, soit parce qu’ils n’ont pas reçu la feature flag.

Les cinq patterns d’erreur (et leur fréquence)

Tous les manifests présents échouent sur les neuf mêmes checks L2, exactement. Ce ne sont pas des bugs de marchands. C’est le scope de l’auto-gen Shopify qui n’inclut pas ces champs. Voici les cinq plus impactants.

Pattern 1 — Aucun bloc merchant (41/41, 100 %)

Le manifest auto-gen Shopify ne contient aucun bloc merchant. Pas de nom de marque. Pas d’identifier stable (URN, URI). Pas de pays (ISO 3166-1). Pas de contact support. Si un agent IA reçoit le manifest de Polène, Rouje ou Sézane, il ne peut pas savoir, depuis le manifest seul, qu’il parle à une marque française de maroquinerie ou de mode. Il déduit de l’hostname et fait confiance à Shopify sur le reste.

Pour un marchand, ça veut dire que le moteur de l’agent ne peut pas appliquer de logique brand-aware (filtrage par pays de fabrication, par segment, par positionnement) sans aller chercher l’info ailleurs. Et pour l’utilisateur final qui demande “trouve-moi une marque française de maroquinerie sous 300 €”, l’agent doit deviner ou cross-référencer avec sa propre base.

Pattern 2 — Aucun signing_keys (41/41, 100 %)

Pas de JWK publique exposée. Aucun marchand FR ne signe cryptographiquement les réponses MCP qu’il renvoie aux agents. Concrètement, un agent qui veut vérifier qu’une réponse de catalog ou de checkout vient bien du shop déclaré, et n’a pas été altérée en transit par un middleman, ne peut pas. Il fait confiance à TLS et c’est tout.

Pour le moment, ce n’est pas un casus belli — la chaîne TLS suffit dans 99 % des cas. Mais AP2 (Agent Payments Protocol) attend des mandats signés, et la non-répudiation des transactions agentiques va devenir un sujet dans les 12 mois. Les premiers chargebacks contestés en mode “ce n’est pas moi qui ai autorisé” vont mettre la pression sur la signature manifeste. Les marchands FR n’ont pas commencé à se poser la question.

Pattern 3 — Aucun contact support déclaré (41/41, 100 %)

Pas d’email, pas d’URL de contact dans le manifest. Or UCP prévoit un mode requires_escalation dans le state machine du checkout : quand l’agent rencontre une situation qu’il ne peut pas trancher (3DS, ambiguïté de stock, dispute sur une promotion), il doit pouvoir adresser un humain. Sans contact support exposé, l’escalation est impossible côté agent. Le user est renvoyé vers le shop par redirection web, ce qui casse la conversation.

Pattern 4 — Capabilities limitées au baseline Shopify (41/41, 100 %)

Tous les manifests exposent strictement les huit mêmes capabilities :

dev.shopify.catalog.storefront
dev.ucp.shopping.cart
dev.ucp.shopping.catalog.lookup
dev.ucp.shopping.catalog.search
dev.ucp.shopping.checkout
dev.ucp.shopping.discount
dev.ucp.shopping.fulfillment
dev.ucp.shopping.order

Aucune extension custom. Si tu vends en abonnement (Aime, Patyka, Nuoo dans notre échantillon ont des modèles d’abonnement actifs), dev.ucp.shopping.subscriptions n’apparaît pas. Si tu as un programme de fidélité (Cabaïa, Oh My Cream, Sézane), dev.ucp.shopping.loyalty non plus. Si tu fais du B2B en parallèle (Asphalte, Bonne Gueule), pas de capability dédiée. Si tu proposes du click & collect ou des points relais (très répandu en FR), rien.

Concrètement : un agent ne peut pas découvrir tes capabilities différenciantes depuis ton manifest. Il découvre le minimum commun à tous les shops Shopify. Ton avantage compétitif sur ces capacités est invisible.

Pattern 5 — Payment handlers limités (41/41, 100 %)

Tous les manifests déclarent strictement deux handlers : com.google.pay et dev.shopify.card. Pas d’Apple Pay (pourtant activé sur la quasi-totalité des shops FR mid-market que j’ai testés en checkout réel). Pas de Klarna, pas de Alma, pas de PayPal, pas de Shop Pay, pas d’Adyen, pas d’Affirm, pas de virement SEPA. Or le paiement fractionné est une attente forte du marché FR (Alma a 14 % de pénétration sur certains panels DTC selon les données 2025), et son absence du manifest signifie que l’agent ne peut pas le proposer dans la conversation.

Conséquence : un user qui demande à son agent IA “paie en 4x” sur un shop FR ne se verra pas proposer Alma, parce que le manifest dit que le shop ne supporte que GPay et la carte Shopify. Faux du point de vue du checkout réel. Vrai du point de vue de l’agent.

Les bonnes surprises

Aucune.

Sur 41 manifests, zéro a customisé. Pas un. Pas même Sézane, pas Polène, pas Tediber, pas Typology, pas une seule marque mid-market FR sérieuse n’a poussé un manifest qui dépasse l’auto-gen Shopify. C’est en soi le résultat le plus remarquable de l’étude : le marché FR n’a pas commencé.

Pour qui cherche un avantage compétitif tangible, c’est une fenêtre. La première marque FR qui publie un manifest correctement enrichi (merchant block, signing keys, capabilities customs) sortira du lot mécaniquement dans le ranking agent — pas par un effet brand mais par un effet data quality. Le coût technique est de l’ordre de quelques jours-développeur. Le coût d’opportunité de ne pas le faire augmente chaque mois où les agents IA capturent une part croissante du discovery e-commerce.

Détail technique notable : le leak *.myshopify.com

Tous les manifests, sans exception, exposent l’endpoint MCP via le subdomain *.myshopify.com du shop, jamais via le custom domain. Exemples observés (anonymisés) :

Ce n’est pas catastrophique en termes de sécurité — les *.myshopify.com sont publics par design. Mais c’est un leak de cohérence brand : la conversation entre l’agent et ton shop ne passe pas par tamarque.fr, elle passe par tamarque-shop-2023.myshopify.com. Si ta marque est suffisamment connue, cette dissonance se voit dans les logs des agents et peut prêter à confusion sur l’identité de l’interlocuteur.

Pourquoi Shopify laisse ces trous

Trois hypothèses, sans Shopify-bashing.

1. UCP est jeune. La spec a été stabilisée le 2026-04-08. Shopify a activé un manifest baseline pour que les agents voient quelque chose sur tout shop, pas pour produire un manifest complet. C’est un MVP côté plateforme. La même approche a été prise pour les structured data Schema.org en 2012 : Shopify a activé un set minimal automatique, et a laissé l’enrichissement aux thèmes et aux apps.

2. L’identité, c’est le territoire du marchand. Shopify n’a pas l’autorité pour publier merchant.country, merchant.support, signing_keys sans demander au marchand. Ces champs nécessitent une UI admin (formulaire dans le dashboard) que Shopify n’a pas encore livrée pour la France. Aux US, les Agentic Storefronts en early access ont commencé à exposer un sous-ensemble de ces champs depuis fin mars, mais le rollout complet n’est pas planifié avant Q3 2026.

3. Trade-off scale vs richesse. Auto-générer pour 5,6 millions de boutiques signifie un template uniforme et stable, pas un manifest bespoke par shop. La richesse vient ensuite par deux voies : soit Shopify livre une UI d’enrichissement dans l’admin (coûteux à développer, à localiser, à supporter), soit l’écosystème d’apps Shopify livre la couche de personnalisation. Historiquement, c’est toujours l’écosystème qui gagne sur ce genre de feature.

Donc ne le prends pas comme un trou bouché demain par Shopify. Prends-le comme un espace ouvert pour les marchands qui acceptent d’investir un peu de temps technique maintenant, avant que la plateforme ne ferme la boucle.

Le fix par pattern

Trois options techniques pour publier un manifest UCP custom sur un shop Shopify, du plus léger au plus engageant :

  1. Worker en bord de réseau (Cloudflare Worker, Vercel Edge Function, etc.) qui intercepte /.well-known/ucp au niveau DNS et renvoie un JSON enrichi. Couvre le custom domain. Ne touche pas Shopify. Recommandé si tu n’as pas d’app dédiée.
  2. App Proxy Shopify qui répond sur une route dédiée au domaine du shop. Plus complexe à setup mais reste dans l’écosystème Shopify.
  3. Reverse proxy custom sur ton infra (si tu en as une devant le shop, ce qui est rare en mid-market mais existe en Shopify Plus avec edge custom).

Pour les fixes techniques eux-mêmes, voici le minimum à publier en complément de l’auto-gen.

Fix 1 — bloc merchant

{
  "ucp": {
    "merchant": {
      "name": "Ta Marque",
      "identifier": "urn:brand:ta-marque-paris",
      "country": "FR",
      "languages": ["fr", "en"],
      "support": {
        "email": "support@ta-marque.com",
        "url": "https://ta-marque.com/contact",
        "phone": "+33 1 XX XX XX XX"
      },
      "tax_jurisdictions": ["FR", "EU"],
      "vat_id": "FR12345678901"
    }
  }
}

identifier doit être stable dans le temps (ne change pas si tu migres de plan ou de domaine). Préférer un URN à une URL. support.email est exigé pour les escalations agentiques.

Fix 2 — signing_keys

Génère une paire ECDSA P-256, publie la JWK publique, signe les réponses MCP côté backend.

"signing_keys": [
  {
    "kty": "EC",
    "crv": "P-256",
    "x": "...",
    "y": "...",
    "kid": "ta-marque-2026-06",
    "alg": "ES256",
    "use": "sig"
  }
]

Roule la clé au moins une fois par an, garde la précédente dans le manifest pendant la fenêtre de transition. Le kid (key ID) doit être unique et auditable dans tes logs.

Fix 3 — agent_profile_url

Une URL HTTPS qui pointe vers une fiche JSON-LD Organization étendue : logo, description, certifications (B-Corp, Origine France Garantie, ESS), valeurs de marque, segments produits, références clients ou presse. C’est la “carte de visite” lue par l’agent au-delà du strict commerce.

Cette page peut être un endpoint de ton CMS, un static file généré au build, ou une route dédiée sur le shop. L’important est qu’elle soit stable et consommable JSON.

Fix 4 — capabilities customs

Ajoute au minimum les capabilities qui correspondent à ce que tu vends réellement :

Chaque capability doit pointer vers un schema JSON résolvable. Tu peux héberger les schemas custom sur ton propre domaine (ex: https://ta-marque.com/.well-known/ucp/schemas/loyalty.json).

Fix 5 — payment handlers

Déclare honnêtement tous les handlers que tu supportes en checkout :

"payment_handlers": {
  "com.google.pay": [{ ... }],
  "com.apple.pay": [{ ... }],
  "com.shop.pay": [{ ... }],
  "com.klarna": [{ "modes": ["pay_in_3", "pay_in_30"] }],
  "com.alma": [{ "modes": ["p2x", "p3x", "p4x"] }],
  "com.paypal": [{ ... }],
  "dev.shopify.card": [{ ... }]
}

Surtout pour Alma et Klarna : ces handlers sont structurellement importants pour le marché FR et leur absence du manifest restreint l’expérience proposée par l’agent.

Limites et reproductibilité

Échantillon. 41 manifests valides, sous le seuil cible de 50. Trois explications. D’abord, parmi les 83 candidates DTC/mid-market FR connues, 38 ne sont pas Shopify (Salesforce Commerce Cloud, Magento, custom). C’est cohérent avec une part de marché Shopify estimée autour de 50-60 % du DTC mid-market FR. Ensuite, 4 boutiques Shopify ne servent pas de manifest (UCP désactivé en admin ou feature flag absente). Pour atteindre 50 manifests valides, il faudrait étendre à ~15 marques FR supplémentaires (food/wine/spirits, men’s grooming, accessoires de niche). Itération possible.

Validation L2 = opinion structurée. La spec UCP 2026-04-08 ne rend pas merchant et signing_keys formellement obligatoires. Notre L2 mesure ce qu’on considère comme la qualité minimale pour qu’un manifest soit utile à un agent au-delà du discovery basique. À assumer dans la lecture : ce n’est pas du strict spec compliance, c’est de l’analyse fonctionnelle.

L3 non testé en conditions réelles. Comme L2 échoue 41 / 41, L3 est skippé par construction (signing_keys absent → check L3.5 inopérant). Une itération future pourrait isoler L3.1 (MCP endpoint reachable) et L3.4 (capability schemas resolvables) du gating L2 pour avoir un chiffre indépendant.

Fingerprint Shopify. Possibles faux négatifs si un shop utilise un reverse proxy qui strippe les headers Shopify. Rare mais existe sur certains shops Plus avec edge custom. Aucun cas clairement identifié dans l’échantillon.

Annexe — données et scripts publics

Les fichiers suivants sont publiés sous research/ucp-audit-50/ du repo agent-ecommerce.fr :

Pour relancer l’audit toi-même :

node --experimental-strip-types research/ucp-audit-50/scripts/fetch-manifests.ts
node --experimental-strip-types research/ucp-audit-50/scripts/validate.ts

Les scripts sont idempotents. Re-runner fetch-manifests.ts écrase 02-manifests-raw.json avec les nouvelles captures, ce qui te permet de tracker l’évolution des manifests Shopify dans le temps. Si tu observes une variation par rapport aux données du 28 avril 2026, on est preneur — on republiera l’étude avec un delta.

Et après

Cette étude est la base d’un outil que je suis en train d’industrialiser : un audit UCP automatisé pour boutique Shopify, qui te dit en deux minutes où ton manifest est en-dessous du minimum exploitable, et te génère le diff exact à appliquer pour passer L2 puis L3. Cet outil sera publié sous le nom Manifest Auditor d’ici l’été. Si tu veux y avoir accès en early, tu peux laisser ton email dans le formulaire d’audit ci-dessous. Pas de spam, juste le lien quand c’est prêt.

Le sujet UCP en 2026 n’est pas une opportunité brand. C’est une opportunité technique. Les marques FR qui investissent maintenant 2-3 jours-développeur dans l’enrichissement de leur manifest seront représentées proprement par les agents IA dès l’activation française des Agentic Storefronts. Les autres seront un nom dans une liste de 41 manifests strictement identiques.