Two kinds of admin
Everyone who can sign into the admin panel falls into one of two tiers. What you see — every navigation item, table row, filter, and dropdown — is shaped entirely by which one you are.
BettahLife staff
- Owner or admin of the single coach flagged
is_platform = true - Sees and manages every coach, user, and business on the platform
- Not bounded by a coins balance — can award coins, escrow event prizes, or adjust any coach's balance freely
- The only tier that can reach Coaches, platform config lists, billing, coin/redemption catalogs, notification broadcasts, and system settings
Coach admins
- Owner or admin of any other coach (individual or organization)
- Sees only their own coach's users, events, courses, and payments
- Bounded by their coin balance — must have enough coins to award or fund prizes
- Cannot reach BettahLife-only sections at all — they simply don't appear in navigation
You become an admin either by being the user who created a coach (its owner), or by accepting an admin invitation from an organization coach. Only active users who are an owner or an admin can log into the panel at all — a plain member account is refused at the login screen.
The ten sections
The panel's sidebar is organized into ten navigation groups, in this order. Each is covered in its own section below.
| # | Group | What lives there | Who sees it |
|---|---|---|---|
| 1 | Accounts Management | Users, Coaches | Both, scoped |
| 2 | Activity & Health | Steps, Distances (raw logs) | Staff only |
| 3 | Event Management | Events, Categories, Types, Frequencies | Both, scoped |
| 4 | Course Management | Courses | Both, scoped |
| 5 | Subscriptions & Payments | Plans, Subscriptions, Payments, Monnify, Apple, Google Play | Mostly staff; Monnify scoped |
| 6 | Coins Management | Bundles, Tiers, Transactions, System Settings, Coach Coins | Mostly staff; Coach Coins is coach-only |
| 7 | Redemption Management | Partner Businesses, Offers, Redemptions, API Credentials, Webhooks | Staff only |
| 8 | Notifications Management | Push/SMS/Email campaigns, Notification Center, Automatic Deliveries | Mostly staff; Notification Center is shared |
| 9 | Website Content | Testimonials | Staff only |
| 10 | System Settings | System Settings (timers & coin config), Docs Settings | Staff only |
Wherever staff and coach admins share a section, most list pages that mix data across coaches carry a Coach Scope filter — visible to staff only — to toggle between BettahLife Only, a specific other coach, or All Coaches.
Accounts Management
The people and businesses on the platform: end users and the coaches they belong to.
Users Scoped
Manages every account — end users, coach admins, and coach owners. Staff see everyone; coach admins see only members and admins tied to their own coach.
Creating & editing Staff-only to edit/delete
Coach admins can create a user only if their coach is an Organization (individuals can't add admins). Editing and deleting an existing account is restricted to BettahLife staff.
What the form covers
Profile photo, name/nickname, email, gender, date of birth, nationality, national ID, the "Admin For" coach link (staff-only, sets coach_id), occupation, favorite sport, health basics (height, weight, blood type, known ailments, allergies, medical notes), nine notification-preference toggles, and — for staff — a read-only coins balance.
Row actions Mostly staff-only
Delete Password forces a password reset; Activate restores a soft-deleted account; Deactivate revokes API tokens and soft-deletes the account; Award Coins credits coins from the BettahLife platform coach with no balance check. All four are staff-only.
Inviting people
The header carries Invite Admin and Invite Member actions — both send a role-based invitation to an existing user for an organization coach. Staff can invite for any organization; coach admins are locked to their own coach. Candidate lists are scoped so you can never invite — or accidentally poach — a user already tied to another coach.
List tabs: All (includes soft-deleted), Admins, Members, Active, Inactive. A header widget pair — total/active/inactive/verified/new-this-month counts, and a monthly-registrations line chart — sits above the table, scoped the same way as the list.
Open any user and you'll find their full profile behind relation-manager tabs:
| Tab | Shows | Visibility |
|---|---|---|
| Phones | Numbers, type, default/WhatsApp flags, verification | Everyone views; staff-only to edit |
| Address | Street, city, state, postal, country | View-only for everyone |
| Events / Courses | What they've registered for or enrolled in | Staff only |
| Memberships / Followed Coaches | Coaches they subscribe to or follow, full CRUD | Staff only |
| Steps, Distance, Water, Weight, Blood Pressure, Heart Rate, Temperature | Read-only health logs | Staff only |
| Health Targets | Their configured goals | Staff only |
| Medications | Name, form, schedule summary, 30-day adherence % | Staff only |
| Coin Transactions | Full ledger with running balance | Staff only |
| Coin Redemptions | Rewards claimed, with a Refund Coins action where eligible | Staff only |
| Automatic Notification Deliveries | System-triggered notification log for this user | Staff only |
The Events, Courses, Memberships, and Followed Coaches tabs are staff-only for a specific reason: a user can belong to multiple coaches at once, so there's no safe way to scope those tabs to just the coach admin viewing them without risking a leak of another coach's data.
Coaches Staff-only
The full roster of coaching businesses — individuals, organizations, and BettahLife itself. This resource doesn't appear in navigation at all for coach admins.
Individual vs. organization
Individuals run a solo business and can't send invitations. Organizations (including BettahLife) can invite both admins and members. There should only ever be one coach flagged is_platform.
Status & verification actions
Row and bulk actions: Approve, Reject, Suspend, Verify, and Certify (the last two only appear when the coach is eligible). List tabs mirror these states: All, Individuals, Organizations, Incomplete, Pending, Approved, Rejected, Suspended.
Fees & branding
One-time, monthly, and annual membership fees with currency, logo and cover photo uploads, description, tags, contact details, address, website, and six social links.
A coach's detail page carries seven relation-manager tabs:
| Tab | What it does |
|---|---|
| Coins | The coach's transaction ledger with a live balance (polls every 5s). Header actions: Adjust Balance (staff-only manual +/− with a required reason) and Purchase Coins (non-staff — picks a bundle, opens a Monnify checkout). |
| Admins | Associate/dissociate admin users — restricted to users with no existing coach affiliation, so you can't silently strip another coach's admin. |
| Members | Attach/detach members, searchable by name or email. |
| Followers | Attach/detach free followers. |
| Documents | KYC uploads (national ID, passport, driver's license) with uploader tracking — full CRUD. |
| Events / Courses | The coach's own content, view-only here (links to the full resource for editing). |
| Invitations | Organization coaches only — send admin/member invites by email or phone, with a Copy Token action and Cancel for pending ones. |
Activity & Health
Two staff-only, read-only resources exposing the raw data the mobile app writes automatically. Nothing here is created from the panel — it's a system of record fed entirely by the app.
Steps Read-only
User, step count, unit, source, device, recorded-at. Filterable by user, a quick or custom recorded-date range, step-count range, unit, source, and device.
Distances Read-only
Same shape as Steps, plus activity type and an "is estimated" flag — distance is estimated from step count on devices that don't report it directly.
Water, Weight, Blood Pressure, Heart Rate, Temperature, Health Targets, and Medications aren't top-level resources here — they only appear as read-only tabs on a specific User's detail page (see the Accounts section above).
Event Management
Time-bounded activities with optional leaderboards and coin prizes, plus the three lookup lists that classify them.
Events Scoped
Staff see every coach's events; coach admins see only their own. The form: title, description, goal, price (blank = free), tags, category/type/frequency, start/end date, online link, expected attendance, address with coordinates, contact phones, a leaderboard toggle with type (steps, distance, or calories), and — at creation only — a coin-rewards repeater for the leaderboard prize table.
Event status lifecycle
Coin escrow & balance checks
Adding, editing, or removing a prize on a leaderboard event re-syncs the escrow. BettahLife staff can always proceed; a coach admin is checked against their available balance (balance minus what's already escrowed) first, and blocked with a notification if they'd overcommit.
Row actions
Publish, Unpublish (revert to Draft), and Cancel Event each appear only when valid for the current status.
Relation managers: Registrations (attach/detach attendees, scoped for coach admins to their own members), Files (media uploads with uploader tracking), Prizes (place → coins → label, up to 50 rows, 1–100,000 coins each — creatable only when the leaderboard is on), and Leaderboard (read-only ranking by daily/weekly/overall period).
Categories, Types & Frequencies Staff-only
Three simple lookup tables (a single name field each) that populate the Event form's classification selects. Global, not coach-scoped — there's one shared list for the whole platform.
Course Management
Ordered learning content, scoped to the coach that owns it.
Courses Scoped
Title, description, price (blank = free), expected attendance, goal, tags, and cover photo. Row actions Publish, Unpublish, and Archive appear only when valid for the current status (Draft/Published/Archived).
Lessons (Items relation manager)
An ordered, drag-to-reorder list of items — title, type (video, article, image, or quiz), description, media upload, and a "Free Access?" toggle. That toggle is forced on and locked whenever the course itself is free, since a lesson inside a free course is always free.
Enrollments relation manager
Attach/detach enrolled users — for coach admins, the attach picker is scoped to only members of that course's coach.
Subscriptions & Payments
Billing infrastructure spanning Monnify (card/bank payments), Apple, and Google Play — mostly staff territory, with one coach-scoped exception.
Plans Staff-only
The catalog of subscribable products: name, unique slug, entitlement type, billing interval, price and currency, Apple/Google product IDs, Monnify product code, an active toggle, and a polymorphic link to whatever the plan actually entitles (a coach's premium content, for example).
Subscriptions Staff-only
Tracks a user's subscription to a Plan — provider, provider subscription ID, status, and starts/renews/expires/grace-ends/cancelled timestamps. Row actions: Cancel at Period End and Expire Now.
Payments Read-only, staff-only
A settled-transaction ledger — user, plan, provider, provider reference, money-formatted amount, status, paid-at. No create or edit; it's a record of completions.
Monnify Transactions Scoped, read-only
The Nigerian payment-gateway log covering coin-bundle purchases and coach subscription payments. Staff see every coach's transactions; coach admins see only their own. Status is color-coded (paid/overpaid = success, pending = warning, else danger), and the view includes the raw webhook payload.
Apple Transactions & Google Play Purchases Read-only, staff-only
Mirror logs fed by Apple and Google server notifications — transaction/order IDs, product IDs, environment, subscription state, expiry. Purely observational; nothing is actioned from these screens.
Coins Management
BettahCoins are the platform's reward currency. This section is almost entirely BettahLife-staff territory — coach admins interact with coins only through their own dedicated Coins page.
How coins move through the platform
Coin Bundles Staff-only
The packs coaches purchase to top up their balance — name, coins amount, price and currency, Apple/Google product IDs, active toggle.
Coin Tiers Staff-only
Loyalty tiers by lifetime coins earned — minimum threshold, benefits, an earning multiplier applied to automatic awards, badge color and icon. The default tier can never be deleted, alone or in bulk.
Coin Transactions Read-only, staff-only
The platform-wide ledger — every credit and debit, with type, amount (color-coded), running balance, and description. Filterable by Coach Scope and type.
Coins page Coach-admin-only
The self-service equivalent for a coach admin: their own transaction table with a live balance, plus Purchase Coins (opens Monnify checkout) and Award Coins (balance-checked — unlike the staff Award Coins action on Users, which skips the check entirely).
Redemption Management
Everything to do with turning coins into real-world rewards through partner businesses — entirely BettahLife-staff territory.
Partner Businesses
The merchants that fulfill redemptions: name, description, logo, contact details, active toggle, and a Redemption PIN. The PIN is one-way hashed on save and never re-displayed — it's what the partner's own staff enter at the public Redemption Portal to verify and redeem codes.
Redemption Offers
The catalog: linked partner, category, name, stock (blank = unlimited), coins cost, a value description (e.g. "15% off"), optional monetary value, terms, active toggle.
Redemptions Read-only
The full ledger of claims, with a color-coded status (Pending/Issued = warning, Completed/Delivered = success, Rejected = danger, Expired = gray). Two actions live here: Issue Reward — manually issue an offer to any user or an arbitrary recipient by name/email/phone — and Refund Coins, which appears only when a redemption is refundable and credits the coins back after a confirmation and optional reason.
Partner API Credentials & Webhook Configs
Programmatic access for partners: API credentials carry scoped abilities (rewards:issue, rewards:verify, rewards:consume) and an active toggle; webhook configs point to a partner's endpoint with an auto-generated signing secret and a checklist of subscribed event types.
A partner business with no PIN set can verify codes publicly but can't redeem or flag them — if a partner reports the Redeem or Flag tiles failing, check whether their PIN has been set on their business record.
Notifications Management
The most involved section in the panel — five resources covering three outbound broadcast channels, an in-app notification center, and an audit trail of everything the system sends automatically.
Broadcast campaign pipeline (Push / SMS / Email)
Push, SMS & Email campaigns Staff-only
All three work identically and are immutable once created — there's no edit or delete, only Retry Failed. Each has content fields specific to its channel (push: title, body, optional data payload; SMS: body; email: subject, body).
Audience targeting
Choose All users, Members only, Admins only, a specific Coach's users, or a hand-picked list of Users. Whatever you pick is resolved to a concrete filter snapshot and stored with the campaign, so a later retry sends to the exact same audience — not whoever matches the criteria today.
Send now or schedule
Sending now queues messages immediately. Scheduling for a future time dispatches a delayed job that fires the actual send when scheduled_at arrives — nothing goes out before then.
Delivery Outcome panel
Every campaign's detail view shows a live status sentence, progress and failure summaries, a recommended next action, queued/succeeded/failed/still-processing counts, and up to 100 recipients in each bucket with timestamps and error messages. The list table itself polls every 10 seconds so in-flight campaigns update without a refresh.
Status, at a glance
Computed purely from the counts — Scheduled Pending Processing Sent Partial Failed No recipients — there's no separate status column to fall out of sync with reality.
Notification Center Shared
In-app posts that show up in the mobile app's notification inbox — distinct from the three broadcast channels above, though publishing one can also queue a linked push notification. Unusually, this one isn't staff-exclusive: any coach admin can post to their own audience, scoped automatically to their coach. The form adds an image, an optional action label and deep-link URL, and a free-form data payload. The table shows both the in-app read count and the linked push campaign's delivery counts side by side.
Automatic Notifications Read-only, staff-only
The audit trail for everything the system sends on its own — event reminders, medication due/missed alerts, inactivity nudges, weekly digests, coin-award and milestone notices, subscription-at-risk warnings, and failed-payment alerts. Each row shows an intent badge (color-coded by severity), channel, recipient, and the record that triggered it. The timing for most of these is configured in System Settings (see below). The same log, scoped to one person, appears as a tab on their User record.
Website Content
Testimonials — the only resource here — manages the public marketing quotes shown on the BettahLife website: name, role, location, headline, quote, photo, a result metric (e.g. "30 lbs" / "Weight Lost"), sort order, and separate "featured" and "published" toggles. Staff-only, full CRUD.
System Settings
Two staff-only pages that configure platform behavior live — no code deploy required.
System Settings
A tabbed form (confusingly named CoinSettings in code, but it now covers far more than coins) that reads and writes every runtime timer and coin-award amount the mobile API depends on.
| Tab | Controls |
|---|---|
| Payments | Platform subscription price — set to 0 to disable Monnify platform-subscription checkout entirely. |
| Operations | Event reminder windows, inactivity nudge and weekly-summary timing, health-data lookback defaults, the full medication reminder/overdue/missed schedule, coach invitation and account-deletion grace periods, payment verification and Monnify reconciliation windows, and file/upload TTLs. |
| Coins | Redemption minimum balance and unredeemed-coins cap, coin value currency & rate, and every per-activity coin award amount (registration, profile completion, first milestone, first transaction, daily step bonus + threshold, subscription payment). |
Every field is a bounded numeric input with sensible min/max limits, and saving writes each one back immediately — changes take effect for the next request, with no deploy or restart.
Docs Settings
Controls the visibility of this documentation site to outsiders: a master switch for the whole docs area, plus one toggle per section (API Docs, Admin Guide, Coach Guide, Member Guide). BettahLife admins always see every page regardless of these toggles — they only affect what unauthenticated visitors and non-staff can reach.
Dashboard & widgets
The landing page after login is a completely different dashboard depending on your tier — every widget gates itself on isBettahlifeStaff().
One widget is shared by everyone: Upcoming Events — staff see it across all coaches with a Coach column, coach admins see only their own.
Rules & limitations worth knowing
A handful of behaviors that show up across multiple sections — understanding these explains a lot of "why can't I do that?" moments.
Coach-scoping is the default, everywhere
Nearly every coach-associated resource — Users, Events, Courses, Monnify Transactions, Notification Center posts, and several relation managers — automatically filters to the logged-in coach admin's own coach. If a "pick any user" dropdown looks like it should be scoped and isn't, that's treated as a bug, not a feature.
Coin escrow protects against overcommitting
Event prizes reserve (escrow) coins from the owning coach's balance the moment they're set. A coach admin can never commit more in prizes than they can afford; BettahLife staff bypass this check entirely.
Broadcast campaigns are immutable
Once a Push, SMS, or Email campaign is created, it can never be edited or deleted — the only remediation for a failed send is Retry Failed, which re-queues against the exact original audience snapshot.
Secrets are never re-displayed
A partner's Redemption PIN is one-way hashed on save; a partner webhook's signing secret is auto-generated on creation. Neither is ever shown again in the panel after the fact — treat the moment of creation as your only chance to copy it.
The default Coin Tier can't be deleted
Whichever tier is flagged as the default is protected from deletion, individually or as part of a bulk action — there must always be a fallback tier for members who haven't reached a higher one.