> ## Documentation Index
> Fetch the complete documentation index at: https://docs.uos.agency/llms.txt
> Use this file to discover all available pages before exploring further.

# Analytics

> Publisher analytics in Dev Portal: what you get and how unlock works

export const AnalyticsDashboardPreview = () => <div className="uos-doc-preview uos-doc-preview--dev" aria-label="Dev Portal analytics dashboard preview">
    <div className="uos-dev-panel uos-analytics-dash">
      <div className="uos-analytics-dash__filters">
        <span className="uos-analytics-dash__select">All apps</span>
        <div className="uos-analytics-dash__range">
          <span className="uos-analytics-dash__day">7d</span>
          <span className="uos-analytics-dash__day uos-analytics-dash__day--active">30d</span>
          <span className="uos-analytics-dash__day">90d</span>
        </div>
      </div>

      <div className="uos-analytics-stats">
        <div className="uos-analytics-stat">
          <span className="uos-dev-eyebrow">Installs</span>
          <span className="uos-analytics-stat__value">128</span>
          <span className="uos-dev-body">94 unique wallets</span>
        </div>
        <div className="uos-analytics-stat">
          <span className="uos-dev-eyebrow">Opens</span>
          <span className="uos-analytics-stat__value">1,042</span>
        </div>
        <div className="uos-analytics-stat">
          <span className="uos-dev-eyebrow">Active wallets</span>
          <span className="uos-analytics-stat__value">61</span>
          <span className="uos-dev-body">112 in 30d</span>
        </div>
        <div className="uos-analytics-stat">
          <span className="uos-dev-eyebrow">Uninstalls</span>
          <span className="uos-analytics-stat__value">7</span>
        </div>
      </div>

      <section className="uos-dev-card uos-dev-card--pad">
        <p className="uos-dev-eyebrow">Daily activity (30d)</p>
        <div className="uos-analytics-bars" aria-hidden="true">
          <span style={{
  height: "35%"
}} />
          <span style={{
  height: "55%"
}} />
          <span style={{
  height: "42%"
}} />
          <span style={{
  height: "70%"
}} />
          <span style={{
  height: "48%"
}} />
          <span style={{
  height: "88%"
}} />
          <span style={{
  height: "62%"
}} />
        </div>
        <div className="uos-analytics-legend">
          <span><i className="uos-analytics-dot uos-analytics-dot--pink" /> Installs</span>
          <span><i className="uos-analytics-dot uos-analytics-dot--gray" /> Opens</span>
        </div>
      </section>

      <div className="uos-analytics-split">
        <section className="uos-dev-card uos-dev-card--pad">
          <p className="uos-dev-eyebrow">Funnel (lifetime)</p>
          <div className="uos-analytics-funnel">
            <div><span>Views</span><b>2,410</b></div>
            <div><span>Installs</span><b>128 · 5%</b></div>
            <div><span>Opens</span><b>1,042</b></div>
          </div>
        </section>
        <section className="uos-dev-card uos-dev-card--pad">
          <p className="uos-dev-eyebrow">Opens by source</p>
          <div className="uos-analytics-sources">
            <div><span>store</span><div className="uos-analytics-bar"><i style={{
  width: "28%"
}} /></div><b>92</b></div>
            <div><span>desktop</span><div className="uos-analytics-bar"><i style={{
  width: "55%"
}} /></div><b>610</b></div>
            <div><span>dock</span><div className="uos-analytics-bar"><i style={{
  width: "38%"
}} /></div><b>290</b></div>
            <div><span>other</span><div className="uos-analytics-bar"><i style={{
  width: "12%"
}} /></div><b>50</b></div>
          </div>
        </section>
      </div>
    </div>
  </div>;

export const AnalyticsLockedPreview = () => <div className="uos-doc-preview uos-doc-preview--dev" aria-label="Dev Portal analytics unlock preview">
    <div className="uos-dev-panel">
      <div className="uos-dev-titleblock">
        <img src="/assets/dev-portal-icon.png" alt="" className="uos-dev-titleblock__icon" />
        <h4 className="uos-dev-titleblock__title" aria-label="Dev Portal">
          <span className="uos-dev-titleblock__muted">Dev </span>
          <span className="uos-dev-titleblock__accent">Portal</span>
        </h4>
      </div>

      <div className="uos-dev-tabs">
        <span className="uos-dev-tab">Publish</span>
        <span className="uos-dev-tab uos-dev-tab--active">Analytics</span>
        <span className="uos-dev-tab">Settings</span>
      </div>

      <section className="uos-dev-card uos-dev-card--pad uos-analytics-locked">
        <div className="uos-analytics-locked__icon" aria-hidden="true">
          <span className="uos-analytics-locked__lock" />
        </div>
        <p className="uos-dev-card__title">Unlock developer analytics</p>
        <p className="uos-dev-body">
          One-time payment of 10 USDC on Base unlocks the full suite for this wallet, forever.
        </p>
        <span className="uos-dev-publish-btn">Unlock for $10</span>
        <p className="uos-dev-body uos-analytics-locked__fine">
          Paid straight to the uOS treasury and verified on-chain.
        </p>
      </section>
    </div>
  </div>;

The **Analytics** tab in Dev Portal shows how people discover, install, and use Mini Apps published by your wallet. Publishing is free. Analytics requires a one-time paid unlock for that wallet.

## Unlock

1. Open **Dev Portal** → **Analytics**.
2. **Sign in** with your publisher wallet (one-time SIWE-style message; proves wallet ownership via the session cookie).
3. Pay **10 USDC on Base** (`transfer` to the uOS treasury).
4. Wait for confirmations (default **3** blocks), then the client claims the unlock with the tx hash.

The unlock is stored as a wallet entitlement for product `analytics`. It is **one-time and permanent** for that wallet: every app published by that wallet is included. There is no subscription.

<AnalyticsLockedPreview />

<div className="uos-doc-preview-caption">Analytics tab before unlock: one-time 10 USDC on Base</div>

<Note>
  The server verifies the USDC transfer on-chain (from your session wallet to the treasury, amount ≥ 10 USDC, unused tx hash). If activation stalls after you pay, use **Retry claim**. The payment is already on-chain.
</Note>

## What you get

After unlock, the dashboard loads from `/api/dev/analytics`. You can filter by one of your apps and by window (**7d / 30d / 90d**). The window applies to daily activity, opens by source, sessions, and retention. Headline totals and the funnel are lifetime. Active wallets always show last 7 days (with a last-30-days hint).

| Metric                        | What the UI shows                                                                                                                                                                  |
| ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Installs**                  | Lifetime total installs; hint shows unique installer wallets (count only). With **All apps** selected, per-app unique counts are summed (the same wallet on two apps counts twice) |
| **Opens**                     | Lifetime total opens                                                                                                                                                               |
| **Active wallets**            | Unique wallets in the last 7 days; hint shows last 30 days                                                                                                                         |
| **Uninstalls**                | Lifetime total uninstalls                                                                                                                                                          |
| **Daily activity**            | Daily installs vs opens for the selected window                                                                                                                                    |
| **Funnel (lifetime)**         | `view` → `install` → `open` event counts (lifetime)                                                                                                                                |
| **Opens by source**           | `store`, `desktop`, `dock`, `other` for the selected window                                                                                                                        |
| **Sessions**                  | Session count and average length for the window; median (p50) is the **latest day’s** p50                                                                                          |
| **Retention by install week** | Cohort week, installed count, D1 / D7 / D30 return rates (window plus 31-day lookback)                                                                                             |

<AnalyticsDashboardPreview />

<div className="uos-doc-preview-caption">Unlocked dashboard: headline stats, daily series, funnel, and sources</div>

## How events are recorded

uOS records analytics server-side when people use the App Store and Mini App windows (views, installs, opens, uninstalls, sessions). The client posts events to `/api/analytics/events`; the server inserts them. Wallet attribution comes from the HTTP-only session cookie when present; anonymous events can still be counted without a wallet.

Session length is sent when a Mini App window closes (or unmounts) and the session lasted more than 1 second.

## Privacy

* The analytics API returns **aggregated counts only**. It does not return lists of wallet addresses.
* Access requires both a signed-in session for your publisher wallet and the `analytics` entitlement.
* You only see apps owned by that wallet.

## Good to know

* Empty state: if you have no published apps yet, the dashboard says analytics start once an app is live.
* Retention cohorts need installs attributed to signed-in users plus return opens; otherwise the retention table stays empty.
* Payment age is capped (default 24 hours from block time); very old tx hashes cannot be claimed.

## Next

[Publish an app](/developers/publish) if you are not live yet, or open Dev Portal in uOS to unlock Analytics.
