RocketChat/Rocket.Chat · error · Error

app-addon-not-valid

app-addon-not-valid

Error message

app-addon-not-valid

What it means

The app being enabled declares an addon (app.info.addon) that names a licensed module, and the current license does not include that module (License.hasModule returns false). Apps tagged as requiring an add-on cannot be enabled without it. Apps marked migrated (installed before validation existed) are exempt.

Solutions

  1. Apply a license that includes the app's required module (Administration -> License)
  2. Request a trial/evaluation license that covers the add-on
  3. If the app should not require the module, fix its info.addon declaration and rebuild/re-publish the app
Defensive patterns

Strategy: validation

Validate before calling

import { License } from '@rocket.chat/license';

const requiredModule = app.info.addon;
if (requiredModule && !License.hasModule(requiredModule)) {
	// show 'module not licensed' notice and skip the enable call
}

Try / catch

try {
	await Apps.enableApp(appId);
} catch (err) {
	if (err instanceof Error && err.message === 'app-addon-not-valid') {
		// surface license/upgrade prompt for the app's add-on
	} else {
		throw err;
	}
}

Prevention

When it happens

Trigger: Enabling a marketplace or private app whose info declares an addon on a workspace whose license lacks that module; e.g. after a trial including the module expires.

Common situations: Trial license lapsed; app updated to require a new paid add-on; license downgraded to a tier without the module.

Related errors


AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18). Data as JSON: /api/errors/9cafc33e00ad0a0a. Report an issue: GitHub.

Appendix: source

Thrown at apps/meteor/ee/server/lib/license/canEnableApp.ts:25

type _canEnableAppDependencies = {
	Apps: typeof Apps;
	License: LicenseImp;
};

export const _canEnableApp = async ({ Apps, License }: _canEnableAppDependencies, app: IAppStorageItem): Promise<void> => {
	if (!(await Apps.isInitialized())) {
		throw new Error('apps-engine-not-initialized');
	}

	// Migrated apps were installed before the validation was implemented
	// so they're always allowed to be enabled
	if (app.migrated) {
		return;
	}

	if (app.info.addon && !License.hasModule(app.info.addon as LicenseModule)) {
		throw new Error('app-addon-not-valid');
	}

	const source = getInstallationSourceFromAppStorageItem(app);
	switch (source) {
		case 'private':
			if (await License.shouldPreventAction('privateApps')) {
				throw new Error('license-prevented');
			}

			break;
		default:
			if (await License.shouldPreventAction('marketplaceApps')) {
				throw new Error('license-prevented');
			}

			const marketplaceInfo = app.marketplaceInfo?.[0];
			if (marketplaceInfo?.isEnterpriseOnly && !License.hasValidLicense()) {
				throw new Error('invalid-license');

View on GitHub (pinned to b2c16d5842)