RocketChat/Rocket.Chat · warning

Trigger is not enabled

Error message

Trigger is not enabled

What it means

Before each HTTP delivery (including scheduled retries), executeTriggerUrl calls isTriggerEnabled, which looks the integration up in the in-memory trigger registry and returns its enabled flag. If the integration is absent from the registry or enabled is false, delivery is skipped with this warn. Integrations are auto-disabled when their endpoint answers 410 Gone.

Source

Thrown at apps/meteor/server/lib/integrations/lib/triggerHandler.ts:502

		for (const url of trigger.urls) {
			await this.executeTriggerUrl(url, trigger, argObject, 0);
		}
	}

	// Ensure that any errors thrown by the script engine will contibue to be compatible with Meteor.Error
	async wrapScriptEngineCall(getter: () => Promise<any>) {
		return wrapExceptions(getter).catch((error) => {
			if (error instanceof Error) {
				throw new Meteor.Error(error.message);
			}

			throw error;
		});
	}

	async executeTriggerUrl(url: string, trigger: IOutgoingIntegration, { event, message, room, owner, user }: ArgumentsObject, tries = 0) {
		if (!this.isTriggerEnabled(trigger)) {
			outgoingLogger.warn({ msg: 'Trigger is not enabled', triggerName: trigger.name, tries });
			return;
		}

		outgoingLogger.debug({ msg: 'Starting to execute trigger', triggerName: trigger.name, triggerId: trigger._id });

		let word;
		// Not all triggers/events support triggerWords
		if (event && outgoingEvents[event].use.triggerWords) {
			if (trigger.triggerWords && trigger.triggerWords.length > 0) {
				for (const triggerWord of trigger.triggerWords) {
					if (!trigger.triggerWordAnywhere && message?.msg.indexOf(triggerWord) === 0) {
						word = triggerWord;
						break;
					} else if (trigger.triggerWordAnywhere && message?.msg.includes(triggerWord)) {
						word = triggerWord;
						break;
					}
				}

View on GitHub (pinned to b2c16d5842)

Solutions

  1. Check Administration -> Integrations and re-enable the integration if it was disabled
  2. Inspect the integration History for a 410 (Gone) response - returning 410 tells Rocket.Chat to disable the integration permanently, so fix the endpoint to stop returning it
  3. Confirm the integration still exists and is registered (re-save it or restart to rebuild the trigger registry)
  4. Treat late retries logging this warn as cleanup noise - the pending setTimeout callbacks are correctly skipping

Example fix

# after a 410 auto-disable, re-enable via REST
curl -H "X-Auth-Token: $TOKEN" -H "X-User-Id: $UID" \
  -H "Content-Type: application/json" \
  -X PUT http://localhost:3000/api/v1/integrations.update \
  -d '{"integration": {"_id": "INTEGRATION_ID", "enabled": true}}'
Defensive patterns

Strategy: retry

Validate before calling

const state = await fetch('/api/v1/integrations.get?integrationId=...').then((r) => r.json());
if (!state.integration?.enabled) {
  // re-enable (admin UI or integrations.update), fix any 410-returning endpoint, then replay the event from the History page
}

Prevention

When it happens

Trigger: An admin disabled the integration between the trigger match and the delivery; a previous delivery received 410 and the integration was auto-disabled (enabled: false) while a retry was still pending; the integration was deleted or not re-registered in the channel registry after a restart, so isTriggerEnabled finds nothing and returns false.

Common situations: retryFailedCalls retries firing after a 410 auto-disable; leftover setTimeout retries from earlier executions skipping via this warn; multi-instance deployments where the in-memory registry diverges from the database.

Related errors


AI-assisted analysis of RocketChat/Rocket.Chat@b2c16d5842 (2026-08-18). Data as JSON: /api/errors/7c4cccc7108adb8d. Report an issue: GitHub.