About novu-dashboard-workflows
A guide for authoring and editing step content in Novu Dashboard workflows, whether by hand or through Novu MCP. It covers multiple step types and details how to handle variables, editor structure, and conditions correctly.
Key features
- 01Rules for email, notification, and HTTP steps
- 02Personalization with Liquid variables
- 03Respect for HTTP response schemas
- 04Preserving editor type and step structure
- 05Merging or replacing conditions by intent
Use cases
- 01Editing email content in a Dashboard workflow
- 02Changing notification delays or digest windows
- 03Adding HTTP request headers or body fields
- 04Updating step conditions
MCP support
The skill guides Novu MCP operations that create or update workflow step content, including tools such as create_workflow and update_workflow_step.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ novuhq/ skills --skill novu-dashboard-workflowsAfter installing, type/novu-dashboard-workflowsin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/chat-step.mddelay-step.mddigest-step.mdemail-step.mdhttp-request-step.mdin-app-step.mdpush-step.mdsms-step.mdstep-conditions.mdthrottle-step.mdDetails
From the project READMEDashboard Workflows
Rules for authoring step content (subject, body, editorType, headers, body, conditions) on workflows that live in the Novu Dashboard — whether you're editing them by hand or via the Novu MCP.
Authoring in code with
@novu/framework? Skip this skill — the Framework SDK encodes these constraints in its types and helpers.Still need to decide what the workflow should look like (channels, severity, critical, digest, templates)? Start with
design-workflow/, then come back here to fill in the step content.
When to use this skill
Use it whenever you write or edit the controls of a Dashboard / MCP step:
- "Set the email subject and body for this step"
- "Update the in-app notification copy"
- "Add headers to this HTTP Request step"
- "Change the digest window to 1 hour"
- "Skip this step when the subscriber is offline" (step condition)
- Any Novu MCP tool call that writes step content (
create_workflow,update_workflow_step, etc.)
Step Content Guidelines
These rules apply to every step type.
- Use Liquid variables in control values for personalization. Variables must be wrapped in double curly braces
{{and}}. Example:{{ subscriber.firstName }},{{ payload.* }}. - EXCEPTION: In Block Editor (
editorType: "block") node attributes, never use curly braces — use bare variable names likepayload.actionUrlinstead of{{ payload.actionUrl }}. Seereferences/email-step.mdfor the full Block Editor rules. - For steps after an HTTP Request step, use
{{ steps.<http-step-id>.<property> }}to reference response data. Only properties defined in that HTTP step'sresponseBodySchemaare available — never invent arbitrary response fields. Example: if HTTP stepfetch-userdefinesresponseBodySchemawithnameandemail, use{{ steps.fetch-user.name }}and{{ steps.fetch-user.email }}. - Never hardcode URLs, names, or product names — use variables instead.
- Keep content consistent with other workflow steps.
- Modify the content according to the user's intent.
- Preserve everything not explicitly asked to change.
- Keep the same
editorType(blockorhtmlfor email) and structure.
Step Types
Each step type has its own content rules. Open the matching reference before writing controls.
| Step type | Reference | Use it for |
|---|---|---|
references/email-step.md | Detailed content, formal communications, receipts | |
| In-App | references/in-app-step.md | Real-time updates, activity feeds, high engagement |
| SMS | references/sms-step.md | Urgent alerts, verification codes, time-sensitive messages |
| Push | references/push-step.md | Mobile engagement, re-engagement, time-sensitive updates |
| Chat | references/chat-step.md | Slack / Discord / Teams team & developer alerts |
| Delay | references/delay-step.md | Pause workflow execution before a channel step |
| Digest | references/digest-step.md | Batch multiple notifications into one |
| Throttle | references/throttle-step.md | Limit notification frequency, prevent fatigue |
| HTTP Request | references/http-request-step.md | Call external APIs / webhooks; fetch data for later steps |
| Step condition | references/step-conditions.md | JSON-Logic for "send only if…", merge / replace / remove |
Common Pitfalls
- Curly braces inside Block Editor attributes — Maily TipTap node attrs (
url,text,src,id,each,href,externalLink) take bare variable names."{{ payload.actionUrl }}"is wrong;"payload.actionUrl"is right. Seereferences/email-step.md. - Referencing undeclared HTTP response fields —
{{ steps.<http-step-id>.<property> }}only works for properties listed in that step'sresponseBodySchema. Add the property to the schema first. - Hardcoding array items instead of looping — when the payload contains an array (
payload.items,payload.providers), iterate with a Block Editorrepeatnode or an HTML{% for %}loop. Don't list array items as separate nodes / elements. - Empty key/value entries in HTTP headers or body — use an empty array
[]when not needed. Never[{ "key": "", "value": "" }]. - Hardcoded URLs / product names — always pull from
payload.*orsubscriber.*so the workflow stays portable. - Changing
editorTypewhen editing email — keepblockasblockandhtmlashtmlunless the user explicitly asks to switch. - Replacing a step condition when the user said "add" — "add" / "also" / "and" merges with
{ "and": [...] }; "change to" / "set to" replaces; "remove" / "clear" returnsnull. Seereferences/step-conditions.md.
See Also
design-workflow/— choose channels, severity,critical, digest defaults, and pick a workflow template before authoring step contentframework-integration/— author the same workflows in code with@novu/frameworkinsteadtrigger-notification/— fire a workflow once it's authored