Régis Lopez-Kaufman
← Tous les skills et guides
Guide · Data6 min de lecture

Un marketing dashboard custom

Le spend Meta et Google croisé avec les leads et les clients signés du CRM, sur trois marchés, sans dépendre d'un outil BI. Une page statique, un Google Sheet comme entrepôt, un Google Apps Script comme seul backend. Voici ce qu'on a construit, et la liste de courses pour monter le même chez toi.

Le dashboard en production, flouté exprès : quatre onglets, trois marchés, les vrais chiffres dessous.

Ce que ça remplace

La dépendance à un BI. Le point de départ était un Looker Studio : tant que le reporting vit dans un outil BI, c'est l'outil qui décide (ses connecteurs, ses templates, ses définitions), et c'est une licence de plus. À la place : un marketing dashboard custom, qui croise le spend Meta et Google avec les leads et les clients signés du CRM, sur trois marchés européens. En production depuis mai 2026, utilisé au quotidien par l'équipe growth d'une scale-up SaaS B2B.

La particularité : il ne repose sur rien. Pas de serveur, pas d'outil BI, pas de framework, pas de build. Une page statique en HTML, CSS et JS, un Google Sheet au centre, un Apps Script autour. Construit et itéré en pair avec Claude Code : chaque évolution est une session de travail (un tableau en plus, une règle de calcul, une section qu'on supprime), testée dans le navigateur avant d'être poussée.

Le circuit des données

Deux connecteurs entrants, un tableur au centre, un endpoint sortant :

Meta AdsGoogle AdsCRMBudgetsWindsor.aiconnecteur ads (payant)Gmailboîte de réceptionexport CSV · chaque nuitGoogle Apps Scripttriggers de nuit : lit Windsor et Gmail, écrit le SheetAPI · 6h00pièce jointe CSVGoogle Sheetl'entrepôt · 5 onglets :meta_daily · google_daily · meta_ads_365d · crm · budgets_monthlyécrit les ongletssaisie manuelleEndpoint web · le même Apps ScriptdoGet : chaque onglet servi en CSV (paramètre dataset + token)lit à la demandePage statique · GitHub Pagesjointures spend ↔ leads par UTM · cache local (IndexedDB)CSV à l'ouverture · 1-3 s
Le circuit complet, des sources au navigateur.
  1. Côté ads : Windsor.aiUn connecteur ELT SaaS : tu branches tes comptes Meta Ads et Google Ads en OAuth, et une seule API te donne le spend quotidien par ad set, annonce ou mot-clé. L'Apps Script l'interroge chaque matin à 6h et écrit le résultat dans le Sheet, mois par mois (un appel multi-années dépasse le timeout). C'est la seule brique payante du système.
  2. Côté CRM : un export mailPas d'API CRM : le CRM envoie chaque nuit un export CSV programmé par e-mail. L'Apps Script lit la pièce jointe dans Gmail, l'écrit dans le Sheet et étiquette le fil pour ne jamais réimporter deux fois. Rustique mais fiable. Et ça marche avec n'importe quel CRM qui sait programmer un export : Zoho, HubSpot, Pipedrive, Salesforce.
  3. Les budgets : à la mainSaisis dans un onglet du Sheet, par pays, canal et segment. C'est le seul input manuel du système.
  4. En sortie : un endpoint CSVLe même Apps Script expose un endpoint web qui sert chaque onglet du Sheet en CSV, avec un paramètre dataset et un token. C'est toute l'API du dashboard.
  5. Le front : une page statiqueHébergée sur GitHub. Le JS télécharge les CSV, fait les jointures en mémoire (le spend et les leads réconciliés par UTM) et garde chaque dataset en cache local, dans IndexedDB : le dashboard s'ouvre en 1 à 3 secondes même quand l'Apps Script est lent.

Les cinq datasets

  • meta_daily : le spend Meta quotidien par ad set, 24 mois d'historique, rafraîchi chaque nuit
  • google_daily : pareil côté Google, par ad group
  • meta_ads_365d : le niveau annonce sur 365 jours, chargé en tâche de fond pour le drill-down
  • crm : tous les leads, avec la date de formulaire, les UTM, le statut qualifié, la date de signature et le pays
  • budgets_monthly : les budgets mensuels par pays × canal × segment, saisis à la main

Les quatre onglets

  1. OverviewTrois cartes de spend (total, Meta, Google), puis deux tableaux : le taux de qualification et le taux de closing, mois par mois, les trois marchés côte à côte. Un client est compté dans le mois où son lead a rempli le formulaire (logique cohorte) : chaque ligne est le vrai taux de conversion d'un lot de leads.
  2. Meta AdsLes KPIs du canal (spend, leads et CPL, qualifiés et CPQ, clients et CPA), puis un tableau par ad set et un par annonce, triables. Chaque ligne se déplie en semaines puis en jours, et clique vers l'Ads Manager.
  3. Google AdsPareil, par campagne. Avec en plus la colonne des conversions que revendique Google, affichée à côté des leads CRM : l'écart entre l'attribution plateforme et la réalité CRM se lit ligne à ligne.
  4. PacingLe suivi du budget du mois : budget vs dépensé à date, projection fin de mois, et le « required daily » pour atterrir juste. Par pays, canal et type de campagne, et chaque carte se déplie jour par jour.

Pour monter le même chez toi

  1. Un connecteur ads vers ton tableurWindsor.ai (payant, tarif selon connecteurs) ou un équivalent : Supermetrics, Airbyte. Une demi-heure pour brancher les comptes.
  2. Un export CRM automatisableUn CSV par mail chaque nuit suffit. L'essentiel : avoir la date de formulaire, les UTM et les dates de changement de statut dans les colonnes.
  3. Un Google Sheet et un Apps ScriptGratuit. Des triggers qui remplissent les onglets la nuit, un doGet qui les sert en CSV. C'est tout le backend.
  4. Un front statiqueHébergé n'importe où, GitHub Pages par exemple. Pas de build, pas de framework : trois fichiers.
  5. Un agent pour assembler et itérerC'est Claude Code qui écrit le front, l'Apps Script et les règles de calcul, session après session, chaque évolution testée dans le navigateur. C'est ce qui permet un dashboard qui épouse tes définitions (cohortes, segments, règles maison) au lieu d'un template BI.

Coût de fonctionnement : l'abonnement du connecteur ads, et rien d'autre.

Une question sur le montage, un cas tordu : écris-moi sur LinkedIn.