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

  1. In Dashboard > Project Settings > App Store / Plugins, install and activate an Email plugin (SMTP or MailerSend), filling host/port/credentials.
  2. Verify the nc_plugins row for the email plugin has active=true.
  3. If you only need user invites, call emailAdapter with isUserInvite=true (returns null gracefully) or surface the invite link.
  4. 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

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


AI-assisted analysis of nocodb/nocodb@d3caaf4e89 (2026-08-12). Data as JSON: /api/errors/cb4626042b58818a. Report an issue: GitHub.