# Un compteur de dons récurrents actifs visible sur le tableau de bord

> Résumer l'état des abonnements de dons mensuels sans ouvrir chaque souscription Stripe une par une, directement dans le tableau de bord WordPress.

- Auteur : WordPress Développement
- Publié le : 2024-06-05
- Mis à jour le : 2026-09-30
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/compteur-dons-recurrents-actifs-tableau-bord/

## L’essentiel

- Synchroniser le statut des abonnements via webhook Stripe
- Compter les abonnements actifs en une requête
- Afficher le total et la variation dans un widget

214 abonnements de dons mensuels actifs, 12 nouveaux ce mois-ci, 5 résiliés : ce sont les trois chiffres qu'une équipe associative voulait voir en un coup d'œil, sans avoir à ouvrir le tableau de bord Stripe et à filtrer manuellement les abonnements par statut. Sur une structure gérant ses dons récurrents via l'API Stripe Billing, connectée à un formulaire WordPress personnalisé, cette information existait déjà côté Stripe, mais restait à une clic de trop du quotidien de l'équipe.

La solution retenue synchronise le statut de chaque abonnement via les webhooks Stripe déjà en place pour le traitement des paiements, stocke un compteur local à jour, et l'affiche dans un widget de tableau de bord WordPress avec la variation par rapport au mois précédent.

## S'appuyer sur les webhooks déjà présents

Un formulaire de don récurrent fonctionnel reçoit déjà les webhooks `customer.subscription.created`, `customer.subscription.updated` et `customer.subscription.deleted` pour gérer les accès et les reçus. Le compteur réutilise ces mêmes événements plutôt que d'ajouter un nouveau mécanisme de synchronisation.

```
add_action( 'wpmoderne_stripe_webhook_recu', function ( $event ) {
    switch ( $event->type ) {
        case 'customer.subscription.created':
            wpmoderne_incrementer_compteur_dons( 1 );
            break;

        case 'customer.subscription.deleted':
            wpmoderne_incrementer_compteur_dons( -1 );
            break;
    }
} );

function wpmoderne_incrementer_compteur_dons( $delta ) {
    $total = (int) get_option( 'wpmoderne_dons_recurrents_actifs', 0 );
    update_option( 'wpmoderne_dons_recurrents_actifs', max( 0, $total + $delta ) );
}
```

## Prévoir une resynchronisation complète périodique

Un compteur incrémenté au fil des webhooks peut dériver, par exemple si un webhook n'a jamais été reçu suite à une panne temporaire. Une tâche hebdomadaire recompte la valeur exacte directement via l'API Stripe pour corriger toute dérive silencieuse.

> L'essentiel à retenir : Synchroniser le statut des abonnements via webhook Stripe ; Compter les abonnements actifs en une requête ; Afficher le total et la variation dans un widget

```
add_action( 'wpmoderne_resync_dons_recurrents', function () {
    $stripe = new \Stripe\StripeClient( STRIPE_SECRET_KEY );
    $total  = 0;
    $params = array( 'status' => 'active', 'limit' => 100 );

    do {
        $page = $stripe->subscriptions->all( $params );
        $total += count( $page->data );

        if ( $page->has_more ) {
            $params['starting_after'] = end( $page->data )->id;
        }
    } while ( $page->has_more );

    update_option( 'wpmoderne_dons_recurrents_actifs', $total );
    update_option( 'wpmoderne_dons_recurrents_derniere_sync', current_time( 'mysql' ) );
} );

if ( ! wp_next_scheduled( 'wpmoderne_resync_dons_recurrents' ) ) {
    wp_schedule_event( time(), 'weekly', 'wpmoderne_resync_dons_recurrents' );
}
```

## Calculer la variation mensuelle

Au-delà du total brut, la variation par rapport au mois précédent donne une lecture plus riche de la santé du programme de dons récurrents. Un instantané mensuel, stocké dans une option historisée, sert de point de comparaison.

```
add_action( 'wpmoderne_snapshot_mensuel_dons', function () {
    $historique = get_option( 'wpmoderne_dons_recurrents_historique', array() );
    $mois       = wp_date( 'Y-m' );

    $historique[ $mois ] = (int) get_option( 'wpmoderne_dons_recurrents_actifs', 0 );

    // Conserver seulement les douze derniers mois.
    $historique = array_slice( $historique, -12, 12, true );

    update_option( 'wpmoderne_dons_recurrents_historique', $historique );
} );
```

## Construire le widget de tableau de bord

Le widget affiche le total actuel, la variation par rapport au mois précédent, et la date de dernière resynchronisation complète pour rassurer sur la fraîcheur de la donnée.

```
add_action( 'wp_dashboard_setup', function () {
    wp_add_dashboard_widget( 'wpmoderne_dons_widget', 'Dons récurrents actifs', function () {
        $total      = (int) get_option( 'wpmoderne_dons_recurrents_actifs', 0 );
        $historique = get_option( 'wpmoderne_dons_recurrents_historique', array() );
        $mois_prec  = array_key_last( $historique );
        $variation  = $mois_prec ? $total - $historique[ $mois_prec ] : 0;

        printf(
            '<p style="font-size:32px;font-weight:bold;">%1$d</p><p>%2$s%3$d ce mois-ci</p>',
            $total,
            $variation >= 0 ? '+' : '',
            $variation
        );
    } );
} );
```

## Points de vigilance

- Un abonnement en statut `past_due` (paiement échoué mais pas encore résilié) ne doit pas être compté comme un échec définitif : Stripe laisse une période de tentatives avant résiliation réelle.
- Traiter séparément les dons ponctuels des dons récurrents dans les statistiques, pour ne jamais confondre les deux dans un même total affiché.
- Documenter la date de dernière resynchronisation dans le widget lui-même, pour que l'équipe sache si le chiffre affiché reflète l'instant présent ou une dérive potentielle depuis quelques jours.

> Un chiffre affiché sans indication de fraîcheur finit par être pris pour argent comptant même quand il ne l'est plus : toujours dater la dernière synchronisation à côté du total.

## En résumé

Ce compteur ne demande aucune nouvelle infrastructure de suivi : il réutilise les webhooks déjà en place pour le traitement des dons, ajoute une resynchronisation périodique en filet de sécurité, et rend visible en tableau de bord une information jusque-là enfouie dans l'interface Stripe. Le gain principal reste le temps que l'équipe associative ne passe plus à vérifier manuellement chaque mois.
