# Construire un tableau de bord de revenus récurrents pour WooCommerce

> MRR, churn, valeur vie client : voici comment extraire ces indicateurs des données d'abonnement WooCommerce pour construire un vrai tableau de bord d'agence.

- Auteur : Clément Hadrot
- Publié le : 2025-05-29
- Mis à jour le : 2025-05-29
- Catégorie : E-commerce
- URL : https://wpmoderne.dev.wordpress-developpement.fr/ecommerce/tableau-bord-revenus-recurrents-woocommerce/

## L’essentiel

- Le MRR ne se déduit pas directement du chiffre d'affaires brut
- Le churn se calcule sur les abonnements actifs, pas sur les commandes
- Un tableau de bord fiable interroge les tables d'abonnement, pas les rapports natifs

Une agence qui gère une dizaine de clients sous abonnement finit toujours par recevoir la même question, un lundi matin : « Est-ce qu'on progresse ou est-ce qu'on stagne ? » Le tableau de bord natif de WooCommerce répond mal à cette question, parce qu'il raisonne en commandes et en chiffre d'affaires ponctuel, pas en revenu récurrent. Pour un client sous abonnement, un mois où personne ne se désabonne mais où personne ne s'abonne non plus ressemble, dans les rapports natifs, à un mois calme. C'est pourtant un mois à surveiller de près.

Nous avons construit, pour un client gérant plusieurs dizaines d'abonnements mensuels et annuels via WooCommerce Subscriptions, un tableau de bord dédié au revenu récurrent. Voici la démarche, réutilisable sur n'importe quelle boutique par abonnement.

## Définir précisément ce qu'on mesure

Le MRR (revenu mensuel récurrent) n'est pas le chiffre d'affaires du mois. Un abonnement annuel de 240 € ne représente pas 240 € de MRR mais 20 €, puisqu'il faut le ramener à une base mensuelle pour pouvoir comparer les abonnements entre eux quelle que soit leur périodicité. Sans cette normalisation, un mois où plusieurs abonnements annuels arrivent à échéance en même temps paraît artificiellement excellent, alors qu'il ne reflète qu'un effet de calendrier.

Trois métriques structurent un tableau de bord utile : le MRR total à une date donnée, le taux de résiliation (churn) mesuré sur la base d'abonnés actifs, et le MRR net des nouveaux abonnements moins les résiliations du mois, qui donne la vraie tendance de croissance.

## Où se trouvent les données dans WooCommerce Subscriptions

Chaque abonnement est un objet de type `shop_subscription`, avec son propre statut (`active`, `on-hold`, `cancelled`, `expired`, `pending-cancel`). Le montant récurrent et la période sont stockés en métadonnées, accessibles via l'API de l'objet : `$subscription->get_total()` pour le montant, `$subscription->get_billing_period()` et `$subscription->get_billing_interval()` pour la fréquence.

## Reconstituer le MRR par requête

Plutôt que de boucler en PHP sur des milliers d'objets d'abonnement (coûteux en mémoire dès quelques centaines d'abonnements actifs), on peut interroger directement les tables sous-jacentes. Sur une installation avec HPOS activé, les données de commande vivent dans des tables dédiées ; les abonnements, eux, restent des objets construits au-dessus de ce même système de stockage. Une requête directe reste possible en ciblant les métadonnées pertinentes, mais elle doit impérativement passer par les fonctions d'accès officielles pour rester compatible avec les futures versions de stockage plutôt que de cibler des noms de table en dur.

> L'essentiel à retenir : Le MRR ne se déduit pas directement du chiffre d'affaires brut ; Le churn se calcule sur les abonnements actifs, pas sur les commandes ; Un tableau de bord fiable interroge les tables d'abonnement, pas les rapports natifs

```
$abonnements_actifs = wcs_get_subscriptions( array(
    'subscription_status' => 'active',
    'subscriptions_per_page' => -1,
) );

$mrr = 0;
foreach ( $abonnements_actifs as $subscription ) {
    $montant = (float) $subscription->get_total();
    $periode = $subscription->get_billing_period();
    $intervalle = max( 1, (int) $subscription->get_billing_interval() );

    $facteur_mensuel = array(
        'day'   => 30 / $intervalle,
        'week'  => 4.345 / $intervalle,
        'month' => 1 / $intervalle,
        'year'  => 1 / ( 12 * $intervalle ),
    );

    $mrr += $montant * ( $facteur_mensuel[ $periode ] ?? 0 );
}
```

Ce calcul, exécuté une fois par jour via une tâche planifiée et stocké dans une table de snapshot dédiée, permet de tracer une courbe de MRR dans le temps sans recalculer l'historique à chaque affichage du tableau de bord.

## Le churn, la métrique qui fait mal mais qui est honnête

Le taux de résiliation mensuel se calcule en comparant le nombre d'abonnements passés au statut `cancelled` ou `expired` pendant le mois, rapporté au nombre d'abonnements actifs en début de mois. Le hook `woocommerce_subscription_status_cancelled` permet de journaliser chaque résiliation avec sa date exacte, plutôt que de reconstituer l'historique après coup à partir du statut courant, qui ne conserve pas la trace du moment de la transition.

```
add_action( 'woocommerce_subscription_status_cancelled', function( $subscription ) {
    global $wpdb;
    $wpdb->insert(
        $wpdb->prefix . 'agence_journal_resiliations',
        array(
            'subscription_id' => $subscription->get_id(),
            'montant_mensuel' => $subscription->get_total(),
            'date_resiliation' => current_time( 'mysql' ),
        )
    );
} );
```

## Assembler le tableau de bord

- Une courbe de MRR total sur douze mois glissants, alimentée par le snapshot quotidien.
- Un indicateur de MRR net du mois en cours (nouveaux abonnements moins résiliations, en valeur mensualisée).
- Un taux de churn mensuel, affiché en pourcentage et en valeur absolue de revenu perdu.
- Une liste des abonnements en statut `on-hold`, qui signalent souvent un échec de paiement récurrent à traiter avant qu'il ne devienne une résiliation définitive.

> Un client qui voit son chiffre d'affaires progresser peut très bien perdre de la valeur récurrente en dessous. Le MRR net est la seule métrique qui ne ment pas sur la tendance réelle d'un modèle par abonnement.

## Pour aller plus loin

Une fois ce socle en place, il devient facile d'ajouter la valeur vie client moyenne (LTV) en croisant le MRR par abonné avec la durée moyenne avant résiliation, ou de segmenter le churn par plan tarifaire pour identifier si un forfait particulier retient moins bien ses abonnés que les autres. L'essentiel reste de ne jamais confondre chiffre d'affaires encaissé et revenu récurrent : ce sont deux histoires différentes, et seule la seconde dit si l'activité par abonnement est réellement en train de grandir.
