Jusqu'ici, notre étoile reliait les ventes, les clients et les canaux. Il manque deux sources — et elles ne sont pas à la même maille :
| Source | Granularité temporelle | Clé de rattachement |
|---|---|---|
SRC_ORDER_ITEMS (ventes) | À la date (created_at) | Date + canal + client |
SRC_MARKETING (média) | Au mois (month, 1 à 12) | Mois + canal |
SRC_BUDGET (budget) | À l'année, par canal | Canal |
On ne peut pas relier directement des ventes datées au jour à un budget marketing mensuel. Il faut une colonne vertébrale temporelle commune : la table calendrier.
Dans Power Query, une requête vide avec ce code M génère un calendrier complet sur 2024, avec l'année, le numéro de mois et le nom du mois en français :
let StartDate = #date(2024, 1, 1), EndDate = #date(2024, 12, 31), NumberOfDays = Duration.Days(EndDate - StartDate) + 1, Dates = List.Dates(StartDate, NumberOfDays, #duration(1,0,0,0)), TableFromList = Table.FromList(Dates, Splitter.SplitByNothing()), ChangedType = Table.TransformColumnTypes(TableFromList,{{"Column1", type date}}), RenamedColumns = Table.RenameColumns(ChangedType,{{"Column1", "Date"}}), InsertYear = Table.AddColumn(RenamedColumns, "Année", each Date.Year([Date])), InsertMonth = Table.AddColumn(InsertYear, "Mois (numéro)", each Date.Month([Date])), InsertMonthName = Table.AddColumn(InsertMonth, "Mois", each Date.MonthName([Date], "fr-FR")) in InsertMonthName
On complète maintenant toutes les relations, toutes en 1:N, dimensions vers faits :
| Depuis (dimension) | Vers | Clé |
|---|---|---|
| DIM_DATE | SRC_ORDER_ITEMS | Date → created_at |
| DIM_DATE | SRC_USERS | Date → created_at |
| DIM_DATE | SRC_MARKETING | Mois (numéro) → month |
| SRC_USERS | SRC_ORDER_ITEMS | user_id → user_id |
| DIM_CANAL | SRC_ORDER_ITEMS | Canal → traffic_source |
| DIM_CANAL | SRC_MARKETING | Canal → channel |
| DIM_CANAL | SRC_BUDGET | Canal → channel |
Grâce à ce modèle, les mesures du module 5 fonctionnent maintenant par canal, par mois, par pays. On les complète avec les indicateurs qui intéressent vraiment le pilotage marketing.
Marge après Mkt = [Marge] - [Spend Mkt] CAC = DIVIDE([Spend Mkt], [Clients], 0)
Le ROAS (Return On Ad Spend) mesure combien d'euros de CA génère un euro dépensé en média. Il se construit directement à partir de deux mesures qu'on a déjà :
ROAS = DIVIDE([CA Réel], [Spend Mkt], 0)
Un ROAS de 3 signifie 3 € de CA pour 1 € investi. Croisé au CAC, il dit non seulement combien coûte un client, mais combien il rapporte.
La table SRC_BUDGET porte un objectif de CA par canal (budget_ca). On mesure l'écart entre réalisé et budget :
Budget CA = SUM(SRC_BUDGET[budget_ca]) Écart CA = [CA Réel] - [Budget CA] Écart CA % = DIVIDE([CA Réel] - [Budget CA], [Budget CA], 0)
Sanity check du module 4 confirmé : certaines lignes de SRC_ORDER_ITEMS n'ont pas de traffic_source. Elles sont donc exclues des analyses par canal. Résultat concret sur TheLook : le total « par canal » (102 794 €) est inférieur au CA de toutes les commandes (262 355 €). Ce n'est pas un bug — c'est la part non attribuée à un canal.
// Rendre visible le CA sans canal CA Sans Canal = CALCULATE([CA Réel], ISBLANK(SRC_ORDER_ITEMS[traffic_source]))
Autre option : ajouter une ligne « Non attribué » dans DIM_CANAL. L'important est de ne jamais faire disparaître silencieusement un écart : on l'explique, on le montre.
On pose un visuel Tableau, Canal (DIM_CANAL) en lignes, et les mesures en valeurs, dans cet ordre : CA Réel, Coût, Marge, Taux de Marge, Clients, Spend Mkt, CAC. Formats : € à 2 décimales pour les montants, % pour le taux, entier pour les clients, totaux activés. Voici le résultat attendu du modèle :
| Canal | CA Réel | Marge | Taux marge | Clients | CAC |
|---|---|---|---|---|---|
| Search | 71 876 € | 35 092 € | 48,82 % | 3 505 | 152,92 € |
| Organic | 16 408 € | 8 067 € | 49,16 % | 718 | 131,59 € |
| 5 460 € | 2 615 € | 47,89 % | 252 | 565,80 € | |
| Display | 3 399 € | 1 655 € | 48,68 % | 207 | 1 590,73 € |
| 5 650 € | 2 768 € | 48,99 % | 318 | 1 320,23 € | |
| TOTAL | 102 794 € | 50 196 € | 48,83 % | 5 000 | 304,43 € |
Une fois cette base en place, la table calendrier et les dimensions partagées ouvrent tout un champ d'analyses, sans reconstruire quoi que ce soit :
SRC_USERS), pour voir où se cache la performance.SRC_BUDGET canal par canal pour transformer le tableau en outil de suivi d'objectifs, pas seulement de constat.Chaque ajout se branche sur l'étoile existante. C'est tout l'intérêt d'un modèle propre : il grandit avec les questions, au lieu de casser à chaque nouvelle demande.
DIVIDE([CA Réel], [Spend Mkt], 0)[CA Réel] - SUM(SRC_BUDGET[budget_ca])