Exigences de qualité pour la révision des apps
Stripe examine chaque app soumise au marketplace au regard d’un ensemble complet d’exigences de qualité. Comprendre ces standards avant de développer fait gagner du temps et réduit le nombre d’allers-retours de révision.
Vue d’ensemble
La révision d’une Stripe App évalue votre app sur six domaines clés :
- Tarification transparente, communication claire des coûts
- Fonctionnement de l’app, fiabilité et exhaustivité
- Standards de développement, qualité du code et usage de l’API
- Qualité de l’UX, standards d’interface et d’expérience utilisateur
- Sécurité, protection des données et pratiques sécurisées
- Conformité légale, exigences de confidentialité et réglementaires
Tarification transparente
Votre app doit communiquer clairement tous les coûts aux utilisateurs :
- Divulgation des tarifs : tous les prix doivent être indiqués d’emblée dans la fiche du marketplace
- Aucun frais caché : les utilisateurs ne doivent pas découvrir de frais inattendus après l’installation
- Conditions d’essai : si vous proposez un essai, indiquez clairement sa durée et ce qui se passe à son terme
- Parcours de montée en gamme : toute incitation à l’achat ou à la montée en gamme doit rester discrète et clairement facultative
- Devise : affichez les prix dans la devise locale de l’utilisateur lorsque c’est possible
Caution
Les apps qui masquent leurs tarifs ou facturent les utilisateurs sans consentement clair sont rejetées immédiatement.
Formatage des dates et des heures
Toutes les dates et heures affichées dans votre app doivent suivre les conventions du tableau de bord Stripe :
- Utilisez la locale de l’utilisateur pour formater les dates lorsqu’elle est disponible
- Affichez les heures dans le fuseau horaire local de l’utilisateur
- Utilisez des horodatages relatifs pour les événements récents (par exemple « il y a 2 heures »)
- Utilisez des horodatages absolus avec date et heure complètes pour les événements plus anciens
- Suivez la norme ISO 8601 pour tous les champs de date exposés à l’API
// Good: Use Stripe's date formatting utilitiesimport { formatDate, formatRelativeTime } from '@stripe/ui-extension-sdk/utils';
const formattedDate = formatDate(timestamp); // Locale-awareconst relativeTime = formatRelativeTime(timestamp); // "2 hours ago"Paramètres de l’app
Si votre app nécessite une configuration :
- Proposez une vue Paramètres dédiée, accessible depuis le viewport de l’app
- Préremplissez des valeurs par défaut pertinentes lorsque c’est possible
- Validez toutes les saisies utilisateur avec des messages d’erreur clairs
- Permettez aux utilisateurs de modifier les paramètres sans réinstaller l’app
- Conservez les paramètres d’une session à l’autre avec l’API Secret Store de Stripe
Prise en charge du sandbox
Votre app doit fonctionner correctement dans le mode sandbox (test) de Stripe :
- Compatibilité avec le mode test : toutes les fonctionnalités doivent fonctionner en mode test
- Données de test : utilisez des données de test réalistes qui démontrent le fonctionnement de l’app
- Aucune donnée live dans le sandbox : n’exposez jamais de données de production en mode test
- Gestion élégante : si une fonctionnalité n’est pas disponible dans le sandbox, affichez un message clair qui en explique la raison
- Définissez
sandbox_install_compatible: truedans votre manifest
{ "sandbox_install_compatible": true}Fonctionnement de l’app
Fiabilité
- L’app ne doit ni planter ni se figer lors d’un usage normal
- Toutes les fonctionnalités annoncées doivent fonctionner comme décrit
- Les erreurs réseau doivent être gérées proprement, avec une possibilité de réessayer
- L’app doit rester réactive pendant les opérations en arrière-plan
Exhaustivité
- Aucun contenu provisoire, aucune fonctionnalité « bientôt disponible », aucun lien mort
- Tous les éléments d’interface doivent être fonctionnels, sans bouton inerte ni contrôle inactif
- Les textes d’aide et les liens vers la documentation doivent pointer vers des pages valides
- La désinstallation doit supprimer proprement toutes les données et tous les webhooks de l’app
Performance
- L’interface doit s’afficher en moins de 3 secondes sur une connexion standard
- Les synchronisations en arrière-plan ne doivent pas bloquer l’interface
- Les grands volumes de données doivent utiliser la pagination ou le chargement différé
- Limitez les appels API pour éviter d’atteindre les limites de débit
Standards de développement
Usage de l’API
- Utilisez la dernière version stable de l’API Stripe
- Suivez les bonnes pratiques de l’API Stripe pour la pagination, la gestion des erreurs et l’idempotence
- Ne dépassez pas les limites de débit, mettez en place un backoff exponentiel pour les nouvelles tentatives
- Utilisez les webhooks pour les mises à jour événementielles plutôt que le polling
Qualité du code
- Aucune erreur ni avertissement en console dans les builds de production
- Supprimez toute journalisation de débogage avant la soumission
- Traitez tous les cas limites (états vides, données manquantes, pannes réseau)
- Suivez les patterns de la bibliothèque de composants de Stripe pour une interface cohérente
Versionnement
- Utilisez le versionnement sémantique (MAJEUR.MINEUR.CORRECTIF)
- Documentez les changements incompatibles dans les mises à jour de version
- Maintenez la compatibilité ascendante lorsque c’est possible
Qualité de l’UX
Publicité
- Aucune publicité : votre app ne doit afficher aucune forme de publicité
- Aucune promotion croisée : ne faites pas la promotion d’autres produits ou services dans l’interface de l’app
- Contenu de marque : n’affichez que votre propre identité de marque, pas celle de tiers (à l’exception des partenaires d’intégration comme Brevo)
Langue et contenu
- Terminologie cohérente : employez la même terminologie dans toute l’app
- Ton professionnel : alignez-vous sur le style de communication professionnel et concis du tableau de bord Stripe
- Pas de jargon : évitez le jargon technique que les marchands pourraient ne pas comprendre
- Correction orthographique : assurez-vous que tous les textes sont exempts de fautes d’orthographe et de grammaire
- Anglais uniquement : tous les textes visibles par l’utilisateur doivent être en anglais pour les apps du marketplace
Boîtes de dialogue de confirmation
Exigez une confirmation de l’utilisateur pour les actions destructrices ou importantes :
// Good: Confirm before destructive actionsconst handleDisconnect = async () => { const confirmed = await showConfirmation({ title: 'Disconnect Brevo Integration', message: 'This will stop syncing customer data to Brevo. You can reconnect at any time.', confirmLabel: 'Disconnect', cancelLabel: 'Cancel', destructive: true, });
if (confirmed) { await disconnectIntegration(); }};Actions qui exigent une confirmation :
- Déconnecter des intégrations
- Supprimer des données synchronisées
- Modifier des paramètres qui affectent le flux de données
- Réinitialiser la configuration aux valeurs par défaut
États de chargement
Affichez toujours un indicateur de chargement pour les opérations asynchrones :
// Good: Show loading state during data fetchconst CustomerSyncStatus = () => { const { data, isLoading, error } = useSyncStatus();
if (isLoading) { return <Spinner label="Loading sync status..." />; }
if (error) { return <Banner type="critical" title="Failed to load sync status"> {error.message} </Banner>; }
return <SyncStatusDisplay data={data} />;};Exigences :
- Affichez des indicateurs de chargement ou des écrans squelettes pendant le chargement des données
- Désactivez les boutons pendant la soumission d’un formulaire
- Affichez des indicateurs de progression pour les opérations longues
- N’affichez jamais un écran vide pendant un chargement
Messages d’erreur
Fournissez des messages d’erreur clairs et actionnables :
// Bad: Generic error"Something went wrong"
// Good: Specific and actionable"Unable to sync customer data to Brevo. Please verify your Brevo API keyin Settings and try again."Règles pour les messages d’erreur :
- Expliquez ce qui s’est passé en langage clair
- Proposez une action précise que l’utilisateur peut entreprendre pour résoudre le problème
- Offrez un moyen de relancer l’opération qui a échoué
- Journalisez les informations d’erreur détaillées pour le débogage (sans les montrer aux utilisateurs)
- Incluez des codes d’erreur pour les échanges avec le support lorsque c’est pertinent
Sécurité
API Secret Store
Utilisez l’API Secret Store de Stripe pour tout stockage de données sensibles :
import { createHttpClient, STRIPE_API_KEY } from '@stripe/ui-extension-sdk/http_client';
// Good: Store secrets using the Secret Store APIconst storeBrevoApiKey = async (apiKey: string) => { const stripe = createHttpClient(STRIPE_API_KEY); await stripe.apps.secrets.create({ name: 'brevo_api_key', payload: apiKey, scope: { type: 'account' }, });};
// Good: Retrieve secrets from the Secret Storeconst getBrevoApiKey = async () => { const stripe = createHttpClient(STRIPE_API_KEY); const secret = await stripe.apps.secrets.find({ name: 'brevo_api_key', scope: { type: 'account' }, }); return secret.payload;};Ne stockez jamais de données sensibles dans :
- Le stockage local ou le stockage de session
- Les cookies
- Les paramètres d’URL
- Des valeurs codées en dur dans le code source
- Des fichiers de configuration en texte clair
Cryptographie
- Pas de cryptographie maison : n’implémentez pas vos propres algorithmes de chiffrement
- Utilisez les primitives de sécurité intégrées de Stripe (Secret Store, secrets de signature)
- Utilisez HTTPS pour tous les appels d’API externes
- Vérifiez toutes les signatures de webhook avant traitement
Traitement des données
- Ne demandez que les permissions dont votre app a réellement besoin
- Ne conservez pas de données Stripe au-delà de ce qui est nécessaire au fonctionnement
- Appliquez des politiques de conservation des données alignées sur votre politique de confidentialité
- Prévoyez un mécanisme permettant aux utilisateurs de demander la suppression de leurs données
Conformité légale
Politique de confidentialité
Votre app doit disposer d’une politique de confidentialité accessible publiquement qui couvre :
- Les données que votre app collecte depuis Stripe
- La manière dont ces données sont stockées, traitées et partagées
- Les politiques de conservation et de suppression des données
- Les droits des utilisateurs sur leurs données
- Les coordonnées de contact pour les demandes relatives à la confidentialité
- La conformité aux réglementations applicables (RGPD, CCPA, etc.)
Conditions d’utilisation
- Fournissez des conditions d’utilisation claires pour votre app
- N’incluez pas de clauses en contradiction avec les conditions d’utilisation de Stripe
- Indiquez clairement toute limitation ou restriction d’usage
Conformité réglementaire
- Respectez toutes les réglementations applicables en matière de protection des données
- Mettez en place les accords de traitement des données appropriés
- Prenez en charge les demandes de portabilité et de suppression des données
- Conservez des journaux d’audit pour l’accès aux données et leur traitement
Calendrier du processus de révision
| Étape | Durée |
|---|---|
| Soumission initiale | 5 à 10 jours ouvrés |
| Révision après correction | 3 à 7 jours ouvrés |
| Approbation finale | 1 à 2 jours ouvrés |
| Publication | Immédiate après approbation |
Tip
Traitez l’ensemble des retours de révision en une seule correction pour éviter les cycles multiples. L’équipe Stripe fournit des retours précis et actionnables pour chaque problème relevé.
Raisons de rejet les plus fréquentes
- Gestion des erreurs absente, l’app plante sur une erreur réseau ou une donnée inattendue
- États de chargement insuffisants, écrans vides pendant la récupération des données
- Tarification peu claire, prix non entièrement divulgués dans la fiche
- Permissions excessives, demande de permissions dont l’app n’a pas besoin
- Mode sandbox défaillant, l’app ne fonctionne pas en mode test
- Problèmes de sécurité, secrets stockés en dehors de l’API Secret Store
- Politique de confidentialité manquante, aucune URL de politique de confidentialité accessible
- Fonctionnalités incomplètes, fonctionnalités « bientôt disponible » ou contenu provisoire