{"record":{"id":"0267f85e7a9ab0a2","repo":"windmill-labs/windmill","slug":"trigger-kind-trigger-kind-requires-enterprise","errorCode":null,"errorMessage":"trigger kind '${trigger.kind}' requires Enterprise","messagePattern":"trigger kind '(.+?)' requires Enterprise","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"frontend/src/lib/components/triggers/workspaceTriggersList.ts","lineNumber":411,"sourceCode":" * (schedules use `enabled: false`, every other kind uses `mode: 'disabled'`)\n * and are encoded here once so importers can't get them wrong.\n */\nexport async function createWorkspaceTriggerDisabled(\n\tworkspace: string,\n\ttrigger: {\n\t\tkind: string\n\t\tpath: string\n\t\tscript_path: string\n\t\tis_flow: boolean\n\t\tsummary?: string | null\n\t\tconfig?: Record<string, any> | null\n\t},\n\topts: { hasEeLicense: boolean }\n): Promise<unknown> {\n\tconst def = TRIGGER_KINDS[trigger.kind as WorkspaceTriggerKind]\n\tif (!def) throw new Error(`trigger kind '${trigger.kind}' not supported yet`)\n\tif (def.eeOnly && !opts.hasEeLicense) {\n\t\tthrow new Error(`trigger kind '${trigger.kind}' requires Enterprise`)\n\t}\n\tif (def.provisionsOnCreate) {\n\t\tthrow new Error(\n\t\t\t`${def.badge} triggers manage cloud subscriptions at creation — fill in the imported resource, then re-create this trigger manually`\n\t\t)\n\t}\n\t// Remote input: only the allowlisted portable slice may reach the create call.\n\tconst config = portableTriggerConfig(trigger.kind, trigger.config)\n\tif (trigger.kind === 'schedule') {\n\t\t// Spread the portable config first so behavioral settings survive the\n\t\t// import (cron_version, retry, failure/recovery/success handlers,\n\t\t// no_flow_overlap, …) — restoring only cron+timezone would silently\n\t\t// change the schedule's semantics once re-enabled.\n\t\treturn ScheduleService.createSchedule({\n\t\t\tworkspace,\n\t\t\trequestBody: {\n\t\t\t\t...config,\n\t\t\t\tpath: trigger.path,","sourceCodeStart":393,"sourceCodeEnd":429,"githubUrl":"https://github.com/windmill-labs/windmill/blob/e474e8803ce2ff5c2df09a58dab51d45f5c922ca/frontend/src/lib/components/triggers/workspaceTriggersList.ts#L393-L429","documentation":"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.","triggerScenarios":"installProject attempts to create a trigger whose TRIGGER_KINDS entry has eeOnly: true while hasEeLicense is false.","commonSituations":"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.","solutions":["Obtain/apply an Enterprise license to the workspace, then retry the install.","Remove or replace the EE-only trigger in the project template before installing on CE.","Skip EE triggers during install on CE with a user-facing warning.","Verify the license is actually active (check hasEeLicense resolution) if you believe you have EE."],"exampleFix":"// before\nawait createWorkspaceTriggerDisabled(trigger, { hasEeLicense }) // throws for eeOnly\n// after\nconst def = TRIGGER_KINDS[trigger.kind as WorkspaceTriggerKind]\nif (def?.eeOnly && !hasEeLicense) {\n  skipped.push(`${trigger.kind} (requires Enterprise)`)\n  continue\n}\nawait createWorkspaceTriggerDisabled(trigger, { hasEeLicense })","handlingStrategy":"validation","validationCode":"function triggerNeedsEe(kind: string): boolean {\n  return TRIGGER_KINDS[kind as WorkspaceTriggerKind]?.eeOnly === true\n}\n// before install:\nconst blocked = triggers.filter((t) => triggerNeedsEe(t.kind) && !hasEeLicense)","typeGuard":"function isCeAllowedKind(k: WorkspaceTriggerKind, hasEeLicense: boolean): boolean {\n  return hasEeLicense || !TRIGGER_KINDS[k]?.eeOnly\n}","tryCatchPattern":"try {\n  await createWorkspaceTriggerDisabled(trigger, { hasEeLicense })\n} catch (e) {\n  if (String(e).includes('requires Enterprise')) {\n    skipped.push(`${trigger.kind}: requires Enterprise license`)\n    return null\n  }\n  throw e\n}","preventionTips":["Check hasEeLicense before installing templates containing eeOnly kinds","Verify the workspace license is active before imports","Document which trigger kinds are EE-only for template authors","Skip-and-report EE triggers on CE instead of failing the install"],"tags":["triggers","licensing","enterprise","project-install"],"backgroundTag":"enterprise-license-required","analyzedSha":"e474e8803ce2ff5c2df09a58dab51d45f5c922ca","analyzedAt":"2026-09-03T12:38:19.024Z","contentChangedAt":"2026-09-03T12:38:19.024Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}