{"record":{"id":"b4861043090c31c6","repo":"n8n-io/n8n","slug":"missing-expression-prefix","errorCode":"MISSING_EXPRESSION_PREFIX","errorMessage":"'${node.name}' has parameter \"${path}\" containing {{ $... }} without '=' prefix. n8n expressions must start with '=' like '={{ $json.field }}'.","messagePattern":"'(.+?)' has parameter \"(.+?)\" containing (.+?)\\} without '=' prefix\\. n8n expressions must start with '=' like '=(.+?)\\}'\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"packages/@n8n/workflow-sdk/src/workflow-builder/plugins/validators/expression-prefix-validator.ts","lineNumber":50,"sourceCode":"\t\tif (isStickyNoteType(node.type)) {\n\t\t\treturn issues;\n\t\t}\n\n\t\t// Skip HTML template node - it uses {{ }} natively for template expressions\n\t\tif (node.type === 'n8n-nodes-base.html') {\n\t\t\treturn issues;\n\t\t}\n\n\t\tconst params = node.config?.parameters;\n\t\tif (!params) {\n\t\t\treturn issues;\n\t\t}\n\n\t\tconst prefixIssues = findMissingExpressionPrefixes(params);\n\n\t\tfor (const { path } of prefixIssues) {\n\t\t\tissues.push({\n\t\t\t\tcode: 'MISSING_EXPRESSION_PREFIX',\n\t\t\t\tmessage: `'${node.name}' has parameter \"${path}\" containing {{ $... }} without '=' prefix. n8n expressions must start with '=' like '={{ $json.field }}'.`,\n\t\t\t\tseverity: 'warning',\n\t\t\t\tnodeName: node.name,\n\t\t\t\tparameterPath: path,\n\t\t\t});\n\t\t}\n\n\t\treturn issues;\n\t},\n};\n","sourceCodeStart":32,"sourceCodeEnd":61,"githubUrl":"https://github.com/n8n-io/n8n/blob/5ac6606e81f67bb9534255570cd4e86fd8101eee/packages/@n8n/workflow-sdk/src/workflow-builder/plugins/validators/expression-prefix-validator.ts#L32-L61","documentation":"Warning-level validator issue (code MISSING_EXPRESSION_PREFIX) emitted when a parameter value contains an n8n expression fragment ('{{ $... }}') but the string does not start with '='. n8n only evaluates a value as an expression when it begins with '='; a bare '{{ }}' fragment is treated as a literal string and will not resolve.","triggerScenarios":"Writing a value like '{{ $json.field }}' (missing leading '='), or '{{ $json.field }} text' instead of '={{ $json.field }} text'.","commonSituations":"Copy-paste from a templating system (Handlebars/Mustache) that uses double braces without '='; LLM-generated expressions missing the prefix; partial edits that drop the '='.","solutions":["Prefix the entire value with '=' so n8n treats it as an expression.","Use '={{ $json.field }}' form for simple field references.","Re-run the validator to confirm the warning clears."],"exampleFix":"// before\n'{{ $json.field }}'\n// after\n'={{ $json.field }}'","handlingStrategy":"validation","validationCode":"function needsExpressionPrefix(value: unknown): boolean {\n  return typeof value === 'string'\n    && /{{\\s*\\$/.test(value)\n    && !value.startsWith('=');\n}\nif (needsExpressionPrefix(paramValue)) {\n  // warn: add '=' prefix\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always prefix n8n expression values with '='.","Recognize '{{ }}' alone is a literal, not an expression.","Run the expression-prefix validator on generated configs."],"tags":["expression","validator","prefix","syntax"],"backgroundTag":null,"analyzedSha":"5ac6606e81f67bb9534255570cd4e86fd8101eee","analyzedAt":"2026-08-12T05:26:35.080Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}