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 Type | AI Feature | Tokens Used | Est. 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.
| Name | Phone | Plan | Streak | Created At |
|---|---|---|---|---|
| Search for a user above... | ||||
Practice Sessions
| Type | Duration | Messages | Time |
|---|
Interview Sessions
| Scenario | Q Asked | Status | Time |
|---|
Payments History
| Amount | Status | Date |
|---|
Quiz Attempts
| Topic | Score | Date |
|---|
Plans Subscription Distribution
| Plan Type | Active 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:
strike → sale → 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
A
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 Name | Tokens Count | INR Cost |
|---|
Cost by Plan (lifetime)
| Plan | Cost |
|---|
Cost by Feature (lifetime)
| Feature | Cost |
|---|
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.
| User | Plan | Chat | Voice (Current) | V-Legacy | Interview | Learning | Quiz | Scenario | Translation | Total Cost | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Msgs | Replies | Cost | Sess | Min | Cost | Cost | Sess | Q | Cost | Gen | Cost | Gen | Cost | Sess | Cost | Req | Cost | |||
Top 50 Highest-Cost Users (lifetime)
| # | User | Plan | Tokens | Cost |
|---|
📊 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 Message | Occurrences | Affected Users | Last Occurred |
|---|---|---|---|
| Loading crash reports... | |||
| Event ID | Type | Status | Retries | Error Message | Action |
|---|---|---|---|---|---|
| Click Refresh to load... | |||||
Compose Push Notification
Push Delivery Audit Log
| Title | Message Body | Delivery Status | Target | Logged Time |
|---|---|---|---|---|
| Click Refresh to load... | ||||