Iris Operator est le cockpit BI d'une marque DTC. Il agrège Shopify + Meta Ads + Klaviyo et sort
CA, COGS, ROAS, profit net, kill-list ads, snooping concurrents — sans ouvrir un seul onglet de plateforme.
Cette page décrit chaque module, la stack, les choix, et donne le prompt complet à coller dans Claude Code pour générer la même chose multi-régies.
Stack · Next.js 16 + React 19 + Tailwind 4
Backend · API routes + Firestore + Supabase
Infra · Cloud Run europe-west1
Cible · 14 modules, 8 intégrations
01 — Modules
Les 14 vues du dashboard
Chaque module répond à une question business précise. Pas de "tableau de bord générique" — chaque page a un job à faire.
📅
Dashboard du jour
Pilotage
Le snapshot business de la journée en cours, rafraîchi toutes les 5 min.
Marqueurs d'événements business avec analyse before/after auto.
Logger un évènement (refonte produit, push pub, hausse de prix…)
Compare conversion rate + AOV sur fenêtre 7/14/30j avant/après
Chart daily breakdown side-by-side
Sauvegardé en Firestore, partageable par lien
🚒
Ads coupe-feu
Action
Vue priorisée : "qu'est-ce que je coupe maintenant ?".
Toutes les campagnes Meta triées par perte cumulée
Fenêtre 3/7/15/30j ajustable
Mini-chart spend vs revenue par campagne
Bouton Pause qui hit Meta Marketing API en 1 clic
📊
Media buying
Action
Reporting cadencé hebdo/mensuel pour le pilotage long terme.
Tableau weekly/monthly : spend, revenue, ROAS, MER, profit net
Leaderboard top ROAS / worst loss / part de spend
Pivot mois × campagne (12 mois glissants)
Delta WoW sur tous les KPI
⚠️
Kill List
Action
Verdict automatique campaign + ad set basé sur un système de fenêtres.
4 niveaux de sévérité : kill / critical / watch / ok
Seuils ajustables (min spend, min ROAS)
Calcule "wasted spend" = combien tu perds en laissant tourner
Filtres et tri par ROAS moyen, sévérité, spend
✨
Nouvelle collection
Produits
Tracking dédié des produits sortis récemment.
Quantités, commandes, revenue, prix moyen
Daily/weekly chart de la trajectoire
Tri custom sur n'importe quelle colonne
📦
Produits & Marges
Produits
Rentabilité unitaire de tout le catalogue, sur la période choisie.
COGS/unit + shipping/unit (formule par pays FR/BE/LU/CH)
Profit absolu et marge % par produit
Vue 7/30/90j
Source unique pour décider quoi pousser, quoi jeter
💰
P&L
Finance
Le vrai compte de résultat, pas le ROAS-vanity de Meta.
Daily / weekly / monthly
Revenue, COGS, ad spend (FB+GA+PIN), bROAS, MER, marge brute, profit
Préset "Depuis 01/01" qui croît tout seul
Export CSV ready
📧
Klaviyo
Email
Performance email/SMS sans ouvrir Klaviyo.
Campaigns + flows séparés, par mois
Open rate, click rate, revenue, orders
Top campaigns / top flows
Sync nightly via API Klaviyo + cache Firestore
💬
Feedback clients
Clients
Aggregateur des avis post-achat (formulaire custom).
Fit (taille), confort, qualité, écart visuel/réel par produit
Health score 0-100 par produit
Top issues automatique (NLP léger sur défauts/raisons retour)
Croisé avec ventes pour calculer le feedback rate
🔍
Snooper
Veille
Surveillance temps réel des concurrents Shopify.
Détection : nouveaux produits, ruptures, retours stock, changements de prix, new variants
Polling auto toutes les 5 min via service séparé
Notif Telegram + email à chaque event
Stats par concurrent (24h / 7j / breakdown par type)
02 — Intégrations
Les régies à brancher
Iris Operator branche actuellement Shopify, Meta Ads, Klaviyo, Firestore et Telegram. Ton clone doit ajouter Google Ads, Microsoft Ads et Pinterest Ads.
Shopify Admin API
OAuth 2025-10 · Iris OK
Meta Marketing API
v19.0 · ads_management
Klaviyo API
Campaigns + Flows
Google Ads API
À ajouter pour le clone
Microsoft Ads API
À ajouter pour le clone
Pinterest Ads API
À ajouter pour le clone
Firestore
Cache + events Snooper
Telegram + Mailgun
Notifs Snooper / alertes
03 — Stack
Tech choisie (et pourquoi)
Framework
Next.js 16
App Router, API routes server-side, RSC + 'use client' ciblé
UI
React 19 + Tailwind 4
Pas de lib UI, composants maison (KpiCard, DataTable, Chart)
Charts
Recharts
Léger, déclaratif, theming via CSS vars
DB / cache
Firestore + Supabase
Firestore pour cache & events, Supabase pour auth + journal
Une seule session admin, pas de multi-tenant pour rester simple
04 — Décisions clés
Ce qui rend Iris Operator utilisable
Cache à 2 vitesses
5 min sur la journée en cours, 1h sur le passé. Pas de "loading 4s à chaque visite", mais les nouvelles ventes apparaissent vite.
Stale-while-revalidate
Hook useStaleData qui affiche le cache instantanément + refresh en background. Aucun spinner après le 1er chargement.
COGS pays-aware
Shipping calculé via formule par pays (FR / BE / LU / CH). Pas un coût moyen bidon — du vrai profit ligne par ligne.
Action depuis le dashboard
Pause d'une campagne Meta direct depuis Ads coupe-feu. Pas un dashboard read-only, un cockpit.
Verdict, pas data
Kill List ne montre pas des KPIs : elle dit "kill / critical / watch / ok". Le job de l'outil = trancher, pas afficher.
Sidebar groupée par intention
Pilotage / Action / Produits / Finance / Email / Clients / Veille. On range par "ce que je veux faire", pas par "source de données".
05 — Le prompt
À coller dans Claude Code
Copie ce prompt dans un nouveau projet (Cursor, Claude Code, Codex peu importe). Le prompt assume que ton pote a déjà des credentials pour Shopify, FB, Google, MS, Pinterest. Si non, l'agent te le dira et te demandera.
# Mission
Construis un dashboard e-commerce DTC nommé "OPERATOR" calqué sur "Iris Operator".
C'est un cockpit BI pour un fondateur solo qui pilote une boutique Shopify avec spend pub multi-régies.
Pas multi-tenant, pas SaaS — un seul user (moi), une seule marque.
## Stack imposée
- Next.js 16 (App Router) + React 19 + TypeScript
- Tailwind CSS v4 (pas de lib UI, composants maison)
- Recharts pour les charts
- API routes Next pour tout le backend (pas de serveur séparé)
- Firestore pour le cache des appels API + events Snooper
- Supabase pour l'auth admin + table "journal_events"
- Déployable Vercel ou Cloud Run, Dockerfile multi-stage
- Variables d'env via .env.local (pas de Doppler / Infisical au début)
## Intégrations à brancher# Shopify Admin API (OAuth client_credentials, version 2025-10)
- SHOPIFY_STORE, SHOPIFY_CLIENT_ID, SHOPIFY_CLIENT_SECRET
- Récupère orders, products, variants, customers
- Module wrapper lib/shopify.ts avec cache token 1h
# Meta Marketing API (v19+, scope ads_management + ads_read)
- META_ACCESS_TOKEN, META_AD_ACCOUNT_ID
- Récupère insights campaigns + adsets + ads avec spend, revenue, purchases, ROAS
- Mutation pour pause campaign / adset
- Module lib/meta-ads.ts# Google Ads API (developer token + OAuth refresh token)
- GOOGLE_ADS_CUSTOMER_ID, GOOGLE_ADS_DEVELOPER_TOKEN, GOOGLE_ADS_REFRESH_TOKEN, GOOGLE_ADS_CLIENT_ID, GOOGLE_ADS_CLIENT_SECRET
- Récupère insights campaigns + ad groups (cost, conversions, conv_value, ctr)
- Mutation pour pause campaign
- Module lib/google-ads.ts# Microsoft Advertising API (OAuth + dev token)
- MICROSOFT_ADS_CUSTOMER_ID, MICROSOFT_ADS_ACCOUNT_ID, MICROSOFT_ADS_DEV_TOKEN, MICROSOFT_ADS_REFRESH_TOKEN, MICROSOFT_ADS_CLIENT_ID
- Récupère campaigns performance report + ad groups
- Module lib/microsoft-ads.ts# Pinterest Ads API (v5)
- PINTEREST_ACCESS_TOKEN, PINTEREST_AD_ACCOUNT_ID
- Récupère analytics campaigns + ad groups (spend, conversions, ROAS)
- Module lib/pinterest-ads.ts# Klaviyo API (revision 2024-10)
- KLAVIYO_API_KEY
- Récupère campaign + flow performance metrics
- Sync nightly + snapshot Firestore
# Notifs (optionnel mais recommandé)
- TELEGRAM_BOT_TOKEN, TELEGRAM_CHAT_ID pour alertes Snooper / Kill List
- MAILGUN_API_KEY pour digest email quotidien
## Architecture & règles
1. Toutes les pages sont en /app/<module>/page.tsx, toutes les routes en /app/api/<module>/route.ts
2. Chaque API route DOIT être cachée via un helper cached(key, fn, ttlMs) :
- 5 min sur les données du jour en cours
- 1h sur les données passées
- 24h sur les snapshots Klaviyo
3. Hook client useStaleData<T>(url) qui retourne { data, loading, refreshing } et fait du stale-while-revalidate via localStorage
4. Aggrégateur lib/ads-multi.ts qui unifie Meta + Google + MS + Pinterest derrière une interface commune AdsPlatform avec getDailySpend, getCampaignInsights, pauseCampaign
5. COGS calculé par produit avec formule shipping par pays (config dans Firestore, pas hardcodé)
6. Frais Stripe = 1.5% + 0.25€ par order, frais Shopify = 0.6% du revenue (configurable)
## Modules à livrer
Sidebar groupée par intention :
Pilotage
- /daily — KPIs du jour vs J-1, top 15 produits, top 10 campaigns toutes régies, 5 dernières commandes avec profit ligne par ligne
- /journal — Logger des events business + analyse before/after auto sur conversion rate + AOV (fenêtre 7/14/30j)
Action
- /ads — "Coupe-feu" : toutes les campagnes triées par perte cumulée (3/7/15/30j), bouton Pause par régie
- /media-buying — Reporting weekly/monthly + leaderboard top ROAS / worst loss + pivot mois × campagne 12 mois glissants
- /kill-list — Verdict auto par campaign + adset (kill / critical / watch / ok) avec seuils ajustables (minSpend, minRoas) et "wasted spend"
Produits
- /new-collection — Tracking spécifique des produits sortis < 60j
- /products — Rentabilité unitaire de tout le catalogue avec COGS, shipping, profit, marge
Finance
- /reports — P&L daily / weekly / monthly avec ad spend décomposé par régie (FB / Google / MS / Pinterest), bROAS, MER, marge brute, profit net
Email
- /klaviyo — Campaigns + flows par mois avec open rate, click rate, revenue
Clients
- /feedback — Aggregateur feedback post-achat (fit, comfort, quality, visual) avec health score 0-100 par produit
Veille
- /snooper — Detection nouveaux produits / ruptures / retours stock / changements prix sur concurrents Shopify, polling toutes les 5 min en service séparé, notif Telegram
## Composants partagés
- PageHeader (titre, sous-titre, slot actions)
- KpiCard (label, valeur, delta vs J-1, mini sparkline optionnel)
- RefreshIndicator (point vert qui pulse pendant le refresh background)
- PeriodSelector (boutons 7/30/90j)
- DataTable (tri par colonne, pagination simple)
- Chart wrapper Recharts avec theming maison
## Design
- Dark theme, accent bordeaux #6b1120 (change-le pour la marque de ton pote)
- Sidebar 224px fixe à gauche, contenu fluide à droite
- Pas d'icon library : SVG inline dans la sidebar
- Tout en français (UI labels, dates, devises)
- Devise = € par défaut, formats fr-FR (1 234,56 €)
- Timezone Europe/Paris pour les bornes de jour
- Police système, pas de Google Fonts
## Anti-patterns à éviter
- NE PAS faire du multi-tenant — c'est un dashboard solo
- NE PAS mettre de loader spinner au-delà du 1er chargement (stale-while-revalidate gère ça)
- NE PAS stocker de credentials en dur — tout en .env.local
- NE PAS appeler les API en client-side direct — toujours via /api/* (CORS, secrets, cache)
- NE PAS agréger les régies "intelligemment" sans les exposer séparément aussi (toujours pouvoir voir Meta vs Google vs MS séparément)
## Order de livraison
1. Setup Next.js 16 + Tailwind + Sidebar + layout
2. /daily avec Shopify + Meta seulement (MVP minimum)
3. /products + COGS engine
4. /ads + /kill-list avec Meta
5. Brancher Google Ads, MS Ads, Pinterest derrière la même interface AdsPlatform
6. /media-buying, /reports (P&L)
7. /klaviyo, /journal, /feedback
8. /snooper (le plus complexe, à faire en dernier ou en service séparé)
Pose-moi les questions sur les credentials manquants AVANT de commencer, pas pendant.
Commence par scaffolder le projet et me confirmer la liste des intégrations qu'on a en main.
06 — Bonus pour ton pote
3 conseils que j'aurais voulu qu'on me donne
Commence par /daily
Le module qui sert le plus c'est le snapshot du jour. Si juste ce module marche bien, t'as déjà 60% de la valeur. Pas besoin d'avoir tout livré pour utiliser.
Mets le cache dès le début
Sans cache, l'agrégat Shopify + 4 régies prend 8-12s. Avec cache 5 min, 100ms. Et tu cognes pas les rate limits.
Brancher 1 régie à la fois
L'interface AdsPlatform commune permet d'ajouter Google puis MS puis Pinterest sans toucher aux pages. C'est l'unique abstraction utile dans tout le projet.