Hey Dev Community! π
Six months ago, I completed a major milestone in my Web Development journey β building eTuitionBd, a comprehensive Tuition Management System designed to connect verified tutors with students seamlessly.
Today, I wanted to share the story, architecture, and tech stack behind this project! π
π§ What is eTuitionBd?
Finding trusted tutors or legitimate tuition posts in Bangladesh can often be a hassle. eTuitionBd solves this friction by providing a transparent, role-based platform for class tracking, secure payments, and structured verification.
β¨ Key Features & User Roles
1. π Student Dashboard
- Post tuition requirements (Subject, Budget, Location).
- Manage applications from different tutors.
- Securely hire tutors by making payments via Stripe.
2. π¨βπ« Tutor Dashboard
- Browse and search tuitions using advanced filtering (Subject, Class, Budget, Gender).
- Track application statuses in real-time.
- View active tuitions and revenue history.
3. π‘οΈ Admin Dashboard
- Centralized user management (Role updates and deletions).
- Tuition post moderation and analytics.
π Security & Core Functionalities
- Authentication: Firebase Auth (Google Social Login + Email/Password) paired with JWT (JSON Web Token) for strict role-based access control and protected routes.
- Automated Workflow: Real-time application updates (Pending β Approved / Rejected / Closed).
- Stripe Payments: A tutor is officially marked as "Approved" only after the student completes the salary payment via Stripe.
π» Tech Stack Behind the Project
- Frontend: React.js, Tailwind CSS, DaisyUI, Framer Motion
- Backend: Node.js, Express.js
- Database: MongoDB
- Authentication & State: Firebase, JWT, TanStack Query (React Query)
- **Payment Processing: **Stripe API
- Deployment: Firebase (Client) & Vercel (Server)
π Explore the Project
- π Live Demo: https://etuitionbd-7c096.web.app/
- π₯οΈ Client Repository: https://github.com/AbrarulRhythm/assignment-11-client
- βοΈ Server Repository: https://github.com/AbrarulRhythm/assignment-11-server
π‘ What I Learned From Building This
Building eTuitionBd taught me how to handle complex backend logic, integrate payment gateways securely, and manage role-based state on the frontend using TanStack Query.
Iβd love to hear your thoughts, feedback, or suggestions on how I can improve it further! Drop a comment below! π
Top comments (4)
Gating tutor approval behind the Stripe payment completing is a nice touch, keeps 'approved' meaningful. Admin dashboard raises a different question for me: when a role gets changed from there, does the server check the caller's own JWT role before applying it, or is it mostly the frontend hiding the button for non-admins?
Thanks for taking the time to read the post and for the thoughtful questionβI really appreciate it!
Yep! The server enforces it as well. The route is protected with both verifyJWTToken and verifyAdmin middleware, so the caller's JWT is validated first, then the user's role is checked against the database before allowing any role update. The frontend only hides the UI for convenienceβthe actual authorization is enforced on the backend.
Nice, that JWT + verifyAdmin check happening server-side is exactly the part people skip. I've seen a few Stripe integrations where the 'mark as paid' step lived on the client and just called an endpoint once Stripe returned success - is your Approved flip driven by a webhook that verifies the Stripe signature server-side, or does the client trigger it after payment succeeds? Either way's a normal spot to land this early on.
It's client-triggered rather than webhook-driven. After Stripe redirects to the success page, the frontend sends the Checkout Session ID to my /payment-success endpoint. The server retrieves the session directly from Stripe, verifies payment_status === 'paid', and only then updates the application status and stores the payment record. So the client never decides whether a payment succeededβit only passes the session ID.