{"id":5642,"date":"2026-06-04T02:59:40","date_gmt":"2026-06-04T02:59:40","guid":{"rendered":"https:\/\/www.cmsgalaxy.com\/blog\/?p=5642"},"modified":"2026-06-04T02:59:40","modified_gmt":"2026-06-04T02:59:40","slug":"moodle-cohorts-cohort-sync-and-course-meta-link-complete-guide-for-course-access-management","status":"publish","type":"post","link":"https:\/\/www.cmsgalaxy.com\/blog\/moodle-cohorts-cohort-sync-and-course-meta-link-complete-guide-for-course-access-management\/","title":{"rendered":"Moodle: Cohorts, Cohort Sync, and Course Meta Link \u2014 Complete Guide for Course Access Management"},"content":{"rendered":"\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. What Is a Moodle Cohort?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>cohort<\/strong> in Moodle is a collection of users created at the site or category level. You can think of it as a central group of users that can be reused across many courses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example cohorts:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OneMembership\nDevOps Students\nSRE Premium Members\nCorporate Batch 2026\nAWS Training Learners\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle documentation explains that cohorts are different from course groups. A <strong>cohort exists for enrolment purposes across Moodle<\/strong>, while a <strong>group exists only inside a specific course<\/strong>. Cohorts can be brought into one or more courses in bulk. (<a href=\"https:\/\/docs.moodle.org\/en\/Cohorts_FAQ?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Simple meaning:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort = Site\/category-level user group\nGroup = Course-level user group\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OneMembership cohort\n    \u2193\nCourse 1\nCourse 2\nCourse 3\nCourse 4\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If you add a user to the <code>OneMembership<\/code> cohort, that user can automatically receive access to all courses where this cohort has been synced.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. What Is Cohort Sync?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Cohort sync<\/strong> is an enrolment method. It automatically enrols members of a cohort into a course. If a user is added to the cohort, the user is enrolled in the course. If the user is removed from the cohort, the user can be unenrolled from the course depending on plugin settings. (<a href=\"https:\/\/docs.moodle.org\/en\/Cohort_sync?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User added to Cohort\n        \u2193\nCohort sync enrolment method\n        \u2193\nUser gets course access\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort: OneMembership\nCourse: Docker Masterclass\nRole: Student\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Once Cohort sync is added to the course, all users inside <code>OneMembership<\/code> get access to <code>Docker Masterclass<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. What Is Course Meta Link?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Course meta link<\/strong> is another enrolment method. It synchronises enrolments and roles from a <strong>source course<\/strong> to a <strong>target course<\/strong>. (<a href=\"https:\/\/docs.moodle.org\/en\/Course_meta_link_enrolment?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Flow:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Source Course users\n        \u2193\nCourse meta link\n        \u2193\nTarget Course access\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Source Course: DevOps Membership Course\nTarget Course: Kubernetes Course\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">If a student is enrolled in <code>DevOps Membership Course<\/code>, Course meta link can automatically enrol that same student into <code>Kubernetes Course<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is useful when one course acts as the \u201cmain enrolment course\u201d and other courses depend on it.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. Cohort Sync vs Course Meta Link<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Feature<\/th><th>Cohort Sync<\/th><th>Course Meta Link<\/th><\/tr><\/thead><tbody><tr><td>Main source<\/td><td>Cohort<\/td><td>Another course<\/td><\/tr><tr><td>Best for<\/td><td>Memberships, batches, departments, customer groups<\/td><td>Linking enrolments between courses<\/td><\/tr><tr><td>Dependency<\/td><td>Depends on cohort<\/td><td>Depends on source course<\/td><\/tr><tr><td>Risk if source deleted<\/td><td>Cohort deletion may affect sync<\/td><td>Deleted source course can break linked enrolment references<\/td><\/tr><tr><td>Best scale usage<\/td><td>Very good for many courses<\/td><td>Useful, but can become messy at scale<\/td><\/tr><tr><td>Example<\/td><td>OneMembership \u2192 100 courses<\/td><td>Course A users \u2192 Course B access<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The most important difference:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort Sync = User group controls course access\nCourse Meta Link = Another course controls course access\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For most membership-style platforms, training portals, corporate LMS sites, and paid access models, <strong>Cohort sync is usually cleaner<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. When Should You Use Cohorts?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use cohorts when you want to manage users centrally.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Good use cases:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>One paid membership gives access to many courses\nOne corporate client has 500 learners\nOne training batch needs access to selected courses\nOne department needs access to internal learning modules\nOne subscription plan unlocks multiple courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort: OneMembership\nCourses:\n- DevOps Foundation\n- Docker Training\n- Kubernetes Training\n- Jenkins Training\n- Terraform Training\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now instead of manually enrolling users in every course, you only manage users inside the cohort.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the clean model:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add user to cohort once\n        \u2193\nUser gets access to all synced courses\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. When Should You Use Course Meta Link?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use Course meta link when enrolment in one course should automatically give access to another course.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Good use cases:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>A main course has child courses\nA program course controls access to module courses\nA master course enrolment should unlock supporting courses\nA certification path has linked sub-courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Main Course: Full Stack Developer Program\nLinked Courses:\n- HTML Course\n- CSS Course\n- JavaScript Course\n- Laravel Course\n- React Course\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The enrolment flow becomes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Student enrolled in Full Stack Developer Program\n        \u2193\nAutomatically enrolled in linked module courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Course meta link can be useful, but it creates a dependency on the source course. If that source course is deleted or corrupted, target courses may have broken enrolment references.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Best Practice Recommendation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For your case, where you have a cohort like:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OneMembership\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">and you want to assign access across many courses, the better structure is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OneMembership Cohort\n        \u2193\nCohort Sync\n        \u2193\nAll membership courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid using this unless you specifically need course-to-course dependency:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Old Master Course\n        \u2193\nCourse Meta Link\n        \u2193\nOther Courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For large Moodle systems with hundreds of courses, Cohort sync is easier to audit, easier to bulk update, and easier to explain to administrators.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 1: How to Create and Use Cohorts in Moodle<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Create a Cohort<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Site administration \u2192 Users \u2192 Accounts \u2192 Cohorts\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Click:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add new cohort\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Add details:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Name: OneMembership\nCohort ID: OneMembership\nContext: System\nVisible: Yes\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle allows cohorts to be created at the system level or within a course category. A system cohort is available site-wide, while a category cohort is available within that category context. (<a href=\"https:\/\/docs.moodle.org\/en\/Cohorts?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Important: Always set a clear <strong>Cohort ID<\/strong>. Moodle upload tools often use the cohort ID, not only the cohort display name. Moodle documentation warns that upload files work on the cohort ID, not the cohort name. (<a href=\"https:\/\/docs.moodle.org\/en\/Cohorts?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Good naming:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort name: OneMembership\nCohort ID: OneMembership\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Avoid blank IDs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Add Users to a Cohort<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can add users manually:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Site administration \u2192 Users \u2192 Accounts \u2192 Cohorts\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then click the members icon and add users.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For bulk assignment, Moodle supports adding users to cohorts using upload users CSV. The upload format can include fields such as <code>username<\/code> and <code>cohort1<\/code>. (<a href=\"https:\/\/docs.moodle.org\/en\/Upload_users?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example CSV:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>username,cohort1\nrajesh,OneMembership\namit,OneMembership\npriya,OneMembership\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Enable Cohort Sync Plugin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Site administration \u2192 Plugins \u2192 Enrolments \u2192 Manage enrol plugins\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Enable:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort sync\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle documentation says Cohort sync must be enabled by an administrator before it can be used in courses. (<a href=\"https:\/\/docs.moodle.org\/en\/Cohort_sync?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Add Cohort Sync to a Course<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open the course:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course \u2192 Participants \u2192 Enrolment methods\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Choose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add method \u2192 Cohort sync\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Select:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Cohort: OneMembership\nRole: Student\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Click:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add method\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now all users in <code>OneMembership<\/code> will be enrolled into that course.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 2: How to Add One Cohort to Hundreds of Courses<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you have hundreds of courses, do not add Cohort sync one by one manually.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Use Moodle\u2019s <strong>Upload courses<\/strong> tool.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle\u2019s Upload courses tool allows administrators or users with the correct capability to create\/update courses using CSV, and it supports course enrolment fields. (<a href=\"https:\/\/docs.moodle.org\/en\/Upload_courses?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Site administration \u2192 Courses \u2192 Upload courses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Use a CSV like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shortname,enrolment_1,enrolment_1_cohortidnumber,enrolment_1_role\nDEVOPS101,cohort,OneMembership,student\nDOCKER101,cohort,OneMembership,student\nK8S101,cohort,OneMembership,student\nJENKINS101,cohort,OneMembership,student\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Recommended upload options:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Upload mode: Update existing courses only\nUpdate mode: Update with CSV data\nPreview: Yes\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is the best Moodle-native way to add one cohort to many existing courses.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 3: Course Meta Link Setup<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Enable Course Meta Link Plugin<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Go to:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Site administration \u2192 Plugins \u2192 Enrolments \u2192 Manage enrol plugins\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Enable:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course meta link\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle documentation says Course meta link must be enabled in enrolment plugin settings before use. (<a href=\"https:\/\/docs.moodle.org\/en\/Course_meta_link_enrolment?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Add Course Meta Link to a Target Course<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Open the target course:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Course \u2192 Participants \u2192 Enrolment methods\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Choose:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Add method \u2192 Course meta link\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then select the source course.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Source Course: DevOps Membership Course\nTarget Course: Kubernetes Course\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Now users enrolled in the source course are synchronised into the target course.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle documentation notes that Course meta link synchronises enrolments and roles from source course to target course; by default, role assignments from the source course are synchronised unless roles are excluded in plugin settings. (<a href=\"https:\/\/docs.moodle.org\/en\/Course_meta_link_enrolment?utm_source=chatgpt.com\">Moodle Docs<\/a>)<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 4: Common Mistake \u2014 Using Course Meta Link Like a Membership System<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Many Moodle admins create a \u201cmaster course\u201d and link all other courses to it:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Master Course\n    \u2193\nCourse 1\nCourse 2\nCourse 3\nCourse 4\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This works, but it is not always the best design.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the master course is deleted, hidden incorrectly, restored badly, or corrupted, linked target courses may have broken enrolment references.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Better design for membership:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OneMembership Cohort\n    \u2193\nCourse 1\nCourse 2\nCourse 3\nCourse 4\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This is simpler because the cohort is the access control object, not a course.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 5: Troubleshooting \u201cCan\u2019t Find Data Record in Database\u201d<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If you deleted old source\/master courses and then some courses show this error:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Can't find data record in database.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">when opening:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Participants \u2192 Enrolment methods\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">then the likely cause is a broken Course meta link enrolment record.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Moodle is trying to load an old linked source course, but that course no longer exists.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SQL: Find Broken Course Meta Links<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    e.id AS enrol_instance_id,\n    e.courseid AS target_course_id,\n    target.shortname AS target_shortname,\n    target.fullname AS target_course_name,\n    e.customint1 AS missing_source_course_id\nFROM mdl_enrol e\nJOIN mdl_course target ON target.id = e.courseid\nLEFT JOIN mdl_course source ON source.id = e.customint1\nWHERE e.enrol = 'meta'\nAND source.id IS NULL;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Meaning:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>target_course_id = course where enrolment page may be broken\nmissing_source_course_id = deleted course previously used as source\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Before fixing anything, take a database backup.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysqldump -u DBUSER -p DBNAME &gt; moodle_before_fix_broken_meta_links.sql\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then remove broken enrolment instances using Moodle\u2019s API, not direct SQL deletion.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 6: Useful SQL Reports for Moodle Cohorts and Meta Links<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">1. Find Courses Where <code>OneMembership<\/code> Is Already Added<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    c.id AS course_id,\n    c.shortname,\n    c.fullname,\n    cc.name AS category_name,\n    e.id AS enrol_instance_id,\n    e.status\nFROM mdl_course c\nJOIN mdl_enrol e \n     ON e.courseid = c.id\nJOIN mdl_cohort ch \n     ON ch.id = e.customint1\nLEFT JOIN mdl_course_categories cc \n     ON cc.id = c.category\nWHERE e.enrol = 'cohort'\nAND (\n    ch.name = 'OneMembership'\n    OR ch.idnumber = 'OneMembership'\n)\nORDER BY cc.name, c.shortname;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. Find Courses Where <code>OneMembership<\/code> Is Not Added<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    c.id AS course_id,\n    c.shortname,\n    c.fullname,\n    cc.name AS category_name\nFROM mdl_course c\nLEFT JOIN mdl_course_categories cc \n       ON cc.id = c.category\nWHERE c.id &lt;&gt; 1\nAND NOT EXISTS (\n    SELECT 1\n    FROM mdl_enrol e\n    JOIN mdl_cohort ch \n         ON ch.id = e.customint1\n    WHERE e.courseid = c.id\n      AND e.enrol = 'cohort'\n      AND (\n          ch.name = 'OneMembership'\n          OR ch.idnumber = 'OneMembership'\n      )\n)\nORDER BY cc.name, c.shortname;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. Find Course Meta Links<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    e.id AS enrol_instance_id,\n    target.id AS target_course_id,\n    target.shortname AS target_course_shortname,\n    target.fullname AS target_course_name,\n    source.id AS source_course_id,\n    source.shortname AS source_course_shortname,\n    source.fullname AS source_course_name\nFROM mdl_enrol e\nJOIN mdl_course target ON target.id = e.courseid\nJOIN mdl_course source ON source.id = e.customint1\nWHERE e.enrol = 'meta'\nORDER BY source.fullname, target.fullname;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">4. Find Duplicate-Looking Course Names by First 4 Characters<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    LEFT(REGEXP_REPLACE(LOWER(TRIM(c.fullname)), '&#91;^a-z0-9]', ''), 4) AS first_4_normalized_chars,\n    COUNT(*) AS total_courses,\n    GROUP_CONCAT(c.id ORDER BY c.id SEPARATOR ' | ') AS course_ids,\n    GROUP_CONCAT(c.shortname ORDER BY c.id SEPARATOR ' | ') AS shortnames,\n    GROUP_CONCAT(c.fullname ORDER BY c.id SEPARATOR ' | ') AS course_names\nFROM mdl_course c\nWHERE c.id &lt;&gt; 1\nGROUP BY LEFT(REGEXP_REPLACE(LOWER(TRIM(c.fullname)), '&#91;^a-z0-9]', ''), 4)\nHAVING COUNT(*) &gt; 1\nORDER BY total_courses DESC, first_4_normalized_chars;\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This helps find courses that may have naming convention differences.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DevOps Basics\nDevOps Basic Course\nDevOps Basics 2025\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 7: Migration Plan from Course Meta Link to Cohort Sync<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">If your Moodle site currently uses Course meta links but you want to move to Cohort sync, use this plan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Step 1: Audit Existing Meta Links<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Run:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT \n    e.id AS enrol_instance_id,\n    target.id AS target_course_id,\n    target.fullname AS target_course_name,\n    source.id AS source_course_id,\n    source.fullname AS source_course_name\nFROM mdl_enrol e\nJOIN mdl_course target ON target.id = e.courseid\nJOIN mdl_course source ON source.id = e.customint1\nWHERE e.enrol = 'meta'\nORDER BY source.fullname, target.fullname;\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 2: Create Replacement Cohort<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Create:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OneMembership\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 3: Add Existing Users to Cohort<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Either manually add users or upload users using CSV:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>username,cohort1\nstudent1,OneMembership\nstudent2,OneMembership\nstudent3,OneMembership\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 4: Add Cohort Sync to Target Courses<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Use Upload courses CSV:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>shortname,enrolment_1,enrolment_1_cohortidnumber,enrolment_1_role\nCOURSE001,cohort,OneMembership,student\nCOURSE002,cohort,OneMembership,student\nCOURSE003,cohort,OneMembership,student\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 5: Verify Access<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Check one student account:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>User is in OneMembership cohort\nUser can access all required courses\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Step 6: Remove Old Course Meta Links<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">After confirming Cohort sync is working, remove old Course meta link enrolment methods from the affected courses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do not delete source courses until you confirm no course still depends on them.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Part 8: Which One Should You Use?<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">Use Cohort Sync When:<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>You sell memberships\nYou manage corporate learners\nYou have batches of students\nYou want one group to access many courses\nYou want cleaner long-term access control\nYou want to bulk manage hundreds of courses\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Use Course Meta Link When:<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>One course genuinely controls another course\nA program course should unlock module courses\nA parent course and child courses are intentionally connected\nYou want enrolment and role sync from one course to another\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Avoid Course Meta Link When:<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>You only need membership-based course access\nYou are using a dummy\/master course just as a user container\nYou plan to delete or frequently modify source courses\nYou have hundreds of courses and need simple access control\n<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">Final Architecture Recommendation<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">For a Moodle business, training company, certification platform, or membership portal, the clean structure is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Users\n  \u2193\nCohort: OneMembership\n  \u2193\nCohort Sync\n  \u2193\nCourses\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">For example:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>OneMembership\n  \u251c\u2500\u2500 DevOps Foundation\n  \u251c\u2500\u2500 Docker Masterclass\n  \u251c\u2500\u2500 Kubernetes Advanced\n  \u251c\u2500\u2500 Jenkins CI\/CD\n  \u251c\u2500\u2500 Terraform on AWS\n  \u2514\u2500\u2500 SRE Foundation\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">This gives you one central access point. Add user once, remove user once, and Moodle handles access through Cohort sync.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Course meta link is powerful, but use it only when courses are logically dependent on each other.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest rule is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>For user groups, use Cohorts.\nFor course-to-course dependency, use Course meta link.\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That one rule will save you many Moodle admin headaches.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1. What Is a Moodle Cohort? A cohort in Moodle is a collection of users created at the site or category level. You can think of it&#8230; <\/p>\n","protected":false},"author":13,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-5642","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts\/5642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/users\/13"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/comments?post=5642"}],"version-history":[{"count":1,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts\/5642\/revisions"}],"predecessor-version":[{"id":5643,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/posts\/5642\/revisions\/5643"}],"wp:attachment":[{"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/media?parent=5642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/categories?post=5642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cmsgalaxy.com\/blog\/wp-json\/wp\/v2\/tags?post=5642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}