Spokina Admin

Sign in using your administrator credentials. Your session will remain valid for 2 hours.

Overview

User Onboarding Trends

Subscriptions Split

User Activity Trends (Last 30 Days)

Loading…
ⓘ DAU/WAU/MAU and the “Active” cohort measure v2 in-app activity only (lesson, quiz, chat, voice, scenario, interview, word-game). Users still on the old Cashfree app do not update v2 activity, so they are not counted here.

Cohort AI Feature Usage

Plan TypeAI FeatureTokens UsedEst. Cost (INR)Requests Count
Loading cohort usage...

User Search & Profiles

💡 PRO-TIP: Hover over any user in the table below to reveal a floating hover card containing real-time strengths, streaks, lessons completed, chat, and voice usage.
NamePhonePlanStreakCreated At
Search for a user above...

Plans Subscription Distribution

Plan TypeActive Users Count
Loading plan distribution...

Admin Key

Held in memory for this page only — never saved to localStorage, cookies or the URL. Refreshing the page means pasting it again. That is deliberate.

Edit Display Config

Leave a field blank to leave it unchanged — only what you fill in is sent. This page cannot pre-load current values (see the note under the preview), so blank does not mean empty, it means "don't touch".
The monthly ladder is three figures, highest first: strikesale → the charged price. The first two are struck through on the paywall; the third is what the customer actually pays and is not editable here — it comes from PRICE_PRO_MONTHLY and the Razorpay Plan. The server enforces strike > sale > charged and rejects anything else.
sends: —
sends: —
Struck through too — it is the middle rung, not the price paid. Must be above the charged price; the server rejects a sale price at or below what is actually charged.
sends: —
The figure struck through beside the ₹3 trial price — not beside the monthly price. Leave blank and the trial hero shows no strike at all. Type null‑equivalent by clearing it is not supported; send a value or omit.
Type null to clear it (removes the line from the paywall entirely).
Use {price} for the charged amount and {trial_price} for the trial amount. Do not type a price like ₹399/month — the server rejects it, because a stored price string is exactly how a stale amount survives a price change.
preview: —
preview: —
Must be above 0. Type null for no countdown at all.
Only governs anything when "resets on view" is false.

What a prospect will see

Not saved yet this session.

Why this page cannot pre-fill

The user-facing GET /subscription/pricing needs a user JWT, which this dashboard does not have. An empty POST {} is not a read — the server answers 400 No fields to update. So the form starts blank and only sends what you type. After a save, the panel above shows the real current state, and the form is back-filled from it.

A GET variant of the admin endpoint guarded by the same key would fix this. That is a backend change and is deliberately not part of this task.
Token Usage Trends
AI Cost Breakdown
Feature Token Breakdown (Current Window)
Feature NameTokens CountINR Cost
Cost by Plan (lifetime)
PlanCost
Cost by Feature (lifetime)
FeatureCost
Per-User Business Usage & AI Cost
Business columns = real activity (messages, minutes, sessions). Cost columns = real billed Gemini spend only. Voice STT/TTS are on-device (free); "V-Legacy" = historical Gemini transcribe from old builds, shown separately.
UserPlan Chat Voice (Current) V-Legacy Interview Learning Quiz Scenario Translation Total Cost
MsgsRepliesCost SessMinCost Cost SessQCost GenCost GenCost SessCost ReqCost
Top 50 Highest-Cost Users (lifetime)
#UserPlanTokensCost

📊 Crash Monitoring — Firebase Crashlytics

The Flutter app reports all crashes to Firebase Crashlytics (live capture). The authoritative crash-free rate, full stack traces, device breakdowns, and version filters live in the Firebase Console. The table below shows only client-reported crashes synced to our own DB — use the console for the complete picture.

Open Firebase Crashlytics Console ↗

Top Client Crashes (Last 30 Days)

Error MessageOccurrencesAffected UsersLast Occurred
Loading crash reports...
Event IDTypeStatusRetriesError MessageAction
Click Refresh to load...

Compose Push Notification

Push Delivery Audit Log

TitleMessage BodyDelivery StatusTargetLogged Time
Click Refresh to load...