⭐ Features & Modules
Every module of iSpeaker Live in depth — what works, who can do what, and how it connects.
On this page
User Roles & Permissions
Two primary user roles via spatie/laravel-permission, plus an administrative role for the Filament panel.
🎓 Student
Default role on registration. Consumes content, books, and live sessions.
Can do
- Browse marketplace; purchase courses & books.
- Watch lessons, take notes, earn certificates.
- Register for live rooms; book 1:1 consultations.
- Post on the feed, comment, react, share, gift.
- Manage wallet, view invoices, withdraw (after limits).
Cannot do
- Publish courses, books, or live rooms.
- Set consultation availability or accept bookings.
- Access the admin panel.
🎤 Speaker
Granted after onboarding/approval. Can do everything a student can, plus authoring & monetisation.
Additional powers
- Publish courses, books, live rooms.
- Define consultation availability & price.
- Manage own learners, see statistics & earnings.
- Approve / reject paid room registrations.
- Mark consultations complete; receive ratings.
🛡️ Admin
Operates via the Filament panel. Cannot be a student or speaker simultaneously.
Capabilities
- Manage users, roles, categories, gifts, settings.
- Moderate posts & review reports.
- Approve withdrawals; reconcile payouts.
- Configure platform-wide settings (VAT, currencies, etc.).
Authentication & Account
Sign-up
- Email + password (required), name, username (unique), optional phone.
- Password complexity: ≥ 8 chars; recommend mixed-case & digits.
- Default role: Student. Becoming a Speaker is a separate flow.
- Email verification flag (
is_verified) supported; configurable.
Sign-in & Sessions
- Sanctum personal access tokens — long-lived for mobile, scoped for web.
- "My sessions" — list active tokens with last-used info, revoke individually.
- "Log out everywhere" — revoke all tokens.
Password & Recovery
- Forgot password → token sent to email (
password_reset_tokens). - Change password from settings.
Account deletion
- Soft-delete (
deleted_at) on user request. - Cascades through related data per FK rules; financial records preserved per regulation.
Profile & Identity
What a profile contains
Avatar & Cover
Image upload with media URL helper, served via signed URLs.
Bio & Headline
Short bio plus a one-line headline for cards/listings.
Interests
Many-to-many with categories — drives feed and marketplace suggestions.
Social Links
JSON list (twitter, ig, linkedin, web) — togglable visibility.
Privacy
Private profile (follow-request gate), email/phone visibility, notifications on/off.
Certificates
Title, issuer, dates, credential URL — ordered list.
Experiences
Title, company, employment type, dates, location, description — ordered.
Speaker expertise
Tags shown on speaker cards & used in filtering.
Privacy modes
| Mode | Behaviour |
|---|---|
| Public | Anyone can view profile & follow without approval. |
| Private | Profile shows limited info; follows require follow request acceptance. |
Social Feed
Post types
- Text — body up to N characters; supports hashtags & mentions.
- Image — one or more images (JSON array of media URLs).
- Video — uploaded video preview + playback.
- Audio — voice notes & podcasts.
Engagement
6 Reactions
like · love · haha · wow · sad · angry. One reaction per user per post.
Threaded comments
Parent-child via parent_id, with image attachments and pinning.
Sharing
Internal repost with optional comment; shareable link for external.
Pinning
Authors can pin their own post; admins/speakers can pin comments on their posts.
Reporting
Spam, harassment, hate speech, violence, misinformation, other. Triaged by admin.
View count
Tracked per post for trending logic.
Discovery
- Feed from people you follow + suggested.
- Trending: hashtags, posts, topics, speakers.
- Hashtags are detected on publish, rendered as clickable links, and open a public hashtag page (
/hashtag/[tag]) that is readable by signed-out visitors. - Trending hashtags refresh the moment a post is published; exact-tag matching (a search for
#testno longer matches#testhash).
Follow System
- Public profile → direct follow (one tap).
- Private profile → follow request with pending/accepted/rejected states.
- Bulk actions on requests: accept all / reject all.
- Counters (
followers_count,following_count) stored on profile. - Suggestions and search across users.
Courses
Authoring (Speaker)
- Create course → title, slug, subtitle, description, category (primary + multiple), language (AR/EN), level (beginner/intermediate/advanced), price (with optional discount), thumbnail, promo video.
- Add structured "why learn" and "requirements" (JSON lists).
- Build out sections and lessons in any order; drag-to-reorder.
- Lesson content types: video, audio, document, or external link.
- Upload video/audio/document/attachments per lesson.
- Optional
is_previewflag — lessons playable without purchase. - Lifecycle:
draft→published→archived; unpublish allowed. - Stats: enrollments, completion, ratings, reviews.
Consuming (Student)
- Browse marketplace; filter by category, language, level, price.
- Preview lessons before purchase.
- Purchase → enrollment created with
activestatus. - Course player tracks per-lesson watched duration; mark complete.
- Take notes per lesson with optional timestamp.
- Earn certificate on 100% completion — unique number + verification URL.
- Rate & review the course.
Books
Publishing (Speaker)
- Upload PDF; set title, slug, author, ISBN, page count, price.
- Set
preview_pages— number of pages anyone can read pre-purchase. - Flags:
allow_printing,allow_copying(enforced by reader). - Status:
draft/published/archived. - Stats: purchases, average rating.
Reader (Student)
In-app PDF viewer
Page navigation, zoom, search.
Preview mode
First N pages served via separate public endpoint.
Annotations
Highlight, note, underline, bookmark — with color & position JSON.
Progress
Current page, total pages read, total reading time per purchase.
DRM
Time-limited tokens; refresh on demand; copy/print toggles enforced.
Live Rooms
Speaker capabilities
- Schedule a room: title, description, thumbnail, category, start/end date & time.
- Duration type:
day/week/month/3month— supports series. - Access: free or paid (with price).
- Max participants & optional recording.
- Pending registration approvals (for paid/curated rooms).
- Start / End controls; share link.
Participant capabilities
- Register (auto for free, with payment for paid).
- Join via Jitsi room (web + mobile).
- In-room chat with text/emoji + announcement messages, pinning, reactions count.
- Leave / cancel registration before session.
- Report a room.
Lifecycle
scheduled→active(on start) →completed/cancelled.- Recordings (if enabled) attached to the room as JSON list of URLs.
Consultations
Speaker setup
- Define availability per weekday: start/end time, session duration, price/session.
- Toggle
is_activeper availability slot. - View incoming bookings, accept / reject / complete.
- Earnings credited to wallet upon completion.
Booking (Student)
- Browse speaker's available dates & slots.
- Book with payment; status flows
pending→scheduled→completed. - Receive meeting link (Jitsi). Reminders via notifications.
- Rate the speaker post-session.
- Cancel a booking before the session starts.
Marketplace & Cart
- Unified browse: courses, books, popular topics, filters.
- Course / book detail pages with reviews list.
- Add to cart (polymorphic
cartable_type+cartable_id). - Cart count, list, remove, clear, apply discount, checkout.
- Checkout creates purchase records and enrollments / book_purchases.
- "My purchased courses" and "My purchased books" views.
Wallet, Payments & Invoices
Wallet
- One wallet per user (
walletstable) withbalance,total_earned,total_withdrawn,pending_balance. - Points are the platform currency. All in-app balances, prices and earnings are shown in points; the conversion rate to real money is a single admin setting (
currency-points-per-unit). - Top up via PayPal. Real money enters and leaves only at two points: top-up and withdrawal.
- Send points to another user.
- Withdraw request → admin approval → settlement by bank transfer. The speaker saves an IBAN and account-holder name; the admin desk exports a payment sheet and records the bank reference once the transfer is made.
- Bank details are encrypted at rest (AES-256). Both copies are covered: the details saved on the speaker's profile, and the snapshot frozen onto the withdrawal request when it is opened — that snapshot is what stops a later profile edit redirecting money an admin has already reviewed. A database dump contains no readable IBAN.
- Saudi gateways (Mada, STC Pay, Apple Pay, Google Pay, Tabby, Tamara) require a merchant account in the platform owner's name; the integration layer is ready and awaits those credentials.
Tax & commission
- VAT is charged once, at top-up only — when real money enters the wallet.
- Platform commission is charged at purchase — when points are spent on a course, book, room or consultation.
- The split prevents double taxation: a purchase paid from an already-taxed balance is never taxed again.
- Both the VAT rate and the commission rate are admin settings, applied platform-wide without a code change.
Transactions
- Every credit / debit recorded with
type,category(course, book, gift, consultation, withdrawal, top-up...),related_type+related_idfor source. balance_afterstored for audit trail.- Status:
pending,completed,failed,refunded. - Unique
transaction_referencefor reconciliation.
Invoices
- Auto-generated for completed transactions: subtotal, VAT, total, items JSON.
- Sequential
invoice_number; downloadable PDF in Arabic and English, carrying the platform logo, contact details and currency. - Every line is priced in real money with the points value beside it. The exchange rate is stamped on the invoice at issue time, so changing the rate later never re-prices a historical invoice.
- A VAT line appears only on a top-up invoice; purchase invoices carry the commission instead.
- The PDF, the web app and the mobile app are all fed by one source of truth, so the three never disagree on a figure.
- Invoice header fields (tax number, commercial registration) are admin settings and print automatically once entered.
- Covers every transaction type: top-up, purchase, speaker earnings, gifts, point transfers and withdrawals.
Speaker Verification
An end-to-end identity and credential check that gates a speaker's ability to charge money.
Request (speaker)
- Submitted from the web app or the mobile app, with supporting documents attached.
- The requested field list is configuration-driven (
config/verification.php), so adding or removing a required document is a one-file change. - Status is visible to the speaker throughout:
pending→approved/rejected.
Review (admin)
- Queue in the Filament panel with the submitted documents; approve or reject with a reason.
- The speaker is notified of the decision (push + in-app).
The pricing gate
- An unverified speaker may create content but may not set a price on it. The rule is enforced server-side on every price-setting endpoint — courses, books, live rooms and consultation availability — not in the UI alone.
Gifts
- Admin-managed gift catalogue: icon, price, ordering.
- Send a gift (with quantity & optional message) to a user or attached to a giftable entity (post, room, etc.).
- Wallet debited on send; receiver credited.
- Stats endpoints: received, sent, top gifts, leaderboard, per-user history.
Chat
- 1:1 conversations (unique pair:
user_one_id+user_two_id). - Messages of type
text/image/video/audio/file. - Reply-to threading, media URLs, metadata JSON, read receipts.
- Soft delete per message; whole conversation deletion preserved server-side.
- Real-time delivery via Reverb WebSocket + Echo client.
- Unread count, conversation search, user search, direct media upload.
Notifications
- In-app polymorphic notifications: actor, type, notifiable entity, data JSON, read state.
- Push via Firebase Cloud Messaging (FCM).
- Common types: new follower, follow request, comment, reaction, course/book review, room reminder, booking accepted, payment received, gift received.
- Endpoints: list, unread count, mark one/all read, delete.
Admin Panel (Filament v3)
Operated at the /admin path by non-student / non-speaker users.
- User management (roles, suspend, view wallets).
- Categories, gifts, settings CRUD.
- Post reports inbox & resolution.
- Transactions ledger; invoice search.
- Withdrawal approvals.
- System-wide settings (VAT %, currency, timezone defaults).
Non-Functional Requirements
⚡ Performance
- API p95 < 500 ms on common endpoints.
- Feed pagination, lazy media loading.
- Cache aggressively for trending & categories.
🛡️ Security
- Sanctum auth, hashed passwords, signed media URLs.
- Spatie role/permission enforcement on every speaker route.
- Rate limiting on auth and high-cost endpoints.
♿ Accessibility
- WCAG AA targets for color contrast & focus.
- Keyboard navigation for all interactive elements.
- Semantic HTML & ARIA where needed.
🌐 Localization
- Arabic (RTL) and English (LTR) at parity.
- Locale-aware numbers, dates, currency.
- Translatable category names & content.
📈 Observability
- Application logs (Laravel) shipped to a single source.
- Failed jobs table monitored; alert on threshold.
- Mobile crash reporting in place.
🔄 Reliability
- Background queues for emails, FCM, video processing.
- Idempotent payment callbacks.
- Daily DB backups & restore drills.