Statistiques & Calculs
Cette page documente toutes les métriques et formules utilisées dans les sections CSM et Media Buyer.
Constantes globales
| Constante | Valeur | Description |
|---|---|---|
PARIS_TZ | Europe/Paris | Toutes les limites de dates calculées en heure de Paris |
NOV_1_2025 | 2025-11-01 | Point de départ des métriques globales (IR, historique dépenses) |
EXCLUDED_BRANCH_CODES | ['1001', '1197'] | Succursales toujours exclues des calculs |
EXCLUDED_STATUSES | ['Hors zone', 'Faux numéro', 'Doublon', 'Déjà client chez nous'] | Statuts de leads non facturables |
Classification des leads
leadsFacturés = leads WHERE leadStatus NOT IN EXCLUDED_STATUSES OR leadStatus IS NULL
leadsNonFacturés = leads WHERE leadStatus IN EXCLUDED_STATUSES
Classification des rendez-vous
Parmi tous les leads où leadStatus = 'Rdv pris' :
rdvPris = COUNT(leads WHERE leadStatus = 'Rdv pris')
rdvMisAJour = COUNT(rdvPris WHERE appointmentStatus IS NOT NULL AND appointmentStatus ≠ '')
rdvPasVenu = COUNT(rdvPris WHERE appointmentStatus = 'Pas venu')
rdvEnAttente = COUNT(rdvPris WHERE appointmentStatus IS NULL OR appointmentStatus = '')
rdvPositif = COUNT(rdvPris WHERE appointmentStatus NOT IN ('Pas venu','En attente',
'Suivi appareillage','Non appareillable','Échec d''appareillage'))
rdvHonorés = rdvPris - rdvPasVenu - rdvEnAttente
Seuil de données suffisantes
Une succursale a suffisamment de données quand au moins 50% de ses rendez-vous ont été mis à jour :
hasEnoughData = (rdvMisAJour / rdvPris) ≥ 0,5
Les métriques dépendant des résultats de rendez-vous (coût/appareil, crPositif, crEntonnoir) sont null pour les succursales qui n'atteignent pas ce seuil.
Taux de conversion
| Métrique | Formule | Description |
|---|---|---|
| CR Phoning | rdvPris / leadsFacturés | % de leads ayant conduit à un rendez-vous |
| CR No-show | rdvPasVenu / rdvPris | % de rendez-vous non honorés |
| CR Positif | rdvPositif / rdvHonorés | % de rendez-vous honorés qui étaient positifs |
| CR Entonnoir | rdvPositif × 0,8 / leadsFacturés | Taux de conversion global de l'entonnoir |
Le facteur
× 0,8modélise le taux d'appareillage de 80% (fraction des rendez-vous positifs aboutissant à la vente d'un appareil auditif).
Appareils vendus
appareilsVendus = rdvPositif × 0,8 × 1,95
× 0,8→ taux d'appareillage de 80%× 1,95→ nombre moyen d'appareils vendus par appareillage réussi (les deux oreilles en moyenne)
Résolution du prix du lead
Pour chaque succursale, le prix du lead est résolu dans l'ordre de priorité suivant :
- Enregistrement billing-branch verrouillé le plus récent :
billingBranches[0].price - Valeur par défaut de la succursale :
branch.leadPrice null→ succursale exclue des calculs de coût/revenu
Montant facturé
montantFacturé = leadsFacturés × prixLead
Coût par appareil
coûtParAppareil = montantFacturé / appareilsVendus
Calculé uniquement quand hasEnoughData = true et appareilsVendus > 0.
Seuil critique : coûtParAppareil > 300 €
Revenu potentiel
revenupotentiel = rdvPositif × 0,8 × 1100 × 1,95
1100= revenu moyen par appareil vendu (€)× 0,8 × 1,95= même formule que les appareils vendus
Dépenses publicitaires
Les dépenses brutes sont récupérées depuis meta_statistics et google_statistics par succursale et par jour.
Coefficient media : les campagnes Meta avec mode = 'media' sont multipliées par 1,15 pour tenir compte des frais d'agence :
dépensesAjustées = dépenses × (mode === 'media' ? 1,15 : 1)
Total des dépenses par succursale = somme de toutes les dépenses journalières ajustées (Meta + Google).
CPL (Coût par lead)
cpl = totalDépenses / totalLeads
IR (Taux de retour sur investissement)
Calculé depuis le 1er novembre 2025 (non limité au mois en cours) :
ir = (leadsFacturés_depuis_nov1 × prixLead) / totalDépenses_depuis_nov1
Un ratio > 1,0 signifie que le chiffre d'affaires de facturation dépasse les dépenses publicitaires → succursale rentable.
Succursales actives
Les succursales actives sont comptées par jour en utilisant une moyenne journalière :
activesParJour[date] = UNION des succursales avec active=1 dans meta_statistics
OU active=1 dans google_statistics pour cette date
succursalesActives = MOYENNE(|activesParJour[date]| pour chaque date de la période)
Fenêtres des périodes de suivi
Chaque onglet de suivi limite les données de leads à une fenêtre temporelle relative à la date du premier lead de la succursale :
| Onglet | Âge depuis le premier lead | Fenêtre de données |
|---|---|---|
recent30 | 0–29 jours | Date premier lead → aujourd'hui |
days30 | 30–89 jours | Date premier lead → date premier lead + 30 jours |
days90 | 90–364 jours | Date premier lead → date premier lead + 90 jours |
annual | 365+ jours | Date premier lead → date premier lead + 365 jours |
État du portfolio
Une succursale est ON un jour donné si elle a un enregistrement meta_statistics avec active = 1 pour cette date.
actives = succursales avec active=1 aujourd'hui
inactives = totalSuccursales - actives
pct = count / totalSuccursales × 100
Clients OFF
Une succursale est un client OFF si elle est inactive depuis 60+ jours consécutifs :
joursInactifs = aujourd'hui - dernièreDateActiveMetaStatistics
clientOff = joursInactifs ≥ 60
Abus d'invalidité
Une succursale présente un abus d'invalidité si plus de 20% de ses leads sont non facturables :
pctInvalides = invalides / totalLeads
abus = pctInvalides > 0,20
Calculs delta (mois sur mois)
La période de comparaison est la même plage de jours dans le mois précédent (limitée au dernier jour du mois précédent si nécessaire) :
delta = null si valeurPrécédente = 0
= (valeurActuelle - valeurPrécédente) / valeurPrécédente × 100 sinon