The decisions behind a new Moodle site
Structure follows delegation and reporting
We design the category tree by asking two questions: who should administer which part of the site, and how will you slice reports? Categories are contexts, so a role assigned at a category applies to every course beneath it. A tree built around departments makes "manager of Sales training" a single role assignment. A tree built around course type makes that impossible. Cohorts do the same job for people. One cohort per intake, team or client, synced to courses, turns enrolment into a membership change instead of a course-by-course task.
Pick enrolment methods per course type
Moodle lets several enrolment methods run in one course, and that is where confusion starts. We agree a short pattern book: compulsory courses use cohort sync, optional ones use self-enrolment (with a key where needed), programs made of several courses use meta links, and manual enrolment stays for exceptions. Each method gets an end rule, whether a fixed duration, an end date or removal when the user leaves the cohort. Suspending or unenrolling a leaver is also a choice, because it decides what happens to that person's grades and history in the course.
Completion and grades are configured before content
Completion tracking must be on at site level and in each course, with conditions on every activity and criteria for the course. If that happens after learners start, earlier work is not always counted the way people expect. So we set default completion conditions and build a course template first, then let your authors add content. The gradebook gets the same treatment: an agreed aggregation method, grade categories and a pass grade per activity, so that "passed" means the same thing across the catalog.
The server side of a calm launch
Three settings cause most early performance trouble. Cron has to run every minute, because enrolment sync, notifications and completion all depend on scheduled tasks. Sessions and the application cache should move off their default stores to something like Redis once you have real concurrency. And moodledata needs fast storage with room to grow, plus a backup that includes both it and the database. We load test with generated courses and users before launch, so the first exam is not the experiment.
Launch with a pilot
Go-live starts with one course and one cohort. We check logins, enrolment, a quiz attempt, a grade and a certificate with real accounts in each role, then open the rest of the catalog. Administrators receive a written guide for the tasks they will repeat: creating a course from the template, adding a cohort, resetting a course for a new term. When single sign-on or HR sync is part of the build, our Moodle integration page covers how that is wired, and the visual side is handled as Moodle theme development.