Aller au contenu principal

Paiements

Stripe avec 5 plans, 16 modules à la carte, 6 bundles, et système freemium.

Configuration Stripe

Variables d'environnement essentielles

# Clés API
STRIPE_SECRET_KEY="sk_test_xxxx"              # Serveur uniquement
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY="pk_test_xxxx"  # Client
STRIPE_WEBHOOK_SECRET="whsec_xxxx"            # Validation webhooks

Fichiers clés

FichierRôle
src/lib/stripe-plan.tsPlans, prix, modules, bundles
src/lib/freemium/freemium-limits.tsQuotas par plan
src/lib/freemium/freemium-guard.tsGuard centralisé (checkFreemiumLimit)
src/app/api/webhooks/stripe/Webhooks Stripe
src/app/api/checkout/Checkout sessions

Plans

HeartCo propose 5 plans avec une tarification EUR et CHF :

Tarification EUR

PlanNom commercialMensuelAnnuelUtilisateurs inclus
FREEPulsation Gratuit0 €0 €1
STARTERPulsation15 €12 €/mois1
CORERythme34 €27 €/mois3
BUSINESSBattement69 €55 €/mois10
ENTERPRISECœur+139 €111 €/mois50

Réduction annuelle : ~20% sur tous les plans.

Tarification CHF (Suisse)

PlanMensuelAnnuel
STARTER17 CHF14 CHF/mois
CORE39 CHF31 CHF/mois
BUSINESS79 CHF63 CHF/mois
ENTERPRISE159 CHF127 CHF/mois

Utilisateurs supplémentaires

MensuelAnnuel
EUR9 €7 €/mois
CHF10 CHF8 CHF/mois

Période d'essai

  • Durée : 14 jours
  • Plan : Battement (BUSINESS) complet
  • Carte bancaire : non requise
  • À l'expiration : downgrade automatique vers FREE
  • Crons : trial-expiry (downgrade) + trial-reminder (rappels à J-7 et J-2)

Modules à la carte

16 modules achetables individuellement, en complément du plan :

ModuleIDMensuelAnnuel
DevisMODULE_DEVIS8 €6 €
Gestion financièreMODULE_COMPTABILITE12 €10 €
Notes de fraisMODULE_NOTES_FRAIS8 €6 €
Relances automatiquesMODULE_RELANCES6 €5 €
CRM & PipelineMODULE_CRM10 €8 €
Catalogue produitsMODULE_PRODUITS7 €6 €
FournisseursMODULE_FOURNISSEURS5 €4 €
Rendez-vousMODULE_RENDEZ_VOUS7 €6 €
Bons de travailMODULE_BONS_TRAVAIL9 €7 €
Rapports terrainMODULE_RAPPORTS_TERRAIN9 €7 €
Itinéraires optimisésMODULE_ITINERAIRES5 €4 €
Gestion équipeMODULE_EQUIPE7 €6 €
Feuilles de tempsMODULE_FEUILLES_TEMPS6 €5 €
Fiches de paieMODULE_FICHES_PAIE10 €8 €
Congés & AbsencesMODULE_RH_CONGES6 €5 €
Assistant IAMODULE_CHATBOT_IA9 €7 €

Modules inclus par plan

PlanModules inclus
FREEAucun
STARTERDevis
COREDevis, CRM, Relances, Produits, Fournisseurs
BUSINESSCore + Comptabilité, Notes de frais, Équipe, Congés, Bons de travail, Feuilles de temps, Assistant IA
ENTERPRISETous les modules

Bundles

6 packs thématiques regroupant plusieurs modules :

BundleMensuelAnnuelPlan requis
Pack BTP29 €23 €BUSINESS
Pack Freelance Pro19 €15 €STARTER
Pack Agence Services24 €19 €CORE
Pack Commerce & Retail24 €19 €CORE
Pack Entreprise Complète39 €31 €BUSINESS
Pack Marketing Pro19 €15 €CORE

Quotas freemium

Chaque plan impose des limites d'utilisation. Le système "check before, increment after" vérifie les quotas avant chaque action.

FeatureFREETRIALSTARTERBUSINESSENTERPRISE
Factures/mois31550
Devis/mois21030
Clients (total)1030200
Produits (total)1050200
Deals CRM (total)520
Bons de travail/mois315
Rapports/mois210
Fournisseurs (total)315
Membres d'équipe151030
Événements calendrier/mois10
Messages chatbot/jour530100
Idées/mois3
Congés/mois15
Notes de frais/mois210
Feuilles de temps/mois530
Rendez-vous/mois320
Générations image/mois0101050200

Les quotas mensuels sont réinitialisés le 1er de chaque mois via le cron reset-usage.

Pattern "check before, increment after"

// Dans le router tRPC
const guard = await checkFreemiumLimit(ctx, "invoices");
if (!guard.allowed) {
  throw new TRPCError({
    code: "FORBIDDEN",
    message: `Quota factures atteint (${guard.used}/${guard.limit})`,
  });
}
 
// ... créer la facture ...
 
// Incrémenter APRÈS le succès (pas avant)
await ctx.db.subscription.update({
  where: { organizationId: ctx.session.user.organizationId },
  data: { invoicesUsed: { increment: 1 } },
});

Webhooks Stripe

Les webhooks Stripe sont gérés dans src/app/api/webhooks/stripe/. Événements principaux :

ÉvénementAction
checkout.session.completedActive l'abonnement
customer.subscription.updatedMet à jour le plan
customer.subscription.deletedDowngrade vers FREE
invoice.payment_succeededMarque le paiement
invoice.payment_failedNotification d'échec

Modifier les plans

Changer un prix

  1. Modifier dans src/lib/stripe-plan.ts :
PLAN_PRICING_EUR: {
  CORE: { monthly: 39, annual: 31 },  // Nouveau prix
}
  1. Créer de nouveaux Price IDs dans le dashboard Stripe
  2. Mettre à jour les variables d'environnement STRIPE_PRICE_*

Ajouter un module à la carte

  1. Ajouter dans MODULE_PRICES_EUR de src/lib/stripe-plan.ts
  2. Créer les Price IDs dans Stripe (monthly + annual)
  3. Ajouter les env vars STRIPE_PRICE_MODULE_*
  4. Ajouter dans STRIPE_PRICE_MAP

Changer les quotas freemium

Modifier PLAN_LIMITS dans src/lib/freemium/freemium-limits.ts. Utiliser -1 pour "illimité".

Fonctions utilitaires

import {
  getPlanFromPriceId,
  isModulePriceId,
  isBundlePriceId,
  isPlanPriceId,
  getPriceIdForCurrency,
} from "~/lib/stripe-plan";
 
// Identifier un Price ID
getPlanFromPriceId("price_xxx");        // "CORE" | null
isModulePriceId("price_xxx");           // true/false
isBundlePriceId("price_xxx");           // true/false
 
// Obtenir un Price ID par devise
getPriceIdForCurrency("CORE", "monthly", "EUR");  // "price_xxx"
getPriceIdForCurrency("CORE", "annual", "CHF");   // "price_yyy"