Le CRA life-time, indicateur clef du business model abonnements.

En abonnement, le CRA life-time est une des 3 valeurs pivots du business model abonné et de sa rentabilité. Les deux autres sont la « durée de vie par abonné » exprimée généralement en mois et le « revenu moyen par abonné » par mois (ARPU – Average Revenue Per User). Le CRA, tout opérateur d’abonnements connaît : Coût de Recrutement par Abonné, il représente le montant qu’il a fallu investir en marketing pour conquérir un nouvel abonné. Comparable au CPO (Cost per Order) de la VAD et du eCommerce, il est simple à calculer : Coût de Recrutement par Abonné : formule de calcul Mais, en matière d’abonnements, c’est sur la durée que s’obtient le ROI (retour sur investissement). Il va donc falloir conserver l’abonné dans le temps, ce qui occasionne des investissements marketing complémentaires. Ainsi, la notion de CRA life time rentre en jeu.

CRA INITIAL / CRA LIFE TIME

Le CRA initial est calculé au moment de la conquête de l’abonné. On peut basiquement calculer son ROI. Il intervient au moment où la marge brute cumulée atteint le montant du CRA initial : l’abonné commence à rapporter son 1er € de marge.

CRA Initial et ROI primaire

Schéma de CRA initial et ROI primaire pour un business model d’abonnement.

Ceci est vrai dans un modèle idéal dans lequel un abonné recruté ne subit aucune attrition. Dans les faits, les abonnés sont moins dociles : ils annulent leur abonnement, ont des incidents de paiement, suspendent provisoirement, changent d’offre…. Leur vie n’est donc pas linéaire et leur longévité est variable. Les services marketing vont donc devoir mener des pour allonger la durée de vie des abonnés. Les dépenses afférentes seront à ajouter au CRA initial pour obtenir le CRA life time. Ce dernier n’est jamais figé, il s’incrémente tout au long de la vie de l’abonné, au fil des actions de fidélisation auxquelles il est exposé.   Avec cette approche, le CRA Life-time, en permanente évolution, repousse sans cesse légèrement le moment de ROI.

Calcul du Coût de Recrutement par Abonné

Schéma de CRA life time et ROI réel pour un business model d’abonnement.

On visualise bien que le CRA initial seul est trompeur pour calculer le ROI. Dans le schéma, le CRA initial seul prévoit un ROI au 10ème mois quand le CRA Life-time le positionne au 14ème mois.   Cette notion de Life-time est donc cruciale pour une modélisation réaliste d’une activité d’abonnements.

CALCUL DU CRA LIFE-TIME

Le CRA Life-time d’un abonné tient donc compte :

  • De son CRA initial,
  • De sa durée de vie,
  • Des dépenses de fidélisation observées durant sa vie d’abonné.

CRA Life-time = CRA initial + Montant total des investissements marketing de fidélisation durant la vie de l’abonné. Pour modéliser le CRA Life-Time, il faut connaître le CRA initial moyen des nouveaux abonnés. On ajoute la variable d’attrition mensuelle de ces nouveaux clients qui permet une projection de l’évolution du portefeuille. On comptabilise par ailleurs les dépenses de fidélisation par abonné.   Exemple de CRA Life-time sur une vie d’un abonné :

  • Notre CRA initial est de 100€.
  • Nous investissons 1€ par abonné par mois en fidélisation.
  • Notre attrition est de 5% par mois en année 1. Puis une attrition moins élevée les années suivantes.
  • Notre CA mensuel est de 30€ avec une marge à 12.50€.

 

Modélisation de la vie d'un abonné

Modélisation de la vie d’un abonné

Le CRA Life-time sur 10 ans s’élève, dans l’exemple, à 138.33€. Le nombre de mois de ROI pour l’obtenir est donc à 14 mois de vie de l’abonné. Déduction faite de ce CRA Life-time, la marge nette cumulée à 10 ans s’élève ici à 268.28€.On voit ici, qu’en année 1, le CRA Life-time est déjà différent du CRA initial. On a engagé des dépenses de fidélisation et, dans le même temps, on a subi une attrition de 5% par mois. Le calcul du CRA Life-time prend donc en compte :

  • 100€ de CRA initial + 1€ par mois avec 5% d’attrition mensuelle.Le 1er mois notre 1€ de dépenses de fidélisation n’est déjà donc plus que 0.95€ puisque l’on a déjà perdu 5% du portefeuille. Le mois suivant, on passe à 95% de 0.95€ soit 0.9025€ de dépenses de fidélisation et ainsi de suite jusqu’à terminer l’année 1 avec 8.65€ qui se sont ajouté au CRA initial pour donner le CRA Life-time à 12 mois de 108.65€.Dans l’exemple, l’année 1 est déficitaire puisque la marge brute dégagée (calculée elle aussi en prenant en compte l’attrition mensuelle) est trop faible pour couvrir le CRA Life-time. Si l’on ne raisonnait qu’en CRA initial (100€ dans notre exemple), on pourrait croire que notre ROI se situe en fin d’année 1 avec une marge de 100,94€. Dans les faits, le modèle indique bien un ROI à 14 mois.

  Les indicateurs incontournables du calcul du ROI sont donc :

  • Le CRA initial, qui nécessite de suivre précisément les coûts d’acquisition.
  • Les dépenses de fidélisation par abonné et par an, qui nécessitent un suivi précis des investissements en fidélisation.
  • Le suivi de l’attrition de son portefeuille.

A noter que cet article présente le CRA Life-time d’abonnés sans engagement (à durée libre) qui règlent mensuellement leur abonnement. Pour des abonnés à durée déterminée qui payent cash pour un abonnement de 12 mois par exemple, le principe est le même. On prend en compte le CRA initial + les coûts de fidélisation et notamment ceux induits par les actions visant à réabonner le client après la fin du premier contrat d’abonnement + le taux de réabonnement observé (nombre d’abonnés qui se réabonnent). On pourra aussi retenir que, contrairement à ce que l’on peut parfois penser, la notion de chiffre d’affaires initial est le plus souvent dénuée de sens dans l’appréciation de la performance d’une action de recrutement. Ce sont les variables, CRA life-time et Marge Life-time qui sont déterminantes pour valider le ROI d’un business model d’abonnement.

Les consultants abonnements de CustUp sont souvent amenés, au cours de leurs mission, à aider nos clients à reconstituer leurs CRA initiaux puis à travailler sur les CRA life-time et donc l’attrition, afin de comprendre le comportement des portefeuilles abonnés et de connaître les seuils de rentabilité. On peut parfois avoir des surprises… et pas toujours agréables ! Les chiffres sont têtus !…

Besoin d'échanger ? Contactons-nous !
Partager :
Caroline Hauss est consultante en abonnements. Elle dirige les missions CustUp et optimise les business models d’abonnements. Sur notre blog,

Caroline Hauss est consultante en abonnements. Elle dirige les missions CustUp et optimise les business models d’abonnements. Sur notre blog, Caroline décrypte les fondamentaux de l’abonnement.

[custup_nom_silo]
[custup_form_optinmonster]
[custup_form_optinmonster]
[custup_form_blog_inline_optinmonster]
<script type="text/javascript"> jQuery(document).ready(function( $ ) { var dj_envoyer_inscription = true; jQuery(document).delegate( '#dj_envoyer_inscription-M3DGG', 'click', function(){ if(dj_envoyer_inscription){ dj_envoyer_inscription = false; var email = jQuery('#dj_form_optinmonster-M3DGG input[name="email"]').val(); var data = new FormData(); data.append( "action", "inscription_mailchimp"); data.append( "email", email); var recaptcha_response = ""; grecaptcha.ready(function () { grecaptcha.execute('6Lc5kLoUAAAAAD3ltaKWkySZa3ss4UzqzFYmCBxn', { action: 'inscription_mailchimp' }).then(function (token) { data.append( "recaptcha_response", token); jQuery("#dj_form_optinmonster-M3DGG .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-M3DGG .panel-primary").css('display', 'block'); jQuery("#dj_form_optinmonster-M3DGG .panel-primary span").html( site.message_030 ); $.ajax({ url: site.ajax_url, type: 'post', dataType: 'JSON', processData: false, contentType: false, cache: false, data: data, success: function(result) { if(result.alerte){ jQuery("#dj_form_optinmonster-M3DGG .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-M3DGG .panel-danger span").html(result.alerte); jQuery("#dj_form_optinmonster-M3DGG .panel-danger").css('display', 'block'); }else if(result.message){ jQuery("#dj_form_optinmonster-M3DGG .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-M3DGG .panel-success span").html(result.message); jQuery("#dj_form_optinmonster-M3DGG .panel-success").css('display', 'block'); } if(result.status){ dataLayer.push({ "event": "gaEvent", "eventCategory": "Blog-Inline", "eventAction": "clic", "eventLabel": "https://www.custup.com/cra-life-time-cout-de-recrutement-par-abonne/", "eventValue": "", "eventNoninteraction": "true" }); } dj_envoyer_inscription = true; }, error: function(errorThrown){ dj_envoyer_inscription = true; } }); }); }); } return false; }); }); </script> <div id="dj_form_optinmonster-M3DGG" class="form_inline"> <div class="form-group col-md-12 col-sm-12 col-xs-12 no-padding m-5"> <div class="panel panel-primary m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-success m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-danger m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> </div> <div class="col-md-7 col-sm-12 col-xs-12 no-padding form-group"> <input class="form-control form-inline" type="text" id="dj_email" name="email" placeholder="E-mail" /> </div> <div class="col-md-5 col-sm-12 col-xs-12 no-padding form-group envoyer text-center "> <button id="dj_envoyer_inscription-M3DGG" class="dj_envoyer_inscription" type="submit">Je m'abonne !</button> </div> </div>
[le Nom du Silo]
[le Nom du Silo]
[custup_icon]
<img src="https://www.custup.com/wp-content/themes/custup/public/img/icon.png" alt="Merci pour votre visite" class="skip-lazy" width="28" height="27"/>
[custup_form_exit]
<script type="text/javascript"> jQuery(document).ready(function( $ ) { var dj_envoyer_inscription = true; var email = ""; jQuery(document).delegate( '#emailgQwV7', 'change', function(){ email = jQuery(this).val(); }); jQuery(document).delegate( '#dj_envoyer_inscription-exit-gQwV7', 'click', function(){ if(dj_envoyer_inscription){ dj_envoyer_inscription = false; var data = new FormData(); data.append( "action", "inscription_mailchimp"); data.append( "email", email); data.append( "exit", 1 ); var recaptcha_response = ""; grecaptcha.ready(function () { grecaptcha.execute('6Lc5kLoUAAAAAD3ltaKWkySZa3ss4UzqzFYmCBxn', { action: 'inscription_mailchimp' }).then(function (token) { data.append( "recaptcha_response", token); jQuery("#dj_form_optinmonster-exit-gQwV7 .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-exit-gQwV7 .panel-primary").css('display', 'block'); jQuery("#dj_form_optinmonster-exit-gQwV7 .panel-primary span").html( site.message_030 ); $.ajax({ url: site.ajax_url, type: 'post', dataType: 'JSON', processData: false, contentType: false, cache: false, data: data, success: function(result) { if(result.alerte){ jQuery("#dj_form_optinmonster-exit-gQwV7 .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-exit-gQwV7 .panel-danger span").html(result.alerte); jQuery("#dj_form_optinmonster-exit-gQwV7 .panel-danger").css('display', 'block'); }else if(result.message){ jQuery("#dj_form_optinmonster-exit-gQwV7 .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-exit-gQwV7 .panel-success span").html(result.message); jQuery("#dj_form_optinmonster-exit-gQwV7 .panel-success").css('display', 'block'); } if(result.status){ dataLayer.push({ "event": "gaEvent", "eventCategory": "Exit", "eventAction": "clic", "eventLabel": "https://www.custup.com/cra-life-time-cout-de-recrutement-par-abonne/", "eventValue": "", "eventNoninteraction": "true" }); } dj_envoyer_inscription = true; }, error: function(errorThrown){ dj_envoyer_inscription = true; } }); }); }); } return false; }); }); </script> <div id="dj_form_optinmonster-exit-gQwV7" class="form_inline popin-exit"> <div class="form-group col-md-12 col-sm-12 col-xs-12 no-padding m-5"> <div class="panel panel-primary m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-success m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-danger m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> </div> <div class="col-md-12 col-sm-12 col-xs-12 no-padding form-group"> <input class="form-control" type="text" id="emailgQwV7" name="email" placeholder="E-mail" /> </div> <div class="col-md-12 col-sm-12 col-xs-12 no-padding form-group envoyer text-center "> <button id="dj_envoyer_inscription-exit-gQwV7" class="dj_envoyer_inscription" type="submit">S'inscrire !</button> </div> </div>
[custup_scroll_nom_silo]
[custup_form_silo_scroll_optinmonster]
<script type="text/javascript"> var email = ""; jQuery(document).ready(function( $ ) { var dj_envoyer_inscription = true; jQuery(document).delegate( '#emailPsW2m', 'change', function(){ email = jQuery(this).val(); }); jQuery(document).delegate( '#dj_envoyer_inscription-PsW2m', 'click', function(e){ if(dj_envoyer_inscription){ dj_envoyer_inscription = false; var data = new FormData(); data.append( "action", "inscription_mailchimp"); data.append( "email", email); data.append( "id_article", 2474); var recaptcha_response = ""; grecaptcha.ready(function () { grecaptcha.execute('6Lc5kLoUAAAAAD3ltaKWkySZa3ss4UzqzFYmCBxn', { action: 'inscription_mailchimp' }).then(function (token) { data.append( "recaptcha_response", token); jQuery("#dj_form_optinmonster-PsW2m .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-PsW2m .panel-primary").css('display', 'block'); jQuery("#dj_form_optinmonster-PsW2m .panel-primary span").html( site.message_030 ); $.ajax({ url: site.ajax_url, type: 'post', dataType: 'JSON', processData: false, contentType: false, cache: false, data: data, success: function(result) { if(result.alerte){ jQuery("#dj_form_optinmonster-PsW2m .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-PsW2m .panel-danger span").html(result.alerte); jQuery("#dj_form_optinmonster-PsW2m .panel-danger").css('display', 'block'); }else if(result.message){ jQuery("#dj_form_optinmonster-PsW2m .panel").css('display', 'none'); jQuery("#dj_form_optinmonster-PsW2m .panel-success span").html(result.message); jQuery("#dj_form_optinmonster-PsW2m .panel-success").css('display', 'block'); } if(result.status){ dataLayer.push({ "event": "gaEvent", "eventCategory": "Silo-XXX-Scroll", "eventAction": "clic", "eventLabel": "https://www.custup.com/cra-life-time-cout-de-recrutement-par-abonne/", "eventValue": "", "eventNoninteraction": "true" }); } dj_envoyer_inscription = true; }, error: function(errorThrown){ dj_envoyer_inscription = true; } }); }); }); } return false; }); }); </script> <div id="dj_form_optinmonster-PsW2m"> <form> <div class="form-group col-md-12 col-sm-12 col-xs-12 no-padding m-5"> <div class="panel panel-primary m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-success m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-danger m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> </div> <div class="col-md-12 col-sm-12 col-xs-12 no-padding form-group"> <input class="form-control" type="text" id="emailPsW2m" name="email" placeholder="E-mail" /> </div> <div class="col-md-12 col-sm-12 col-xs-12 no-padding form-group envoyer text-center "> <button id="dj_envoyer_inscription-PsW2m" class="dj_envoyer_inscription" value="xx" type="submit">S'inscrire</button> </div> </form> </div>
[custup_count_abonnes_liste_mailchimp]
4131
[custup_form_horizontal_optinmonster]
<script type="text/javascript"> var email = ""; jQuery(document).ready(function( $ ) { var dj_envoyer_inscription = true; jQuery(document).delegate( '#emailZdxEZ', 'change', function(){ email = jQuery(this).val(); }); jQuery(document).delegate( '#dj_envoyer_inscription-ZdxEZ', 'click', function(){ if(dj_envoyer_inscription){ dj_envoyer_inscription = false; var data = new FormData(); data.append( "action", "inscription_mailchimp"); data.append( "email", email); grecaptcha.ready(function () { grecaptcha.execute('6Lc5kLoUAAAAAD3ltaKWkySZa3ss4UzqzFYmCBxn', { action: 'inscription_mailchimp' }).then(function (token) { data.append( "recaptcha_response", token); jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel").css('display', 'none'); jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel-primary").css('display', 'block'); jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel-primary span").html( site.message_030 ); $.ajax({ url: site.ajax_url, type: 'post', dataType: 'JSON', processData: false, contentType: false, cache: false, data: data, success: function(result) { if(result.alerte){ jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel").css('display', 'none'); jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel-danger span").html(result.alerte); jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel-danger").css('display', 'block'); }else if(result.message){ jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel").css('display', 'none'); jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel-success span").html(result.message); jQuery("#dj_form_horizontal_optinmonster-ZdxEZ .panel-success").css('display', 'block'); } if(result.status){ dataLayer.push({ "event": "gaEvent", "eventCategory": "Blog-Floating-Bar", "eventAction": "clic", "eventLabel": "https://www.custup.com/cra-life-time-cout-de-recrutement-par-abonne/", "eventValue": "", "eventNoninteraction": "true" }); } dj_envoyer_inscription = true; }, error: function(errorThrown){ dj_envoyer_inscription = true; } }); }); }); } return false; }); }); </script> <div id="dj_form_horizontal_optinmonster-ZdxEZ" class="dj_form_horizontal_optinmonster"> <input type="hidden" name="recaptcha_response" value=""> <div class="col-md-12 col-sm-12 col-xs-12 no-padding form-group dj_email_content"> <input class="form-control" type="text" id="emailZdxEZ" name="email" placeholder="E-mail" /> </div> <div class="col-md-12 col-sm-12 col-xs-12 no-padding form-group text-center dj_email_envoyer"> <button id="dj_envoyer_inscription-ZdxEZ" class="dj_envoyer_inscription" type="submit">Valider</button> </div> <div class="form-group col-md-12 col-sm-12 col-xs-12 no-padding m-5"> <div class="panel panel-primary m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-success m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> <div class="panel panel-danger m-0" style="display:none;"> <div class="panel-heading"> <span class="m-5"></span> </div> </div> </div> </div>