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

  1. Upload/renew a valid Mattermost Enterprise license in System Console > Edition and License
  2. Verify the license includes the Boards/Plugins entitlement needed
  3. 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

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


AI-assisted analysis of mattermost-community/focalboard@a84bbb65e3 (2026-08-30). Data as JSON: /api/errors/d68a3d4d9508bea3. Report an issue: GitHub.