Ce que vous saurez faire à la fin
- Construire un pipeline complet de reporting hebdomadaire automatisé avec Claude IA, depuis l’extraction CSV jusqu’à la diffusion Slack et email
- Rédiger des prompts robustes qui transforment des données brutes (ventes, support, marketing) en synthèse exécutive lisible en 2 minutes
- Extraire automatiquement les KPI clés (chiffre d’affaires en FCFA, marge, taux de conversion, NPS) et détecter les anomalies semaine après semaine
- Mettre en place un déclencheur planifié (cron Linux ou Make.com) qui exécute le rapport chaque vendredi à 17h sans intervention humaine
- Documenter et versionner vos prompts pour que l’équipe puisse adapter le format sans casser la chaîne
Durée : 4h. Pré-requis : compte Anthropic Claude (clé API à environ 11 000 FCFA de crédits initiaux soit 18 USD), compte Slack avec droits d’admin pour créer un webhook entrant, accès SMTP (Gmail Workspace, Brevo Sendinblue ou Mailtrap), Python 3.10+ installé, un fichier CSV hebdomadaire avec au minimum 3 colonnes (date, métrique, valeur).
Étape 1 — Cartographier les rapports actuels
Avant d’automatiser, listez les rapports que votre PME produit déjà manuellement. Pour une PME sénégalaise type (10 à 50 personnes), on retrouve généralement : un rapport ventes hebdo (chiffre d’affaires HT/TTC en FCFA, top 5 clients, top 5 produits), un rapport support (tickets ouverts, fermés, temps de résolution moyen), un rapport marketing (visiteurs site, leads générés, coût par lead). Identifiez celui qui consomme le plus de temps : c’est lui que vous automatiserez en premier. Comptez le temps réel passé chaque semaine (souvent 2 à 4 heures pour un responsable opérations payé 600 000 FCFA/mois, soit un coût caché d’environ 30 000 FCFA par rapport).
Étape 2 — Préparer un CSV propre et stable
Le pipeline ne fonctionnera que si votre source de données respecte un format constant. Exportez un CSV de référence depuis votre outil (Odoo, Sage Saari, HubSpot, Wave, ou un Google Sheets). Renommez les colonnes en snake_case sans accents, et formatez les dates en ISO 8601. Voici un exemple minimal pour un rapport ventes :
date,vendeur,client,produit,quantite,montant_fcfa,marge_fcfa,canal
2026-04-13,Aïssatou Ndiaye,Nestlé Sénégal,Formation Excel,3,450000,180000,direct
2026-04-13,Mamadou Sow,Sonatel,Audit cybersécurité,1,2500000,1100000,appel_offre
2026-04-14,Aïssatou Ndiaye,Patisen,Coaching équipe,5,750000,300000,referral
2026-04-15,Fatou Diop,SDE,Formation Power BI,2,400000,160000,linkedin
2026-04-16,Mamadou Sow,Total Sénégal,Maintenance SI,1,1800000,720000,direct
2026-04-17,Fatou Diop,Auchan,Formation Word,4,320000,128000,direct
Étape 3 — Créer la clé API Anthropic
Connectez-vous sur console.anthropic.com avec un email professionnel. Cliquez sur Settings, puis API Keys, puis Create Key. Donnez un nom explicite (par exemple reporting-hebdo-prod). Copiez la clé qui commence par sk-ant- et stockez-la immédiatement dans un gestionnaire de mots de passe (Bitwarden ou 1Password). Vous ne pourrez plus la revoir. Achetez 20 USD de crédits initiaux par carte bancaire ou Wise : à environ 3 USD par million de tokens en entrée pour Claude Sonnet, vous tiendrez 6 mois de reporting hebdomadaire pour une PME standard.
Étape 4 — Installer l’environnement Python
Ouvrez un terminal sur votre serveur Ubuntu (VPS Contabo à 5 EUR/mois soit 3 300 FCFA, ou OVH chez Sonatel) ou votre PC de bureau. Créez un dossier projet et un environnement virtuel pour isoler les dépendances :
mkdir ~/reporting-claude && cd ~/reporting-claude
python3 -m venv venv
source venv/bin/activate
pip install anthropic==0.39.0 pandas==2.2.3 python-dotenv==1.0.1 requests==2.32.3
echo "ANTHROPIC_API_KEY=sk-ant-VOTRECLEICI" > .env
echo "SLACK_WEBHOOK_URL=https://hooks.slack.com/services/T00/B00/xxx" >> .env
echo "SMTP_USER=reporting@votreentreprise.sn" >> .env
echo "SMTP_PASS=votre_mot_de_passe_app" >> .env
Étape 5 — Créer le webhook Slack
Dans Slack, allez dans Outils, puis Personnaliser Slack, puis Configurer les apps. Cherchez Incoming Webhooks et cliquez Add to Slack. Choisissez le canal de destination, par exemple #reporting-direction. Slack génère une URL de la forme https://hooks.slack.com/services/T0XXXXX/B0XXXXX/xxxxxxxxxxxxxxxx. Copiez-la dans votre fichier .env. Testez immédiatement avec curl :
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"Test reporting depuis Dakar"}' \
https://hooks.slack.com/services/T0XXXXX/B0XXXXX/xxxxxxxxxxxxxxxx
Étape 6 — Rédiger le prompt système
Le prompt système définit le comportement de Claude pour tous vos rapports. Il doit être clair sur le rôle, le ton, le format de sortie et les contraintes business. Voici un prompt éprouvé pour un rapport hebdomadaire ventes :
Tu es analyste reporting senior pour une PME sénégalaise.
Tu reçois un CSV de ventes hebdomadaires.
Tu produis une synthèse exécutive de 250 mots maximum
en Markdown, lisible en 2 minutes par un dirigeant pressé.
Structure obligatoire :
1. Résumé en 3 puces (KPI principaux en FCFA)
2. Top 3 succès de la semaine (avec chiffres)
3. Top 3 alertes ou risques
4. 2 recommandations actionnables pour la semaine suivante
Règles strictes :
- Toujours en français
- Montants formatés avec espace comme séparateur (1 250 000 FCFA)
- Comparer à la semaine précédente si fournie (variation en %)
- Ne jamais inventer de chiffre absent du CSV
- Si une donnée manque, écrire "donnée non disponible"
- Ton factuel, pas de superlatifs marketing
Étape 7 — Écrire le script Python principal
Créez un fichier reporting.py dans votre dossier projet. Ce script lit le CSV, calcule des agrégats, envoie le tout à Claude, puis poste le résultat sur Slack et par email. Voici le squelette complet :
import os, smtplib, json, requests
from email.mime.text import MIMEText
from datetime import datetime, timedelta
import pandas as pd
from anthropic import Anthropic
from dotenv import load_dotenv
load_dotenv()
client = Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))
df = pd.read_csv("ventes_semaine.csv", parse_dates=["date"])
ca_total = df["montant_fcfa"].sum()
marge_total = df["marge_fcfa"].sum()
top_clients = df.groupby("client")["montant_fcfa"].sum().nlargest(5)
top_produits = df.groupby("produit")["montant_fcfa"].sum().nlargest(5)
contexte = f"""
Semaine du {df['date'].min().date()} au {df['date'].max().date()}
CA total : {ca_total:,} FCFA
Marge totale : {marge_total:,} FCFA
Nombre de ventes : {len(df)}
Top 5 clients : {top_clients.to_dict()}
Top 5 produits : {top_produits.to_dict()}
Détail brut : {df.to_csv(index=False)}
"""
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1500,
system=open("prompt_systeme.txt").read(),
messages=[{"role": "user", "content": contexte}]
)
rapport = response.content[0].text
print(rapport)
Étape 8 — Ajouter la diffusion Slack et email
Complétez le script avec deux fonctions de diffusion. Slack accepte le Markdown via mrkdwn, et l’email peut être envoyé en HTML via SMTP standard. Pour Gmail Workspace, activez d’abord la validation en deux étapes puis générez un mot de passe d’application dans les paramètres de sécurité Google.
def envoyer_slack(texte):
payload = {"text": texte, "mrkdwn": True}
r = requests.post(os.getenv("SLACK_WEBHOOK_URL"), json=payload)
r.raise_for_status()
def envoyer_email(sujet, corps_html, destinataires):
msg = MIMEText(corps_html, "html", "utf-8")
msg["Subject"] = sujet
msg["From"] = os.getenv("SMTP_USER")
msg["To"] = ", ".join(destinataires)
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as s:
s.login(os.getenv("SMTP_USER"), os.getenv("SMTP_PASS"))
s.send_message(msg)
envoyer_slack(rapport)
envoyer_email(
sujet=f"Reporting ventes semaine {datetime.now().isocalendar().week}",
corps_html=rapport.replace("\n", "<br>"),
destinataires=["dg@entreprise.sn", "directeur.commercial@entreprise.sn"]
)
Étape 9 — Tester avec un cas réel
Lancez le script en mode test sur le CSV de la semaine écoulée. Vérifiez trois points : les montants en FCFA correspondent à votre comptabilité (tolérance 0 FCFA), le rapport ne contient aucun chiffre absent du CSV (hallucination), et le format Markdown s’affiche correctement dans Slack (gras, puces, sauts de ligne). Si Claude invente une donnée, durcissez votre prompt système avec la phrase : Si tu n’es pas certain à 100% d’un chiffre, écris donnée non vérifiée et n’avance aucun nombre.
Étape 10 — Comparer la semaine N à la semaine N-1
Pour calculer les variations, sauvegardez chaque semaine les KPI dans un fichier historique.csv. Le prompt utilisateur intègre alors les chiffres de référence pour permettre à Claude de calculer les variations en pourcentage.
historique = pd.read_csv("historique_kpi.csv")
semaine_precedente = historique.iloc[-1]
variation_ca = ((ca_total - semaine_precedente["ca"]) / semaine_precedente["ca"]) * 100
contexte_compare = f"""
Cette semaine : CA = {ca_total:,} FCFA
Semaine dernière : CA = {semaine_precedente['ca']:,} FCFA
Variation : {variation_ca:+.1f}%
"""
Étape 11 — Planifier l’exécution automatique
Sur Linux, utilisez cron pour exécuter le script chaque vendredi à 17h heure de Dakar (UTC+0). Éditez la crontab avec crontab -e et ajoutez la ligne suivante. Vérifiez que votre serveur est bien sur le fuseau Africa/Dakar avec timedatectl set-timezone Africa/Dakar.
0 17 * * 5 /home/ubuntu/reporting-claude/venv/bin/python /home/ubuntu/reporting-claude/reporting.py >> /var/log/reporting.log 2>&1
Étape 12 — Versionner les prompts dans Git
Les prompts sont du code : versionnez-les. Initialisez un dépôt Git privé sur GitHub ou Gitea auto-hébergé et créez un dossier prompts/ avec un fichier par type de rapport. Cela permet à votre équipe de tester des variantes sans casser la production. Ajoutez .env à .gitignore pour ne jamais committer la clé API.
git init
echo ".env" > .gitignore
echo "venv/" >> .gitignore
echo "*.csv" >> .gitignore
mkdir prompts
mv prompt_systeme.txt prompts/ventes_v1.txt
git add . && git commit -m "Init pipeline reporting Claude"
Étape 13 — Tableau des coûts mensuels estimés
Pour une PME générant 4 rapports hebdomadaires (ventes, support, marketing, opérations) sur Claude Sonnet 4.5 :
Poste Quantité Coût mensuel
Tokens entrée Claude 4 rapports x 4 sem ~1 500 FCFA
Tokens sortie Claude idem ~3 000 FCFA
VPS Linux Contabo 1 ~3 300 FCFA
Slack workspace gratuit jusqu'à 90 jours 0 FCFA
SMTP Gmail Workspace compte existant 0 FCFA
Total ~7 800 FCFA/mois
Étape 14 — Mettre en place une alerte si échec
Encapsulez le script principal dans un try/except qui notifie Slack si une erreur survient. Sans cela, vous découvrirez un échec lundi matin à la réunion COMEX. Ajoutez aussi une vérification de fraîcheur du CSV : si le fichier date de plus de 24h, alertez immédiatement.
try:
age_csv = (datetime.now() - datetime.fromtimestamp(os.path.getmtime("ventes_semaine.csv"))).days
if age_csv > 1:
envoyer_slack(":warning: CSV ventes obsolète, mise à jour requise")
exit(1)
# ... logique principale ...
except Exception as e:
envoyer_slack(f":x: Échec reporting : {str(e)[:200]}")
raise
Erreurs classiques à éviter
- Erreur : envoyer le CSV brut dans le prompt sans agrégation. Vous gaspillez des tokens et noyez Claude dans le bruit. Conséquence : facture API multipliée par 10 et synthèse moins pertinente.
- Erreur : laisser Claude inventer des chiffres absents du CSV. Conséquence : un dirigeant prend une décision sur un chiffre faux. Toujours imposer la règle pas de chiffre sans source dans le prompt système.
- Erreur : stocker la clé API en clair dans le script. Conséquence : fuite lors d’un push Git public, facture de plusieurs centaines de milliers de FCFA en quelques heures.
- Erreur : utiliser le modèle Opus pour des résumés simples. Conséquence : coût 5x supérieur à Sonnet pour un gain de qualité marginal sur ce cas.
- Erreur : ne pas tester sur 4 semaines avant production. Conséquence : vous découvrez un cas limite (vendeur absent, produit retiré) le jour de la diffusion au COMEX.
- Erreur : oublier de sauvegarder l’historique des KPI. Conséquence : impossible de calculer les variations semaine après semaine, le rapport perd 50% de sa valeur.
Checklist Reporting Claude
✓ Clé API Anthropic créée et stockée hors Git
✓ CSV source au format snake_case avec dates ISO 8601
✓ Prompt système rédigé et versionné dans prompts/
✓ Webhook Slack testé avec curl
✓ SMTP configuré avec mot de passe d'application
✓ Script Python isolé dans un venv
✓ Test sur 4 semaines de données réelles
✓ Vérification anti-hallucination (zéro chiffre inventé)
✓ Historique KPI sauvegardé pour comparaisons
✓ Cron planifié sur fuseau Africa/Dakar
✓ Try/except avec notification Slack en cas d'échec
✓ Vérification fraîcheur du CSV avant envoi
✓ Coût mensuel suivi dans un tableau de bord
✓ Documentation accessible à toute l'équipe ops
✓ Procédure de rollback si rapport invalide