windmill-labs/windmill · error

Feature not supported in cloud hosted windmill

Error message

Feature not supported in cloud hosted windmill

What it means

When the instance runs in cloud-hosted mode (CLOUD_HOSTED flag), configuring workspace trigger failure email notifications is disabled; the endpoint logs a warning and returns 'Feature not supported in cloud hosted windmill'. Additionally the code path guards that only the error-handler users or superadmins may configure it.

Source

Thrown at backend/windmill-api/src/jobs.rs:2618

    email_recipients: Option<Vec<String>>,
    error: Value,
}

#[cfg(all(feature = "enterprise", feature = "instance_smtp"))]
async fn send_email_with_instance_smtp(
    authed: ApiAuthed,
    Extension(db): Extension<DB>,
    Path(w_id): Path<String>,
    Json(send_email): Json<SendEmail>,
) -> error::Result<Json<String>> {
    use windmill_common::jobs::EMAIL_ERROR_HANDLER_USER_EMAIL;
    use windmill_queue::SCHEDULE_ERROR_HANDLER_USER_EMAIL;

    if *CLOUD_HOSTED {
        tracing::warn!(
                "Workspace trigger failure email notification is not available for cloud hosted Windmill",
            );
        return Err(anyhow::anyhow!("Feature not supported in cloud hosted windmill").into());
    }

    let is_handler_job = authed.email == EMAIL_ERROR_HANDLER_USER_EMAIL
        || authed.email == SCHEDULE_ERROR_HANDLER_USER_EMAIL;

    if !is_handler_job && !windmill_api_auth::is_super_admin_authed(&db, &authed).await? {
        return Err(Error::NotAuthorized(
            "Only super admin or whitelisted token can access email workspace error handler feature"
                .to_string(),
        ));
    }

    // Missing/empty `email_recipients` is a schedule-level misconfiguration (e.g. the
    // user picked the email handler in the UI but never entered an address). Log a warning
    // and return a client error — do NOT escalate to `report_critical_error`, which would
    // fan this out to the instance critical-error channels on every failed run.
    let Some(recipients) = send_email.email_recipients.as_ref() else {
        tracing::warn!(

View on GitHub (pinned to e474e8803c)

Solutions

  1. Use Windmill's web UI notification integrations available on cloud (e.g. Slack/webhook based error handlers) instead of direct email
  2. Self-host Windmill (CLOUD_HOSTED=false) to enable trigger failure email notifications
  3. Set up error handling inside the flow/script itself (error handler steps) rather than relying on email notification settings
Defensive patterns

Strategy: validation

Validate before calling

// before enabling trigger error email notifications
if is_cloud_hosted() {
    disableEmailToggle(); // show "available on self-hosted only"
}

Try / catch

match set_trigger_error_email(authed, db, payload).await {
    Ok(cfg) => cfg,
    Err(e) if e.to_string().contains("not supported in cloud hosted") => {
        notify_user("Email notifications require self-hosted Windmill; use webhooks instead");
        fallback_to_webhook_error_handler()
    }
    Err(e) => return Err(e.into()),
}

Prevention

When it happens

Trigger: A user (or the scheduler error-handler route) on app.windmill.com (or any CLOUD_HOSTED=true instance) attempts to enable/modify email notifications for trigger failures.

Common situations: Setting up error email alerts on the hosted Windmill cloud; migrating self-hosted flows that used email notifications to the cloud edition; scripts calling the trigger settings API against the cloud.

Related errors


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