Analytics et optimisation
Mesurer et optimiser les performances de votre app
Une app publiée sans suivi analytique est un investissement en aveugle. Le Apps SDK et le portail développeur fournissent des métriques détaillées pour comprendre comment votre app est utilisée, où les utilisateurs décrochent et comment améliorer vos résultats.
Le dashboard Analytics
Le portail développeur expose un tableau de bord avec les métriques essentielles :
Les métriques qui comptent
Métriques d’engagement
- Sessions par utilisateur — combien de fois un utilisateur lance votre app par semaine
- Actions par session — nombre moyen d’actions appelées par conversation
- Durée de session — temps passé à interagir avec votre app
- Taux de complétion — pourcentage de sessions qui aboutissent à un résultat utile
Métriques de rétention
- Rétention J1 — pourcentage d’utilisateurs qui reviennent le lendemain
- Rétention J7 — pourcentage qui revient dans la semaine
- Rétention J30 — pourcentage qui revient dans le mois
- Cohortes — évolution de la rétention par date d’inscription
Métriques de conversion (commerce)
- Taux d’installation — visiteurs Store qui installent votre app
- Taux de conversion gratuit vers payant — utilisateurs gratuits qui passent premium
- ARPU — revenu moyen par utilisateur
- Churn mensuel — pourcentage d’abonnés qui annulent
- LTV — valeur vie client estimée
Accéder aux analytics via le SDK
Le SDK expose une API pour récupérer vos métriques programmatiquement :
import { analytics } from "@openai/apps-sdk";
// Récupérer les métriques des 30 derniers jours
const metrics = await analytics.getMetrics({
appSlug: "mon-app",
period: "30d",
metrics: ["dau", "sessions", "actions", "revenue"],
});
console.log(`DAU moyen : ${metrics.dau.average}`);
console.log(`Sessions totales : ${metrics.sessions.total}`);
console.log(`Revenu du mois : ${metrics.revenue.total} EUR`);
Analytics par action
Identifiez quelles actions sont les plus utilisées et optimisez en conséquence :
const actionMetrics = await analytics.getActionMetrics({
appSlug: "mon-app",
period: "7d",
});
// Résultat :
// [
// { action: "searchProducts", calls: 4521, avgLatency: 230, errorRate: 0.02 },
// { action: "getDetails", calls: 2103, avgLatency: 180, errorRate: 0.01 },
// { action: "addToCart", calls: 891, avgLatency: 150, errorRate: 0.03 },
// ]
Optimiser les performances
Réduire la latence
La latence des actions impacte directement l’expérience utilisateur :
// Avant : appels séquentiels (lent)
const product = await fetchProduct(id);
const reviews = await fetchReviews(id);
const stock = await checkStock(id);
// Après : appels parallèles (rapide)
const [product, reviews, stock] = await Promise.all([
fetchProduct(id),
fetchReviews(id),
checkStock(id),
]);
Utiliser le cache
Le SDK propose un cache intégré pour les données qui changent rarement :
export const getCategories = defineAction({
name: "getCategories",
description: "Liste les catégories de produits disponibles",
cacheTtl: 3600, // Cache 1 heure
handler: async () => {
return await fetchCategories();
},
});
Optimiser les descriptions d’actions
Si le modèle appelle la mauvaise action, ajustez vos descriptions :
// Problème : le modèle confond searchProducts et getProductDetails
// Solution : descriptions plus distinctes
// searchProducts
description: "Recherche des produits par mot-clé dans le catalogue. Retourne une liste de résultats. Utilisez cette action quand l'utilisateur cherche quelque chose sans connaître le produit exact."
// getProductDetails
description: "Récupère les détails complets d'un produit spécifique par son identifiant. Utilisez cette action quand l'utilisateur veut plus d'informations sur un produit déjà identifié."
A/B testing
Le SDK supporte les expérimentations pour tester différentes approches :
import { experiment } from "@openai/apps-sdk";
app.action("showPricing", {
description: "Affiche les options de tarification",
handler: async (_, context) => {
const variant = await experiment.getVariant(
context.user.id,
"pricing-layout"
);
if (variant === "A") {
return { _widget: "pricingCards" }; // Cartes côte à côte
} else {
return { _widget: "pricingTable" }; // Tableau comparatif
}
},
});
Analysez ensuite les résultats :
const results = await experiment.getResults("pricing-layout");
// { A: { conversion: 0.12 }, B: { conversion: 0.18 } }
// Le tableau comparatif convertit 50 % mieux
Tableau de bord personnalisé
Créez votre propre dashboard en combinant les métriques du SDK avec vos données internes :
app.action("adminDashboard", {
description: "Affiche le tableau de bord administrateur de l'application",
auth: "required",
handler: async (_, context) => {
if (!isAdmin(context.user.id)) {
throw new ActionError("FORBIDDEN", "Accès réservé aux administrateurs");
}
const [appMetrics, businessMetrics] = await Promise.all([
analytics.getMetrics({ appSlug: "mon-app", period: "7d" }),
getBusinessMetrics(), // Vos propres métriques
]);
return {
_widget: "adminDashboard",
dau: appMetrics.dau.average,
revenue: appMetrics.revenue.total,
activeSubscriptions: businessMetrics.subscriptions,
topActions: appMetrics.topActions,
};
},
});
Itérer sur les retours utilisateurs
Le Store permet aux utilisateurs de laisser des avis. Exploitez ces retours :
- Répondez systématiquement aux avis négatifs avec un plan d’action
- Identifiez les patterns dans les demandes de fonctionnalités
- Mesurez l’impact de chaque mise à jour sur la rétention et les avis
Points clés à retenir
- Le dashboard développeur expose les métriques d’engagement, rétention et revenus
- Analysez les performances par action pour identifier les goulots d’étranglement
- Parallélisez les appels et utilisez le cache pour réduire la latence
- Le A/B testing permet de comparer différentes approches de manière empirique
- Les descriptions d’actions bien rédigées réduisent les erreurs de routage du modèle
- Itérez continuellement sur les retours utilisateurs et les métriques