6 min read

How to Track User Stickiness in Amplitude

User stickiness—how often users return—is the metric that separates products from dead apps. Amplitude lets you measure DAU/MAU ratios and retention cohorts, but only if you're tracking the right events and segmenting correctly. This guide shows you how to instrument stickiness from event definition to dashboard.

Set Up Core Engagement Events

Stickiness measurement starts with tracking a baseline engagement event that fires when users do something meaningful.

Track a Daily Active Event

Define one primary event that signals daily engagement—opening your app, viewing the dashboard, or using a core feature. This becomes your stickiness metric. Fire it once per session, not per pageview.

javascript
// Track once when user opens the app or dashboard
amplitude.track('App Opened', {
  session_id: generateSessionId(),
  plan_tier: 'pro',
  feature_access: ['dashboard', 'api']
});

// Or if measuring feature stickiness:
amplitude.track('Feature Used', {
  feature_name: 'analytics_dashboard',
  time_spent_seconds: 180
});
Fire once per session to avoid inflating DAU counts

Add User Properties for Segmentation

Set user properties at signup or when user state changes. This tags users by plan, cohort, or feature access—so you can measure stickiness *per segment*, not just globally.

javascript
// Set user properties once (e.g., at login or signup)
amplitude.setUserProperties({
  plan_tier: 'pro',
  signup_date: '2026-01-15',
  mau_bucket: 'power_user',
  mrr: 99.99
});

// Alternatively, use identify:
amplitude.identify(new amplitude.Identify()
  .set('plan_tier', 'pro')
  .set('signup_date', '2026-01-15')
);

Validate Events in Event Debugger

Go to Amplitude > Data > Event Debugger. Filter by your user ID and verify that events are arriving with the correct properties. Check the Timeline tab—events should appear in real-time within seconds of being triggered.

javascript
// Test in your browser console:
console.log(amplitude.getSessionId()); // verify session ID

// Ensure event names are exact (case-sensitive):
amplitude.track('App Opened'); // ✓ matches
amplitude.track('app_opened');  // ✗ different event
Tip: Track 1–3 core events, not dozens. Amplitude charges per tracked event, and noise drowns out signal.

Build Retention Cohorts

Once events flow, use Amplitude's Retention feature to measure how many users return by day/week/month. This is where stickiness becomes visible.

Create a Retention Chart

Go to Analytics > Retention. Set Return Event to your core engagement event (e.g., 'App Opened'). Amplitude shows cohort-by-cohort return rates: what % returned on day 1, day 7, day 30. A healthy product has >40% DAU/MAU; most SaaS see 10–30%.

javascript
// No SDK code—this uses Amplitude's UI
// But ensure your engagement event fires consistently:
const trackAppOpen = () => {
  const lastOpened = localStorage.getItem('last_app_open');
  const today = new Date().toDateString();
  
  if (lastOpened !== today) {
    amplitude.track('App Opened', { opened_date: today });
    localStorage.setItem('last_app_open', today);
  }
};

// Call on page load
trackAppOpen();

Filter by User Segment

Add a filter in Retention: plan_tier = pro. Compare this curve against plan_tier = free. Different segments have different stickiness; this reveals if the problem is pricing, onboarding, or feature parity.

javascript
// Always include segment in your tracking:
amplitude.track('App Opened', {
  plan_tier: user.plan, // 'free' or 'pro'
  onboarded: user.setup_complete,
  days_since_signup: calculateDaysSince(user.created_at)
});

// Then in Amplitude UI, filter Retention by these properties
// Compare free vs pro retention curves side-by-side

Monitor WAU/MAU Ratio

Create a Dashboard card that shows weekly active users (WAU) vs monthly active users (MAU). A 60%+ WAU/MAU ratio means users return within a week. Below 40% signals stickiness problems.

javascript
// Track explicit WAU/MAU events (simpler for dashboarding):
const sevenDaysAgo = Date.now() - 7 * 24 * 60 * 60 * 1000;
const thirtyDaysAgo = Date.now() - 30 * 24 * 60 * 60 * 1000;

if (user.last_active_time > sevenDaysAgo) {
  amplitude.track('Weekly Active User');
}
if (user.last_active_time > thirtyDaysAgo) {
  amplitude.track('Monthly Active User');
}
Watch out: Amplitude cohorts reset at UTC midnight. If your users are in different time zones, custom events let you define 'daily active' relative to their local time.

Build a Stickiness Dashboard

A one-pager showing DAU/MAU, segment breakdown, and trends keeps your team aligned on what matters.

Add a Retention Card

In Dashboards, click + New CardRetention. Set Return Event to 'App Opened'. Choose Cohort Timeline view to see day-by-day return rates. Pin this to your team dashboard.

javascript
// Ensure 'App Opened' fires consistently for accurate DAU:
let appOpenedThisSession = false;

window.addEventListener('focus', () => {
  if (!appOpenedThisSession) {
    amplitude.track('App Opened', {
      return_type: document.hidden ? 'foreground' : 'initial',
      timestamp: Date.now()
    });
    appOpenedThisSession = true;
  }
});

Add Segment Filters

Duplicate the Retention card twice: once filtered by plan_tier = free, once by plan_tier = pro. Place them side-by-side. A visibly lower free-tier curve signals a pricing/feature problem.

javascript
// Track plan tier in every event for Amplitude filtering:
amplitude.setUserProperties({ plan_tier: user.plan });

// In Amplitude Dashboard, filter by property:
// Card 1: plan_tier = 'free'
// Card 2: plan_tier = 'pro'
// Card 3: plan_tier = 'enterprise'

// Compare retention curves across tiers
Tip: Check your stickiness dashboard weekly. A 5% drop in DAU/MAU week-over-week warrants investigation—it usually signals a feature bug, bad deploy, or pricing change.

Common Pitfalls

  • Tracking every button click: Event overload creates noise. Stick to 1–3 core engagement events. Amplitude charges per tracked event.
  • Missing user properties: Without segmenting by plan or cohort, you measure aggregate stickiness and miss the segments that are actually churning.
  • Firing engagement events multiple times per session: 'App Opened' should fire once per session, not per page. Multiple fires inflate DAU and hide real retention.
  • Ignoring time zone differences: Amplitude cohorts reset at UTC midnight. If your product operates in PST, create custom events with local-time logic.

Wrapping Up

Stickiness is the north star—it tells you if users love your product or just signed up. By tracking a core engagement event, building retention cohorts, and segmenting by plan, you'll spot churn early. If you want to track this automatically across tools, Product Analyst can help.

Track these metrics automatically

Product Analyst connects to your stack and surfaces the insights that matter.

Try Product Analyst — Free