skills/dashboard-workflows/SKILL.md
Author step content for Novu workflows defined in the Dashboard or generated/edited via the Novu MCP. Use when filling in step controls (subject, body, editorType, headers, body, conditions) for email, in-app, sms, push, chat, delay, digest, throttle, or HTTP Request steps.
npx skillsauth add novuhq/skills novu-dashboard-workflowsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
Use it whenever you write or edit the controls of a Dashboard / MCP step:
create_workflow, update_workflow_step, etc.)These rules apply to every step type.
{{ and }}. Example: {{ subscriber.firstName }}, {{ payload.* }}.editorType: "block") node attributes, never use curly braces — use bare variable names like payload.actionUrl instead of {{ payload.actionUrl }}. See references/email-step.md for the full Block Editor rules.{{ steps.<http-step-id>.<property> }} to reference response data. Only properties defined in that HTTP step's responseBodySchema are available — never invent arbitrary response fields. Example: if HTTP step fetch-user defines responseBodySchema with name and email, use {{ steps.fetch-user.name }} and {{ steps.fetch-user.email }}.editorType (block or html for email) and structure.Each step type has its own content rules. Open the matching reference before writing controls.
| Step type | Reference | Use it for |
| -------------- | --------------------------------------------------------------- | ----------------------------------------------------------- |
| Email | 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 |
url, text, src, id, each, href, externalLink) take bare variable names. "{{ payload.actionUrl }}" is wrong; "payload.actionUrl" is right. See references/email-step.md.{{ steps.<http-step-id>.<property> }} only works for properties listed in that step's responseBodySchema. Add the property to the schema first.payload.items, payload.providers), iterate with a Block Editor repeat node or an HTML {% for %} loop. Don't list array items as separate nodes / elements.[] when not needed. Never [{ "key": "", "value": "" }].payload.* or subscriber.* so the workflow stays portable.editorType when editing email — keep block as block and html as html unless the user explicitly asks to switch.{ "and": [...] }; "change to" / "set to" replaces; "remove" / "clear" returns null. See references/step-conditions.md.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/framework insteadtrigger-notification/ — fire a workflow once it's authoreddata-ai
Trigger Novu notification workflows to send messages across email, SMS, push, chat, and in-app channels. Supports single triggers, bulk triggers, broadcast to all subscribers, topic-based targeting, and cancellation. Use when sending transactional notifications, alerts, or any event-driven messages.
testing
Create, update, search, and delete subscribers in Novu. Manage topics for group-based notification targeting. Set subscriber credentials for push and chat channels. Use when managing notification recipients, creating subscriber records, organizing subscribers into topics, or configuring channel-specific credentials.
development
Configure notification preferences in Novu at the workflow and subscriber level. Set default channel preferences (email, SMS, push, chat, in-app), mark preferences as read-only or subscriber-editable, and manage subscriber-specific overrides. Use when setting up notification opt-in/opt-out, configuring per-channel delivery preferences, or building a preferences management UI.
development
Integrate Novu's in-app notification inbox into web applications. Supports React, Next.js, and vanilla JavaScript. Includes the Inbox component (bell icon + notification feed), composable components (Bell, Notifications, InboxContent, Preferences), headless hooks, branded theming, custom render props, multi-tenancy via contexts, tabs, localization, and HMAC security. Use when adding an in-app notification center, bell icon, notification feed, real-time notification updates, or building a personalized and branded notification experience.