Skip to content

Troubleshooting ​

Something is not doing what it should. This page is organised the way a diagnosis goes: where mooDesk reports its own failures, the five checks that settle most cases, then symptoms by area, and finally the reference of every incident the plugin can record. How each feature works, and what each setting does, stays on the pages linked from here.

Start with System Health ​

mooDesk → System health (/local/moodesk/health.php, capability local/moodesk:viewhealth) is where mooDesk shows what it absorbed instead of letting it break a ticket: a notification that could not be sent, a webhook that keeps failing, a mailbox poll that errored, a scheduled task that threw, a knowledge base write that failed, an unexpected error in the interface. What the page contains is described in Features → System Health; this is how to read it when something is wrong.

What you seeWhat it means
Everything is workingNo live incident in the active window (24 hours by default)
Something needs attentionAt least one live incident of severity warning or error
A source is downAt least one live critical incident. Only email ingestion raises critical incidents: the mailbox poll failing as a whole, or an OAuth 2.0 sign-in that cannot happen
A source card reading N live incident(s)Which of the six sources — Notifications and automation, Webhooks, Email ingestion, Scheduled tasks, Knowledge base, Interface — the trouble is in
An incident rowOne fingerprint: the same failure repeating collapses onto one row and bumps Occurrences and Last seen, rather than piling up rows. The code on the row (for example email_ingestion.imap.poll_failed) is what the incident reference below is keyed on
AcknowledgeYou are on it: alerts for this incident stop, the row stays listed. Needs local/moodesk:managesettings
ResolveIt is fixed: the row leaves the live list. If the same failure happens again the incident reopens with its history, so a resolved incident that keeps coming back is a fix that did not take

Three things to know about what is not on the page:

  • The message is redacted. Before an incident is stored, passwords, tokens, keys, JWTs, IMAP LOGIN lines and every email address are removed from the message. An operator learns that a delivery failed, not to whom. The operator alert about a refused sender, sent through Moodle messaging, is where the address is.
  • Older than the window is not gone. An incident whose last occurrence is older than the Active incident window stops counting as a current problem but stays on record until Incident retention (90 days) removes it.
  • Alerts are a separate channel. New incidents at or above Alert from severity (error by default) are sent by Moodle messaging to the Unknown-sender alert recipients, or to the site administrators when that list is empty, no more than once per Alert cooldown per incident. All four settings are in Configuration → Operator alerts and retention. If you never receive an alert but System Health shows incidents, see Notifications.

Where else mooDesk writes:

LogWhereHolds
Task logsSite administration → Server → Tasks → Task logs, component mooDeskOne line per run of each scheduled task, including the per-outcome counts of the mailbox poll and the webhook dispatcher
Webhook delivery logmooDesk → Webhooks, the Recent deliveries list of each webhookEvery attempt with payload, HTTP status and the first 4 KB of the response — Integrations
Moodle's error logThe web server's PHP error log; Debugging under Site administration → DevelopmentAnything that escaped mooDesk's own handling

First checks ​

Five questions that settle most reports before any digging.

  1. Is cron running? Site administration → Server → Tasks → Scheduled tasks, filter mooDesk: every task shows a recent Last run and no Fail delay. Notifications, SLA breaches, auto-close, email ingestion, webhook deliveries and operator alerts all depend on cron. A site where cron stopped looks like six different bugs at once.
  2. Which edition is the site actually running? mooDesk → License shows the verdict and the effective edition. A refused key runs the site as Starter without deleting anything: Pro and Enterprise screens turn into an upgrade prompt and their tasks do nothing. The verdicts are explained in Configuration → License.
  3. Does the user hold the capability? Every mooDesk screen and action is a capability at system context. Site administration → Users → Permissions → Check system permissions for the user answers most "I cannot see / cannot do" reports; the table of capabilities is in Installation → Roles and capabilities.
  4. Is the task enabled? A task can be disabled from Moodle's task list without mooDesk noticing. Check the Enabled column for the task behind the feature — the list with schedules is in Installation → Scheduled tasks.
  5. What does System Health say? If the page is green and the report is about something mooDesk did not do, the cause is almost always one of the four points above rather than a failure: mooDesk records failures, not decisions.

Symptoms ​

Each table reads what you see → the usual cause → where to confirm it → what to do. Where a cause is documented elsewhere, the link is the fix.

Installation and upgrade ​

SymptomUsual causeConfirmDo
The plugin is not listed, or Moodle refuses to install itMoodle below 4.5 — mooDesk requires itSite administration → Notifications names the requirementUpgrade Moodle first; see Installation → System requirements
mooDesk appears in the navigation but every page errorsThe upgrade did not complete — tables or roles missingPlugins overview shows a status other than Up to dateRun Site administration → Notifications to completion, then read the web server's error log
Nothing in the Administration group of mooDesk's sidebarThe user has no management capabilityCheck system permissionsEntries appear per capability; the Manager archetype holds them by default
After an upgrade, a page is blank or styled wronglyCached templates or JavaScriptReproduce in a private windowSite administration → Development → Purge all caches
The mooDesk Agent role is missingIt is seeded only by a fresh install; deleted roles are not recreatedDefine rolesRecreate it by hand with the capabilities listed in Configuration → Roles, or reinstall

Licence and editions ​

SymptomUsual causeConfirmDo
A Pro or Enterprise screen shows an upgrade prompt on a licensed siteThe key is refused, so the site is StartermooDesk → License shows a verdict other than validRead the verdict: malformed, forged, untrusted_key, expired, revoked, site_mismatch, an earlier licence format, or no valid agent capacity. Each is explained in Configuration → License
The site runs as Starter right after upgrading to 2.37.0The licence was issued before 2.37.0, which replaced the licence signing keyThe verdict says untrusted_keyContact support@moodesk.io for a re-issued licence and paste it under Licence key. Nothing was deleted: Pro and Enterprise data comes back with a valid key. See the 2.37.0 upgrade notes
It worked yesterday; today it is StarterThe key expired, or the revocation list now lists itThe verdict says expired or revokedContact support@moodesk.io for a renewed key; paste it under Licence key, which revalidates on save
site_mismatch on a site that has the right keyThe key was issued for another URL — a staging copy of production is the usual caseThe verdict names itA key is bound to one site URL; staging needs its own
License status reads This licence was issued for an earlier licence format and is not accepted by this version of mooDesk. Ask digitalMood for a replacement licence — running as StarterThe licence was issued in the format used before 2.39.0, which 2.39.0 no longer acceptsThe message names itContact support@moodesk.io for a replacement licence and paste it under Licence key. Nothing was deleted and every agent is kept. See Installation → Upgrading to 2.39.0
License status reads This licence does not state a valid agent capacity for its plan. Ask digitalMood for a replacement licence — running as StarterThe licence does not state an agent capacity its plan allows (Pro 10, 15, 20 or 25; Enterprise 50 to 1000 in steps of 25)The message names itContact support@moodesk.io for a replacement licence. Nothing was deleted and every agent is kept in the meantime
Agent limit exceeded on License and System Health, with No agent has been removed. New agents cannot be added until the count is back under the capacity.More active agents than the capacity on the licence — for example after an upgrade, a licence with a smaller capacity, or agents given the role through Moodle's own screensThe Agents row shows the active agents above the capacity, for example 12 / 10 agentsEvery agent is kept and keeps working, but none can be added. Get a licence with the capacity you need, or bring the count under the capacity — Configuration → Agents
The revocation check never runsOutbound HTTPS blocked, or revocation_enabled offTask log of refresh_revocation_listAllow licenses.moodesk.io — Installation → Network and privacy
sync_license runs and does nothingExpected: the task is registered but performs no work in this release—Nothing; see Configuration → Known limitations

Permissions and visibility ​

SymptomUsual causeConfirmDo
An agent sees only their own ticketsThe account has viewown but not viewall — it is not in the mooDesk Agent roleCheck system permissionsAdd the agent through mooDesk → Agents, which assigns the role; do not assign viewall alone
An agent cannot reply, or cannot add a noteMissing reply / addnote, or the ticket is merged into another and read-onlyThe ticket shows the merge bannerContinue on the target ticket; see Features → Merging duplicates
A site administrator cannot be assigned a ticketAdministrators are not agents unless they hold local/moodesk:agentmooDesk → AgentsAdd them as an agent if they should take tickets
A ticket cannot be assigned to a particular agentThe ticket belongs to a department the agent is not a member ofmooDesk → Departments → membersAdd the agent to the department, or move the ticket
Requesters cannot open ticketslocal/moodesk:submit removed from Authenticated user, or the default category is missing or inactiveCheck system permissions; Site administration → Plugins → Local plugins → mooDesk → Default categoryRestore the capability; set an active default category — Configuration → Categories
Nobody can see a knowledge base articleIt is a draft or archived, it is Agents only, or the reader's language has no translation and the fallback is another rowOpen it as an editor: status, audience and translations are on the articlePublish it; set the audience; add the translation — Features → Knowledge base

Notifications ​

mooDesk never sends mail itself: every notification goes through Moodle messaging, and every operator alert too. Three providers carry them — Ticket notification, Email ingestion alert, Operational alert — described in Configuration → Notifications.

SymptomUsual causeConfirmDo
No notification of any kind reaches anyoneMoodle's outgoing mail is not configured, or cron is not runningSite administration → Server → Email → Test outgoing mail configuration; scheduled tasks Last runFix Moodle's mail first; nothing in mooDesk can work around it
One user gets nothing, others doThe user disabled the provider under Preferences → Notification preferences, or the provider's site default is offTheir preferences; Site administration → Messaging → Notification settingsRe-enable the mooDesk rows; site defaults are per provider
The notification arrives, but lateMoodle sends through cron and the user's digest settingsDigest setting in the user's preferencesExpected behaviour of Moodle messaging
A specific notification never firesIts switch is off, or the event does not notify by design — internal notes, priority and status changes notify nobodyConfiguration → NotificationsTurn the switch on; the four events are the only ones
System Health shows observer.<event>.failedThe sending threw — usually a messaging or mail failure — and nothing retries it: that notification is lostThe incident's message (redacted)Fix the underlying failure; the next event sends normally
Operator alerts never arrive although incidents existThe incident is below Alert from severity, is inside the cooldown, or was acknowledged; or the recipients list names an ID that is not a userOperator alerts and retentionLower the threshold to warning while diagnosing; verify the user IDs
The CSAT invitation is not receivedThe ticket never reached the trigger status, or the requester silenced Ticket notification; it is sent once per ticket, never on a later transitionThe requester's own ticket page shows a How did we do? card while the invitation is openConfiguration → CSAT

Email ingestion and reply by email Pro ​

The mailbox is polled by the process_incoming_email task every 5 minutes. Every message ends in one of the outcomes listed in Integrations → Outcomes; the task log counts them per run. Provider-specific pitfalls (app passwords, IMAP switched off, OAuth 2.0 on Google and Microsoft 365) are under Provider notes.

SymptomUsual causeConfirmDo
No mail becomes a ticket, System Health reads A source is downThe connection, login or folder select failed: wrong host, port or password, IMAP disabled at the provider, a certificate rejected, a server without STARTTLS while Connection security is STARTTLS, or a firewallIncident email_ingestion.imap.poll_failed. Its message names the cause: the connection refused, the certificate rejected, no STARTTLS, or the server's answer to a failed login, with the password removed. Before 2.38.1 a certificate rejected on an SSL/TLS mailbox read only IMAP connect failed: (0)Fix the mailbox settings; the next poll clears it. See Integrations → Connect the mailbox
No mail becomes a ticket, System Health reads A source is down with an email_ingestion.oauth2.* incidentThe mailbox is set to OAuth 2.0 and cannot sign inThe incident code, belowFollow the remedy for that code in the incident reference
No mail becomes a ticket, System Health is greenThe task is disabled, cron is not running, or no new mail has arrived in the polled folder. Mail that was moved out of the folder or deleted before a poll is not seenTask log of process_incoming_email: no runs, or 0 outcomesFirst checks; check the folder name, and that no rule or other client moves mail out of it
The settings page warns that the mailbox is polled without encryptionConnection security is NoneSystem Health, Mailbox connection: Not encryptedChoose SSL/TLS or STARTTLS, with the port your provider gives for it (usually 993 or 143)
Old mail in the folder never became ticketsThe first poll of a folder reads only the last 14 days, and leaves alone a message that was already there without a Message-ID (rescan_skipped_no_message_id)Task log of the first runExpected. Forward any message you still need to the mailbox, so it arrives as new mail. See How mooDesk reads the mailbox
Mail arrives in mooDesk late, for up to three pollsOne message keeps failing with a transient error. The poll stops at it so nothing is skipped, and after three polls in a row it moves to the retry listTask log: error counted on consecutive runs; the matching incident (email_ingestion.parse.failed or email_ingestion.route.failed)It clears by itself once the message is set aside. If it recurs, report it with the sanitised headers
A sender's mail is refused and the operators get an alertThe sender is not an active Moodle user (unknown_sender_rejected), or Inbound sender authentication is on Require and the verdict was not a pass (sender_unverified_rejected)Task log; the alert names the outcomeThe sender needs a Moodle account with that address; or review the strict policy — Integrations → Sender authentication
Every new ticket by mail is refused since Require was turned onThe provider profile cannot read a verdict on this mailboxIncident email_ingestion.ticket.sender_auth_unreadableChoose the right profile, or step back from Require — the policy does not change itself
Replies by mail are refused, new tickets workReply authentication is Require token and the message carried none (token_required), or the token did not verify (token_invalid), or a valid token came from another address (token_sender_mismatch)Task log outcome; matching email_ingestion.reply.* incidentIntegrations → Modes and the round-trip check
Replies are refused and an error incident says the address is unprovenRequire token is on but the round-trip probe for the current reply address never came backIncident email_ingestion.reply.token_address_unprovenFix the reply address and run the probe again. See Modes and the round-trip check
A reply by mail lands as a new ticketThreading failed: the reply link was stripped by the mail client, or the mode is Legacy with its limits. On a site installed fresh before 2.38.1, notifications also used the no-reply address: the site had no key to sign reply addressesIntegrations → Modes; the Reply-To of a notification is the no-reply address instead of support+…Ask the sender to reply to the notification unedited; prefer token mode. Upgrade to 2.38.1 or later, which creates the missing key
The same mail creates two ticketsSent twice outside the deduplication window (300 s by default)Task log shows two ticket_createdRaise email_dedup_window if your provider re-delivers — Operator alerts and retention
One message never becomes a ticketIt cannot be parsed (email_ingestion.parse.failed: retried, then set aside on the retry list), it cannot be stored (email_ingestion.message.unprocessable, set aside for good), or it was abandoned from a full retry list (email_ingestion.cursor.retry_abandoned)Matching incidentAsk the sender to send it again; if it recurs, report it with the sanitised headers
A large message never becomes a ticketIt is over Maximum message size (50 MB by default) and was not downloadedIncident email_ingestion.message.oversized, with the message size and the limitAsk the sender to send it again within the limit. Raising the limit does not bring back a message already recorded
An attachment is missing from a ticket created by mailAbove the size limit — skipped, noted in the task log, no incident — or file storage refused itTask log line exceeds max … skipped; or incident email_ingestion.attachment.store_failed. The ticket itself was createdAsk for a smaller file; or check Moodle's data directory
The sender was refused but received no bounceSending the bounce failedIncident email_ingestion.bounce.send_failed — same root cause as NotificationsFix outgoing mail

Webhooks Enterprise ​

Deliveries leave through the dispatch_webhook task every minute, through Moodle's HTTP client, with 5 attempts and the timeouts described in Integrations → Delivery, retries and the log.

SymptomUsual causeConfirmDo
Nothing is ever deliveredCron not running, the task disabled, or the webhook pausedTask log of dispatch_webhook; the webhook's Active stateFirst checks
Every attempt fails with a transport errorThe host or port is blocked by Moodle's HTTP security settings, DNS does not resolve from the server, or the certificate is not valid — mooDesk verifies TLS and follows no redirectsDelivery log: the error text of the attemptSite administration → Security → HTTP security (blocked hosts, allowed ports); use a valid certificate; give the final URL
Attempts time outThe endpoint answers in more than 5 secondsDelivery logAcknowledge fast, process later
Deliveries stop after five failures and an incident appearsExpected: the row is abandoned after the fifth attemptIncident webhook.delivery.abandoned, one per webhookFix the endpoint, then Resolve. Abandoned deliveries are not replayed
Deliveries fail permanently right after editing the webhookThe webhook was disabled or deleted while rows were pending — they fail permanentlyDelivery logExpected; re-enable before the queue drains next time
The receiver rejects the signatureThe secret was rotated in mooDesk and the receiving end still has the old one, or the receiver computes the signature over a re-serialised bodyIntegrations → Verifying the signatureRotate the secret again and configure the new one on the receiving end straight away; it is shown once
Deliveries arrive without an X-Signature-256 headerThe webhook was created before 2.33.0 without a secret: the list marks it UnsignedThe webhook listUse Rotate secret on its edit page, and configure the new secret on the receiving end
An event you expected never appears in the logThe webhook is not subscribed to it, or the event does not exist — there is no assignment eventIntegrations → Events and payloadSubscribe; watch ticket.updated for the other fields
webhook.enqueue.failed or webhook.queue.row_failedA database failure while queuing or processing — the event for that subscription is lostThe incident's exception_classCheck the database and Moodle's error log; report if it recurs

Scheduled tasks and cron ​

SymptomUsual causeConfirmDo
SLA breaches are flagged up to an hour lateExpected: check_sla_breaches runs hourly; the SLA badge on the ticket is computed live, the breach event and its notification are notTask scheduleRun the task more often from Moodle's task list if the hour matters
Resolved tickets never close by themselvesautoclose_resolved_days is 0 (the default), or the task is disabled; it runs daily at 02:00Configuration → AutomationSet the number of days
A task shows a Fail delay that keeps doublingThe task throws on every run; Moodle backs offTask log for the exception; System Health for a matching incidentFix the cause; Clear fail delay on the task
scheduled_task.check_sla.ticket_failed / scheduled_task.autoclose.ticket_failedOne ticket failed inside the task; the run continued with the othersThe incident's ticketidOpen that ticket; the message says what threw
A retention sweep never runsDisabled, or the site's cron does not reach the early-morning slotsLast run on purge_incidents, purge_webhook_log, purge_email_audit, purge_kb_events, purge_merge_snapshotsRun cron continuously; the sweeps are spread between 04:20 and 05:50
An automation rule never firesIts trigger is time_elapsed, which is stored and never evaluated in this releaseConfiguration → Known limitationsUse an event trigger

REST API Enterprise ​

Every API error is an entry in API → Errors, and the checks a call passes are in API → How a call is authorised. Since 2.34.0 a call without a token issued from mooDesk's API tokens page is refused with api_token_unmanaged. The two reports that are not API errors:

SymptomUsual causeDo
You are not allowed to use the rest protocolThe token's owner lacks webservice/rest:use, which no Moodle role holds by defaultAPI → Before you start
The Generate token form is missing from the API tokens pageThe site is not EnterpriseLicence and editions

Knowledge base ​

SymptomUsual causeConfirmDo
A published article is not found by mooDesk's own searchmooDesk's search is a live query, not an index: the article is not published, is Agents only, is in another language, or the words are not in its title or bodyOpen the article as an editorFeatures → Knowledge base
A published article is missing from Moodle's global searchGlobal search has not indexed it yet, or a deleted article's document stayed behindSite administration → Plugins → Search → Manage global search; incident kb.search_index.remove_failed for a stale hitRun the global search indexer
Analytics show no dataEvents are recorded per view, vote and search; the report covers at most 90 days and is a Pro featureIncident kb.analytics.record_failed if writes failFeatures → Knowledge base
A translation shows the wrong languageThe reader's Moodle language has no row and the fallback chain picked another; the notice says soArticle translationsAdd the translation

Interface errors ​

An action in mooDesk's interface that fails unexpectedly shows a generic message in the browser and records the detail — class, file and line — as an incident on System Health under Interface (ajax.<action>.unexpected). This is deliberate: a database error or a library exception can quote SQL, paths or hostnames, and those belong to the operator, not to the page. If a user reports "an unexpected error", open System Health before asking them to reproduce it.

Rule refusals — a merge that is not allowed, a ticket out of reach, a missing field — are shown as they are and record nothing.

Incident reference ​

Every code mooDesk can write to System Health in 2.39.0, by source. Retried says whether mooDesk itself will try the failed operation again; where it says no, the fix is on you and the operation has to be redone by hand (or will simply happen next time the event occurs).

Notifications and automation (observer) ​

All error, none retried. <event> is one of ticket_created, ticket_replied, ticket_assigned, ticket_sla_breached, ticket_merged, csat_on_status_changed, rule_on_ticket_created, rule_on_status_changed, rule_on_sla_breached, webhook_on_ticket_created, webhook_on_status_changed, webhook_on_ticket_replied, webhook_on_field_changed, webhook_on_ticket_merged, webhook_on_merge_reverted.

CodeWhat did not happenContext
observer.<event>.failedThe notification, CSAT invitation, automation rule or webhook enqueue that this event should have triggered. The ticket action itself succeeded.ticketid, exception_class

Email ingestion (email_ingestion) ​

CodeSeverityMeaningRetried
email_ingestion.imap.poll_failedcriticalConnecting, logging in or selecting the folder failed, so no mail is being read at all. The message names the causeNext poll
email_ingestion.oauth2.not_readycriticalOAuth 2.0 cannot work as configured: no service chosen, a service disabled or without a client, not Google or Microsoft, a Microsoft service not set up for mail, a Moodle version too old for Microsoft 365 (below 4.5.5 / 5.0.1), no system account connected, or one connected before the mailbox chose the service. Do: read the warning on the email ingestion settings page; it names the problemNext poll
email_ingestion.oauth2.token_refresh_failedcriticalThe provider refused to renew the access token: the app was removed from the account, the password changed, or a policy changed. Do: connect the system account of the OAuth 2 service againNext poll
email_ingestion.oauth2.blocked_by_policycriticalThe provider's administrator blocks the app for the mailbox account. Do: reconnecting does not help; an administrator of the Google Workspace or Microsoft 365 tenant must allow the appNext poll
email_ingestion.oauth2.auth_rejectedcriticalThe mail server refused a freshly renewed token. Do: check that IMAP is enabled for the mailbox, that Mailbox username is the address the token was issued for (or a shared mailbox the system account has full access to), and the tenant's policies. The server's answer is in the incidentNext poll
email_ingestion.parse.failedwarningOne message could not be parsedYes, see the retry list below
email_ingestion.route.failederrorDeciding what a message is (new ticket or reply) threw, or the database refused a write for a moment (a lock, a deadlock, a read-only database; since 2.38.1)Yes, see the retry list below
email_ingestion.message.unprocessableerrorOne message cannot be stored (headers beyond the schema, or a write refused for a reason that will not change). It was marked as processedNo
email_ingestion.message.oversizederrorOne message is larger than Maximum message size and was not downloaded. Its headers are recorded and it was marked as processed. Do: ask the sender to send it again within the limitNo
email_ingestion.cursor.retry_abandonederrorThe retry list was full (20 messages), so its oldest message was given upNo
email_ingestion.cursor.uidvalidity_changedwarningThe server renumbered the folder (for example after a restore), so it is being re-scanned once, 14 days back—
email_ingestion.ticket.sender_auth_unreadableerrorRequire is on and no usable provider profile, or a verdict the profile cannot read: new tickets by mail are being refusedEach message
email_ingestion.ticket.sender_unverifiedwarningOne new-ticket mail was refused because the receiving server did not authenticate its senderNo
email_ingestion.reply.token_requiredwarningA reply carried no conversation token and the site requires oneNo
email_ingestion.reply.token_invalidwarningA reply's token did not verifyNo
email_ingestion.reply.token_sender_mismatchwarningA valid token, sent from another user's addressNo
email_ingestion.reply.token_address_unprovenerrorRequire token is on but no probe has confirmed the current reply address: replies are being refusedEach message
email_ingestion.reply.unauthorisedwarningThe sender may not write to the ticket they answeredNo
email_ingestion.attachment.store_failedwarningThe ticket or reply was created; one attachment could not be storedNo
email_ingestion.alert.send_failedwarningThe operator alert about a refusal could not be sentNo
email_ingestion.bounce.send_failedwarningThe bounce telling a sender their mail was refused could not be sentNo

A transient failure stops the poll at that message, and it is retried on the next poll. After three polls in a row it moves to a retry list of up to 20 messages, retried first on every poll, and the poll moves past it.

Webhooks (webhook) ​

CodeSeverityMeaningRetried
webhook.enqueue.failederrorWriting the queue row for one subscription failed; that event is lost for that webhookNo
webhook.queue.row_failederrorProcessing one queue row threw; the row stays in the queue untouchedNo
webhook.delivery.abandonederrorA delivery was given up: five failed attempts, or the webhook was disabled or deleted meanwhile. One incident per webhook; the message says whichNo

Scheduled tasks (scheduled_task) ​

CodeSeverityMeaningRetried
scheduled_task.check_sla.ticket_failederrorThe hourly SLA check failed on one ticket and continued with the restNext run
scheduled_task.autoclose.ticket_failederrorThe daily auto-close failed on one ticket and continued with the restNext run

Knowledge base (knowledge_base) ​

CodeSeverityMeaningRetried
kb.search_index.remove_failedwarningRemoving a deleted article's document from Moodle's global search failed; a stale hit may remain until the index is rebuiltNo
kb.analytics.record_failedwarningOne analytics event (view, vote, search, suggestion) could not be written; the report will under-count itNo

Interface (ui) ​

CodeSeverityMeaningRetried
ajax.<action>.unexpectederrorAn interface action failed with something other than a rule refusal; the user saw a generic message, the detail is hereNo

Before you report a bug ​

Open an issue with the bug report form — the channel is described on Support. What makes a report answerable:

  • Versions: mooDesk (Plugins overview), Moodle, PHP, database. The edition as shown on mooDesk → License.
  • The incident: the code, severity, first/last seen and occurrences from System Health, and its message as shown there — it is already redacted.
  • The task log line for the run in question, when a scheduled task is involved.
  • Steps to reproduce, and what you expected instead.

Sanitise before posting

Issues are public. Never paste a licence key, an API token, a mailbox password, a webhook secret, an email address, a real user's name or ID, or a hostname of your own. System Health messages are redacted for you; task logs, delivery logs and error logs are not — replace addresses, hostnames and IDs before attaching them.


Verified against mooDesk 2.39.0.

mooDesk is a product by digitalMood.
mooDesk is an independent third-party plugin and is not affiliated with or endorsed by Moodle HQ.
Moodle® is a registered trademark of Moodle Pty Ltd.

mooDesk is a product by digitalMood.
mooDesk is an independent third-party plugin and is not affiliated with or endorsed by Moodle HQ.
Moodle® is a registered trademark of Moodle Pty Ltd.