{"record":{"id":"cb4626042b58818a","repo":"nocodb/nocodb","slug":"plugin-not-configured-active","errorCode":null,"errorMessage":"Plugin not configured / active","messagePattern":"Plugin not configured / active","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/nocodb/src/helpers/NcPluginMgrv2.ts","lineNumber":235,"sourceCode":"  public static async emailAdapter(\n    isUserInvite = true,\n    ncMeta = Noco.ncMeta,\n  ): Promise<IEmailAdapter> {\n    const pluginData = await ncMeta.metaGet2(\n      RootScopes.ROOT,\n      RootScopes.ROOT,\n      MetaTable.PLUGIN,\n      {\n        category: PluginCategory.EMAIL,\n        active: true,\n      },\n    );\n\n    if (!pluginData) {\n      // return null to show the invite link in UI\n      if (isUserInvite) return null;\n      // for webhooks, throw the error\n      throw new Error('Plugin not configured / active');\n    }\n\n    const pluginConfig = defaultPlugins.find(\n      (c) =>\n        c.title === pluginData.title && c.category === PluginCategory.EMAIL,\n    );\n    const plugin = new pluginConfig.builder(ncMeta, pluginData);\n\n    if (pluginData?.input) {\n      pluginData.input = JSON.parse(pluginData.input);\n    }\n\n    await plugin.init(pluginData?.input);\n    return plugin.getAdapter();\n  }\n\n  public static async webhookNotificationAdapters(\n    title: string,","sourceCodeStart":217,"sourceCodeEnd":253,"githubUrl":"https://github.com/nocodb/nocodb/blob/d3caaf4e890acf64bd49b788cf6dc32b7644c895/packages/nocodb/src/helpers/NcPluginMgrv2.ts#L217-L253","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"async function emailReady(ncMeta = Noco.ncMeta): Promise<boolean> {\n  const row = await ncMeta.metaGet2(RootScopes.ROOT, RootScopes.ROOT, MetaTable.PLUGIN,\n    { category: PluginCategory.EMAIL, active: true });\n  return !!row;\n}\nif (!await emailReady()) {\n  // show invite link instead of attempting webhook email delivery\n}","typeGuard":null,"tryCatchPattern":"try {\n  const adapter = await NcPluginMgrv2.emailAdapter(false);\n  await adapter.mail(...);\n} catch (e) {\n  if (/not configured/i.test((e as Error).message)) {\n    // deactivate email webhooks or prompt admin to configure SMTP\n  } else throw e;\n}","preventionTips":["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."],"tags":["plugins","email","smtp","webhooks","configuration","typescript"],"backgroundTag":null,"analyzedSha":"d3caaf4e890acf64bd49b788cf6dc32b7644c895","analyzedAt":"2026-08-12T13:07:32.092Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}