Global Stats | Bibdle
← Back to Game

Global Stats

EST reference date: {todayEst}

{#each statCards as card (card.label)} {card.label} {card.value} {/each}

Traffic & Growth (7-day windows)

Completions Velocity {signed(growth.completionsVelocity, "/day")} vs prior 7 days Completions Accel. {signed(growth.completionsAcceleration, "/day")} rate of change of velocity User Velocity {signed(growth.userVelocity)} unique players, wk/wk User Acceleration {signed(growth.userAcceleration)} rate of change of user velocity New Players (7d) {String(growth.newUsers7d)} first-time players Churned (7d) {String(growth.churned7d)} played wk prior, not this wk Net Growth (7d) {signed(growth.netGrowth7d)} new minus churned

Survival Curve

Of players who completed N sessions, what % came back for N+1?

{#each sessionDepthCards as card (card.depth)} After {card.depth} plays {card.returnRate != null ? `${card.returnRate}%` : "N/A"} {card.players} players {/each}

New Player Return Rate (7-day rolling avg)

Return Rate (7d avg) {newPlayerReturnVelocity.current7dAvg != null ? `${newPlayerReturnVelocity.current7dAvg}%` : "N/A"} new players who came back Return Rate Change {newPlayerReturnVelocity.change != null ? signed(newPlayerReturnVelocity.change, "pp") : "N/A"} vs prior 7 days Prior 7d Avg {newPlayerReturnVelocity.prior7dAvg != null ? `${newPlayerReturnVelocity.prior7dAvg}%` : "N/A"} days 8–14 ago
{#if newPlayerReturnSeries.length > 0}
{#each (returnExpanded ? newPlayerReturnSeries : newPlayerReturnSeries.slice(0, 3)) as row (row.date)} {/each}
Date New Players Return Rate 7d Avg
{row.date} {row.cohort} {row.rate != null ? `${row.rate}%` : "—"} {row.rollingAvg != null ? `${row.rollingAvg}%` : "—"}
{#if row.rollingAvg != null}
{/if}
{#if newPlayerReturnSeries.length > 3} {/if} {:else}

Not enough data yet.

{/if}

Weekly Active Users

Unique players per 7-day window. Most recent week first. Avg WAU: {avgWau}

{#each (wauExpanded ? wauWeeks : wauWeeks.slice(0, 3)) as row (row.weekEnd)} {@const barPct = Math.round( (row.wau / maxWau) * 100, )} {/each}
Week Active Users Wk/Wk Change
{row.weekStart} – {row.weekEnd} {row.wau} {row.changePct != null ? signed(row.changePct, "%") : "—"}
{#if wauWeeks.length > 3} {/if}

Monthly Active Users

{mauMode === 'rolling' ? 'Unique players per 30-day window. Most recent first.' : 'Unique players per calendar month. Current month projected to end of month.'}

{#if mauMode === 'rolling'} {@const displayedMauMonths = mauExpanded ? mauMonths : mauMonths.slice(0, 3)} {@const maxMau = Math.max(1, ...mauMonths.map((m) => m.mau))}
{#each displayedMauMonths as row (row.monthEnd)} {@const barPct = Math.round((row.mau / maxMau) * 100)} {/each}
Period Active Users Mo/Mo Change
{row.monthStart} – {row.monthEnd} {row.mau} {row.changePct != null ? signed(row.changePct, '%') : '—'}
{#if mauMonths.length > 3} {/if} {:else} {@const displayedCalMau = mauExpanded ? calendarMauMonths : calendarMauMonths.slice(0, 3)} {@const maxCalMau = Math.max(1, ...calendarMauMonths.map((m) => m.projectedMau ?? m.mau))}
{#each displayedCalMau as row (row.monthStart)} {@const displayMau = row.projectedMau ?? row.mau} {@const barPct = Math.round((displayMau / maxCalMau) * 100)} {/each}
Month Active Users Mo/Mo Change
{row.label} {#if row.isCurrentMonth} (projected) {/if} {#if row.isCurrentMonth} {row.mau} → {row.projectedMau ?? row.mau} {:else} {row.mau} {/if} {#if row.changePct != null} {row.isCurrentMonth ? '~' : ''}{signed(row.changePct, '%')} {:else} — {/if}
{#if calendarMauMonths.length > 3} {/if} {/if}

Last 14 Days — Completions

{#each (completionsExpanded ? last14Days : last14Days.slice(0, 3)) as row (row.date)} {@const barPct = Math.round( (row.count / maxCount) * 100, )} {/each}
Date Completions
{row.date} {row.count}
{#if last14Days.length > 3} {/if}

Active Streak Distribution

{#if streakChart.length === 0}

No active streaks yet.

{:else}
{#each (streakExpanded ? streakChart : streakChart.slice(0, 3)) as row (row.days)} {@const barPct = Math.round( (row.count / maxStreakCount) * 100, )} {/each}
Days Players
{row.days} {row.count}
{#if streakChart.length > 3} {/if} {/if}

Retention Over Time

% of each day's players who played again exactly 7 or 30 days later (regardless of activity in between). Cohorts with fewer than 3 players are excluded.

7-Day Retention

{#if retention7dSeries.length === 0}

Not enough data yet.

{:else}
{#each (ret7dExpanded ? retention7dSeries : retention7dSeries.slice(0, 3)) as row (row.date)} {/each}
Cohort Date n Ret. %
{row.date} {row.cohortSize} {row.rate}%
{#if retention7dSeries.length > 3} {/if} {/if}

30-Day Retention

{#if retention30dSeries.length === 0}

Not enough data yet.

{:else}
{#each (ret30dExpanded ? retention30dSeries : retention30dSeries.slice(0, 3)) as row (row.date)} {/each}
Cohort Date n Ret. %
{row.date} {row.cohortSize} {row.rate}%
{#if retention30dSeries.length > 3} {/if} {/if}