---
name: app-growth-stack
description: "Stand up an app-growth stack: UAC + Meta app campaigns, install + in-app event tracking, cohort/LTV read, and a scaling plan — end to end, gated."
license: MIT
compatibility: "Works with any Agent-Skills-compatible AI (Claude, ChatGPT, Cursor, Codex, and more). Ad-account actions run through Adspirer."
metadata:
  author: "Adspirer"
  version: "1.0.0"
  adspirer_category: "full-stack-playbooks"
  adspirer_source: "https://www.adspirer.com/skills/app-growth-stack"
  adspirer_connection_url: "https://adspirer.ai/sign-up"
  adspirer_primary_keyword: "app growth strategy"
  adspirer_secondary_keywords: "app marketing strategy, mobile app growth"
  adspirer_launch_wave: "1"
  adspirer_kind: "skill"
  adspirer_level: "operator"
  adspirer_platforms: "google,meta"
  adspirer_supported_clients: "claude,claude-code,chatgpt,codex,cursor,gemini,windsurf"
  adspirer_summary: "Stand up an app-growth stack: UAC + Meta app campaigns, install + in-app event tracking, cohort/LTV read, and a scaling plan — end to end, gated."
  adspirer_connections_required: "ga4,adspirer"
  adspirer_connections_optional: ""
---

# App Growth Stack

## Use this when

Use this when a mobile app (iOS/Android, native or hybrid) has SDK-level install and in-app event tracking already technically feasible (Firebase/GA4 for Android, or an MMP like AppsFlyer/Adjust) and the goal is to build install-and-post-install-event campaigns from scratch on Google UAC (App campaigns) and Meta App Ads, then read cohort/LTV signal back to decide scale-up, hold, or kill. Right fit when: the app is live in stores, has at least one meaningful in-app conversion event (purchase, trial start, subscription, level-complete for games), and there's budget for a real learning-phase spend (Google needs 50 installs/wk minimum signal per ad group equivalent; Meta needs ~50 optimization events/week per ad set to exit learning). Wrong fit for: pre-launch apps with no event data yet (do event-tracking setup first, this skill will stall at the audit step), web-to-app deep-link retargeting only (different skill), or apps where the only goal is raw install volume with no downstream event (skip the LTV/cohort leg, use a simpler UAC-installs-only skill instead — this one is built around event-value optimization).

## What you need

- Adspirer connected to the Google Ads account (must have App campaign access — requires a linked Google Play or App Store listing) and the Meta Ads account (must have an App ID registered in Meta Events Manager, with the Meta SDK or App Events API already integrated).
- App identifier for both stores: Android package name (e.g. com.company.app) and/or iOS App Store ID.
- GA4 property linked to the app (Firebase for Android, or GA4 for iOS via SDK) — needed to pull install source, cohort retention, and LTV-adjacent event data. **Connect Google Analytics 4:** this step uses Google Analytics 4. Add the Google Analytics 4 MCP/connector to your agent — setup: https://developers.google.com/analytics/devguides/MCP, then continue. Skip only if a step says it's optional.
- At least one in-app conversion event already firing and visible in the ad platforms' event managers (Google: linked via Google Play/Firebase or SDK conversion event; Meta: App Events via SDK or MMP passthrough). If no event fires yet, this skill will surface that at step 2 and stop — event instrumentation is a prerequisite, not something this skill builds.
- A target CPI (cost-per-install) or CPA (cost-per-event) range the user is willing to test against, and a total test budget the user is comfortable losing to reach statistical signal (rule of thumb: 3-5x target CPA per ad set/ad group minimum before judging).
- Campaign objective decision: installs-only (top of funnel) vs. app-event optimization (e.g. purchase, subscribe) — this skill defaults to event optimization if a qualifying event exists, since it converts to LTV-relevant users, but will say so and let the user override.

## Procedure

1. **Pull current state before building anything.** Read existing Google Ads App campaigns (if any) and Meta App campaigns via Adspirer, plus GA4 install/event volume for the trailing 30 days. This establishes whether this is a greenfield build or an existing stack that needs restructuring — never assume greenfield.
**Connect Adspirer (the ads connection):** when you reach a step that touches a live ad account, connect Adspirer first. In Claude Code, run `/plugin marketplace add anthropics/claude-plugins-community` then `/plugin install adspirer-ads-agent@claude-community`. In claude.ai or ChatGPT, add the Adspirer connector from https://www.adspirer.com/docs/ai-clients. Any other agent: follow https://www.adspirer.com/docs/ai-clients for your client. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed.

2. **Audit event tracking readiness before spending a dollar.** Cross-check that the conversion event the campaigns will optimize toward (e.g. `purchase`, `trial_start`) is actually firing in the last 7 days in both Google's linked conversion source and Meta Events Manager/Aggregated Event Measurement — not just configured, but firing with real volume. Pull the same event from GA4 to sanity-check volume matches (platforms undercount vs. GA4 due to attribution windows and SDK dedup — expect Google/Meta counts to run 10-30% under GA4's raw event count; anything wider than that suggests a firing/tagging problem, not just attribution math). **Google Analytics 4**
   - If iOS is in scope, separately confirm SKAdNetwork (SKAN 4) conversion value schema is configured in Meta and Google's SKAN reporting is mapped — iOS event-level optimization is structurally different (delayed, probabilistic, capped conversion value schema) from Android's deterministic event pipe. Flag this distinction explicitly rather than treating iOS and Android as one campaign.
   - **Stop condition check:** if the target event has fewer than ~10 firings/day across both stores combined, do not proceed to campaign build — recommend the user runs a broader top-funnel install campaign first to generate event volume, or fixes instrumentation. Report this as blocked, not a soft warning.

3. **Build Google App campaign (UAC) structure.** One App campaign per objective (installs vs. specific in-app action) per OS if budgets/creative differ meaningfully; otherwise one cross-OS campaign is fine since UAC auto-optimizes placement across Search/Display/YouTube/Discover/Play. Set:
   - Campaign goal: "Get more conversions from in-app actions" if event volume cleared the step-2 threshold, else "Get more installs."
   - Target CPI or target CPA bid — start at the user's stated target, not below it; Google's algorithm needs headroom to find volume in early learning and an aggressive low bid just starves the campaign of impressions rather than buying cheap.
   - Budget: default daily budget = 20-30x target CPA as a floor to let the algorithm exit learning within ~1-2 weeks (state this as a default, ask the user to confirm or override — this is real money).
   - Asset groups: at minimum 4-5 text assets (headlines/descriptions), 2 landscape + 2 portrait images, 1 video if available — UAC quality/reach degrades hard on thin asset groups since it can't test creative combinations.
**Connect Adspirer (the ads connection):** when you reach a step that touches a live ad account, connect Adspirer first. In Claude Code, run `/plugin marketplace add anthropics/claude-plugins-community` then `/plugin install adspirer-ads-agent@claude-community`. In claude.ai or ChatGPT, add the Adspirer connector from https://www.adspirer.com/docs/ai-clients. Any other agent: follow https://www.adspirer.com/docs/ai-clients for your client. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed.

4. **Build Meta App campaign structure.** Objective = App Promotion, with the app's registered Events Manager App ID selected. Ad set level:
   - Optimization event: same event validated in step 2 (purchase/trial/etc.) if volume supports it, else install-level optimization ("App Install") as a fallback with a note to migrate to event-optimization once volume builds.
   - Budget: Advantage+ campaign budget (CBO) recommended over manual ad-set budgets for app campaigns — Meta's app ads perform better with budget flexibility across ad sets during learning; default daily budget same 20-30x target CPA floor as Google.
   - Placements: Advantage+ placements (automatic) by default — app campaigns specifically benefit from Audience Network + Reels + Stories inventory that manual placement selection often excludes, and that inventory is often where cheap install volume lives.
   - iOS-specific: if targeting iOS 14.5+, confirm the campaign is SKAN-aware (Meta handles this automatically for App Promotion objective, but confirm Aggregated Event Measurement priority ranks the same event validated in step 2 — Meta only gets one prioritized conversion event per app domain in the SKAN world, so if multiple app campaigns compete for different events, only the top-priority one gets full SKAN attribution).
**Connect Adspirer (the ads connection):** when you reach a step that touches a live ad account, connect Adspirer first. In Claude Code, run `/plugin marketplace add anthropics/claude-plugins-community` then `/plugin install adspirer-ads-agent@claude-community`. In claude.ai or ChatGPT, add the Adspirer connector from https://www.adspirer.com/docs/ai-clients. Any other agent: follow https://www.adspirer.com/docs/ai-clients for your client. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed.

5. **Set explicit learning-phase exit criteria before launch, not after.** Document for the user: Google typically needs 2 weeks / 20+ conversions of stable spend before UAC signals are reliable; Meta ad sets need ~50 optimization events within a rolling 7-day window to exit "Learning" into "Learning Limited" or "Active." Do not judge, pause, or reallocate budget before these thresholds are met — early kills on underperforming-looking campaigns are the single most common way buyers strangle an app campaign before it has real signal.

6. **Launch is a proposal, not an action.** Present the full campaign structure (budgets, bids, targeting, asset groups, event mapping) to the user for explicit approval before any campaign goes live or budget is spent. Nothing launches silently.
**Connect Adspirer (the ads connection):** when you reach a step that touches a live ad account, connect Adspirer first. In Claude Code, run `/plugin marketplace add anthropics/claude-plugins-community` then `/plugin install adspirer-ads-agent@claude-community`. In claude.ai or ChatGPT, add the Adspirer connector from https://www.adspirer.com/docs/ai-clients. Any other agent: follow https://www.adspirer.com/docs/ai-clients for your client. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed.

7. **After the learning-phase window elapses (step 5 thresholds met), pull cohort/LTV read.** Query GA4 for day-1/day-7/day-30 retention and, if revenue events are tracked, cumulative revenue-per-install by cohort and by campaign/source (UTM or GA4's attribution linking back to the ad platform). **Google Analytics 4**
   - Cross-reference GA4 cohort LTV against blended CPI/CPA paid on each platform to compute a real payback estimate — never invent an LTV:CAC ratio from platform-reported "value" alone, since Meta/Google in-platform value optimization scores are directional signals, not verified revenue.

8. **Produce the scale/hold/kill recommendation per platform/campaign, gated on live data only.** Criteria (defaults, override as needed): scale (increase budget 20-30% no more than every 3-4 days) if day-7 retention and CPA are within the user's target band and learning phase is exited; hold if learning phase isn't complete or signal is inconclusive; kill/pause candidate if CPA is running >150% of target AND learning phase has fully exited AND day-7 retention on that cohort is below the account's own historical baseline (never against an invented industry benchmark). Flag budget-scaling caution: jumping budget more than ~20-30% at once on Google or Meta app campaigns resets or destabilizes the learning phase — scale in steps, not jumps.

9. **Surface iOS/Android split explicitly in the final report** even if campaigns are combined — SKAN's probabilistic/delayed iOS data means iOS scale decisions should lean more conservative and wait for longer windows than Android's deterministic event data; collapsing the two into one blended number hides which OS is actually working.

10. **Any budget change, pause, or new campaign launch coming out of the scale/hold/kill recommendation requires the user's explicit approval before execution** — this skill produces a report and a proposed action, never a silent budget move.
**Connect Adspirer (the ads connection):** when you reach a step that touches a live ad account, connect Adspirer first. In Claude Code, run `/plugin marketplace add anthropics/claude-plugins-community` then `/plugin install adspirer-ads-agent@claude-community`. In claude.ai or ChatGPT, add the Adspirer connector from https://www.adspirer.com/docs/ai-clients. Any other agent: follow https://www.adspirer.com/docs/ai-clients for your client. Sign-in link for the user: https://adspirer.ai/sign-up. Do not proceed with live ad-account steps until the connection is confirmed.

## Fixed checks

- Conversion event fired-volume check (step 2): pull live event counts from Google's conversion source, Meta Events Manager, and GA4 directly — never trust "the event is configured" as proof it's firing; configured-but-silent events are the most common app-tracking failure mode.
- SKAN/iOS attribution mapping check (step 2, 4): confirm live in Meta Events Manager which event currently holds SKAN priority for the app — this can silently change if another campaign or team member edits AEM priority; don't assume the priority set at launch is still in place at read time.
- Learning-phase status check (step 5, 8): read live campaign/ad-set delivery status from Google Ads and Meta directly (Google's "Learning" tag in UAC reporting; Meta's ad-set delivery status field) — never infer learning status from elapsed days or spend alone, since it depends on actual conversion volume achieved, which varies.
- Budget/bid-vs-live-account check before any scale action (step 8): re-pull current live daily budget and bid from the account immediately before proposing a change — someone may have manually adjusted it since the last read, and a percentage-based scale calculated off stale data over- or under-shoots.
- GA4-vs-platform event count reconciliation (step 2, 7): compare GA4 raw event volume against each platform's reported conversion volume for the same event/window; a gap wider than the expected attribution-window discrepancy (~10-30%) is a live data-integrity flag, not something to average over. **Google Analytics 4**
- Cohort retention and revenue figures used in the scale/hold/kill call (step 7-8) must be pulled fresh from GA4 at decision time, not cached from an earlier pull in the same conversation — cohorts mature daily and a day-7 cohort read on day 3 is incomplete data, not just stale data.

## Stop conditions

- **Success:** Google App campaign and/or Meta App campaign launched with user-approved structure, both platforms confirmed serving with valid event optimization mapped, and a scale/hold/kill report delivered after learning-phase thresholds were met using live cohort data.
- **No-op / already covered:** existing app campaigns already meet the target structure (correct event optimization, healthy learning-phase status, budgets aligned to target CPA) — report current state and skip rebuild rather than duplicating a working setup.
- **Blocked — no qualifying event volume:** step 2's event-firing check comes back under ~10 events/day combined; skill stops before campaign build and reports the instrumentation or top-funnel-volume gap as the blocker, with no campaigns created.
- **Blocked — missing platform prerequisite:** Google account lacks a linked app store listing, or Meta account has no registered Events Manager App ID for the app — report exactly which prerequisite is missing and where to fix it; do not attempt a workaround campaign structure.
- **Needs-approval — structure proposed, awaiting go-ahead:** full campaign build (budgets, bids, event mapping) is drafted and presented but not yet launched pending explicit user sign-off (step 6).
- **Needs-approval — scale/kill action proposed, awaiting go-ahead:** post-learning-phase report is delivered with a scale/hold/kill recommendation, but no budget or status change is executed until the user approves (step 10).
- **Inconclusive — learning phase incomplete at report time:** if the user asks for a read before Google's 2-week/20-conversion or Meta's 50-event thresholds are met, report the data honestly as insufficient for a scale/kill call rather than forcing a premature verdict.

## Approval boundaries

Every campaign launch, budget-set, bid-set, and any subsequent budget scale/pause/kill action requires the user's explicit approval before execution — this skill drafts and proposes campaign structures and scale recommendations but never spends money or changes live budgets without a confirmed go-ahead at the point marked in the procedure. Read-only steps (state audit, event-firing checks, GA4 cohort pulls) run without per-step approval since they take no action on the live account; only steps that create or modify a campaign, ad set, budget, or bid are gated.

## What you get

A running install-and-event app-growth stack across Google UAC and Meta App Ads: a pre-build readiness audit (event volume, SKAN mapping, GA4 reconciliation) that stops the build if tracking isn't real yet; a user-approved campaign structure on both platforms with event-optimized bidding (not just raw installs) and explicit learning-phase exit criteria documented up front; and, after that learning phase actually completes, a cohort/LTV-grounded scale-hold-kill report per platform and per OS (iOS treated separately from Android given SKAN's probabilistic data) with a proposed next action that stays a proposal until the user approves it.
