Step Conditions
A step condition decides whether a step runs or is skipped. Same semantics on both authoring surfaces; different syntax.Dashboard semantics: condition evaluates totrue⇒ step runs. Framework semantics:skipreturnstrue⇒ step is skipped. They’re mirror images — invert the boolean when porting between surfaces.
Available Variables
Use only variables that are in scope for the workflow run.
Prefer reusing existing variables for consistency. Only introduce new payload.* variables when truly needed — duplication makes templates and conditions harder to maintain.
Variable Namespaces
Subscriber Properties
Availablesubscriber.* properties:
subscriber.firstNamesubscriber.lastNamesubscriber.emailsubscriber.phonesubscriber.avatarsubscriber.localesubscriber.timezonesubscriber.subscriberIdsubscriber.isOnlinesubscriber.lastOnlineAtsubscriber.data(custom subscriber data; deeply addressable assubscriber.data.<key>)
Step Outputs
Canonical Conditions (Dashboard JSON-Logic)
Subscriber is offline
In-App was not read
In-App was not seen
Workflow tags include any of
HTTP response property equals a value
The property must be declared in the HTTP step’s responseBodySchema. Undeclared properties are not addressable.
Framework Equivalents
The same conditions in@novu/framework. Note that skip is the inverse of “run if true” — you return true to skip.
Subscriber is offline (run only if offline)
In-App was not read (send email fallback)
Branch on HTTP response
Quick Reference
Common Pitfalls
- Inverting the boolean wrong — Dashboard runs when condition is
true; Frameworkskipskips whentrue. They’re opposites. - Referencing undeclared HTTP properties — only properties in
responseBodySchemaare addressable insteps.<http>.<prop>. - Using
subscriber.isOnline == trueas a string —isOnlineis a boolean. Use"false"(string) only in JSON-Logic; in Framework use the JS booleanfalse. - Conditions on a delay step — delays support skip too, but if a delay is skipped the workflow proceeds immediately. Don’t treat skip as “shorten”.
See Also
channel-selection.md— uses these conditions for offline gatingworkflow-templates.md— every template’sStep conditionlines map to these snippetsframework-integration/references/workflow-and-steps.md— full Frameworkskipreferencedashboard-workflows/references/step-conditions.md— Dashboard / Novu MCP authoring flow, including the merge / replace / remove intent rules