What a Moodle Matrix integration gives course teams
A school or university team that wants chat inside each Moodle course, without routing student conversations through a third-party chat service, now has a built-in option. Moodle 4.3 added a Matrix integration to core, with administrator controls for room creation and moderation capabilities that let teachers moderate the conversation. The provider does not host anything itself. It connects to a Matrix homeserver that your organization operates, so messages, membership records and room history stay in infrastructure you control. That one decision shapes most of the project, from who responds when chat breaks to what your data protection documentation has to describe.
The practical value for course teams is a room that follows the course itself. Teachers open the conversation from Moodle, and the provider creates the Matrix accounts it needs through the homeserver connection. Moderation stays with the teaching staff who already run the course. None of this works until the homeserver exists and is healthy. Matrix.org lists several implementations, including Synapse, Dendrite and the Conduit family with its forks. Synapse is the most widely documented, is developed by Element under AGPL-3.0, and has commercial licenses available from Element. Element moved future Synapse contributions to AGPLv3 in December 2023, so confirm with counsel which license terms and any commercial exception apply to your deployment before you commit to one.
This section sets the decisions that come before configuration. The rest of the page covers the provider settings, prerequisites, membership sync from course enrolments, how Moodle users map to Matrix identities, security, testing and the failure points that appear in production. Read those sections with one question in mind: who in your organization owns the homeserver and its upgrades? The provider needs a homeserver name, a homeserver URL and an access token for an account that acts on the homeserver. Whoever manages that account holds significant control over room and user administration, so settle the ownership and custody of that token before anyone places it into a Moodle setting.
Federation is the decision teams most often leave at its default and later regret. Synapse federates on port 8448 unless delegation is configured, and its federation_domain_whitelist setting restricts federation to listed domains. An empty list disables federation entirely. For course chat that should stay inside one institution, decide explicitly whether the homeserver talks to other servers, then confirm that your firewall matches the Synapse documentation's advice to protect the federation listener. Write the decision down, because it affects the threat model, the testing plan and the evidence you will need to show reviewers.
Plan for release cadence on both sides. Moodle ships major releases in April and October and minor point releases every two months. Synapse releases on its own schedule, and its upgrade notes warn that rolling back can be difficult because of database schema changes. Synapse 1.143.0 and later require PostgreSQL 14 or newer, and 1.142.0 and later require Python 3.10 or newer, so confirm the database and runtime your homeserver needs before you schedule an upgrade. Ask who tracks both release streams, who tests the provider against each new Moodle version, and who approves a homeserver upgrade before course rooms depend on it. Name those owners before the first course is provisioned.
What you need before you configure the Matrix provider
Four things must be in place before the Matrix communication provider can create course rooms: a Moodle release that includes the integration, a Matrix homeserver that Moodle can reach, a dedicated admin account with an access token, and a server name with valid TLS. Each one has version or configuration choices that are easier to settle before anyone opens the Moodle admin settings.
Moodle version and server requirements
The Matrix integration requires Moodle 4.3 or later, which introduced Matrix as a course communication option with admin controls for room creation. Separately, the server requirements belong to the Moodle release you actually run. Moodle 5.1 requires 64-bit PHP 8.2 or later, and Moodle 5.3 requires 64-bit PHP 8.3 or later with PostgreSQL 17 or MariaDB 11.4. Check these against your current stack and your upgrade path before you deploy.
A reachable Matrix homeserver
Moodle creates rooms and accounts by calling your homeserver over HTTP(S), so the Moodle web server must be able to reach the homeserver URL, not just your users' browsers. Confirm network paths and firewall rules between the two hosts. Synapse is the most widely documented option, but the homeserver you choose determines which versions and database engines you must support.
Dedicated admin account and access token
The provider authenticates with one homeserver account that performs room creation, membership changes and moderation actions. Create a dedicated account for this purpose instead of reusing a person's login, and generate its access token for Moodle to store. Record who owns the account, where the token is kept, and how it will be rotated if the account is ever compromised.
DNS and TLS for the server name
The server name fixes how user IDs and room identifiers are formed, so it cannot be changed casually after rooms exist. Plan the public name, the DNS records that point to the homeserver, and a valid TLS certificate for the host Moodle connects to. Federation defaults to port 8448, and delegation can serve the name from another host on port 443. Decide whether federation is needed at all, because a closed deployment may restrict it.
Homeserver versions and database support
Each homeserver release drops support for older Python and PostgreSQL versions. Synapse 1.143.0 and later require PostgreSQL 14 or newer, and 1.142.0 and later require Python 3.10 or newer. Confirm with the Moodle communication_matrix documentation which homeserver versions your Moodle release supports before you choose a build, then check that your database host meets the homeserver's requirements.
How Moodle creates rooms and keeps membership in step
The flow starts with three values in Moodle's Matrix communication provider: the homeserver name, the homeserver URL and an access token. The URL is what Moodle uses to connect to the homeserver and create accounts. The access token belongs to the account that performs actions on the homeserver, so whoever controls that account controls what Moodle can do there. The homeserver name is the part that appears after the colon in Matrix IDs, such as @user:example.com. Before rollout, check the exact wording and behavior of these settings in the communication_matrix language strings for the Moodle version your client runs, and decide which account will hold the token and how its credentials are stored and rotated.
Moodle 4.3 introduced the Matrix integration, which makes Matrix available for use in courses and gives administrators controls for room creation. Teachers receive moderation capabilities in the rooms that Moodle manages, so the practical decisions are which roles may create or moderate a room and whether moderation follows the teacher role in the course. Confirm in your version whether a room is created when a course is set up, on first use, or on demand, and whether the rooms sit in the course context or are created by a site-level action. Write these answers down as a permissions matrix, because the room model is what your teachers and auditors will ask about first.
Membership is the part most likely to differ from what your teams expect. Confirm whether a new enrolment adds the user to the course room automatically, whether an unenrolment or role change removes or downgrades membership, and whether any of this flows in one direction only, from Moodle to Matrix. Also confirm how long these changes take to appear and whether a user needs a Matrix account created through the homeserver URL before they can join. Test this on a non-production homeserver with a test course: enrol, change roles and unenrol a set of test users, then compare Moodle enrolments with Matrix membership and moderator rights after each step.
Course end is the other behavior to confirm in writing. Find out whether the room is archived, left open, emptied of members or deleted, and whether message history and files remain accessible to teachers or administrators afterward. The answer determines your retention and export plan, so include a step to check how records are kept before the first live course closes. On the Matrix side, Synapse uses server_name to identify users and rooms, so treat that value as fixed once the homeserver is in use and settle it before any course room is created. If you enable federation, the federation_domain_whitelist setting and firewalling of the federation listener should be part of the same test plan.
Configuration sequence for course rooms with Matrix
This sequence takes a self-hosted Matrix homeserver and a Moodle site from a clean install to one tested course room. Each step produces a result you can check before the next one starts, so a fault shows up where it was introduced. Work through it in order, because the homeserver name and federation policy shape every step that follows.
Stand up the homeserver with stable DNS
Your infrastructure team installs Synapse with PostgreSQL, which the Synapse documentation recommends for production. Synapse 1.143.0 and later require PostgreSQL 14 or newer, so confirm your database version first. Set server_name to the domain that appears in user IDs (for example, @user:example.com in an illustrative setup) and publish matching DNS records. Done when the client API answers over HTTPS and a test account signs in from a Matrix client.
Set the federation policy early
Decide whether the homeserver federates at all, and record the decision with your security owner. Synapse treats an empty federation_domain_whitelist as federation disabled, while a populated list limits federation to the domains you name. If federation is off or limited, firewall the federation listener, which Synapse serves on port 8448 by default, as the Synapse documentation recommends. Done when a configuration review shows the chosen setting and a request from a domain outside the list is refused.
Create the Moodle service account and token
On the homeserver, create a dedicated service account for Moodle to act through, with no personal or shared use. Generate an access token for that account using the method documented for your Synapse version, and store the token in your secrets manager. Done when a read-only test request made from the Moodle host with that token returns the service account's own user ID.
Configure the Matrix provider in Moodle
A Moodle administrator enables the Matrix communication provider, which Moodle 4.3 introduced, and enters three values: the homeserver name, the homeserver URL that Moodle uses to connect and create accounts, and the access token from the previous step. Restrict who can view the token field in admin settings. Done when the provider settings save without a connection error and Moodle can create a test account on the homeserver.
Enable Matrix for a pilot course
A course administrator turns on Matrix communication for one pilot course first, leaving other courses unchanged. Choose a course with a small teaching group and enrolments that already contain both a teacher and a student, so membership can sync during testing. Done when the course settings show the Matrix option as active and the course has a room available to open.
Confirm room creation and membership
Sign in as a teacher enrolled in the pilot course and create or open the course room. Then sign in as an enrolled student and confirm that the student appears as a member of that room without a manual invitation. Done when the room exists on the homeserver, both users see it in their Matrix clients, and the membership list matches the course enrolments. Ask the vendor or your Moodle support contact how membership changes are synchronized in your version.
Test teacher moderation in the room
As the teacher, take one moderation action in the pilot room, such as removing a test message or changing a member's permissions, and confirm the action appears in the room history. Then check the student's client to confirm it reflects the same change. Done when the moderator action is visible to both users and the results are recorded as acceptance evidence before any other course is enabled.
How Moodle roles and enrolments map to Matrix room permissions
This table compares each Moodle enrolment and role source with the Matrix membership and power level it produces in a course room. The Who controls it column shows which mappings Moodle applies by default and which ones the administrator must review. Confirm every row against the Moodle release you run, because the Matrix provider and its role capabilities can change between releases.
| Moodle source | Matrix result | Who controls it | What to verify in testing |
|---|---|---|---|
| Site administrator account | Holds the access token used to create rooms and accounts on the homeserver | Site administrator, set in the Matrix communication provider settings | Confirm the token's Matrix account, its server permissions and that it cannot be used for personal chat |
| Editing teacher enrolment | Joins the course room with moderation power if the teacher capability maps to it | Moodle capabilities for the role, reviewed by the administrator | Teacher can moderate messages and members, and the power level shown in room settings matches intent |
| Non-editing teacher enrolment | Joins the course room, with moderation only if the role carries the same capabilities | Moodle capabilities for the role, reviewed by the administrator | Confirm whether this role can change room settings or remove members in your release |
| Student enrolment | Joins the course room as a standard member who can post messages | Moodle default student role, checked by the administrator | Students cannot invite members, change room settings, or remove other users |
| Custom role with course capabilities | Membership is created, but power level depends on how each capability is mapped | Administrator, because custom roles are not mapped by default | Test each custom role in a sample course and record its resulting Matrix power level |
| Enrolment suspended or removed | Matrix membership is removed or changed after the next synchronization | Moodle enrolment sync, timing set by site configuration | Confirm when removal takes effect and what members see in message history afterwards |
| Enrolment method (manual, cohort or self enrolment) | Membership should follow the enrolment regardless of how the user was enrolled | Moodle enrolment plugins, with sync behavior confirmed by the administrator | Enrol one user through each method used on the site and confirm the same room membership results |
| Room creation for a new course | A dedicated Matrix room is created and linked to the Moodle course | Site administrator, through admin controls for room creation | Only roles you intend can create rooms, and each course maps to exactly one room |
Choosing a Synapse deployment for course chat
The homeserver is the first decision in this design, because Moodle's Matrix communication provider can only work with the server you point it at. The main candidates named in the Matrix ecosystem are Synapse, written in Python and licensed AGPL-3.0-or-later by Element; Dendrite, written in Go and also AGPL-3.0-or-later; and Conduit with its Rust forks Continuwuity and Tuwunel, which are Apache-2.0. Synapse is the most widely documented of these. For a course-chat design, that depth matters because your administrators will need upgrade notes, troubleshooting references and configuration guidance. Documentation depth does not replace a check against the features your course rooms depend on, so test those features on the candidate you select.
Licensing deserves the same attention as features. On December 13, 2023, Element announced that future Synapse contributions would be licensed under AGPLv3 instead of Apache 2.0, moved the repositories from matrix-org to element-hq on GitHub, and began selling AGPL exceptions, with contributors signing a contributor license agreement. AGPL is a copyleft licence with obligations that can apply when users interact with a modified program over a network. Element also offers commercial licences for Synapse. Whether your organization's hosting, internal changes or distribution create obligations is a question for your counsel, and the answer should be in hand before the server stores any course conversations.
Plan for PostgreSQL as the production database. The Synapse documentation recommends PostgreSQL for production and also supports SQLite, but a deployment that serves many courses and staff should not depend on SQLite. The current version floors are firm: Synapse 1.143.0 and later require PostgreSQL 14 or newer, and Synapse 1.142.0 and later require Python 3.10 or newer. Confirm that the operating system packages you intend to use meet both floors. Synapse also drops support for Python and PostgreSQL versions once they reach upstream end of life, so these floors will move during the life of the deployment. The upgrade notes warn that rolling back can be difficult because of database schema changes between releases, so take and test a database backup before every upgrade.
Decide whether the server federates before you configure it. Synapse federates on port 8448 by default, and delegation can serve user IDs such as @user:example.com from another host on port 443. The server_name setting determines how users and rooms are identified, so choose the domain with care. An empty federation_domain_whitelist disables federation, and the configuration documentation recommends firewalling the federation listener as well. For a chat used only by enrolled students and staff, closing federation is a reasonable choice to record with your security team. Confirm with the provider's documentation that this setting does not affect the account and room operations it performs.
Before you fix a version, confirm which homeserver and version Moodle's Matrix provider has been tested against. The provider needs a homeserver name, a homeserver URL for connecting and creating accounts, and an access token for the account that performs actions on the server. A successful test against one homeserver tells you little about another, so ask the Moodle provider's maintainers or your implementation partner for the tested combination. Record the Synapse version, PostgreSQL version, Python version, Moodle version and the provider settings in your design record. Then run a test course against that exact combination before any student is enrolled.
Securing the homeserver, the token and the federation listener
These cards cover the controls that decide who can act on your Matrix homeserver from Moodle and who can reach it from outside. Start with the credentials Moodle holds, then narrow the network paths and identity sources that feed course membership. Each card names a decision your team should record before the Moodle provider moves into production.
Store the access token as a privileged secret
The access token in Moodle's Matrix communication provider belongs to an account that can create rooms and act on the homeserver, so treat it as a privileged credential. Keep it out of code, out of configuration files kept in version control and out of course content, and load it from a secrets store your team already operates. Agree a rotation schedule with the platform owners, and record who can view or replace the token and how a rotation is applied to the Moodle site with minimal disruption to course chat.
Limit the Moodle service account
The account behind the token should hold only the permissions that room creation, membership changes and moderation require, and no administrative rights on the homeserver. Create it as a dedicated account that is separate from any administrator login, so its activity can be audited on its own. Confirm with the Synapse documentation which permissions each Moodle action needs, then test every action in a staging room before go-live.
Encrypt client and federation traffic
Serve the client API and any federation traffic over TLS with certificates your organization manages, and confirm that Moodle can reach the homeserver URL over HTTPS from its web tier. Check the certificate chain that Moodle trusts, including any internal certificate authority, and document the renewal process. An expired certificate can interrupt room synchronization, so monitor expiry dates as part of the platform's routine checks.
Restrict federation with an allowlist
Synapse's federation_domain_whitelist setting limits federation to the domains you list, and an empty list disables federation entirely. For a course chat deployed for one institution, decide first whether any external homeserver needs to join rooms, then write that decision into the configuration. Review the list whenever a partner is added or removed, because federation policy determines who can see and join the rooms that Moodle creates.
Firewall the federation listener on port 8448
Synapse federates on port 8448 by default, and its documentation recommends firewalling the federation listener. Allow inbound traffic to that port only from the hosts or networks your federation policy names, and confirm that any delegation still directs remote servers to the intended host on port 443. Test the rules from outside your network, including through any load balancer or reverse proxy in front of the homeserver.
Connect SSO and the student identity lifecycle
Synapse supports single sign-on through oidc_providers, saml2_config and CAS, so choose the protocol your identity provider already serves and configure it on the homeserver. Moodle signs learners in through its own authentication plugins, so both sides must agree on user identifiers. Create and remove student accounts through the same identity lifecycle the institution uses for its other systems, so homeserver access ends with the institution's offboarding process rather than a separate cleanup list.
How to test course rooms before students arrive
Test the Matrix course rooms in a sandbox course before any student or teacher uses them. Create a sandbox course in a non-production Moodle site connected to a non-production Synapse homeserver, and create at least one teacher account and one student account in the sandbox. Give the teacher account the capability that allows room moderation, and enrol the student through the same method your production courses will use. Keep a written record of the Moodle version, the homeserver name and the account that holds the access token, because those are the settings the Matrix communication provider depends on. Run the core checks in order. First, confirm that a room is created for the sandbox course and that its name and identifiers match what the provider expects. Second, enrol the student and confirm that the student is invited and joins. Third, unenrol the student and confirm that membership is removed on the homeserver, not only hidden in Moodle. Check this from a Matrix client or the Synapse admin API, not from the Moodle interface alone. Fourth, use the teacher account to perform moderator actions such as removing a message or a member, and confirm the results on the homeserver. Finally, confirm that message history is retained for the period your records policy requires, and that a removed student cannot read new messages after unenrolment.
The homeserver needs its own recovery test. Take a backup that covers the PostgreSQL database, the media store and the configuration files, including the signing key material. Restore that backup to a separate host and confirm that the restored server starts, that rooms and memberships appear, and that message history is complete for a sample of rooms. Then point a test Moodle site at the restored homeserver and confirm that the provider can still create rooms with the existing access token. Record how long the restore took on your hardware, because that figure, not a vendor estimate, is what you will plan against for a real incident. Upgrades need a rehearsal on a copy of the database. Restore a recent database dump to a staging Synapse running the same release as production, then apply the upgrade notes for the target release in order. Check the database and runtime requirements before you start. For example, Synapse 1.143.0 and later require PostgreSQL 14 or newer, and 1.142.0 and later require Python 3.10 or newer. Repeat the room, invitation, removal and history checks after the upgrade, and time the steps so the production maintenance window is based on measured steps.
Plan rollback before the first upgrade, because the Synapse upgrade notes warn that rolling back can be difficult when database schema changes are involved. Rolling back by installing the previous package is not a reliable recovery path. Take a snapshot of the homeserver host or virtual machine, plus a logical database dump, immediately before each upgrade. Store both where they can be restored independently of the upgraded system. Write down who approves a rollback, which snapshot restores which version, and how Moodle users will be told that course rooms are unavailable during the restore. Before the institution-wide rollout, run a pilot with one department. Pick a department with a small number of active courses, a teacher group willing to report problems, and a named administrator who can check homeserver state. Agree exit criteria in writing before the pilot starts. These should cover membership accuracy after enrolment changes, moderation support, history retention and the restore test. The pilot shows you how many courses are provisioned in practice, what moderators need to be trained on and which policy questions the homeserver settings must answer. Ask any implementation partner to state in the written scope which of these tests they run, which they hand over, and what evidence they provide at the end.
Common Moodle Matrix failures and how to fix them
This table lists common failures when Moodle's Matrix communication provider works with a self-hosted Synapse homeserver, with the likely cause, the check to run and the fix for each. Use it for first-pass triage, then confirm exact error messages against the Moodle and Synapse logs for the versions you run. Most failures trace back to three settings: the homeserver URL, the server_name and the service account token.
| Failure | Likely cause | Check to run | Fix |
|---|---|---|---|
| Moodle provider cannot reach the homeserver URL | Wrong URL, a firewall or proxy between the Moodle web server and Synapse, or a certificate the Moodle host does not trust. | From the Moodle web server, send a request to the configured URL and read the Moodle and proxy logs for the connection error. | Correct the URL in the provider settings, open the network route, and add the internal certificate authority to the Moodle host. |
| Access token rejected or expired | Token revoked, service account deactivated, or a token issued to a personal account that was later changed. | Confirm the service account is active on Synapse and test the token with a simple authenticated request. | Issue a new token for a dedicated Moodle service account and update the provider settings. |
| Homeserver name does not match server_name | The homeserver name in Moodle differs from server_name in the Synapse configuration, so user IDs such as @user:example.com do not resolve. | Compare server_name in homeserver.yaml with the homeserver name in Moodle, then inspect one created user ID. | Correct the Moodle setting. Decide server_name before users and rooms exist, because changing it later is disruptive. |
| Users missing from rooms after enrolment changes | Sync did not run for that change, the user has no Matrix account yet, or a sync error was logged without a retry. | Compare enrolments with room members for one course and search the Moodle logs for communication sync errors. | Rerun sync for affected courses, confirm account creation for the user, and confirm which enrolment events trigger sync in your version. |
| Federation open or closed unexpectedly | federation_domain_whitelist is unset, so the list does not restrict federation, or it is set to an empty list, which disables it. Firewall rules may also differ from the setting. | Read the whitelist value and test reachability of port 8448 from an outside host against your federation policy. | Set the whitelist to the approved domains or an empty list, firewall the federation listener, and record the policy decision. |
| PostgreSQL or Python below Synapse minimums | Synapse was upgraded to a release that needs PostgreSQL 14 or Python 3.10 while the host still runs older versions. | Check the Synapse upgrade notes for the target version, then check the Python and PostgreSQL versions on the host. | Upgrade PostgreSQL or Python first, back up the database, then upgrade Synapse, since rolling back can be difficult. |
| Rooms not created for new courses | The Matrix provider is not enabled, the course communication setting is not Matrix, or the service account cannot create rooms. | Check the admin settings, the communication setting on a test course, and the Moodle logs for a room creation error. | Enable the provider, set the course option, and correct the service account permissions. Confirm the room creation controls in your Moodle version. |
Questions buyers ask before hiring help with Moodle Matrix
What drives the cost of a Moodle Matrix implementation?
The main cost drivers are the size of the Matrix homeserver, the number of courses and users it must serve, the identity design, the testing scope, and who keeps the stack current after launch. Synapse is the most widely documented Matrix homeserver. It is licensed under AGPL-3.0, with commercial licenses also available from Element, so check licensing before the build starts. Database sizing matters because Synapse recommends PostgreSQL for production, and recent Synapse releases require PostgreSQL 14 or newer. Larger deployments may add worker processes connected through Redis, which adds components to run and monitor. Single sign-on through OpenID Connect, SAML2 or CAS, plus the account rules that map identities to course enrolments, adds design and test effort. One-time costs include design, build and the first verification. Recurring costs include upgrades, backups, monitoring and security patching for both Moodle and Synapse. Ask any provider for a written scope that lists each item and marks it as one-time or recurring.
How long does a Matrix course room pilot take?
The duration depends on the agreed scope, so ask for the timeline in the written proposal rather than relying on a general estimate. The factors that set it are the number of courses and users in the pilot, whether a Synapse homeserver already exists or must be built, how many identity sources the pilot touches, whether the Moodle site already runs a supported version, and how quickly your institution can supply hosting, DNS records, certificates and test accounts. Decision makers who approve federation policy and moderation rules often set the pace, because those choices are needed early in the build. Ask for the entry criteria for the pilot, the test steps that close it, the tasks that stay with your staff, and the dates that depend on your side.
Can our own team run Moodle Matrix without outside help?
Yes, if the team already has three skill sets: Moodle administration, Synapse operations and identity engineering. Moodle administration covers the core Matrix communication provider settings, which take a homeserver name, a homeserver URL used for connecting and creating accounts, and an access token for the account that acts on the homeserver. It also covers room creation controls and teacher moderation, which Moodle 4.3 introduced. Synapse operations covers PostgreSQL, supported Python and PostgreSQL versions, upgrades and, if load grows, workers connected through Redis. Identity skills cover single sign-on setup and how account attributes map to course enrolments. The access token is a privileged credential, so the team needs a secure way to store and rotate it. A team missing one of these skill sets can train for that part or buy help for that part only, and a fixed-scope engagement can be limited that way.
What must our institution provide before implementation starts?
Your institution provides the infrastructure, access and decisions that the build depends on. Hosting: servers or cloud accounts for the Synapse homeserver, its database and the Moodle site, sized with the provider. DNS and certificates: records for the server name and any federation delegation host, plus valid certificates for each public endpoint. Identity source: the directory or identity provider that Moodle and Matrix will trust, along with the account attributes it can release. Decision makers: named owners for federation policy, room creation rules and moderation roles, who can answer questions within agreed timeframes. Test accounts: teacher, student and administrator accounts on both platforms for verification. Confirm each item early, because missing DNS changes or certificate issuance can hold up the start of the build.
What should a fixed-scope quote for Moodle Matrix include?
A fixed-scope quote should list each deliverable and the conditions under which it is accepted. Ask for the Synapse homeserver design, including the server name, database and worker plan, and the Redis components if workers are used. Federation policy should be stated explicitly, including whether federation is disabled, restricted to a domain list, or opened more widely. The Moodle side should cover the core Matrix communication provider configuration, room creation controls, teacher moderation and enrolment-based membership sync. Identity work should name the protocol (OpenID Connect, SAML2 or CAS), the attribute mapping and the account creation rules. Include testing with defined test cases, backups, documentation, handover, and an upgrade plan. Also list exclusions, client-side assumptions, your institution's dependencies and each cost as one-time or recurring. The quote follows from the written scope, so anything missing from the scope will be missing from the price.
What do Synapse upgrades involve after go-live?
Synapse upgrades need a staged plan, tested backups and a rollback position that is usually harder than a normal package downgrade. The upgrade notes warn that rolling back can be difficult because database schema changes occur between releases. Synapse also drops support for Python and PostgreSQL versions once they reach upstream end of life, and recent releases raise minimums: 1.142.0 and later require Python 3.10 or newer, and 1.143.0 and later require PostgreSQL 14 or newer. Check these requirements against your platform before each upgrade. Moodle has its own requirements, so plan the two upgrades in a sequence that keeps the Matrix provider working. Confirm the upgrade cadence, who approves production changes, and whether the test environment mirrors the production database closely enough to be useful.
Must federation be turned off for a private course chat?
Federation is not required for course rooms that only contain your own users, but it should be a deliberate decision rather than a default. Synapse federates on port 8448 by default, and the federation_domain_whitelist setting restricts federation to listed domains. An empty list disables federation. The Synapse documentation recommends also firewalling the federation listener when federation is not needed, so the network controls and the homeserver setting should agree. If your rooms must reach users on other homeservers, list only the domains you trust and document who approves additions. Confirm the policy with your security team before the build, because it affects DNS, firewall rules and the delegation design that user identifiers depend on.
How DeployOpen scopes and supports Moodle Matrix rooms
DeployOpen plans, implements, documents and supports self-hosted open-source platforms inside the client's own infrastructure, and Moodle course rooms with Matrix follow the same written-scope method. The work starts with an agreed scope covering the Matrix homeserver, the Moodle communication provider and the membership rules before any room is created.
How we scope
- Confirm which Moodle version and database the site runs, and which Matrix homeserver implementation will host the course rooms
- Agree whether rooms map one to one with courses and who may create, moderate and archive them
- Define how enrolment roles such as teacher and student translate into room membership and moderation powers
- Record the federation position in writing, including whether the homeserver talks to other Matrix servers at all
- Agree in writing the scope, deliverables and timeline before work starts, since engagements are fixed-scope
How we build
- Deploy the Matrix homeserver in your infrastructure with PostgreSQL as the database, as Synapse documentation recommends for production
- Configure the Moodle Matrix communication provider with the homeserver name, homeserver URL and a dedicated service account access token
- Test room creation, membership synchronization from enrolments and teacher moderation in a staging environment before go-live
- Document the admin controls for room creation and moderation so course staff know what they can and cannot change
- Check the Moodle version against the Matrix feature set, since the integration arrived in Moodle 4.3 and later releases must be confirmed
How we hand over
- Provide the configuration record for the homeserver, the Moodle provider settings and the service account, with secrets stored outside the code
- Hand over runbooks for adding users, rotating the access token and recovering the homeserver database
- Deliver test results showing enrolment changes reaching room membership on a sample course
- Walk course administrators through room creation, moderation and the teacher workflow in your own environment
- Agree on a documented upgrade plan covering Moodle point releases and Synapse releases with their database and Python requirements
How we support
- Offer ongoing support, upgrades and continuous testing as a retainer after handover, scoped in writing
- Plan Moodle and Synapse upgrades as separate tracks, checking each release's requirements before changing either
- Keep backup and restore procedures for the homeserver database current, since rollback between Synapse releases can be difficult
- Review the service account permissions and federation settings on a schedule agreed with your security team
- Confirm any support level, response expectation or coverage window with DeployOpen in the written scope, not from this page

