{"record":{"id":"23d66ffea4ba2f81","repo":"flowable/flowable-engine","slug":"no-event-model-found-for-event-key-eventkey","errorCode":null,"errorMessage":"No event model found for event key ${eventKey}","messagePattern":"No event model found for event key (.+?)","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/DefaultInboundEventProcessingPipeline.java","lineNumber":140,"sourceCode":"            eventDefinitionQuery.tenantId(tenantId);\n        }\n        EventDefinition eventDefinition = eventDefinitionQuery.latestVersion().singleResult();\n        \n        if (eventDefinition == null) {\n            if (eventRegistryConfiguration.isFallbackToDefaultTenant()) {\n                String defaultTenant = eventRegistryConfiguration.getDefaultTenantProvider().getDefaultTenant(tenantId, ScopeTypes.EVENT_REGISTRY, eventKey);\n                if (StringUtils.isNotEmpty(defaultTenant)) {\n                    eventDefinition = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(eventKey).tenantId(defaultTenant).latestVersion().singleResult();\n                    \n                } else {\n                    eventDefinition = eventRepositoryService.createEventDefinitionQuery().eventDefinitionKey(eventKey).latestVersion().singleResult();\n                }\n            }\n        }\n        \n        if (eventDefinition == null) {\n            logger.error(\"No event model found for event key \" + eventKey);\n            throw new FlowableException(\"No event model found for event key \" + eventKey);\n        }\n        \n        EventDeployment eventDeployment = eventRepositoryService.createDeploymentQuery().deploymentId(eventDefinition.getDeploymentId()).singleResult();\n        \n        EventModel eventModel = eventRepositoryService.getEventModelById(eventDefinition.getId());\n        \n        EventInstanceImpl eventInstance = new EventInstanceImpl(\n            eventModel.getKey(),\n            extractPayload(eventModel, event, eventDeployment.getParentDeploymentId(), tenantId),\n            tenantId\n        );\n\n        if (debugLoggingEnabled) {\n            logger.debug(\"Transforming {} for inbound {} channel {}. Inbound event: {}\", eventInstance, inboundChannel.getChannelType(),\n                    inboundChannel.getKey(), inboundEvent);\n        }\n        Collection<EventRegistryEvent> registryEvents = transform(eventInstance);\n","sourceCodeStart":122,"sourceCodeEnd":158,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/pipeline/DefaultInboundEventProcessingPipeline.java#L122-L158","documentation":"Thrown by DefaultInboundEventProcessingPipeline.run when an inbound event's key cannot be resolved to a deployed event definition, so no EventModel can be loaded for processing. Flowable logs the problem and throws FlowableException, aborting processing of that inbound payload. Effectively, a channel received an event whose key has no matching deployed event model.","triggerScenarios":"An inbound message arrives on a channel whose key (extracted from the payload or channel key detection) does not match any deployed event definition — after removing/renaming an event model while producers still send the old key, or before the event definition is deployed.","commonSituations":"Renaming an event key in the event registry JSON while upstream systems still emit the old key; deploying the consumer service before its event definitions; typo or case mismatch in the key extractor configuration; events from another product/environment sharing the channel.","solutions":["Deploy (or restore) an event definition whose key matches eventKey for the channel's tenant.","Align the inbound key extraction (InboundEventKeyDetector / channel configuration) so it produces keys that exist in the registry.","Coordinate producers to stop or remap events using the removed key, or add a dead-letter/skip handler in the pipeline.","Verify event definitions via EventDefinitionQuery and compare against actual inbound payloads."],"exampleFix":"// before\npipeline.run(rawEvent); // throws if key unknown\n// after\ntry {\n    pipeline.run(rawEvent);\n} catch (FlowableException e) {\n    logger.warn(\"Skipping inbound event with unknown key\", e); // or route to DLQ\n}","handlingStrategy":"try-catch","validationCode":"EventDefinition def = eventRepositoryService.createEventDefinitionQuery()\n    .eventDefinitionKey(eventKey).latestVersion().singleResult();\nif (def == null) logger.warn(\"Inbound key \" + eventKey + \" has no deployed event definition; skipping\");","typeGuard":null,"tryCatchPattern":"try {\n    event = pipeline.run(rawEvent);\n} catch (FlowableException e) {\n    if (e.getMessage() != null && e.getMessage().startsWith(\"No event model found for event key\")) {\n        // route to dead-letter / metrics, don't crash the consumer\n    } else {\n        throw e;\n    }\n}","preventionTips":["Never rename or delete event keys without coordinating with producers.","Deploy event definitions before starting inbound channel consumers.","Log and monitor unknown inbound keys to catch producer/registry drift early.","Validate key extractor configuration against actual payloads in staging."],"tags":["flowable","event-registry","inbound-event","not-found"],"backgroundTag":"resource-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}