Budibase/budibase · error · Error

Unable to find action implementation for "${stepId}"

Error message

Unable to find action implementation for "${stepId}"

What it means

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.

Source

Thrown at packages/server/src/automations/actions.ts:185

/* istanbul ignore next */
export async function getAction<
  TStep extends AutomationActionStepId,
  TInputs = AutomationStepInputs<TStep>,
  TOutputs = AutomationStepOutputs<TStep>,
>(stepId: TStep): Promise<ActionImplementation<TInputs, TOutputs> | undefined> {
  if (ACTION_IMPLS[stepId as keyof ActionImplType] != null) {
    return ACTION_IMPLS[
      stepId as keyof ActionImplType
    ] as unknown as ActionImplementation<TInputs, TOutputs>
  }

  // must be a plugin
  if (env.SELF_HOSTED) {
    const plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)
    const found = plugins.find(plugin => plugin.schema.schema.stepId === stepId)
    if (!found) {
      throw new Error(`Unable to find action implementation for "${stepId}"`)
    }
    return (await getAutomationPlugin(found)).action
  }
}

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Install the automation plugin whose schema.stepId matches the missing stepId in the environment.
  2. Re-upload the plugin package via the builder/admin plugin management for the self-hosted instance.
  3. Update the automation to use a built-in action if the plugin is no longer available.
  4. Confirm env.SELF_HOSTED is set correctly for the deployment.

Example fix

// before (plugin missing on target env)
// after: install plugin then verify
const plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)
if (!plugins.some(p => p.schema.schema.stepId === "my_custom_step")) {
  throw new Error("Install plugin my_custom_step before running automation")
}
Defensive patterns

Strategy: validation

Validate before calling

const plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)
if (!plugins.some(p => p.schema.schema.stepId === stepId) && !BUILTIN_ACTIONS.includes(stepId)) {
  throw new Error(`Automation step "${stepId}" unavailable: plugin not installed`)

Type guard

const pluginInstalled = (plugins: Plugin[], stepId: string): boolean =>
  plugins.some(p => p.schema.schema.stepId === stepId)

Try / catch

try {
  const action = await getAction(stepId)
} catch (e) {
  if (/Unable to find action implementation/.test(e.message)) {
    // surface a message telling the admin to install the plugin
  } else throw e
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/d7f3d80b14c772a8. Report an issue: GitHub.