Maestro
Learning management system to create and sell courses online
Strapi Plugin Maestro
Transform your Strapi app into a Learning Management System to create and sell courses online effortlessly.
Features
- Integrated with strapi-plugin-mux-video-uploader
- Organize courses in categories, modules and lectures
- Process payments with Stripe's checkout page
Requirements
- Strapi V5.x.x
- Must have installed strapi-plugin-mux-video-uploader
- Must have installed @strapi/plugin-seo
- Mux account
- Access token ID
- Secret Key
- Webhook signing secret
- Signing Key ID
- Base64-encoded Private Key
- Stripe account
- Secret key
- Checkout success URL
- Checkout cancel URL
Installation
In the root of your strapi application, run the following command:
1npm i strapi-plugin-maestro
Configuring .env variables
Once installed, set the following values in your project's .env:
1ACCESS_TOKEN_ID={Mux access token ID}
2ACCESS_TOKEN_SECRET={Mux secret key}
3WEBHOOK_SIGNING_SECRET={Mux webhook signing secret}
4SIGNING_KEY_ID={Mux signing Key ID}
5SIGNING_KEY_PRIVATE_KEY={Mux base64-encoded Private Key}
6
7STRIPE_SECRET_KEY={Stripe secret key}
8STRIPE_CHECKOUT_SUCCESS_URL={Frontend checkout success URL}
9STRIPE_CHECKOUT_CANCEL_URL={Frontend checkout cancel URL}
Finally, add the following configuration in config/plugins.ts:
1export default ({ env }: { env: any }) => ({
2 "maestro": {
3 enabled: true,
4 config: {
5 stripeSecretKey: env('STRIPE_SECRET_KEY'),
6 checkoutSuccessUrl: env('STRIPE_CHECKOUT_SUCCESS_URL'),
7 checkoutCancelUrl: env('STRIPE_CHECKOUT_CANCEL_URL'),
8 }
9 },
10 "mux-video-uploader": {
11 enabled: true,
12 config: {
13 accessTokenId: env('ACCESS_TOKEN_ID'),
14 secretKey: env('ACCESS_TOKEN_SECRET'),
15 webhookSigningSecret: env('WEBHOOK_SIGNING_SECRET'),
16 playbackSigningId: env('SIGNING_KEY_ID'),
17 playbackSigningSecret: env('SIGNING_KEY_PRIVATE_KEY'),
18 }
19 }
20});
And that's it, now you can start the server with npm run develop
.
Setting up permissions
In order for the plugin to serve content, manage users and create and confirm orders, you must enable some endpoints in the Users & Permissions Pluginfor the Maestro plugin.
For Authenticated users, enable the following:
From courses:
- checkLecture
- getClassesCompleted
- getCurrentLecture
- getCourseDetails
- getItemsPurchased
- getMyLearning
- getPlayAuth
- resumeCourse
From orders:
- confirmWithUser
- create
- find
- findOne
For Public users, enable the following:
From categories:
- findOne
- index
From courses:
- find
- findOne
- findSlugs
From orders:
- confirm
- create
- finishRegister
Usage
Creating courses is done through the Strapi Admin Dashboard.
API
The Maestro plugin exposes a REST API for managing and consuming courses, categories, orders, and user progress. Below is a list of available endpoints, grouped by resource, with their methods, paths, authentication requirements, and descriptions.
Categories
Get all categories
GET /categories/index
Auth: Public
Returns a list of all categories, each with its thumbnail and associated courses (with thumbnails and modules/lectures).
Get a single category
GET /categories/:slug
Auth: Public
Returns a single category by slug, including its thumbnail and courses (with thumbnails and modules/lectures).
Courses
Get all courses
GET /courses
Auth: Public
Returns all courses with thumbnails, modules, lectures, category, students, and instructor info.
Get a single course
GET /courses/:slug
Auth: Public
Returns a course by slug, including modules, lectures, category, students, and instructor info.
Get all course slugs
GET /courses-slugs
Auth: Public
Returns a list of all course slugs.
Get course details (students & user progress)
GET /course-details/:courseId
Auth: Authenticated
Returns the number of students and, if authenticated, the classes the user has completed for a course.
Get classes completed by user
GET /courses/:courseId/classes-completed
Auth: Authenticated
Returns the lectures the user has completed for a course.
Get current lecture to resume
GET /courses/:courseId/get-current-lecture
Auth: Authenticated
Returns the current lecture for the user to resume in a course.
Resume course
GET /courses/:courseId/resume-course
Auth: Authenticated
Resumes the course for the user, returning the next lecture to watch.
Get play authorization for a lecture
GET /courses/:courseId/get-play-auth-lecture
Auth: Authenticated
Returns play authorization for a lecture video (e.g., Mux playback token).
Mark lecture as completed
PUT /courses/:courseId/check-lecture
Auth: Authenticated
Marks a lecture as completed for the user.
Get purchased course IDs
GET /my-items-purchased
Auth: Authenticated
Returns the IDs of all courses purchased by the user.
Get purchased courses (full info)
GET /my-learning
Auth: Authenticated
Returns full information for all courses purchased by the user.
Orders
List orders
GET /orders
Auth: Authenticated
Returns all orders for the authenticated user.
Get a single order
GET /orders/:id
Auth: Authenticated
Returns a single order by ID, only if it belongs to the user.
Create an order
POST /orders
Auth: Public or Authenticated
Creates a new order for one or more courses. Requires courses
(array of course IDs), payment_method
(credit_card
or paypal
), and optionally email
(for guest checkout). Returns a checkout session for Stripe or PayPal.
Confirm an order (public)
PUT /orders/confirm
Auth: Public
Confirms an order after payment (Stripe/PayPal webhook or redirect). Marks the order as confirmed and enrolls the user in the purchased courses.
Confirm an order with user
PUT /orders/confirm-with-user
Auth: Authenticated
Confirms an order for the authenticated user after payment. Enrolls the user in the purchased courses.
Finish registration after order
PUT /orders/finish-register
Auth: Public
Completes registration for a user after a guest checkout and order confirmation.
Services
The plugin provides internal services for advanced usage and extension:
- courses: Register users to courses, calculate lecture durations, etc.
- payments: Handles order creation and payment confirmation for Stripe and PayPal.
- stripe: Integrates with Stripe for checkout sessions and payment status.
- paypal: Integrates with PayPal for checkout sessions and payment status.
Data Models
The plugin defines the following main content-types:
- Category: title, description, thumbnail, slug, courses
- Course: title, duration, description, price, thumbnail, long_description, difficulty, language, category, slug, students, modules, instructor
- Module: title, duration, course, lectures, slug, description
- Lecture: title, slug, duration, video, module, description
- StudentCourse: course, student, current_lecture, lectures_completed
- Order: amount, user, confirmed, checkout_session, payment_method, items, response, courses
- Instructor: name, bio, image, slug, designation, courses
See the server/src/content-types/
directory for full schema details.
Bug reports
If you find a bug or need support for using this plugin, open an issue at https://github.com/luisguve/strapi-plugin-maestro
Install now
npm install strapi-plugin-maestro
Create your own plugin
Check out the available plugin resources that will help you to develop your plugin or provider and get it listed on the marketplace.