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
- Apply a license that includes the app's required module (Administration -> License)
- Request a trial/evaluation license that covers the add-on
- 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
- Check app.info.addon against License.hasModule before showing an enable button
- Track license module coverage when installing apps that declare add-ons
- Re-validate add-on requirements after license renewals/downgrades
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
- invalid-license
- Failed to parse app.json
- license-prevented
- Marketplace_Invalid_Apps_Engine_Version
- No app.json file found in the zip
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)