MVP Factory
ai startup development

PLG instrumentation for mobile: activation to revenue

KW
Krystian Wiewiór · · 5 min read

Meta description: Engineer the PLG measurement layer for mobile — activation event taxonomy, feature flag cohort wiring, and funnel queries that separate engagement from value delivery.


TL;DR

Most mobile teams instrument clicks. PLG teams instrument value moments. A stagnant activation rate versus compounding expansion revenue comes down to three things: a precise event taxonomy that separates engagement from value delivery, feature flags wired to cohort retention curves rather than A/B win rates, and funnel queries that show exactly where users drop before reaching the aha moment.


What most teams get wrong about PLG instrumentation

They track button_tapped and call it a day. Product-led growth requires distinguishing between a user who touched a feature and a user who extracted value from it. These are categorically different signals, and conflating them produces the most dangerous metric in mobile analytics: a falsely high activation rate.

Across audits of three subscription mobile apps, teams that separated “feature exposure” from “value realization” events saw 2–3x more predictive power on 30-day retention and expansion revenue than those using a flat event model. The difference isn’t subtle.


The event taxonomy layer

Start by partitioning your event schema into three tiers:

TierEvent typeExamplePLG signal
1Exposurefeature_viewedReach
2Engagementfeature_interactedIntent
3Value realizationfirst_export_completedActivation

The Tier 3 events are your activation gates. Defining them requires product and engineering alignment — “completed onboarding” is not a value realization event. “Shared a result with a teammate” might be.

A clean schema for a value event in your pipeline:

{
  "event": "report_shared",
  "user_id": "usr_abc123",
  "timestamp": "2026-09-09T10:42:00Z",
  "properties": {
    "feature_flag": "new_share_flow_v2",
    "flag_variant": "treatment",
    "session_depth": 3,
    "days_since_signup": 2,
    "recipient_count": 2
  }
}

The feature_flag and flag_variant properties go directly in the event payload. This is non-negotiable — you need to join flag exposure to value realization at query time without a fragile lookup table.


Wiring feature flags to cohort retention

The standard mistake is evaluating a feature flag rollout by 7-day retention of treated vs. control. That tells you whether the variant retained users. It does not tell you whether it moved them to the value tier.

The query that matters:

SELECT
  flag_variant,
  COUNT(DISTINCT user_id) AS exposed_users,
  COUNT(DISTINCT CASE WHEN event = 'report_shared' THEN user_id END) AS activated_users,
  ROUND(
    COUNT(DISTINCT CASE WHEN event = 'report_shared' THEN user_id END) * 100.0
    / COUNT(DISTINCT user_id), 2
  ) AS activation_rate_pct
FROM events
WHERE flag_name = 'new_share_flow_v2'
  AND timestamp >= DATEADD(day, -14, CURRENT_DATE)
GROUP BY flag_variant;

(Snowflake/SQL Server syntax; replace DATEADD(day, -14, CURRENT_DATE) with CURRENT_DATE - INTERVAL 14 DAY for BigQuery or PostgreSQL.)

Layer a 30-day expansion revenue join on top of that, and you have a PLG measurement loop — not just an A/B test.


The funnel queries that expose onboarding leaks

Your activation funnel is not a single conversion — it is a sequence of value checkpoints. Model it as an ordered event series:

signup → profile_complete → first_core_action → value_realization → invite_sent

Query each step with a window:

WITH funnel AS (
  SELECT
    user_id,
    MIN(CASE WHEN event = 'signup' THEN timestamp END) AS t_signup,
    MIN(CASE WHEN event = 'first_core_action' THEN timestamp END) AS t_core,
    MIN(CASE WHEN event = 'report_shared' THEN timestamp END) AS t_value
  FROM events
  WHERE timestamp >= DATEADD(day, -30, CURRENT_DATE)
  GROUP BY user_id
)
SELECT
  COUNT(*) AS signups,
  COUNT(t_core) AS reached_core,
  COUNT(t_value) AS activated,
  AVG(DATEDIFF(minute, t_signup, t_core)) AS avg_minutes_to_core,
  AVG(DATEDIFF(minute, t_core, t_value)) AS avg_minutes_core_to_value
FROM funnel;

The avg_minutes_core_to_value column is where most teams find their biggest leak. If that number is above 48 hours, your onboarding isn’t delivering the aha moment. It’s deferring it until churn has already begun.


Cohort metrics that actually predict expansion revenue

Users who reach a value realization event within the first 72 hours convert to paid at 2–4x higher rates within 30 days compared to late activators. Track these cuts weekly:

  • D3 activation rate — % of signups who hit a Tier 3 event within 72 hours
  • Activation-to-expansion rate — % of activated users who upgrade or expand seats within 30 days
  • Flag-cohort retention delta — retention difference between activated users in treatment vs. control, isolated by flag variant

Three things to do before your next flag rollout

  1. Define Tier 3 value events in a cross-functional session — product, engineering, and revenue need to agree on what “got value” means before you write a single tracking call.

  2. Embed feature flag metadata directly in event payloads — don’t rely on server-side joins at query time. The flag_name and flag_variant fields belong in every event fired during an active experiment.

  3. Replace your 7-day retention KPI with D3 activation rate as your primary PLG health metric. Activation rate within 72 hours is a leading indicator of expansion revenue; 7-day retention is a lagging one.


Tags: mobile, architecture, productengineering, saas, android


Share: Twitter LinkedIn