windmill-labs/windmill · error

trigger kind '${trigger.kind}' requires Enterprise

Error message

trigger kind '${trigger.kind}' requires Enterprise

What it means

createWorkspaceTriggerDisabled rejects trigger kinds flagged `eeOnly` in TRIGGER_KINDS when the workspace has no Enterprise license (opts.hasEeLicense false). This enforces the licensing boundary during project installs — EE trigger kinds cannot be silently created on CE.

Source

Thrown at frontend/src/lib/components/triggers/workspaceTriggersList.ts:411

 * (schedules use `enabled: false`, every other kind uses `mode: 'disabled'`)
 * and are encoded here once so importers can't get them wrong.
 */
export async function createWorkspaceTriggerDisabled(
	workspace: string,
	trigger: {
		kind: string
		path: string
		script_path: string
		is_flow: boolean
		summary?: string | null
		config?: Record<string, any> | null
	},
	opts: { hasEeLicense: boolean }
): Promise<unknown> {
	const def = TRIGGER_KINDS[trigger.kind as WorkspaceTriggerKind]
	if (!def) throw new Error(`trigger kind '${trigger.kind}' not supported yet`)
	if (def.eeOnly && !opts.hasEeLicense) {
		throw new Error(`trigger kind '${trigger.kind}' requires Enterprise`)
	}
	if (def.provisionsOnCreate) {
		throw new Error(
			`${def.badge} triggers manage cloud subscriptions at creation — fill in the imported resource, then re-create this trigger manually`
		)
	}
	// Remote input: only the allowlisted portable slice may reach the create call.
	const config = portableTriggerConfig(trigger.kind, trigger.config)
	if (trigger.kind === 'schedule') {
		// Spread the portable config first so behavioral settings survive the
		// import (cron_version, retry, failure/recovery/success handlers,
		// no_flow_overlap, …) — restoring only cron+timezone would silently
		// change the schedule's semantics once re-enabled.
		return ScheduleService.createSchedule({
			workspace,
			requestBody: {
				...config,
				path: trigger.path,

View on GitHub (pinned to e474e8803c)

Solutions

  1. Obtain/apply an Enterprise license to the workspace, then retry the install.
  2. Remove or replace the EE-only trigger in the project template before installing on CE.
  3. Skip EE triggers during install on CE with a user-facing warning.
  4. Verify the license is actually active (check hasEeLicense resolution) if you believe you have EE.

Example fix

// before
await createWorkspaceTriggerDisabled(trigger, { hasEeLicense }) // throws for eeOnly
// after
const def = TRIGGER_KINDS[trigger.kind as WorkspaceTriggerKind]
if (def?.eeOnly && !hasEeLicense) {
  skipped.push(`${trigger.kind} (requires Enterprise)`)
  continue
}
await createWorkspaceTriggerDisabled(trigger, { hasEeLicense })
Defensive patterns

Strategy: validation

Validate before calling

function triggerNeedsEe(kind: string): boolean {
  return TRIGGER_KINDS[kind as WorkspaceTriggerKind]?.eeOnly === true
}
// before install:
const blocked = triggers.filter((t) => triggerNeedsEe(t.kind) && !hasEeLicense)

Type guard

function isCeAllowedKind(k: WorkspaceTriggerKind, hasEeLicense: boolean): boolean {
  return hasEeLicense || !TRIGGER_KINDS[k]?.eeOnly
}

Try / catch

try {
  await createWorkspaceTriggerDisabled(trigger, { hasEeLicense })
} catch (e) {
  if (String(e).includes('requires Enterprise')) {
    skipped.push(`${trigger.kind}: requires Enterprise license`)
    return null
  }
  throw e
}

Prevention

When it happens

Trigger: installProject attempts to create a trigger whose TRIGGER_KINDS entry has eeOnly: true while hasEeLicense is false.

Common situations: Importing a project that uses EE triggers (e.g. certain queue/streaming triggers) into a Community Edition instance; a license key that expired or was not applied to the workspace.

Related errors


AI-assisted analysis of windmill-labs/windmill@e474e8803c (2026-09-03). Data as JSON: /api/errors/0267f85e7a9ab0a2. Report an issue: GitHub.