Budibase/budibase · error · HTTPError

Automations cannot have more than ${MAX_STICKY_NOTES_PER_AUT

Error message

Automations cannot have more than ${MAX_STICKY_NOTES_PER_AUTOMATION} sticky notes

What it means

Automations support UI sticky notes, capped at MAX_STICKY_NOTES_PER_AUTOMATION. validateStickyNoteLimit runs on both create and update and throws this 400 HTTPError when automation.uiTree.stickyNotes exceeds the limit.

Source

Thrown at packages/server/src/sdk/workspace/automations/crud.ts:322

      const readonlyField = key as keyof typeof step.inputs
      const oldStep = oldStepDefinitions.find(i => i.id === step.id)
      if (step.inputs[readonlyField] !== oldStep?.inputs[readonlyField]) {
        throw new HTTPError(
          `Field ${readonlyField} is readonly and it cannot be modified`,
          400
        )
      }
    })
  }
}

function validateStickyNoteLimit(automation: Automation) {
  const stickyNotes = automation.uiTree?.stickyNotes
  if (
    Array.isArray(stickyNotes) &&
    stickyNotes.length > MAX_STICKY_NOTES_PER_AUTOMATION
  ) {
    throw new HTTPError(
      `Automations cannot have more than ${MAX_STICKY_NOTES_PER_AUTOMATION} sticky notes`,
      400
    )
  }
}

function trimUnexpectedObjectFields<T extends Automation>(automation: T): T {
  // This will ensure all the automation fields (and nothing else) is mapped to the result
  const allRequired: RequiredKeys<Omit<Automation, "_deleted">> = {
    _id: automation._id,
    _rev: automation._rev,
    definition: automation.definition,
    screenId: automation.screenId,
    uiTree: automation.uiTree,
    appId: automation.appId,
    live: automation.live,
    projectIds: automation.projectIds,
    name: automation.name,

View on GitHub (pinned to a81a902e9a)

Solutions

  1. Remove sticky notes until the count is at or below MAX_STICKY_NOTES_PER_AUTOMATION and retry.
  2. Consolidate overlapping notes into fewer notes before saving.
  3. If importing, strip or trim the stickyNotes array from the imported JSON.

Example fix

// before
automation.uiTree.stickyNotes = [...manyNotes] // > limit
await update(automation)
// after
automation.uiTree.stickyNotes = automation.uiTree.stickyNotes.slice(0, MAX_STICKY_NOTES_PER_AUTOMATION)
await update(automation)
Defensive patterns

Strategy: validation

Validate before calling

const MAX = MAX_STICKY_NOTES_PER_AUTOMATION
if (Array.isArray(automation.uiTree?.stickyNotes) && automation.uiTree.stickyNotes.length > MAX) {
  automation.uiTree.stickyNotes = automation.uiTree.stickyNotes.slice(0, MAX)
}
await sdk.automations.update(automation)

Try / catch

try {
  await sdk.automations.update(automation)
} catch (e) {
  if (e instanceof HTTPError && e.status === 400 && e.message.includes("sticky notes")) {
    // trim stickyNotes and retry / inform the user of the cap
  }
  throw e
}

Prevention

When it happens

Trigger: Creating or updating an automation whose uiTree.stickyNotes array length is greater than MAX_STICKY_NOTES_PER_AUTOMATION.

Common situations: Bulk import/paste of an automation JSON with many notes; automation copy/duplicate accumulating notes; older clients without the limit create oversized canvases that now fail to save.

Related errors


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