Budibase/budibase · error · Error

Automation is disabled

Error message

Automation is disabled

What it means

`externalTrigger` is the entry point for API/webhook-initiated automation runs. Before doing anything it checks `automation.disabled`; if the automation has been disabled in the builder (or programmatically), it refuses to run and throws 'Automation is disabled'. This prevents external callers from firing automations that an admin explicitly turned off.

Source

Thrown at packages/server/src/automations/triggers.ts:216

}

export async function externalTrigger(
  automation: Automation,
  params: AutomationTriggerParams,
  options: ExternalTriggerOptions & { getResponses: true }
): Promise<AutomationResults | DidNotTriggerResponse>
export async function externalTrigger(
  automation: Automation,
  params: AutomationTriggerParams,
  options?: ExternalTriggerOptions & { getResponses?: false }
): Promise<AutomationJob | DidNotTriggerResponse>
export async function externalTrigger(
  automation: Automation,
  params: AutomationTriggerParams,
  { getResponses, onProgress, isTestRun }: ExternalTriggerOptions = {}
): Promise<AutomationResults | DidNotTriggerResponse | AutomationJob> {
  if (automation.disabled) {
    throw new Error("Automation is disabled")
  }

  const workspaceId = params.appId || context.getWorkspaceId()
  const isDevRun = workspaceId ? isDevWorkspaceID(workspaceId) : false
  const shouldRunAsTest = Boolean(isTestRun || isDevRun)

  if (
    sdk.automations.isAppAction(automation) &&
    !isTestRun &&
    !(await checkTestFlag(automation._id!))
  ) {
    if (params.fields == null) {
      params.fields = {}
    }

    // values are likely to be submitted as strings, so we shall convert to correct type
    const coercedFields: any = {}
    const triggerInputs = automation.definition.trigger.inputs || {}

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Re-enable the automation in the builder (toggle the automation's enabled/disabled state).
  2. Check via the API that automation.disabled is false before calling the trigger endpoint.
  3. Remove or update the external caller so it no longer invokes the disabled automation's webhook.

Example fix

// before: curl -X POST https://app.budi.live/api/automations/<id>/trigger
// after (in app code): if (automation.disabled) return; await api.post(`/automations/${id}/trigger`, params)
Defensive patterns

Strategy: try-catch

Validate before calling

// GET the automation first and check enabled state
const auto = await api.get(`/automations/${id}`)
if (auto.data.disabled) throw new Error(`Automation ${id} is disabled; re-enable before triggering`)

Try / catch

try {
  return await api.post(`/automations/${id}/trigger`, params)
} catch (err) {
  if (err.message === "Automation is disabled") {
    // alert admin / skip pipeline instead of failing hard
    return { skipped: true, reason: "automation-disabled" }
  }
  throw err
}

Prevention

When it happens

Trigger: POSTing to the automation trigger/webhook endpoint (/automations/{id}/trigger or a webhook URL) for an automation whose `disabled` flag is true; hitting a webhook whose backing automation was disabled after the webhook was created.

Common situations: An admin disabled a misbehaving automation but an external system (Zapier, cron, another app) still calls its webhook URL; importing an app export where the automation was disabled at export time; test scripts replaying recorded triggers against a disabled automation.

Related errors


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