Aller au contenu
Publié le
Plateforme

Calcul de nos indicateurs financiers

Pour chaque chiffre : ce qu'il mesure, sa formule, les modèles Odoo lus, le périmètre, la convention retenue et ses limites connues.

Pourquoi cette page existe#

Un expert-comptable qui relit nos chiffres ne demande pas si l'outil est joli. Il demande d'où vient le montant, sur quelle période, avec quelle convention, et ce qui n'est pas dedans. Sans ces réponses, il ne peut pas accorder sa confiance, donc il ne la donne pas. Cette page est là pour qu'il n'ait rien à deviner, et elle est publique : pas besoin de compte pour la lire.

Ce qui garantit qu'elle est à jour#

Ces définitions ne sont pas rédigées à côté du produit, elles vivent dans le code qui calcule. Un contrôle automatique refuse toute modification du calcul d'un indicateur qui ne serait pas accompagnée de sa définition, un second refuse que cette page s'écarte des définitions, et un troisième refuse une définition sans sa traduction. Une documentation non gardée est fausse en trois mois ; celle-ci ne peut pas l'être sans bloquer la livraison.

Deux conséquences qu'il vaut mieux dire :

  • Le périmètre d'un chiffre est mesuré, pas déclaré. Quand UpBoard annonce « écritures comptabilisées du 1er au 13 octobre, 1 240 lignes lues », ces valeurs viennent des lectures réellement exécutées dans votre Odoo, pas d'une phrase écrite à la main.
  • Seules les écritures comptabilisées sont lues, sauf une exception signalée comme telle : la marge par produit, qui lit des commandes confirmées et n'est donc pas une lecture comptable.

Les trois règles qui gouvernent les périodes#

Elles valent pour tous les indicateurs datés, et ce sont celles qui se trompent le plus silencieusement ailleurs.

  1. L'appartenance à une période suit la date comptable de l'écriture, jamais sa date de création ou de dernière modification technique. Pour les créances et les dettes, c'est la date d'échéance qui compte, puisque c'est le retard qui est mesuré.
  2. Les cumuls partent de l'ouverture de votre exercice comptable, pas du 1er janvier. Si votre exercice se clôture le 30 juin, le comparatif avec l'année précédente et les versements anticipés à l'impôt des sociétés suivent cet exercice.
  3. L'état de vos comptes est lu dans Odoo. Un mois antérieur à votre date d'arrêté est annoncé définitif ; un mois ouvert annonce son jour et la date d'arrêté. Si UpBoard ne peut pas lire cette date, il dit que le statut est inconnu, et jamais que la période est ouverte.

Ce qu'UpBoard ne couvre pas en finance#

Dit franchement, parce qu'un trou découvert seul coûte plus cher qu'un trou annoncé :

  • la clôture avec écritures : UpBoard ne passe aucune écriture de régularisation et ne verrouille aucune période ;
  • les immobilisations : aucun suivi ni plan d'amortissement. Seule une anomalie est détectée, les biens non amortis ;
  • le réel contre le budget : aucune comparaison budgétaire ;
  • les notes de frais : ni validation, ni remboursement.

Si votre Odoo contient des données sur l'un de ces sujets, UpBoard vous le dit plutôt que de laisser croire que ses chiffres les englobent.

Le référentiel#

19 indicateurs documentés
O01

Score de santé compta

Score composite 0-100 et grade A-F
Ce que ça mesure
Une note d'ensemble de la tenue financière, sur cinq axes.
Calcul
Moyenne pondérée des cinq axes (trésorerie, créances, dettes, fiscal, performance). Chaque sous-score suit une courbe `100 · exp(-pénalité/100)` avec un plancher à 1, et non une soustraction linéaire.
Sources Odoo
  • Aucune lecture propre : agrège les sorties de O02 à O19.
Périmètre
Même périmètre que les analyses agrégées.
Convention retenue
La courbe exponentielle a remplacé la soustraction linéaire, qui saturait à 0 dès sept anomalies critiques et rendait 10 et 40 critiques indiscernables. Le bas du barème est inchangé.
Limites connues
  • Un axe sans donnée exploitable n'est pas noté : le score est alors annoncé partiel, avec les axes non notés. Ne jamais lire un score partiel comme une note complète.
  • Un domaine Odoo absent chez le client est exclu de la moyenne plutôt que noté 100 : zéro anomalie faute de module ne vaut pas « tout va bien ».
O02

Trésorerie disponible et autonomie

Solde de trésorerie, burn rate, runway
Ce que ça mesure
Ce qu'il y a en banque et en caisse, et combien de temps ça tient.
Calcul
Solde = somme des balances des comptes de liquidité. Burn rate mensuel = charges des 90 derniers jours / 3. Runway = solde / burn rate mensuel.
Sources Odoo
  • `account.move.line.balance` sur les comptes de liquidité
  • `account.account` pour identifier ces comptes
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Le burn rate est lissé sur 90 jours : un seul mois atypique donnerait une autonomie fantaisiste.
Exclus du chiffre
  • Lignes de crédit non tirées, découverts autorisés.
Limites connues
  • Aucune écriture de trésorerie trouvée ne donne pas un solde de 0 mais un solde **inconnu** : un faux zéro se lirait comme une faillite.
  • Le runway n'est rendu que si le burn rate est positif.
O03

Prévisionnel de trésorerie 30, 60, 90 jours

Projection d'encaissements et décaissements probabilisés
Ce que ça mesure
L'évolution probable du solde, et la date d'un éventuel découvert.
Calcul
Solde projeté = solde actuel + encaissements attendus pondérés − décaissements attendus. Pondération des encaissements par horizon : 90 % à 30 jours, 75 % à 60 jours, 60 % à 90 jours. Les dettes fournisseurs sont comptées à 100 %.
Sources Odoo
  • `account.move.amount_residual` et `invoice_date_due` (clients et fournisseurs)
  • Solde de départ : mêmes comptes que O02
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Asymétrie volontaire : on escompte ce qu'on doit recevoir, jamais ce qu'on doit payer. Un prévisionnel optimiste sur les sorties ne sert à rien.
Exclus du chiffre
  • Factures non encore émises, commandes non facturées, salaires et échéances fiscales à venir qui ne sont pas des écritures.
Limites connues
  • Les taux de recouvrement sont des hypothèses fixes, pas un historique du client : un payeur systématiquement en retard est traité comme les autres.
  • Les sorties récurrentes hors comptabilité (salaires, loyers non encore comptabilisés) ne sont pas projetées, donc le solde projeté est plutôt optimiste.
O04

Alertes de trésorerie

Franchissements de seuil sur le solde et le runway
Ce que ça mesure
Les situations de trésorerie qui exigent une décision maintenant.
Sources Odoo
  • Aucune lecture propre : lit les sorties de O02 et O03.
Périmètre
Même périmètre que O02 et O03.
Limites connues
  • Solde inconnu : aucune alerte de trésorerie n'est émise, plutôt qu'une alerte rassurante ou alarmiste sur un chiffre absent.
O05

Rapprochement bancaire

Lignes bancaires non rapprochées et correspondances proposées
Ce que ça mesure
Ce qui reste à rapprocher, et ce que le rapprochement peut proposer seul.
Sources Odoo
  • `account.bank.statement.line` non rapprochées
  • `account.move` ouvertes (`amount_residual`) pour la mise en correspondance
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Une correspondance n'est proposée que sur un faisceau d'indices concordants ; rien n'est rapproché automatiquement.
Limites connues
  • Les listes sont plafonnées (2 000 lignes lues) : sur une base très volumineuse, le compte affiché est un plancher, et la troncature est dite.
  • Un paiement groupé couvrant plusieurs factures n'est pas rapproché.
O06

Position nette de trésorerie

Trésorerie nette des dettes court terme, quick ratio
Ce que ça mesure
Ce qui reste réellement après avoir payé le court terme.
Calcul
Position nette = trésorerie − dettes à court terme. Quick ratio = trésorerie / dettes à court terme.
Sources Odoo
  • Trésorerie : mêmes comptes que O02
  • `account.move.amount_residual` des factures fournisseurs ouvertes
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Le court terme est borné aux échéances à 30 jours et au déjà échu.
Exclus du chiffre
  • Dettes financières à plus d'un an, provisions.
Limites connues
  • Le quick ratio n'est pas rendu quand il n'y a aucune dette court terme : une division par zéro ne vaut pas « ratio excellent ».
O07

Balance âgée clients

Aging des créances par tranche d'ancienneté
Ce que ça mesure
Qui doit combien, et depuis combien de temps.
Calcul
Répartition de `amount_residual` en cinq tranches selon l'écart entre aujourd'hui et `invoice_date_due` : non échu, 1-30, 31-60, 61-90, +90 jours.
Sources Odoo
  • `account.move` clientes ouvertes : `amount_residual`, `invoice_date_due`
  • `res.partner` pour le nom du client
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
L'ancienneté se compte sur la **date d'échéance**, pas sur la date de facture : c'est le retard qui est mesuré, pas l'âge du document.
Exclus du chiffre
  • Factures en brouillon, avoirs non imputés.
Limites connues
  • Un litige commercial en cours n'est pas distingué d'un simple retard de paiement : les deux apparaissent comme une créance échue.
O08

Risque de crédit par client

Score de défaut 0-100 et encours exposé
Ce que ça mesure
La probabilité qu'un client ne paie pas, et le montant en jeu.
Calcul
Score pondéré sur quatre facteurs : historique de paiement 35 %, encours actuel 25 %, ancienneté de la relation 20 %, signaux récents 20 %. Seuils : 75 critique, 50 élevé, 25 moyen.
Sources Odoo
  • `account.move` clientes et `account.payment` (historique)
  • `res.partner` (ancienneté de la relation)
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Les poids sont fixes et assumés comme tels : c'est un classement pour prioriser des relances, pas une notation financière.
Limites connues
  • Aucune donnée externe (solvabilité publiée, défaut déclaré) n'entre dans le score : il ne lit que l'historique présent dans Odoo.
  • Un client récent sans historique obtient un score peu informatif.
O09

Délai moyen d'encaissement

DSO (days sales outstanding), méthode countback
Ce que ça mesure
Le nombre de jours moyen entre la facture et son paiement.
Calcul
Countback : on remonte le chiffre d'affaires facturé mois par mois jusqu'à épuiser l'encours client, et on compte les jours parcourus. Fenêtre d'analyse : 365 jours (180 jours par client).
Sources Odoo
  • `account.move` clientes : `invoice_date`, `invoice_date_due`, `amount_residual`
  • `account.payment` pour les dates de règlement
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Countback plutôt que la formule par ratio (encours / CA × jours) : le ratio écrase les effets de saisonnalité et donne un DSO flatteur sur une activité irrégulière.
Limites connues
  • Un mois de facturation exceptionnel déforme le DSO de la période suivante, countback comprise.
  • Le DSO par client sur 180 jours n'est pas comparable au DSO global sur 365 jours : ne pas les mettre côte à côte sans le dire.
O10

Clients à relancer

File de relance priorisée, niveau et canal
Ce que ça mesure
Qui relancer cette semaine, à quel niveau et par quel moyen.
Sources Odoo
  • `account.move` clientes échues
  • `mail.message` pour savoir ce qui a déjà été envoyé
  • `res.partner` pour le canal disponible
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Trois niveaux (rappel, relance formelle, mise en demeure) déterminés par l'ancienneté du retard et l'historique de relance, pas par le montant seul.
Limites connues
  • Un dossier relancé depuis moins de sept jours et resté sans réponse n'est pas re-signalé : utile contre le harcèlement, mais le dossier disparaît temporairement de la file.
  • Une réponse arrivée depuis la boîte d'un employé plutôt que l'adresse du client peut ne pas être vue.
O11

Promesses de paiement

Suivi des engagements client, tenus et rompus
Ce que ça mesure
Qui s'est engagé à payer, et qui a tenu.
Sources Odoo
  • `mail.message` sur les factures (l'engagement est un échange, pas un champ)
  • `account.move.amount_residual` et `invoice_date_due` (le paiement attendu)
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Limites connues
  • Un engagement pris par téléphone et non consigné dans Odoo est invisible : l'indicateur ne mesure que ce qui a été écrit.
O12

Balance âgée fournisseurs

Aging des dettes par tranche d'ancienneté
Ce que ça mesure
À qui on doit combien, et depuis quand.
Calcul
Mêmes tranches que la balance âgée clients, appliquées aux factures fournisseurs ouvertes.
Sources Odoo
  • `account.move` fournisseurs ouvertes : `amount_residual`, `invoice_date_due`
  • `res.partner` pour le fournisseur
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Ancienneté comptée sur la date d'échéance, comme pour les clients.
Exclus du chiffre
  • Factures en brouillon, notes de crédit non imputées.
Limites connues
  • Un escompte de règlement anticipé disponible n'est pas signalé ici.
O13

Délai moyen de paiement

DPO (days payable outstanding)
Ce que ça mesure
Le nombre de jours moyen entre la facture fournisseur et son paiement.
Calcul
Délai constaté entre `invoice_date` et la date de règlement, rapproché par le lettrage. Fenêtre d'analyse : 365 jours.
Sources Odoo
  • `account.move` fournisseurs et `account.move.line` (lettrage)
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Le paiement est daté par le lettrage, pas par la date de l'écriture de banque : c'est le lettrage qui dit quelle facture a été soldée.
Limites connues
  • Le repère sectoriel affiché est indicatif et interne, ce n'est pas une statistique officielle.
  • Un paiement partiel étalé donne un délai moyen peu représentatif.
O14

Date de paiement conseillée

Arbitrage trésorerie contre relation fournisseur
Ce que ça mesure
Quand payer chaque facture pour garder du cash sans abîmer la relation.
Sources Odoo
  • `account.move` fournisseurs ouvertes : `invoice_date_due`, `amount_residual`
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Trois dates proposées par facture (au plus tôt, conseillée, limite) ; aucune n'est appliquée automatiquement.
Limites connues
  • Les conditions de paiement négociées hors Odoo, et l'escompte, ne sont pas connus de l'indicateur.
O15

TVA prévisionnelle

Solde de TVA de la période en cours et anomalies de codes
Ce que ça mesure
Ce qui sera à payer ou à récupérer à la prochaine déclaration.
Calcul
TVA collectée − TVA déductible sur les écritures de la période.
Sources Odoo
  • `account.move.line` sur les comptes de TVA : `balance`
  • `res.company` pour la périodicité déclarative
  • `ir.module.module` pour vérifier la localisation belge
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
La périodicité vient du réglage de la société quand il existe ; sinon le trimestriel des PME belges est **supposé** et dit comme tel, parce qu'une échéance mensuelle prise pour trimestrielle est une échéance ratée.
Exclus du chiffre
  • Écritures en brouillon, donc une TVA non encore comptabilisée.
Limites connues
  • Ce n'est pas une déclaration : aucun report, aucun prorata de déduction, aucun régime particulier n'est appliqué.
  • Un solde calculé en cours de période n'est pas le solde final.
O16

Échéances fiscales

Calendrier à 90 jours (TVA, ISOC, listing intracommunautaire)
Ce que ça mesure
Ce qui tombe dans les trois mois, et ce qui est critique.
Sources Odoo
  • Catalogue belge interne, daté par le code
  • `res.company` pour l'exercice comptable et le numéro d'entreprise
Périmètre
Société courante : seuls le réglage d'exercice et le numéro d'entreprise sont lus. **Aucune écriture comptable n'est lue** : les dates viennent du catalogue légal, pas de la comptabilité. Les obligations ne sont jamais consolidées au niveau groupe, chaque société dépose les siennes.
Convention retenue
Les versements anticipés ISOC se comptent depuis l'ouverture de la **période imposable**, pas depuis les trimestres civils : pour un exercice au 30 juin, les quatre dates glissent d'autant. La TVA, elle, garde son rythme civil.
Limites connues
  • Catalogue belge seulement, et tenu à la main : une date légale qui change demande une mise à jour du code.
  • Sans numéro d'entreprise lisible sur la société, les échéances société sont affichées par défaut plutôt que tues.
  • Ce calendrier ne remplace pas celui du mandataire fiscal.
O17

Compte de résultat du mois

P&L mensuel avec charges récurrentes attendues
Ce que ça mesure
Le résultat du mois en cours, et ce qu'il manque encore pour le clore.
Calcul
Agrégation des écritures du mois par catégorie de compte (plan comptable belge) : chiffre d'affaires, marge brute, résultat avant amortissements, résultat opérationnel. Les charges récurrentes des trois mois précédents absentes du mois en cours sont signalées comme attendues.
Sources Odoo
  • `account.move.line.balance` et `account.account.code`
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante. Mois calendaire.
Convention retenue
Le mois reste le mois calendaire, même sur un exercice décalé : un compte de résultat mensuel est mensuel. En revanche l'état des comptes vient d'Odoo : un mois antérieur à la date d'arrêté est annoncé définitif, un mois ouvert annonce son jour et la date d'arrêté.
Limites connues
  • Les charges récurrentes attendues sont une **estimation** fondée sur les trois mois précédents, pas une écriture : elles sont affichées à part et ne doivent pas être recopiées dans une déclaration.
  • Un mois en cours n'est pas un mois clos, quelle que soit la présentation.
O18

Comparatif avec l'année précédente

Cumul d'exercice contre même période de l'exercice précédent
Ce que ça mesure
Comment huit indicateurs évoluent face à la même période l'an dernier.
Calcul
Cumul depuis l'ouverture de l'exercice jusqu'à aujourd'hui, comparé au cumul de l'exercice précédent arrêté à la même date, un an plus tôt.
Sources Odoo
  • `account.move.line.balance` et `account.account.code`
Périmètre
Écritures comptabilisées seulement (`state = posted`), société courante.
Convention retenue
Le cumul part de l'ouverture de l'**exercice comptable** de la société, pas du 1er janvier : sur un exercice décalé, le 1er janvier tombe au milieu de la période et les deux cumuls ne se correspondraient pas. La date équivalente en N-1 est la même date un an plus tôt, rabotée au mois réel (29 février devient 28 février).
Limites connues
  • Un écart de périmètre entre les deux exercices (acquisition, changement de plan comptable) n'est pas détecté : la comparaison est faite sur les comptes tels qu'ils sont.
  • Si l'un des deux bouts tombe dans une période non arrêtée, le cumul est annoncé non définitif.
O19

Marge par produit et par client

Marge brute estimée sur commandes confirmées
Ce que ça mesure
Où se fait la marge, et ce qui est vendu à perte.
Calcul
Marge = prix de vente de la ligne − coût unitaire estimé × quantité. Le coût retenu est le prix de revient du produit, recoupé avec les lignes d'achat des six derniers mois.
Sources Odoo
  • `sale.order.line` des commandes confirmées (`state in sale, done`)
  • `purchase.order.line` des six derniers mois (`state in purchase, done`)
  • `product.product.standard_price`
Périmètre
Commandes de vente **confirmées** seulement, société courante. Ce n'est pas une lecture comptable : les devis non confirmés et la facturation ne sont pas lus.
Convention retenue
La marge est calculée sur la commande, pas sur la facture : c'est la vision commerciale, disponible plus tôt, et elle peut différer du résultat comptable.
Exclus du chiffre
  • Devis non confirmés, commandes annulées.
Limites connues
  • Le coût est un **prix de revient estimé**, pas un coût de revient comptable : frais de port, remises fournisseur et stocks valorisés différemment ne sont pas repris. Un produit « vendu à perte » ici est un signal à vérifier, pas une conclusion comptable.
  • Un produit jamais acheté sur les six derniers mois garde son prix de revient de fiche, qui peut être obsolète.
  • Les lignes sans produit (frais saisis à la main) sont hors marge.

Un chiffre vous paraît faux ?#

Deux cas, et ils se traitent différemment. Si le chiffre ne correspond pas à la définition ci-dessus, c'est un bug : écrivez-nous à info@upboard.ai avec l'indicateur concerné. Si le chiffre correspond à la définition mais pas à votre attente, c'est une convention à discuter, et c'est une conversation que nous prenons volontiers : ces choix sont documentés précisément pour pouvoir être contestés.