Skip to main content
The Educator Applications interface allows administrators to review, approve, or reject applications from users who want to become course creators on the SkillRise platform.

Overview

When users apply to become educators, their applications enter a review queue. Administrators can evaluate each application based on professional credentials, expertise, and background information before granting educator privileges.
Approving an application automatically grants the user the “educator” role in Clerk, enabling them to create and publish courses

Application States

Applications progress through three possible states:
1

Pending

Newly submitted applications awaiting administrator review
2

Approved

Applications that have been accepted. User receives educator role and can create courses.
3

Rejected

Applications that were declined. User can resubmit with updated information.

Filter System

Administrators can filter applications by status:
Displays all applications regardless of status

Dynamic Filtering

Filters are applied server-side:
const filter = status ? { status } : {}
const applications = await EducatorApplication.find(filter)
  .sort({ createdAt: -1 })

Application Information

Each application displays comprehensive applicant information:

Summary View

Professional Title

The applicant’s professional designation (e.g., “Senior Software Engineer”)

Expertise Areas

Comma-separated list of subject areas the applicant can teach

Status Badge

Color-coded indicator showing application state

Submission Date

When the application was submitted (formatted as “15 Jan 2024”)

Expanded Details

Click the expand button to view full application details:
A detailed professional biography describing the applicant’s background, teaching experience, and qualifications.
Optional link to the applicant’s LinkedIn profile or personal portfolio website for verification.
Clerk user identifier for account lookup and verification.
For rejected applications, displays the reason provided by the reviewing administrator.

Application Actions

Approve Application

1

Click Approve

Click the teal “Approve” button on a pending application
2

Status Update

Application status changes to “approved” in the database
3

Role Grant

Clerk user metadata is updated with role: 'educator'
4

User Notification

User can now access educator features and create courses
Backend Process:
// Update application status
application.status = 'approved'
application.rejectionReason = ''
await application.save()

// Grant educator role via Clerk
await clerkClient.users.updateUserMetadata(application.userId, {
  publicMetadata: { role: 'educator' }
})

Reject Application

1

Click Reject

Click the red “Reject” button on a pending application
2

Provide Reason

A modal appears requesting an optional rejection reason
3

Confirm Rejection

Click “Confirm Reject” to finalize the decision
4

Status Update

Application is marked as rejected with the provided reason
Rejection Modal:

Optionally provide a reason. The applicant will see this when they check their status.

Providing a detailed rejection reason helps applicants understand what improvements are needed if they choose to reapply

API Endpoints

GET /api/admin/educator-applications

Fetches applications with optional status filtering: Request:
GET /api/admin/educator-applications?status=pending
Authorization: Bearer <admin_token>
Response:
{
  "success": true,
  "applications": [
    {
      "_id": "app123",
      "userId": "user_2abc123def456",
      "professionalTitle": "Senior Software Engineer",
      "bio": "10+ years of experience in web development...",
      "expertise": ["React", "Node.js", "TypeScript"],
      "linkedinUrl": "https://linkedin.com/in/johndoe",
      "status": "pending",
      "rejectionReason": "",
      "createdAt": "2024-03-15T10:30:00Z"
    }
  ]
}

PATCH /api/admin/educator-applications/:id/approve

Approves an application and grants educator role: Request:
PATCH /api/admin/educator-applications/app123/approve
Authorization: Bearer <admin_token>
Response:
{
  "success": true,
  "message": "Application approved. Educator role granted."
}

PATCH /api/admin/educator-applications/:id/reject

Rejects an application with optional reason: Request:
PATCH /api/admin/educator-applications/app123/reject
Authorization: Bearer <admin_token>
Content-Type: application/json

{
  "reason": "Please provide more detail about your teaching experience."
}
Response:
{
  "success": true,
  "message": "Application rejected."
}
All endpoints require admin authentication via Bearer token

Application Lifecycle

New Application

Reapplication Process

Users with rejected applications can reapply:
1

Rejected Application

Application status is set to “rejected” with a reason
2

User Reviews Feedback

User sees rejection reason in their application status
3

Update & Resubmit

User updates their information and resubmits
4

Status Reset

Application status changes back to “pending” for review
Backend Logic:
if (existing && existing.status === 'rejected') {
  existing.professionalTitle = professionalTitle
  existing.bio = bio
  existing.expertise = expertise
  existing.status = 'pending'
  existing.rejectionReason = ''
  await existing.save()
}

Data Model

The EducatorApplication schema:
FieldTypeRequiredDescription
userIdStringYesUnique Clerk user identifier
professionalTitleStringYesApplicant’s professional designation
bioStringYesDetailed professional background
expertiseArrayYesList of subject areas (min 1)
linkedinUrlStringNoLinkedIn or portfolio URL
statusStringYesOne of: pending, approved, rejected
rejectionReasonStringNoAdmin-provided rejection explanation
createdAtDateAutoApplication submission timestamp

Best Practices

Aim to review pending applications within 24-48 hours to maintain a positive user experience and encourage quality educators to join the platform.
Always provide constructive feedback when rejecting applications. This helps applicants improve their submissions and encourages reapplication.
Review LinkedIn profiles or portfolio URLs when provided to verify credentials and professional background.
Ensure the applicant’s expertise areas align with platform content needs and existing course gaps.

Status Indicators

Each status has distinct visual styling:

Pending

Amber badge indicating awaiting review

Approved

Teal badge indicating acceptance

Rejected

Red badge indicating declined status

Responsive Design

The application list adapts to different screen sizes:
  • Mobile: Stacked layout with essential information visible
  • Tablet: Expanded cards with action buttons
  • Desktop: Full details with inline actions and expanded views

Loading States

While processing actions:
  • Approve button shows ”…” and is disabled
  • Reject modal shows “Rejecting…” during submission
  • All other buttons are disabled to prevent concurrent actions
Regularly check the pending applications count on the main dashboard. A high backlog may indicate the need for additional reviewers or streamlined criteria.