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
- 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.
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
- 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.
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
- Email trigger inputs are required
- OAuth2 auth config not found
- Workspace DB not found - self-host users using cloud don't h
- CouchDB username not set
- CouchDB password not set
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/d7f3d80b14c772a8.
Report an issue: GitHub.