mattermost-community/focalboard · error
appropriate license required
Error message
appropriate license required
What it means
ErrInsufficientLicense is a sentinel error meaning the operation requires a license that is not present or does not cover the feature. Board metadata and other licensed features call the plugin API's license checks and return this error when the check fails. It indicates an entitlement problem, not a bug in the request.
Source
Thrown at server/model/error.go:19
package model
import (
"database/sql"
"errors"
"fmt"
"net/http"
"strings"
mmModel "github.com/mattermost/mattermost/server/public/model"
pluginapi "github.com/mattermost/mattermost/server/public/pluginapi"
)
var (
ErrViewsLimitReached = errors.New("views limit reached for board")
ErrPatchUpdatesLimitedCards = errors.New("patch updates cards that are limited")
ErrInsufficientLicense = errors.New("appropriate license required")
ErrCategoryPermissionDenied = errors.New("category doesn't belong to user")
ErrCategoryDeleted = errors.New("category is deleted")
ErrBoardMemberIsLastAdmin = errors.New("cannot leave a board with no admins")
ErrRequestEntityTooLarge = errors.New("request entity too large")
ErrInvalidBoardSearchField = errors.New("invalid board search field")
)
// ErrNotFound is an error type that can be returned by store APIs
// when a query unexpectedly fetches no records.
type ErrNotFound struct {
entity string
}
// NewErrNotFound creates a new ErrNotFound instance.View on GitHub (pinned to a84bbb65e3)
Solutions
- Upload/renew a valid Mattermost Enterprise license in System Console > Edition and License
- Verify the license includes the Boards/Plugins entitlement needed
- If the feature is not needed, avoid calling the licensed endpoint or degrade gracefully
Example fix
// before
meta, err := app.GetBoardMetadata(boardID)
// after
meta, err := app.GetBoardMetadata(boardID)
if errors.Is(err, model.ErrInsufficientLicense) {
// fall back to unlicensed behavior or prompt admin to license
} Defensive patterns
Strategy: type-guard
Validate before calling
license := pluginAPI.License.Get()
if license == nil || !license.Features.Boards {
// avoid calling licensed endpoints; degrade gracefully
} Type guard
func isLicenseErr(err error) bool {
return errors.Is(err, model.ErrInsufficientLicense)
} Try / catch
meta, err := app.GetBoardMetadata(boardID)
if errors.Is(err, model.ErrInsufficientLicense) {
return nil // render unlicensed UI instead of failing
} Prevention
- Check license presence at startup and surface it to admins
- Set alerts before license expiry
- Gate licensed features behind capability checks
When it happens
Trigger: Calling GetBoardMetadata (or any licensed API) on an unlicensed/free Mattermost install, or with a license that expired or lacks the Boards entitlement; IsErrNotImplemented maps it to HTTP 501.
Common situations: License expired after renewal lapse; license file not uploaded after upgrade; on-prem install without the required Enterprise license; local dev environments without a trial license.
Related errors
- views limit reached for board
- patch updates cards that are limited
- block fields size limit exceeded
- at least one board is required
- at least one block is required
AI-assisted analysis of mattermost-community/focalboard@a84bbb65e3 (2026-08-30).
Data as JSON: /api/errors/d68a3d4d9508bea3.
Report an issue: GitHub.