Produits de facturation
Modèle de catalogue produit et workflow de gestion admin.
Modèle de catalogue
Les produits de facturation sont stockés dans billing_products avec des
métadonnées non secrètes :
- clé produit
- type (
subscriptionouone_time) - slug de plan
- intervalle (
monthly/yearlyle cas échéant) - slug de droit optionnel
- Stripe price ID, géré en interne après synchronisation
- métadonnées Stripe Product/Price en miroir
- indicateur actif
- ordre de tri
Les admins gèrent les prix produit dans Yayaw. Lorsqu'un montant produit est enregistré, Yayaw crée ou met à jour le Stripe Product correspondant, crée un nouveau Stripe Price lorsque le montant, la devise ou l'intervalle change, archive le Price précédent pour les nouveaux checkouts et stocke le Stripe price ID résultant ainsi que les métadonnées Product/Price en miroir. Les secrets Stripe restent dans les variables d'environnement.
Products & Services est la source de vérité pour les noms, prix, types,
intervalles, état de synchronisation Stripe et disponibilité checkout des
produits de facturation. Les modèles de données CMS ne doivent pas dupliquer ces
champs commerciaux.
Les coupons Stripe et codes promotionnels sont répliqués dans :
billing_stripe_couponsbilling_stripe_promotion_codes
Stripe reste la source de vérité pour les remises ; Yayaw les réplique pour les variables CMS et l'inspection MCP.
Workflow admin
Utilisez les pages admin du tableau de bord :
/dashboard/admin/billing-products/dashboard/admin/billing-settings
Capacités V1 actuelles :
- basculer l'état actif d'un produit
- modifier le montant et la devise du produit
- créer et répliquer le Stripe Product/Price via l'API Stripe
- modifier l'ordre de tri
- conserver des clés produit stables
Les réglages de facturation couvrent actuellement :
- jours de période de grâce
- réglages du dépôt GitHub pour l'accès au code
Les limites de fonctionnalités des plans vivent dans billing_plans et sont
lues par les services de facturation à l'exécution. Les quotas média et les
limites de sièges doivent être modifiés via le modèle de plan de facturation à
l'exécution, pas codés en dur dans les cartes produit.
Contenu Produit CMS
Le seed crée un modèle de données global billing-product-content avec une
entrée par produit du catalogue de facturation. Chaque entrée est liée par le
champ verrouillé catalog_product_key et ne doit contenir que des ajouts
éditoriaux: badge, résumé, puces de fonctionnalités, libellé CTA ou état mis en
avant.
Utilisez ce modèle pour compléter les variables de catalogue dans les pages ou
sections. Utilisez {billing.product.<productKey>.*} et
{billing.price.<productKey>.*} pour les noms de produits, prix, Stripe Price
IDs et disponibilité checkout.
Workflow d'organisation
Utilisez la page de facturation d'organisation :
/dashboard/organization/billing/dashboard/organization/plans
Capacités V1 actuelles :
/billingse concentre sur le résumé du plan actif et l'activité interne/plansse concentre sur la sélection de plan et les actions de checkout- lancer un checkout d'abonnement
- lancer un checkout de paiement unique (
pro_lifetime) - ouvrir le portail de facturation Stripe
- voir les raisons de désactivation du checkout avant de cliquer sur les actions
L'action du portail de facturation est désactivée jusqu'à ce que l'organisation possède un client Stripe enregistré. Cela évite un échec de portail confus avant que le premier checkout réussi ne crée le client dans Stripe.
Notes opérationnelles
- Si un produit n'a pas de Stripe price ID synchronisé, un Stripe Price/Product en miroir actif ou comporte une erreur de synchronisation, le checkout est désactivé pour ce produit.
- Les sessions Stripe Checkout d'abonnement et de paiement unique autorisent les codes promotionnels Stripe.
- Le seed crée uniquement les lignes de produits manquantes et n'écrase pas les changements de catalogue gérés par opérateur.
- Les clés produit sont des contrats stables. Ajoutez une nouvelle clé produit pour une nouvelle offre commerciale plutôt que de réutiliser une clé existante avec une sémantique différente.
- Les Stripe Price IDs sont immuables pour le montant/la devise/l'intervalle. Les changements de montant créent un nouveau Price actif et archivent l'ancien Price pour les nouveaux checkouts.
- Les données de remise sont répliquées depuis Stripe uniquement pour les usages en lecture. Créez et gouvernez les coupons/codes promotionnels dans Stripe.
- Le checkout à vie en paiement unique accorde
pro_lifetimeet crée un grant durable d'accès au code indexé par session de checkout Stripe. - Le checkout d'abonnement crée un grant durable d'accès au code indexé par Stripe subscription ID, puis rafraîchit ou révoque ce grant sur les événements d'abonnement.
Workflow MCP
Les outils du plan de contrôle (control plane) exposent le catalogue et le miroir des remises Stripe :
yayaw_billing_products_listyayaw_billing_product_updateyayaw_stripe_discounts_listyayaw_stripe_discounts_sync
Les écritures nécessitent control-plane:admin, l'autorisation Yayaw
billing-product:update et un reason.
Validation
Vérifications utiles après des changements du catalogue de facturation :
bun test src/lib/server/services/billing/billing-products.test.ts
bun test src/lib/server/services/billing/stripe-catalog-sync.test.ts
bun test src/lib/server/services/billing/billing-organization-view.test.ts
bun run testVue d'ensemble de la facturation
Architecture de facturation et modèle d'exécution pour les abonnements et les paiements uniques.
Procédure opérationnelle de test de la facturation
Stratégie de validation manuelle et automatisée pour les abonnements, le checkout de paiement unique, les webhooks et l'application des règles.