{"record":{"id":"d7f3d80b14c772a8","repo":"Budibase/budibase","slug":"unable-to-find-action-implementation-for-stepid","errorCode":null,"errorMessage":"Unable to find action implementation for \"${stepId}\"","messagePattern":"Unable to find action implementation for \"(.+?)\"","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/server/src/automations/actions.ts","lineNumber":185,"sourceCode":"\n/* istanbul ignore next */\nexport async function getAction<\n  TStep extends AutomationActionStepId,\n  TInputs = AutomationStepInputs<TStep>,\n  TOutputs = AutomationStepOutputs<TStep>,\n>(stepId: TStep): Promise<ActionImplementation<TInputs, TOutputs> | undefined> {\n  if (ACTION_IMPLS[stepId as keyof ActionImplType] != null) {\n    return ACTION_IMPLS[\n      stepId as keyof ActionImplType\n    ] as unknown as ActionImplementation<TInputs, TOutputs>\n  }\n\n  // must be a plugin\n  if (env.SELF_HOSTED) {\n    const plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)\n    const found = plugins.find(plugin => plugin.schema.schema.stepId === stepId)\n    if (!found) {\n      throw new Error(`Unable to find action implementation for \"${stepId}\"`)\n    }\n    return (await getAutomationPlugin(found)).action\n  }\n}\n","sourceCodeStart":167,"sourceCodeEnd":190,"githubUrl":"https://github.com/Budibase/budibase/blob/a81a902e9a8fe55b467d106765f6638f12e35c49/packages/server/src/automations/actions.ts#L167-L190","documentation":"getAction resolves an automation step's implementation. After checking built-in actions, it treats the stepId as a plugin, but only when SELF_HOSTED is enabled. In self-host mode, if no fetched automation plugin matches the stepId, a plain Error naming the step is thrown; in non-self-host mode the function falls through, which also surfaces as a missing implementation downstream.","triggerScenarios":"An automation definition references a plugin stepId that is not installed, or a built-in stepId that this build no longer registers; plugin installed on one environment but missing on another; SELF_HOSTED disabled where plugins are expected.","commonSituations":"Migrating apps between environments where custom automation plugins are not installed; renamed/removed plugin step IDs after upgrade; running pro/cloud builds while importing an app that uses self-hosted plugins.","solutions":["Install the automation plugin whose schema.stepId matches the missing stepId in the environment.","Re-upload the plugin package via the builder/admin plugin management for the self-hosted instance.","Update the automation to use a built-in action if the plugin is no longer available.","Confirm env.SELF_HOSTED is set correctly for the deployment."],"exampleFix":"// before (plugin missing on target env)\n// after: install plugin then verify\nconst plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)\nif (!plugins.some(p => p.schema.schema.stepId === \"my_custom_step\")) {\n  throw new Error(\"Install plugin my_custom_step before running automation\")\n}","handlingStrategy":"validation","validationCode":"const plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)\nif (!plugins.some(p => p.schema.schema.stepId === stepId) && !BUILTIN_ACTIONS.includes(stepId)) {\n  throw new Error(`Automation step \"${stepId}\" unavailable: plugin not installed`)","typeGuard":"const pluginInstalled = (plugins: Plugin[], stepId: string): boolean =>\n  plugins.some(p => p.schema.schema.stepId === stepId)","tryCatchPattern":"try {\n  const action = await getAction(stepId)\n} catch (e) {\n  if (/Unable to find action implementation/.test(e.message)) {\n    // surface a message telling the admin to install the plugin\n  } else throw e\n}","preventionTips":["Install all custom automation plugins on every environment before importing apps.","Export/backup plugin packages with app migrations.","Track plugin step IDs used in automations and validate on deploy.","Keep SELF_HOSTED and plugin registry configuration consistent across environments."],"tags":["automation","plugin","self-hosted","configuration"],"backgroundTag":"missing-plugin","analyzedSha":"a81a902e9a8fe55b467d106765f6638f12e35c49","analyzedAt":"2026-08-29T01:03:10.972Z","schemaVersion":2},"datasetVersion":"2026-08-29T02:17:18.158Z"}