nocodb/nocodb · error · Error
Plugin not configured / active
Error message
Plugin not configured / active
What it means
NcPluginMgrv2.emailAdapter (NcPluginMgrv2.ts:235) throws when called with isUserInvite=false (the webhook/email-send path) and no EMAIL-category plugin is active in nc_plugins. For user invites it returns null (so the UI can show an invite link instead of emailing), but for non-invite callers (e.g. webhook email delivery) the absence of a configured+active email adapter is a hard failure.
Source
Thrown at packages/nocodb/src/helpers/NcPluginMgrv2.ts:235
public static async emailAdapter(
isUserInvite = true,
ncMeta = Noco.ncMeta,
): Promise<IEmailAdapter> {
const pluginData = await ncMeta.metaGet2(
RootScopes.ROOT,
RootScopes.ROOT,
MetaTable.PLUGIN,
{
category: PluginCategory.EMAIL,
active: true,
},
);
if (!pluginData) {
// return null to show the invite link in UI
if (isUserInvite) return null;
// for webhooks, throw the error
throw new Error('Plugin not configured / active');
}
const pluginConfig = defaultPlugins.find(
(c) =>
c.title === pluginData.title && c.category === PluginCategory.EMAIL,
);
const plugin = new pluginConfig.builder(ncMeta, pluginData);
if (pluginData?.input) {
pluginData.input = JSON.parse(pluginData.input);
}
await plugin.init(pluginData?.input);
return plugin.getAdapter();
}
public static async webhookNotificationAdapters(
title: string,View on GitHub (pinned to d3caaf4e89)
Solutions
- In Dashboard > Project Settings > App Store / Plugins, install and activate an Email plugin (SMTP or MailerSend), filling host/port/credentials.
- Verify the nc_plugins row for the email plugin has active=true.
- If you only need user invites, call emailAdapter with isUserInvite=true (returns null gracefully) or surface the invite link.
- Test the plugin via the 'Test' button before relying on webhook email delivery.
Defensive patterns
Strategy: validation
Validate before calling
async function emailReady(ncMeta = Noco.ncMeta): Promise<boolean> {
const row = await ncMeta.metaGet2(RootScopes.ROOT, RootScopes.ROOT, MetaTable.PLUGIN,
{ category: PluginCategory.EMAIL, active: true });
return !!row;
}
if (!await emailReady()) {
// show invite link instead of attempting webhook email delivery
} Try / catch
try {
const adapter = await NcPluginMgrv2.emailAdapter(false);
await adapter.mail(...);
} catch (e) {
if (/not configured/i.test((e as Error).message)) {
// deactivate email webhooks or prompt admin to configure SMTP
} else throw e;
} Prevention
- Activate and test an Email (SMTP/MailerSend) plugin before relying on email webhooks.
- For invites, pass isUserInvite=true so the absence gracefully shows a link.
- Monitor nc_plugins active state after restore/migration.
When it happens
Trigger: A webhook or job that must send email calls emailAdapter(false, ...) while no SMTP/MailerSend email plugin has been activated in the UI. Also triggered if the active email plugin was deactivated or its row removed from nc_plugins.
Common situations: Fresh install where SMTP was never configured; admin deactivated the SMTP plugin; webhook configured to email on trigger but no mailer active; restoring a meta DB without plugin activation state.
Related errors
- Duplicate plugin ids found in default plugins: ${duplicateId
- Integration not configured properly
- Failed to encrypt all data sources, please remove invalid da
- Source not found
- Invalid old secret or no sources/integrations found
AI-assisted analysis of nocodb/nocodb@d3caaf4e89 (2026-08-12).
Data as JSON: /api/errors/cb4626042b58818a.
Report an issue: GitHub.