# Growth KPI Dashboard -- Q1 2026 QBR

**Prepared:** 2026-04-10 | **Presented:** 2026-04-11 | **Owner:** Growth Team

---

## CAC / Activation Mismatch Fix

**The problem:** CAC denominator uses *all new signups* while activation rate uses *activated users only*. This inflates LTV/CAC (looks better than reality) and deflates activation rate when used alongside blended CAC. The two metrics tell contradictory stories in the same dashboard.

**Root cause:** CAC = `total_spend / all_signups`, but LTV is calculated on *activated* customers only. When you divide an activated-customer LTV by a blended-signup CAC, the ratio is artificially favorable.

**The fix -- use two CAC variants consistently:**

| Metric | Formula | Use It For |
|---|---|---|
| **Blended CAC** | `total_spend / all_signups` | Channel efficiency, top-of-funnel cost |
| **Activated CAC** | `total_spend / activated_users` | Unit economics, LTV/CAC ratio, payback |

**Rule:** LTV/CAC and Payback Period MUST use Activated CAC. Channel View cards show Blended CAC. Both are labeled explicitly on every card.

```sql
-- Blended CAC (channel efficiency)
SELECT
    channel,
    DATE_TRUNC('month', u.created_at) AS month,
    SUM(ms.spend) / NULLIF(COUNT(DISTINCT u.id), 0) AS blended_cac
FROM users u
JOIN marketing_spend ms
    ON ms.channel = u.acquisition_channel
    AND ms.month = DATE_TRUNC('month', u.created_at)
WHERE u.created_at >= DATE_TRUNC('quarter', CURRENT_DATE) - INTERVAL '1 quarter'
GROUP BY channel, DATE_TRUNC('month', u.created_at);

-- Activated CAC (unit economics)
SELECT
    DATE_TRUNC('month', u.created_at) AS month,
    SUM(ms.spend) / NULLIF(COUNT(DISTINCT u.id) FILTER (
        WHERE u.id IN (SELECT user_id FROM activation_events WHERE milestone = 'activated')
    ), 0) AS activated_cac
FROM users u
JOIN marketing_spend ms
    ON ms.channel = u.acquisition_channel
    AND ms.month = DATE_TRUNC('month', u.created_at)
GROUP BY DATE_TRUNC('month', u.created_at);
```

---

## View 1: Executive Summary

One-page view. 6 headline KPIs with QoQ trend, two charts, one alert strip.

```
┌──────────────────────────────────────────────────────────────────┐
│  GROWTH EXECUTIVE SUMMARY              Q1 2026   [Quarter ▼]    │
├───────────┬───────────┬───────────┬──────────┬────────┬─────────┤
│    MRR    │  MRR      │ Activated │  LTV/CAC │Payback │ Net Rev │
│           │  Growth   │   CAC *   │  Ratio * │Period *│ Churn   │
│  $X.XM    │  X.X%     │  $XXX     │  X.Xx    │ X mo   │ -X.X%   │
│  ▲ X% QoQ │ ▲ X.Xpp  │  ▼ $XX    │  ▲ X.Xx  │ ▼ Xmo  │ ▲ X.Xpp│
├───────────┴───────────┴───────────┴──────────┴────────┴─────────┤
│  * Uses Activated CAC (spend / activated users), not blended    │
├─────────────────────────────────┬────────────────────────────────┤
│  MRR TREND (12 months)         │  MRR BRIDGE (Q1)               │
│  ┌───────────────────────────┐ │                                 │
│  │                      ╱──  │ │  Start MRR        $X.XM         │
│  │                 ╱───╱     │ │  + New             $XXXk        │
│  │            ╱───╱          │ │  + Expansion       $XXXk        │
│  │       ╱───╱               │ │  - Contraction    ($XXk)        │
│  │  ╱───╱                    │ │  - Churned        ($XXk)        │
│  └───────────────────────────┘ │  = End MRR         $X.XM         │
│  Apr May Jun Jul Aug Sep Oct   │                                 │
│  Nov Dec Jan Feb Mar           │  Net New MRR: +$XXXk (+X.X%)   │
├────────────────────────────────┴────────────────────────────────┤
│  ALERTS                                                         │
│  [red]  Churn spiked to X.X% in Mar (threshold: X.X%)          │
│  [ylw]  Expansion revenue slowing -- down XX% MoM               │
│  [grn]  Activated CAC improved $XX QoQ after channel rebalance  │
└─────────────────────────────────────────────────────────────────┘
```

**Headline KPI definitions:**

| KPI | Definition | Target |
|---|---|---|
| MRR | Sum of normalized monthly subscription revenue (annual/12, quarterly/3) | Track trend |
| MRR Growth | `(MRR_current - MRR_prior) / MRR_prior` month-over-month | > 5% MoM |
| Activated CAC | `total_channel_spend / activated_users` | < $XXX |
| LTV/CAC | `LTV / activated_cac` -- both sides use activated-user basis | > 3.0x |
| Payback Period | `activated_cac / (ARPU * gross_margin)` in months | < 12 mo |
| Net Revenue Churn | `(contraction + churned_mrr - expansion) / start_mrr` | < -2% (negative = expansion) |

---

## View 2: Channel View

One row per acquisition channel. Blended CAC here (all signups), since this view evaluates channel top-of-funnel efficiency.

```
┌──────────────────────────────────────────────────────────────────┐
│  CHANNEL PERFORMANCE                  Q1 2026   [Quarter ▼]     │
├──────────────────────────────────────────────────────────────────┤
│  Filter: [All Channels ▼]  [Compare: Q4 2025 ▼]                │
├──────────┬────────┬──────────┬────────┬──────────┬──────────────┤
│ Channel  │ Spend  │ Signups  │Blended │Activated │ Act. Rate    │
│          │        │          │ CAC    │  CAC     │              │
├──────────┼────────┼──────────┼────────┼──────────┼──────────────┤
│ Organic  │ $XXk   │  X,XXX   │ $XX    │ $XXX     │ XX%          │
│ Paid SEM │ $XXk   │  X,XXX   │ $XXX   │ $XXX     │ XX%          │
│ Paid Soc │ $XXk   │  X,XXX   │ $XXX   │ $XXX     │ XX%          │
│ Content  │ $XXk   │  X,XXX   │ $XX    │ $XXX     │ XX%          │
│ Referral │ $XXk   │    XXX   │ $XX    │ $XX      │ XX%          │
│ Partner  │ $XXk   │    XXX   │ $XXX   │ $XXX     │ XX%          │
├──────────┴────────┴──────────┴────────┴──────────┴──────────────┤
│                                                                  │
│  SPEND vs ACTIVATED CAC BY CHANNEL         CHANNEL MIX SHIFT    │
│  (bubble = signup volume)                  (Q4 vs Q1 stacked)   │
│  ┌────────────────────────────┐            ┌──────────────────┐ │
│  │  y: Activated CAC          │            │ Q4 ████████████  │ │
│  │      ●Paid Soc             │            │ Q1 ████████████  │ │
│  │  ●PaidSEM                  │            │                  │ │
│  │          ●Partner          │            │ Organic ■        │ │
│  │    ●Content                │            │ Paid    ■        │ │
│  │ ●Organic   ●Referral      │            │ Content ■        │ │
│  │        x: Spend ──────>   │            │ Referral■        │ │
│  └────────────────────────────┘            └──────────────────┘ │
├──────────────────────────────────────────────────────────────────┤
│  INSIGHT: Paid Social blended CAC looks fine ($XX) but          │
│  activation rate is only XX%, making activated CAC $XXX --      │
│  worst unit economics of any channel. Recommend reallocating    │
│  $XXk to Content + Referral which activate at XX%+.             │
└──────────────────────────────────────────────────────────────────┘
```

**Why both CAC columns matter here:** A channel can look cheap on blended CAC but produce users who never activate, making its *real* cost (activated CAC) the highest in the portfolio. Showing both side-by-side exposes this.

---

## View 3: Activation Funnel

Step-by-step conversion from signup to activated, with channel-level breakdown.

```
┌──────────────────────────────────────────────────────────────────┐
│  ACTIVATION FUNNEL                    Q1 2026   [Quarter ▼]     │
├──────────────────────────────────────────────────────────────────┤
│  Segment: [All Users ▼]  Channel: [All ▼]  Cohort: [Q1 2026 ▼]│
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  FUNNEL STEPS                                                    │
│                                                                  │
│  Signup ████████████████████████████████████████████  X,XXX 100% │
│                                                                  │
│  Onboarding     ▼ XX% drop-off                                  │
│  Complete  ██████████████████████████████████         X,XXX  XX% │
│                                                                  │
│  First Key      ▼ XX% drop-off                                  │
│  Action    ████████████████████████                   X,XXX  XX% │
│                                                                  │
│  Aha Moment     ▼ XX% drop-off                                  │
│  Reached   ███████████████████                       X,XXX  XX% │
│                                                                  │
│  Activated      ▼ XX% drop-off                                  │
│  (Day 7)   █████████████████                           XXX  XX% │
│                                                                  │
├──────────────────────────────┬───────────────────────────────────┤
│  DROP-OFF BY CHANNEL         │  TIME TO ACTIVATE (distribution) │
│                              │                                   │
│  Step w/ biggest leak:       │  Median: X.X days                │
│  "First Key Action"         │  P75:    X.X days                │
│                              │  P90:    XX.X days               │
│  Channel    Drop   vs Avg   │                                   │
│  Paid Soc   XX%    +XXpp    │  ┌─────────────────────────────┐ │
│  Paid SEM   XX%    +Xpp     │  │  ▁▃▇█▇▅▃▂▁▁               │ │
│  Partner    XX%    +Xpp     │  │  1  3  5  7  10  14  21 day│ │
│  Content    XX%    -Xpp     │  └─────────────────────────────┘ │
│  Organic    XX%    -Xpp     │                                   │
│  Referral   XX%    -XXpp    │  Users activating after day 7     │
│                              │  are XX% of total -- consider     │
│                              │  extending window to 10 days.    │
├──────────────────────────────┴───────────────────────────────────┤
│  ACTIVATION DEFINITION                                          │
│  A user is "activated" when they complete ALL of:               │
│  1. Finish onboarding (profile + team setup)                    │
│  2. Perform first key action (e.g., create first [object])      │
│  3. Reach aha moment (e.g., receive first [value event])        │
│  4. Return on a second day within 7 calendar days of signup     │
│                                                                  │
│  This definition feeds into Activated CAC across all views.     │
└──────────────────────────────────────────────────────────────────┘
```

**Activation definition governance:** The activation milestones above are the single source of truth for "activated user" across all three views. Any change to this definition must update the CAC calculations simultaneously.

---

## Implementation: Activation Query

```sql
-- Activation funnel with per-step counts
WITH signup AS (
    SELECT id AS user_id, acquisition_channel, created_at
    FROM users
    WHERE created_at >= DATE_TRUNC('quarter', CURRENT_DATE - INTERVAL '1 quarter')
      AND created_at <  DATE_TRUNC('quarter', CURRENT_DATE)
),
steps AS (
    SELECT
        s.user_id,
        s.acquisition_channel,
        s.created_at AS signup_at,
        oe.completed_at AS onboarding_at,
        fka.completed_at AS first_action_at,
        aha.completed_at AS aha_at,
        d2.event_at AS day2_return_at,
        -- Fully activated = all four milestones within 7 days
        CASE WHEN oe.completed_at IS NOT NULL
              AND fka.completed_at IS NOT NULL
              AND aha.completed_at IS NOT NULL
              AND d2.event_at IS NOT NULL
              AND d2.event_at <= s.created_at + INTERVAL '7 days'
        THEN TRUE ELSE FALSE END AS is_activated
    FROM signup s
    LEFT JOIN onboarding_events oe
        ON oe.user_id = s.user_id
    LEFT JOIN (
        SELECT user_id, MIN(created_at) AS completed_at
        FROM key_actions GROUP BY user_id
    ) fka ON fka.user_id = s.user_id
    LEFT JOIN (
        SELECT user_id, MIN(created_at) AS completed_at
        FROM aha_events GROUP BY user_id
    ) aha ON aha.user_id = s.user_id
    LEFT JOIN (
        SELECT user_id, MIN(event_at) AS event_at
        FROM user_sessions
        WHERE event_at::date > (SELECT created_at::date FROM users u2 WHERE u2.id = user_sessions.user_id)
        GROUP BY user_id
    ) d2 ON d2.user_id = s.user_id
)
SELECT
    acquisition_channel,
    COUNT(*) AS signups,
    COUNT(*) FILTER (WHERE onboarding_at IS NOT NULL) AS onboarded,
    COUNT(*) FILTER (WHERE first_action_at IS NOT NULL) AS first_action,
    COUNT(*) FILTER (WHERE aha_at IS NOT NULL) AS aha_reached,
    COUNT(*) FILTER (WHERE is_activated) AS activated,
    ROUND(100.0 * COUNT(*) FILTER (WHERE is_activated) / NULLIF(COUNT(*), 0), 1) AS activation_rate
FROM steps
GROUP BY ROLLUP (acquisition_channel)
ORDER BY acquisition_channel NULLS FIRST;
```

---

## Data Consistency Checklist

Before QBR presentation, verify:

- [ ] Activated CAC is used in LTV/CAC and Payback (not blended)
- [ ] Channel View labels distinguish "Blended CAC" vs "Activated CAC"
- [ ] Activation definition in funnel view matches the WHERE clause in CAC query
- [ ] MRR normalization matches Finance (annual/12, quarterly/3)
- [ ] Date ranges are identical across all three views (Q1 = Jan 1 - Mar 31)
- [ ] Channel spend totals reconcile with Finance's marketing spend report
- [ ] Cohort boundaries use `DATE_TRUNC('month')`, not daily granularity

---

## QBR Talking Points

1. **CAC/Activation mismatch is now fixed.** We split into Blended CAC (channel efficiency) and Activated CAC (unit economics). LTV/CAC uses activated basis -- expect the ratio to look X.Xx lower than last quarter's deck, but it is now accurate.

2. **Channel rebalance opportunity.** Paid Social has the lowest blended CAC but worst activation rate, making its activated CAC the highest. Shifting budget to Content/Referral improves true unit economics.

3. **Activation funnel bottleneck.** The biggest drop-off is at "First Key Action." This is where channel quality diverges -- Referral users convert at XXpp above average, Paid Social at XXpp below.

4. **Net revenue churn.** Watch contraction trend -- expansion revenue is slowing, which will flip net churn positive if not addressed.
