App Analytics
Stripe provides built-in analytics for published marketplace apps, giving you visibility into installs, listing performance, and user engagement. You can also build custom analytics using webhooks and the Stripe API.
Available Reports
The Stripe Dashboard provides the following analytics for your published app:
Install Metrics
| Metric | Description |
|---|---|
| Installs | Total number of new app installations in the selected period |
| Uninstalls | Total number of app uninstallations in the selected period |
| Cumulative Net Installs | Running total of installs minus uninstalls over time |
Listing Performance
| Metric | Description |
|---|---|
| Listing Views | Total page views of your app’s marketplace listing |
| Unique Views | Unique visitors who viewed your marketplace listing |
| MoM Conversion Rate | Month-over-month percentage of listing viewers who install the app |
Growth Metrics
| Metric | Description |
|---|---|
| MoM Growth Rate | Month-over-month growth in net installs |
| Churn Rate | Percentage of installed users who uninstall per month |
Data Freshness
Caution
Analytics data has a 48-hour lag. The data you see in the dashboard reflects activity from approximately two days ago. Plan your reporting windows accordingly.
- Data is updated daily with a 48-hour processing delay
- Historical data is available from the date your app was first published
- Metrics are calculated in UTC timezone
- Export data as CSV from the Stripe Dashboard for external analysis
Accessing Analytics via API
You can programmatically access app analytics using the Stripe Reporting API:
Install Data
# Fetch app install reportcurl https://api.stripe.com/v1/reporting/report_runs \ -u sk_live_xxxxx: \ -d "report_type=app.installs.daily" \ -d "parameters[interval_start]=1709251200" \ -d "parameters[interval_end]=1711929600" \ -d "parameters[app_id]=com.tajo.brevo-integration"Listing Views
# Fetch listing views reportcurl https://api.stripe.com/v1/reporting/report_runs \ -u sk_live_xxxxx: \ -d "report_type=app.listing_views.daily" \ -d "parameters[interval_start]=1709251200" \ -d "parameters[interval_end]=1711929600" \ -d "parameters[app_id]=com.tajo.brevo-integration"Programmatic Access (Node.js)
const stripe = require('stripe')('sk_live_xxxxx');
// Create a report run for app installsconst reportRun = await stripe.reporting.reportRuns.create({ report_type: 'app.installs.daily', parameters: { interval_start: Math.floor(new Date('2025-03-01').getTime() / 1000), interval_end: Math.floor(new Date('2025-03-31').getTime() / 1000), app_id: 'com.tajo.brevo-integration', },});
// Poll for report completionconst checkReport = async (reportId) => { const report = await stripe.reporting.reportRuns.retrieve(reportId);
if (report.status === 'succeeded') { // Download the report file const file = await stripe.files.retrieve(report.result.id); console.log('Report URL:', file.url); return file; }
if (report.status === 'failed') { throw new Error('Report generation failed'); }
// Report still processing return null;};Users Tab
The Users tab in your app’s analytics shows individual account-level data:
| Column | Description |
|---|---|
| Account ID | The Stripe account that installed your app |
| Install Date | When the app was installed |
| Status | Active or uninstalled |
| Uninstall Date | When the app was uninstalled (if applicable) |
Use this data to:
- Track individual account activation status
- Follow up with accounts that installed but haven’t completed onboarding
- Identify accounts that uninstalled and understand churn reasons
- Correlate install data with your own platform analytics
Custom Analytics with Webhooks
For real-time analytics and deeper insights, set up webhooks to track app events:
Webhook Events
Listen for these events to build custom analytics:
| Event | Description |
|---|---|
account.application.authorized | User installed your app |
account.application.deauthorized | User uninstalled your app |
Webhook Handler
const express = require('express');const stripe = require('stripe')('sk_live_xxxxx');
const app = express();
app.post('/webhooks/stripe-app', express.raw({ type: 'application/json' }), async (req, res) => { const sig = req.headers['stripe-signature']; const webhookSecret = process.env.STRIPE_APP_WEBHOOK_SECRET;
let event;
try { event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret); } catch (err) { console.error('Webhook signature verification failed:', err.message); return res.status(400).send('Webhook signature verification failed'); }
switch (event.type) { case 'account.application.authorized': { const account = event.data.object; console.log('App installed by:', account.id);
// Track in your analytics system await trackEvent('app_installed', { account_id: account.id, timestamp: new Date(event.created * 1000), });
// Trigger onboarding email await sendOnboardingEmail(account.id); break; }
case 'account.application.deauthorized': { const account = event.data.object; console.log('App uninstalled by:', account.id);
// Track churn await trackEvent('app_uninstalled', { account_id: account.id, timestamp: new Date(event.created * 1000), });
// Clean up account data await cleanupAccountData(account.id); break; }
default: console.log('Unhandled event type:', event.type); }
res.json({ received: true });});Connect List API
For Connect platforms, use the Connect List API to get information about accounts with your app installed:
const stripe = require('stripe')('sk_live_xxxxx');
// List all connected accounts with your app installedconst getInstalledAccounts = async () => { const accounts = []; let hasMore = true; let startingAfter = null;
while (hasMore) { const params = { limit: 100 }; if (startingAfter) { params.starting_after = startingAfter; }
const response = await stripe.accounts.list(params);
for (const account of response.data) { // Check if your app is installed on this account if (account.settings?.apps?.includes('com.tajo.brevo-integration')) { accounts.push({ id: account.id, email: account.email, created: account.created, }); } }
hasMore = response.has_more; if (response.data.length > 0) { startingAfter = response.data[response.data.length - 1].id; } }
return accounts;};Building a Custom Analytics Dashboard
Combine Stripe analytics with your own data for a comprehensive view:
// Aggregate analytics for reportingconst getAppAnalytics = async (startDate, endDate) => { const [stripeInstalls, brevoSyncStats, activationData] = await Promise.all([ // Stripe install data getStripeInstallReport(startDate, endDate), // Brevo sync metrics from Tajo getBrevoSyncMetrics(startDate, endDate), // Activation funnel from your database getActivationFunnel(startDate, endDate), ]);
return { // Acquisition totalInstalls: stripeInstalls.installs, totalUninstalls: stripeInstalls.uninstalls, netInstalls: stripeInstalls.installs - stripeInstalls.uninstalls, listingConversionRate: stripeInstalls.conversionRate,
// Activation onboardingCompleted: activationData.completedOnboarding, brevoConnected: activationData.connectedBrevo, firstSyncCompleted: activationData.firstSyncCompleted, activationRate: activationData.completedOnboarding / stripeInstalls.installs,
// Engagement totalCustomersSynced: brevoSyncStats.totalCustomers, totalEventsSynced: brevoSyncStats.totalEvents, averageSyncFrequency: brevoSyncStats.avgSyncPerDay,
// Retention churnRate: stripeInstalls.uninstalls / stripeInstalls.totalActive, monthlyGrowthRate: stripeInstalls.momGrowth, };};Key Metrics to Track
For the Tajo Brevo integration, focus on these metrics:
| Metric | Target | Why It Matters |
|---|---|---|
| Install-to-Activation Rate | > 70% | Percentage of installers who complete Brevo setup |
| Time to First Sync | < 5 minutes | How quickly users see value after installing |
| 30-Day Retention | > 80% | Percentage of users still active after 30 days |
| Monthly Churn Rate | < 5% | Keep uninstalls low with a valuable integration |
| Listing Conversion Rate | > 15% | Percentage of listing viewers who install |
| Customers Synced per Account | > 100 | Indicates depth of integration usage |
Tip
Set up automated alerts for significant metric changes. A sudden spike in uninstalls or drop in activation rate may indicate a bug or UX issue that needs immediate attention.