[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-novu-novu-design-workflow":3,"mdc--g67dot-key":35,"related-org-novu-novu-design-workflow":1653,"related-repo-novu-novu-design-workflow":1758},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":30,"sourceUrl":33,"mdContent":34},"novu-design-workflow","design Novu notification workflows","Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state. Applies to BOTH dashboard-authored and code-first (`@novu\u002Fframework`) workflows. Use when planning a new workflow, deciding which channels to include, picking severity, configuring digest behavior, or matching a use case (order confirmation, payment failed, account suspended, comment, trial expiring, password reset, webhook fan-out, fetch-then-notify) to a proven template.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"novu","Novu","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnovu.png","novuhq",[13,17,20],{"name":14,"slug":15,"type":16},"Messaging","messaging","tag",{"name":18,"slug":19,"type":16},"Workflow Automation","workflow-automation",{"name":21,"slug":22,"type":16},"Notifications","notifications",1,"https:\u002F\u002Fgithub.com\u002Fnovuhq\u002Fskills","2026-07-16T06:02:17.656187",null,2,[29,22,8],"notification",{"repoUrl":24,"stars":23,"forks":27,"topics":31,"description":32},[29,22,8],"Novu Skill Set for AI Agents ","https:\u002F\u002Fgithub.com\u002Fnovuhq\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fdesign-workflow","---\nname: novu-design-workflow\ndescription: Design notification workflows the Novu way — choose channels, set severity, decide when a workflow is critical, configure digests, and route based on subscriber state. Applies to BOTH dashboard-authored and code-first (`@novu\u002Fframework`) workflows. Use when planning a new workflow, deciding which channels to include, picking severity, configuring digest behavior, or matching a use case (order confirmation, payment failed, account suspended, comment, trial expiring, password reset, webhook fan-out, fetch-then-notify) to a proven template.\n---\n\n# Design Workflow\n\nDesign rules for any Novu workflow — independent of whether you author it in the **Dashboard** (no-code) or in **code** with [`@novu\u002Fframework`](..\u002Fframework-integration). The decisions here (channels, severity, critical, digest, conditions) are the same on both surfaces; only the syntax differs.\n\n> Authoring **in code**? Pair this skill with [`framework-integration\u002F`](..\u002Fframework-integration) for `workflow(...)`, `step.*`, `controlSchema`, and Bridge Endpoint setup.\n> Authoring **in the Dashboard or via the Novu MCP**? After designing here, fill in step content (subject, body, `editorType`, headers, conditions) using [`dashboard-workflows\u002F`](..\u002Fdashboard-workflows).\n\n## When to use this skill\n\nUse it whenever you need to **decide what a workflow should look like**:\n\n- \"Design an order-confirmation workflow\"\n- \"Which channels should I send for a payment failure?\"\n- \"Make this notification critical\"\n- \"Should this be digested?\"\n- \"Add a fallback for offline subscribers\"\n- \"What's the right template for X?\"\n\nDo **not** use it for: triggering an existing workflow ([`trigger-notification\u002F`](..\u002Ftrigger-notification)), authoring code wrappers ([`framework-integration\u002F`](..\u002Fframework-integration)), or rendering severity in the UI ([`inbox-integration\u002F`](..\u002Finbox-integration)).\n\n## Severity & Critical\n\nTwo independent dials. Most workflows set **neither**.\n\n| Dial       | Values                          | Default      | Effect                                                                          |\n| ---------- | ------------------------------- | ------------ | ------------------------------------------------------------------------------- |\n| `severity` | `LOW` \u002F `MEDIUM` \u002F `HIGH`       | unset        | Visual prioritization in the Inbox (color, glow); informs digest skip rules.    |\n| `critical` | `true` \u002F `false`                | `false`      | Bypass subscriber preferences, skip digest, no delays, all available channels.  |\n\nRules of thumb:\n\n- Leave `severity` unset for most workflows. Only set it when visual prioritization is needed.\n- `HIGH` = \"deal with this today\" (payment failed, trial expiring tomorrow).\n- `critical: true` = \"deliver regardless of preferences\" (account suspended, security alert, password reset).\n- `critical: true` ⇒ digest is automatically skipped and channels deliver immediately.\n\nSee [`references\u002Fseverity-and-critical.md`](.\u002Freferences\u002Fseverity-and-critical.md) for the full behavior matrix and the `readOnly` vs `critical` distinction.\n\n## Channel Selection\n\n### If the user specified channels\n\nUse **only** those channels. Do not add fallbacks. Do not add extras. If the requested channel isn't configured in the organization, add it anyway because the user explicitly asked for it.\n\n> \"Send a push notification when the order ships\" → one `push` step. Nothing else.\n\n### If the user did NOT specify channels\n\nPick from channels **configured in the organization**, in this priority order, up to **3 channels**:\n\n```\nIn-App  >  Email  >  Chat  >  Push  >  SMS\n```\n\n| Channel | Use it for                                                                                          | Skip it when                                                |\n| ------- | --------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- |\n| In-App  | Default for in-product content. Always include if the user is in your product.                      | The recipient can't see it (password reset, OTP, pre-signup) |\n| Email   | Receipts, documentation, async communication. Default fallback after In-App.                        | Pure conversational pings inside the product                 |\n| Chat    | If configured AND `severity >= MEDIUM`. Slack\u002FTeams for ops & internal flows.                       | Marketing or low-severity nudges                             |\n| Push    | Fallback when subscriber is **offline** but needs immediate awareness.                              | Subscriber is online (use In-App instead)                    |\n| SMS     | Last resort. Only when no other channel works (true emergencies, OTP, regulatory).                  | Anything that fits in Email or Push                          |\n\nSee [`references\u002Fchannel-selection.md`](.\u002Freferences\u002Fchannel-selection.md) for the full decision tree.\n\n## Digest Defaults\n\nWhen you add a digest step, default to:\n\n- `type: \"regular\"`\n- look-back window: **5 minutes**\n- digest time: **1 hour**\n- key: `subscriberId` (and `+threadId` for conversational flows)\n\n**Skip the digest** when:\n\n- `severity: HIGH`, or\n- `critical: true`\n\nSee [`references\u002Fdigest-defaults.md`](.\u002Freferences\u002Fdigest-defaults.md) for digest key composition and conversational examples.\n\n## User-State Logic\n\nAdapt routing based on whether the subscriber is online:\n\n| State    | Behavior                                                                                                |\n| -------- | ------------------------------------------------------------------------------------------------------- |\n| Online   | Send In-App immediately. Skip Push. Delay Email\u002FChat based on severity.                                 |\n| Offline  | Use Push or Chat to get attention.                                                                      |\n\nDefault delays:\n\n- **B2B** apps → next work hour\n- **B2C** apps → ~30 minutes\n\nThe condition for \"subscriber offline\" is the same on both surfaces — see [`references\u002Fstep-conditions.md`](.\u002Freferences\u002Fstep-conditions.md).\n\n## Workflow Templates\n\nMatch the use case to a template and copy its shape. Each template specifies severity, critical, actionable, and interaction type, plus the step ordering.\n\n| # | Use case                       | Severity | Critical | Notes                                            |\n| - | ------------------------------ | -------- | -------- | ------------------------------------------------ |\n| 1 | Order Confirmation             | none     | false    | Digested, In-App + Email + Push (offline only)   |\n| 2 | Comment on Your Post           | none     | false    | Digested by `subscriberId + threadId`            |\n| 3 | Payment Failed                 | HIGH     | false    | In-App + Chat + Email + Push (offline)           |\n| 4 | Account Suspended              | HIGH     | true     | All channels, no preferences, no digest          |\n| 5 | Forgot Password                | none     | true     | Email + SMS only, no In-App                      |\n| 6 | Trial Expiring Tomorrow        | HIGH     | false    | In-App + Chat + Email + Push (offline)           |\n| 7 | Explicit Channel Request       | n\u002Fa      | n\u002Fa      | Use only the channels the user specified         |\n| 8 | Webhook \u002F External API Call    | varies   | varies   | Add `step.http` after channel steps              |\n| 9 | Fetch Data then Notify         | varies   | varies   | `step.http` first; declare `responseBodySchema`  |\n\nFull ASCII flows + per-template metadata in [`references\u002Fworkflow-templates.md`](.\u002Freferences\u002Fworkflow-templates.md).\n\n## Step Conditions\n\nConditions decide whether a step runs. Use them for \"send only if subscriber is offline\", \"send email only if In-App wasn't seen\", and similar fallbacks.\n\n- **Dashboard** authors write [JSON-Logic](https:\u002F\u002Fjsonlogic.com): `{ \"==\": [{ \"var\": \"subscriber.isOnline\" }, \"false\"] }`\n- **Framework** authors pass a `skip: () => boolean` callback to the step.\n\nThe semantics are identical. See [`references\u002Fstep-conditions.md`](.\u002Freferences\u002Fstep-conditions.md) for the canonical snippets and the variables available in each scope.\n\n## Common Pitfalls\n\n1. **Don't set severity by default** — leave it unset unless you actually need visual prioritization.\n2. **`critical: true` is not the same as `readOnly: true`** — `readOnly` only hides the workflow from the Preferences UI; `critical` bypasses preferences and digests at runtime. See [`references\u002Fseverity-and-critical.md`](.\u002Freferences\u002Fseverity-and-critical.md).\n3. **Don't add fallbacks when the user named the channels** — explicit channel requests are exact.\n4. **Cap the channel count at 3** when the user didn't specify channels. More channels = more annoyance, not more reach.\n5. **Don't combine digest with `critical: true`** — critical workflows must deliver immediately. The digest step is auto-skipped.\n6. **Digest key matters for conversational flows** — without `+threadId`, a comment on Post A and a comment on Post B end up in the same digest.\n7. **Push only when offline** — sending push to an online user duplicates the In-App alert.\n8. **HTTP step needs `responseBodySchema`** — without it, downstream steps can't read response properties via `{{ steps.\u003Cid>.\u003Cprop> }}`.\n\n## References\n\n- [Channel Selection](.\u002Freferences\u002Fchannel-selection.md) — full decision tree and per-channel guidance\n- [Severity & Critical](.\u002Freferences\u002Fseverity-and-critical.md) — behavior matrix, preference & digest interactions, `readOnly` vs `critical`\n- [Digest Defaults](.\u002Freferences\u002Fdigest-defaults.md) — windows, keys, conversational digest patterns\n- [Step Conditions](.\u002Freferences\u002Fstep-conditions.md) — JSON-Logic snippets and Framework `skip` equivalents\n- [Workflow Templates](.\u002Freferences\u002Fworkflow-templates.md) — the 9 reference flows with severity\u002Fcritical\u002Finteraction tables\n\n## See Also\n\n- [`dashboard-workflows\u002F`](..\u002Fdashboard-workflows) — author step content (subject, body, `editorType`, headers, conditions) for Dashboard or Novu MCP workflows\n- [`framework-integration\u002F`](..\u002Fframework-integration) — implement these designs in code (`workflow()`, `step.*`, `controlSchema`, Bridge)\n- [`manage-preferences\u002F`](..\u002Fmanage-preferences) — how `critical` interacts with subscriber-level preferences\n- [`inbox-integration\u002F`](..\u002Finbox-integration) — how severity surfaces visually in the Inbox\n- [`trigger-notification\u002F`](..\u002Ftrigger-notification) — invoking a workflow once it's designed\n",{"data":36,"body":37},{"name":4,"description":6},{"type":38,"children":39},"root",[40,49,83,160,167,179,214,260,266,277,402,407,453,485,491,498,510,526,532,550,562,694,710,716,721,774,784,806,822,828,833,881,886,909,925,931,936,1234,1250,1256,1261,1307,1322,1328,1470,1476,1543,1549],{"type":41,"tag":42,"props":43,"children":45},"element","h1",{"id":44},"design-workflow",[46],{"type":47,"value":48},"text","Design Workflow",{"type":41,"tag":50,"props":51,"children":52},"p",{},[53,55,61,63,68,70,81],{"type":47,"value":54},"Design rules for any Novu workflow — independent of whether you author it in the ",{"type":41,"tag":56,"props":57,"children":58},"strong",{},[59],{"type":47,"value":60},"Dashboard",{"type":47,"value":62}," (no-code) or in ",{"type":41,"tag":56,"props":64,"children":65},{},[66],{"type":47,"value":67},"code",{"type":47,"value":69}," with ",{"type":41,"tag":71,"props":72,"children":74},"a",{"href":73},"..\u002Fframework-integration",[75],{"type":41,"tag":67,"props":76,"children":78},{"className":77},[],[79],{"type":47,"value":80},"@novu\u002Fframework",{"type":47,"value":82},". The decisions here (channels, severity, critical, digest, conditions) are the same on both surfaces; only the syntax differs.",{"type":41,"tag":84,"props":85,"children":86},"blockquote",{},[87],{"type":41,"tag":50,"props":88,"children":89},{},[90,92,97,99,108,110,116,118,124,125,131,133,138,140,146,148,158],{"type":47,"value":91},"Authoring ",{"type":41,"tag":56,"props":93,"children":94},{},[95],{"type":47,"value":96},"in code",{"type":47,"value":98},"? Pair this skill with ",{"type":41,"tag":71,"props":100,"children":101},{"href":73},[102],{"type":41,"tag":67,"props":103,"children":105},{"className":104},[],[106],{"type":47,"value":107},"framework-integration\u002F",{"type":47,"value":109}," for ",{"type":41,"tag":67,"props":111,"children":113},{"className":112},[],[114],{"type":47,"value":115},"workflow(...)",{"type":47,"value":117},", ",{"type":41,"tag":67,"props":119,"children":121},{"className":120},[],[122],{"type":47,"value":123},"step.*",{"type":47,"value":117},{"type":41,"tag":67,"props":126,"children":128},{"className":127},[],[129],{"type":47,"value":130},"controlSchema",{"type":47,"value":132},", and Bridge Endpoint setup.\nAuthoring ",{"type":41,"tag":56,"props":134,"children":135},{},[136],{"type":47,"value":137},"in the Dashboard or via the Novu MCP",{"type":47,"value":139},"? After designing here, fill in step content (subject, body, ",{"type":41,"tag":67,"props":141,"children":143},{"className":142},[],[144],{"type":47,"value":145},"editorType",{"type":47,"value":147},", headers, conditions) using ",{"type":41,"tag":71,"props":149,"children":151},{"href":150},"..\u002Fdashboard-workflows",[152],{"type":41,"tag":67,"props":153,"children":155},{"className":154},[],[156],{"type":47,"value":157},"dashboard-workflows\u002F",{"type":47,"value":159},".",{"type":41,"tag":161,"props":162,"children":164},"h2",{"id":163},"when-to-use-this-skill",[165],{"type":47,"value":166},"When to use this skill",{"type":41,"tag":50,"props":168,"children":169},{},[170,172,177],{"type":47,"value":171},"Use it whenever you need to ",{"type":41,"tag":56,"props":173,"children":174},{},[175],{"type":47,"value":176},"decide what a workflow should look like",{"type":47,"value":178},":",{"type":41,"tag":180,"props":181,"children":182},"ul",{},[183,189,194,199,204,209],{"type":41,"tag":184,"props":185,"children":186},"li",{},[187],{"type":47,"value":188},"\"Design an order-confirmation workflow\"",{"type":41,"tag":184,"props":190,"children":191},{},[192],{"type":47,"value":193},"\"Which channels should I send for a payment failure?\"",{"type":41,"tag":184,"props":195,"children":196},{},[197],{"type":47,"value":198},"\"Make this notification critical\"",{"type":41,"tag":184,"props":200,"children":201},{},[202],{"type":47,"value":203},"\"Should this be digested?\"",{"type":41,"tag":184,"props":205,"children":206},{},[207],{"type":47,"value":208},"\"Add a fallback for offline subscribers\"",{"type":41,"tag":184,"props":210,"children":211},{},[212],{"type":47,"value":213},"\"What's the right template for X?\"",{"type":41,"tag":50,"props":215,"children":216},{},[217,219,224,226,236,238,246,248,258],{"type":47,"value":218},"Do ",{"type":41,"tag":56,"props":220,"children":221},{},[222],{"type":47,"value":223},"not",{"type":47,"value":225}," use it for: triggering an existing workflow (",{"type":41,"tag":71,"props":227,"children":229},{"href":228},"..\u002Ftrigger-notification",[230],{"type":41,"tag":67,"props":231,"children":233},{"className":232},[],[234],{"type":47,"value":235},"trigger-notification\u002F",{"type":47,"value":237},"), authoring code wrappers (",{"type":41,"tag":71,"props":239,"children":240},{"href":73},[241],{"type":41,"tag":67,"props":242,"children":244},{"className":243},[],[245],{"type":47,"value":107},{"type":47,"value":247},"), or rendering severity in the UI (",{"type":41,"tag":71,"props":249,"children":251},{"href":250},"..\u002Finbox-integration",[252],{"type":41,"tag":67,"props":253,"children":255},{"className":254},[],[256],{"type":47,"value":257},"inbox-integration\u002F",{"type":47,"value":259},").",{"type":41,"tag":161,"props":261,"children":263},{"id":262},"severity-critical",[264],{"type":47,"value":265},"Severity & Critical",{"type":41,"tag":50,"props":267,"children":268},{},[269,271,276],{"type":47,"value":270},"Two independent dials. Most workflows set ",{"type":41,"tag":56,"props":272,"children":273},{},[274],{"type":47,"value":275},"neither",{"type":47,"value":159},{"type":41,"tag":278,"props":279,"children":280},"table",{},[281,310],{"type":41,"tag":282,"props":283,"children":284},"thead",{},[285],{"type":41,"tag":286,"props":287,"children":288},"tr",{},[289,295,300,305],{"type":41,"tag":290,"props":291,"children":292},"th",{},[293],{"type":47,"value":294},"Dial",{"type":41,"tag":290,"props":296,"children":297},{},[298],{"type":47,"value":299},"Values",{"type":41,"tag":290,"props":301,"children":302},{},[303],{"type":47,"value":304},"Default",{"type":41,"tag":290,"props":306,"children":307},{},[308],{"type":47,"value":309},"Effect",{"type":41,"tag":311,"props":312,"children":313},"tbody",{},[314,361],{"type":41,"tag":286,"props":315,"children":316},{},[317,327,351,356],{"type":41,"tag":318,"props":319,"children":320},"td",{},[321],{"type":41,"tag":67,"props":322,"children":324},{"className":323},[],[325],{"type":47,"value":326},"severity",{"type":41,"tag":318,"props":328,"children":329},{},[330,336,338,344,345],{"type":41,"tag":67,"props":331,"children":333},{"className":332},[],[334],{"type":47,"value":335},"LOW",{"type":47,"value":337}," \u002F ",{"type":41,"tag":67,"props":339,"children":341},{"className":340},[],[342],{"type":47,"value":343},"MEDIUM",{"type":47,"value":337},{"type":41,"tag":67,"props":346,"children":348},{"className":347},[],[349],{"type":47,"value":350},"HIGH",{"type":41,"tag":318,"props":352,"children":353},{},[354],{"type":47,"value":355},"unset",{"type":41,"tag":318,"props":357,"children":358},{},[359],{"type":47,"value":360},"Visual prioritization in the Inbox (color, glow); informs digest skip rules.",{"type":41,"tag":286,"props":362,"children":363},{},[364,373,389,397],{"type":41,"tag":318,"props":365,"children":366},{},[367],{"type":41,"tag":67,"props":368,"children":370},{"className":369},[],[371],{"type":47,"value":372},"critical",{"type":41,"tag":318,"props":374,"children":375},{},[376,382,383],{"type":41,"tag":67,"props":377,"children":379},{"className":378},[],[380],{"type":47,"value":381},"true",{"type":47,"value":337},{"type":41,"tag":67,"props":384,"children":386},{"className":385},[],[387],{"type":47,"value":388},"false",{"type":41,"tag":318,"props":390,"children":391},{},[392],{"type":41,"tag":67,"props":393,"children":395},{"className":394},[],[396],{"type":47,"value":388},{"type":41,"tag":318,"props":398,"children":399},{},[400],{"type":47,"value":401},"Bypass subscriber preferences, skip digest, no delays, all available channels.",{"type":41,"tag":50,"props":403,"children":404},{},[405],{"type":47,"value":406},"Rules of thumb:",{"type":41,"tag":180,"props":408,"children":409},{},[410,422,432,443],{"type":41,"tag":184,"props":411,"children":412},{},[413,415,420],{"type":47,"value":414},"Leave ",{"type":41,"tag":67,"props":416,"children":418},{"className":417},[],[419],{"type":47,"value":326},{"type":47,"value":421}," unset for most workflows. Only set it when visual prioritization is needed.",{"type":41,"tag":184,"props":423,"children":424},{},[425,430],{"type":41,"tag":67,"props":426,"children":428},{"className":427},[],[429],{"type":47,"value":350},{"type":47,"value":431}," = \"deal with this today\" (payment failed, trial expiring tomorrow).",{"type":41,"tag":184,"props":433,"children":434},{},[435,441],{"type":41,"tag":67,"props":436,"children":438},{"className":437},[],[439],{"type":47,"value":440},"critical: true",{"type":47,"value":442}," = \"deliver regardless of preferences\" (account suspended, security alert, password reset).",{"type":41,"tag":184,"props":444,"children":445},{},[446,451],{"type":41,"tag":67,"props":447,"children":449},{"className":448},[],[450],{"type":47,"value":440},{"type":47,"value":452}," ⇒ digest is automatically skipped and channels deliver immediately.",{"type":41,"tag":50,"props":454,"children":455},{},[456,458,468,470,476,478,483],{"type":47,"value":457},"See ",{"type":41,"tag":71,"props":459,"children":461},{"href":460},".\u002Freferences\u002Fseverity-and-critical.md",[462],{"type":41,"tag":67,"props":463,"children":465},{"className":464},[],[466],{"type":47,"value":467},"references\u002Fseverity-and-critical.md",{"type":47,"value":469}," for the full behavior matrix and the ",{"type":41,"tag":67,"props":471,"children":473},{"className":472},[],[474],{"type":47,"value":475},"readOnly",{"type":47,"value":477}," vs ",{"type":41,"tag":67,"props":479,"children":481},{"className":480},[],[482],{"type":47,"value":372},{"type":47,"value":484}," distinction.",{"type":41,"tag":161,"props":486,"children":488},{"id":487},"channel-selection",[489],{"type":47,"value":490},"Channel Selection",{"type":41,"tag":492,"props":493,"children":495},"h3",{"id":494},"if-the-user-specified-channels",[496],{"type":47,"value":497},"If the user specified channels",{"type":41,"tag":50,"props":499,"children":500},{},[501,503,508],{"type":47,"value":502},"Use ",{"type":41,"tag":56,"props":504,"children":505},{},[506],{"type":47,"value":507},"only",{"type":47,"value":509}," those channels. Do not add fallbacks. Do not add extras. If the requested channel isn't configured in the organization, add it anyway because the user explicitly asked for it.",{"type":41,"tag":84,"props":511,"children":512},{},[513],{"type":41,"tag":50,"props":514,"children":515},{},[516,518,524],{"type":47,"value":517},"\"Send a push notification when the order ships\" → one ",{"type":41,"tag":67,"props":519,"children":521},{"className":520},[],[522],{"type":47,"value":523},"push",{"type":47,"value":525}," step. Nothing else.",{"type":41,"tag":492,"props":527,"children":529},{"id":528},"if-the-user-did-not-specify-channels",[530],{"type":47,"value":531},"If the user did NOT specify channels",{"type":41,"tag":50,"props":533,"children":534},{},[535,537,542,544,549],{"type":47,"value":536},"Pick from channels ",{"type":41,"tag":56,"props":538,"children":539},{},[540],{"type":47,"value":541},"configured in the organization",{"type":47,"value":543},", in this priority order, up to ",{"type":41,"tag":56,"props":545,"children":546},{},[547],{"type":47,"value":548},"3 channels",{"type":47,"value":178},{"type":41,"tag":551,"props":552,"children":556},"pre",{"className":553,"code":555,"language":47},[554],"language-text","In-App  >  Email  >  Chat  >  Push  >  SMS\n",[557],{"type":41,"tag":67,"props":558,"children":560},{"__ignoreMap":559},"",[561],{"type":47,"value":555},{"type":41,"tag":278,"props":563,"children":564},{},[565,586],{"type":41,"tag":282,"props":566,"children":567},{},[568],{"type":41,"tag":286,"props":569,"children":570},{},[571,576,581],{"type":41,"tag":290,"props":572,"children":573},{},[574],{"type":47,"value":575},"Channel",{"type":41,"tag":290,"props":577,"children":578},{},[579],{"type":47,"value":580},"Use it for",{"type":41,"tag":290,"props":582,"children":583},{},[584],{"type":47,"value":585},"Skip it when",{"type":41,"tag":311,"props":587,"children":588},{},[589,607,625,651,676],{"type":41,"tag":286,"props":590,"children":591},{},[592,597,602],{"type":41,"tag":318,"props":593,"children":594},{},[595],{"type":47,"value":596},"In-App",{"type":41,"tag":318,"props":598,"children":599},{},[600],{"type":47,"value":601},"Default for in-product content. Always include if the user is in your product.",{"type":41,"tag":318,"props":603,"children":604},{},[605],{"type":47,"value":606},"The recipient can't see it (password reset, OTP, pre-signup)",{"type":41,"tag":286,"props":608,"children":609},{},[610,615,620],{"type":41,"tag":318,"props":611,"children":612},{},[613],{"type":47,"value":614},"Email",{"type":41,"tag":318,"props":616,"children":617},{},[618],{"type":47,"value":619},"Receipts, documentation, async communication. Default fallback after In-App.",{"type":41,"tag":318,"props":621,"children":622},{},[623],{"type":47,"value":624},"Pure conversational pings inside the product",{"type":41,"tag":286,"props":626,"children":627},{},[628,633,646],{"type":41,"tag":318,"props":629,"children":630},{},[631],{"type":47,"value":632},"Chat",{"type":41,"tag":318,"props":634,"children":635},{},[636,638,644],{"type":47,"value":637},"If configured AND ",{"type":41,"tag":67,"props":639,"children":641},{"className":640},[],[642],{"type":47,"value":643},"severity >= MEDIUM",{"type":47,"value":645},". Slack\u002FTeams for ops & internal flows.",{"type":41,"tag":318,"props":647,"children":648},{},[649],{"type":47,"value":650},"Marketing or low-severity nudges",{"type":41,"tag":286,"props":652,"children":653},{},[654,659,671],{"type":41,"tag":318,"props":655,"children":656},{},[657],{"type":47,"value":658},"Push",{"type":41,"tag":318,"props":660,"children":661},{},[662,664,669],{"type":47,"value":663},"Fallback when subscriber is ",{"type":41,"tag":56,"props":665,"children":666},{},[667],{"type":47,"value":668},"offline",{"type":47,"value":670}," but needs immediate awareness.",{"type":41,"tag":318,"props":672,"children":673},{},[674],{"type":47,"value":675},"Subscriber is online (use In-App instead)",{"type":41,"tag":286,"props":677,"children":678},{},[679,684,689],{"type":41,"tag":318,"props":680,"children":681},{},[682],{"type":47,"value":683},"SMS",{"type":41,"tag":318,"props":685,"children":686},{},[687],{"type":47,"value":688},"Last resort. Only when no other channel works (true emergencies, OTP, regulatory).",{"type":41,"tag":318,"props":690,"children":691},{},[692],{"type":47,"value":693},"Anything that fits in Email or Push",{"type":41,"tag":50,"props":695,"children":696},{},[697,698,708],{"type":47,"value":457},{"type":41,"tag":71,"props":699,"children":701},{"href":700},".\u002Freferences\u002Fchannel-selection.md",[702],{"type":41,"tag":67,"props":703,"children":705},{"className":704},[],[706],{"type":47,"value":707},"references\u002Fchannel-selection.md",{"type":47,"value":709}," for the full decision tree.",{"type":41,"tag":161,"props":711,"children":713},{"id":712},"digest-defaults",[714],{"type":47,"value":715},"Digest Defaults",{"type":41,"tag":50,"props":717,"children":718},{},[719],{"type":47,"value":720},"When you add a digest step, default to:",{"type":41,"tag":180,"props":722,"children":723},{},[724,733,743,753],{"type":41,"tag":184,"props":725,"children":726},{},[727],{"type":41,"tag":67,"props":728,"children":730},{"className":729},[],[731],{"type":47,"value":732},"type: \"regular\"",{"type":41,"tag":184,"props":734,"children":735},{},[736,738],{"type":47,"value":737},"look-back window: ",{"type":41,"tag":56,"props":739,"children":740},{},[741],{"type":47,"value":742},"5 minutes",{"type":41,"tag":184,"props":744,"children":745},{},[746,748],{"type":47,"value":747},"digest time: ",{"type":41,"tag":56,"props":749,"children":750},{},[751],{"type":47,"value":752},"1 hour",{"type":41,"tag":184,"props":754,"children":755},{},[756,758,764,766,772],{"type":47,"value":757},"key: ",{"type":41,"tag":67,"props":759,"children":761},{"className":760},[],[762],{"type":47,"value":763},"subscriberId",{"type":47,"value":765}," (and ",{"type":41,"tag":67,"props":767,"children":769},{"className":768},[],[770],{"type":47,"value":771},"+threadId",{"type":47,"value":773}," for conversational flows)",{"type":41,"tag":50,"props":775,"children":776},{},[777,782],{"type":41,"tag":56,"props":778,"children":779},{},[780],{"type":47,"value":781},"Skip the digest",{"type":47,"value":783}," when:",{"type":41,"tag":180,"props":785,"children":786},{},[787,798],{"type":41,"tag":184,"props":788,"children":789},{},[790,796],{"type":41,"tag":67,"props":791,"children":793},{"className":792},[],[794],{"type":47,"value":795},"severity: HIGH",{"type":47,"value":797},", or",{"type":41,"tag":184,"props":799,"children":800},{},[801],{"type":41,"tag":67,"props":802,"children":804},{"className":803},[],[805],{"type":47,"value":440},{"type":41,"tag":50,"props":807,"children":808},{},[809,810,820],{"type":47,"value":457},{"type":41,"tag":71,"props":811,"children":813},{"href":812},".\u002Freferences\u002Fdigest-defaults.md",[814],{"type":41,"tag":67,"props":815,"children":817},{"className":816},[],[818],{"type":47,"value":819},"references\u002Fdigest-defaults.md",{"type":47,"value":821}," for digest key composition and conversational examples.",{"type":41,"tag":161,"props":823,"children":825},{"id":824},"user-state-logic",[826],{"type":47,"value":827},"User-State Logic",{"type":41,"tag":50,"props":829,"children":830},{},[831],{"type":47,"value":832},"Adapt routing based on whether the subscriber is online:",{"type":41,"tag":278,"props":834,"children":835},{},[836,852],{"type":41,"tag":282,"props":837,"children":838},{},[839],{"type":41,"tag":286,"props":840,"children":841},{},[842,847],{"type":41,"tag":290,"props":843,"children":844},{},[845],{"type":47,"value":846},"State",{"type":41,"tag":290,"props":848,"children":849},{},[850],{"type":47,"value":851},"Behavior",{"type":41,"tag":311,"props":853,"children":854},{},[855,868],{"type":41,"tag":286,"props":856,"children":857},{},[858,863],{"type":41,"tag":318,"props":859,"children":860},{},[861],{"type":47,"value":862},"Online",{"type":41,"tag":318,"props":864,"children":865},{},[866],{"type":47,"value":867},"Send In-App immediately. Skip Push. Delay Email\u002FChat based on severity.",{"type":41,"tag":286,"props":869,"children":870},{},[871,876],{"type":41,"tag":318,"props":872,"children":873},{},[874],{"type":47,"value":875},"Offline",{"type":41,"tag":318,"props":877,"children":878},{},[879],{"type":47,"value":880},"Use Push or Chat to get attention.",{"type":41,"tag":50,"props":882,"children":883},{},[884],{"type":47,"value":885},"Default delays:",{"type":41,"tag":180,"props":887,"children":888},{},[889,899],{"type":41,"tag":184,"props":890,"children":891},{},[892,897],{"type":41,"tag":56,"props":893,"children":894},{},[895],{"type":47,"value":896},"B2B",{"type":47,"value":898}," apps → next work hour",{"type":41,"tag":184,"props":900,"children":901},{},[902,907],{"type":41,"tag":56,"props":903,"children":904},{},[905],{"type":47,"value":906},"B2C",{"type":47,"value":908}," apps → ~30 minutes",{"type":41,"tag":50,"props":910,"children":911},{},[912,914,924],{"type":47,"value":913},"The condition for \"subscriber offline\" is the same on both surfaces — see ",{"type":41,"tag":71,"props":915,"children":917},{"href":916},".\u002Freferences\u002Fstep-conditions.md",[918],{"type":41,"tag":67,"props":919,"children":921},{"className":920},[],[922],{"type":47,"value":923},"references\u002Fstep-conditions.md",{"type":47,"value":159},{"type":41,"tag":161,"props":926,"children":928},{"id":927},"workflow-templates",[929],{"type":47,"value":930},"Workflow Templates",{"type":41,"tag":50,"props":932,"children":933},{},[934],{"type":47,"value":935},"Match the use case to a template and copy its shape. Each template specifies severity, critical, actionable, and interaction type, plus the step ordering.",{"type":41,"tag":278,"props":937,"children":938},{},[939,970],{"type":41,"tag":282,"props":940,"children":941},{},[942],{"type":41,"tag":286,"props":943,"children":944},{},[945,950,955,960,965],{"type":41,"tag":290,"props":946,"children":947},{},[948],{"type":47,"value":949},"#",{"type":41,"tag":290,"props":951,"children":952},{},[953],{"type":47,"value":954},"Use case",{"type":41,"tag":290,"props":956,"children":957},{},[958],{"type":47,"value":959},"Severity",{"type":41,"tag":290,"props":961,"children":962},{},[963],{"type":47,"value":964},"Critical",{"type":41,"tag":290,"props":966,"children":967},{},[968],{"type":47,"value":969},"Notes",{"type":41,"tag":311,"props":971,"children":972},{},[973,1000,1032,1058,1084,1110,1135,1162,1197],{"type":41,"tag":286,"props":974,"children":975},{},[976,981,986,991,995],{"type":41,"tag":318,"props":977,"children":978},{},[979],{"type":47,"value":980},"1",{"type":41,"tag":318,"props":982,"children":983},{},[984],{"type":47,"value":985},"Order Confirmation",{"type":41,"tag":318,"props":987,"children":988},{},[989],{"type":47,"value":990},"none",{"type":41,"tag":318,"props":992,"children":993},{},[994],{"type":47,"value":388},{"type":41,"tag":318,"props":996,"children":997},{},[998],{"type":47,"value":999},"Digested, In-App + Email + Push (offline only)",{"type":41,"tag":286,"props":1001,"children":1002},{},[1003,1008,1013,1017,1021],{"type":41,"tag":318,"props":1004,"children":1005},{},[1006],{"type":47,"value":1007},"2",{"type":41,"tag":318,"props":1009,"children":1010},{},[1011],{"type":47,"value":1012},"Comment on Your Post",{"type":41,"tag":318,"props":1014,"children":1015},{},[1016],{"type":47,"value":990},{"type":41,"tag":318,"props":1018,"children":1019},{},[1020],{"type":47,"value":388},{"type":41,"tag":318,"props":1022,"children":1023},{},[1024,1026],{"type":47,"value":1025},"Digested by ",{"type":41,"tag":67,"props":1027,"children":1029},{"className":1028},[],[1030],{"type":47,"value":1031},"subscriberId + threadId",{"type":41,"tag":286,"props":1033,"children":1034},{},[1035,1040,1045,1049,1053],{"type":41,"tag":318,"props":1036,"children":1037},{},[1038],{"type":47,"value":1039},"3",{"type":41,"tag":318,"props":1041,"children":1042},{},[1043],{"type":47,"value":1044},"Payment Failed",{"type":41,"tag":318,"props":1046,"children":1047},{},[1048],{"type":47,"value":350},{"type":41,"tag":318,"props":1050,"children":1051},{},[1052],{"type":47,"value":388},{"type":41,"tag":318,"props":1054,"children":1055},{},[1056],{"type":47,"value":1057},"In-App + Chat + Email + Push (offline)",{"type":41,"tag":286,"props":1059,"children":1060},{},[1061,1066,1071,1075,1079],{"type":41,"tag":318,"props":1062,"children":1063},{},[1064],{"type":47,"value":1065},"4",{"type":41,"tag":318,"props":1067,"children":1068},{},[1069],{"type":47,"value":1070},"Account Suspended",{"type":41,"tag":318,"props":1072,"children":1073},{},[1074],{"type":47,"value":350},{"type":41,"tag":318,"props":1076,"children":1077},{},[1078],{"type":47,"value":381},{"type":41,"tag":318,"props":1080,"children":1081},{},[1082],{"type":47,"value":1083},"All channels, no preferences, no digest",{"type":41,"tag":286,"props":1085,"children":1086},{},[1087,1092,1097,1101,1105],{"type":41,"tag":318,"props":1088,"children":1089},{},[1090],{"type":47,"value":1091},"5",{"type":41,"tag":318,"props":1093,"children":1094},{},[1095],{"type":47,"value":1096},"Forgot Password",{"type":41,"tag":318,"props":1098,"children":1099},{},[1100],{"type":47,"value":990},{"type":41,"tag":318,"props":1102,"children":1103},{},[1104],{"type":47,"value":381},{"type":41,"tag":318,"props":1106,"children":1107},{},[1108],{"type":47,"value":1109},"Email + SMS only, no In-App",{"type":41,"tag":286,"props":1111,"children":1112},{},[1113,1118,1123,1127,1131],{"type":41,"tag":318,"props":1114,"children":1115},{},[1116],{"type":47,"value":1117},"6",{"type":41,"tag":318,"props":1119,"children":1120},{},[1121],{"type":47,"value":1122},"Trial Expiring Tomorrow",{"type":41,"tag":318,"props":1124,"children":1125},{},[1126],{"type":47,"value":350},{"type":41,"tag":318,"props":1128,"children":1129},{},[1130],{"type":47,"value":388},{"type":41,"tag":318,"props":1132,"children":1133},{},[1134],{"type":47,"value":1057},{"type":41,"tag":286,"props":1136,"children":1137},{},[1138,1143,1148,1153,1157],{"type":41,"tag":318,"props":1139,"children":1140},{},[1141],{"type":47,"value":1142},"7",{"type":41,"tag":318,"props":1144,"children":1145},{},[1146],{"type":47,"value":1147},"Explicit Channel Request",{"type":41,"tag":318,"props":1149,"children":1150},{},[1151],{"type":47,"value":1152},"n\u002Fa",{"type":41,"tag":318,"props":1154,"children":1155},{},[1156],{"type":47,"value":1152},{"type":41,"tag":318,"props":1158,"children":1159},{},[1160],{"type":47,"value":1161},"Use only the channels the user specified",{"type":41,"tag":286,"props":1163,"children":1164},{},[1165,1170,1175,1180,1184],{"type":41,"tag":318,"props":1166,"children":1167},{},[1168],{"type":47,"value":1169},"8",{"type":41,"tag":318,"props":1171,"children":1172},{},[1173],{"type":47,"value":1174},"Webhook \u002F External API Call",{"type":41,"tag":318,"props":1176,"children":1177},{},[1178],{"type":47,"value":1179},"varies",{"type":41,"tag":318,"props":1181,"children":1182},{},[1183],{"type":47,"value":1179},{"type":41,"tag":318,"props":1185,"children":1186},{},[1187,1189,1195],{"type":47,"value":1188},"Add ",{"type":41,"tag":67,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":47,"value":1194},"step.http",{"type":47,"value":1196}," after channel steps",{"type":41,"tag":286,"props":1198,"children":1199},{},[1200,1205,1210,1214,1218],{"type":41,"tag":318,"props":1201,"children":1202},{},[1203],{"type":47,"value":1204},"9",{"type":41,"tag":318,"props":1206,"children":1207},{},[1208],{"type":47,"value":1209},"Fetch Data then Notify",{"type":41,"tag":318,"props":1211,"children":1212},{},[1213],{"type":47,"value":1179},{"type":41,"tag":318,"props":1215,"children":1216},{},[1217],{"type":47,"value":1179},{"type":41,"tag":318,"props":1219,"children":1220},{},[1221,1226,1228],{"type":41,"tag":67,"props":1222,"children":1224},{"className":1223},[],[1225],{"type":47,"value":1194},{"type":47,"value":1227}," first; declare ",{"type":41,"tag":67,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":47,"value":1233},"responseBodySchema",{"type":41,"tag":50,"props":1235,"children":1236},{},[1237,1239,1249],{"type":47,"value":1238},"Full ASCII flows + per-template metadata in ",{"type":41,"tag":71,"props":1240,"children":1242},{"href":1241},".\u002Freferences\u002Fworkflow-templates.md",[1243],{"type":41,"tag":67,"props":1244,"children":1246},{"className":1245},[],[1247],{"type":47,"value":1248},"references\u002Fworkflow-templates.md",{"type":47,"value":159},{"type":41,"tag":161,"props":1251,"children":1253},{"id":1252},"step-conditions",[1254],{"type":47,"value":1255},"Step Conditions",{"type":41,"tag":50,"props":1257,"children":1258},{},[1259],{"type":47,"value":1260},"Conditions decide whether a step runs. Use them for \"send only if subscriber is offline\", \"send email only if In-App wasn't seen\", and similar fallbacks.",{"type":41,"tag":180,"props":1262,"children":1263},{},[1264,1289],{"type":41,"tag":184,"props":1265,"children":1266},{},[1267,1271,1273,1281,1283],{"type":41,"tag":56,"props":1268,"children":1269},{},[1270],{"type":47,"value":60},{"type":47,"value":1272}," authors write ",{"type":41,"tag":71,"props":1274,"children":1278},{"href":1275,"rel":1276},"https:\u002F\u002Fjsonlogic.com",[1277],"nofollow",[1279],{"type":47,"value":1280},"JSON-Logic",{"type":47,"value":1282},": ",{"type":41,"tag":67,"props":1284,"children":1286},{"className":1285},[],[1287],{"type":47,"value":1288},"{ \"==\": [{ \"var\": \"subscriber.isOnline\" }, \"false\"] }",{"type":41,"tag":184,"props":1290,"children":1291},{},[1292,1297,1299,1305],{"type":41,"tag":56,"props":1293,"children":1294},{},[1295],{"type":47,"value":1296},"Framework",{"type":47,"value":1298}," authors pass a ",{"type":41,"tag":67,"props":1300,"children":1302},{"className":1301},[],[1303],{"type":47,"value":1304},"skip: () => boolean",{"type":47,"value":1306}," callback to the step.",{"type":41,"tag":50,"props":1308,"children":1309},{},[1310,1312,1320],{"type":47,"value":1311},"The semantics are identical. See ",{"type":41,"tag":71,"props":1313,"children":1314},{"href":916},[1315],{"type":41,"tag":67,"props":1316,"children":1318},{"className":1317},[],[1319],{"type":47,"value":923},{"type":47,"value":1321}," for the canonical snippets and the variables available in each scope.",{"type":41,"tag":161,"props":1323,"children":1325},{"id":1324},"common-pitfalls",[1326],{"type":47,"value":1327},"Common Pitfalls",{"type":41,"tag":1329,"props":1330,"children":1331},"ol",{},[1332,1342,1386,1396,1406,1421,1438,1448],{"type":41,"tag":184,"props":1333,"children":1334},{},[1335,1340],{"type":41,"tag":56,"props":1336,"children":1337},{},[1338],{"type":47,"value":1339},"Don't set severity by default",{"type":47,"value":1341}," — leave it unset unless you actually need visual prioritization.",{"type":41,"tag":184,"props":1343,"children":1344},{},[1345,1361,1363,1368,1370,1375,1377,1385],{"type":41,"tag":56,"props":1346,"children":1347},{},[1348,1353,1355],{"type":41,"tag":67,"props":1349,"children":1351},{"className":1350},[],[1352],{"type":47,"value":440},{"type":47,"value":1354}," is not the same as ",{"type":41,"tag":67,"props":1356,"children":1358},{"className":1357},[],[1359],{"type":47,"value":1360},"readOnly: true",{"type":47,"value":1362}," — ",{"type":41,"tag":67,"props":1364,"children":1366},{"className":1365},[],[1367],{"type":47,"value":475},{"type":47,"value":1369}," only hides the workflow from the Preferences UI; ",{"type":41,"tag":67,"props":1371,"children":1373},{"className":1372},[],[1374],{"type":47,"value":372},{"type":47,"value":1376}," bypasses preferences and digests at runtime. See ",{"type":41,"tag":71,"props":1378,"children":1379},{"href":460},[1380],{"type":41,"tag":67,"props":1381,"children":1383},{"className":1382},[],[1384],{"type":47,"value":467},{"type":47,"value":159},{"type":41,"tag":184,"props":1387,"children":1388},{},[1389,1394],{"type":41,"tag":56,"props":1390,"children":1391},{},[1392],{"type":47,"value":1393},"Don't add fallbacks when the user named the channels",{"type":47,"value":1395}," — explicit channel requests are exact.",{"type":41,"tag":184,"props":1397,"children":1398},{},[1399,1404],{"type":41,"tag":56,"props":1400,"children":1401},{},[1402],{"type":47,"value":1403},"Cap the channel count at 3",{"type":47,"value":1405}," when the user didn't specify channels. More channels = more annoyance, not more reach.",{"type":41,"tag":184,"props":1407,"children":1408},{},[1409,1419],{"type":41,"tag":56,"props":1410,"children":1411},{},[1412,1414],{"type":47,"value":1413},"Don't combine digest with ",{"type":41,"tag":67,"props":1415,"children":1417},{"className":1416},[],[1418],{"type":47,"value":440},{"type":47,"value":1420}," — critical workflows must deliver immediately. The digest step is auto-skipped.",{"type":41,"tag":184,"props":1422,"children":1423},{},[1424,1429,1431,1436],{"type":41,"tag":56,"props":1425,"children":1426},{},[1427],{"type":47,"value":1428},"Digest key matters for conversational flows",{"type":47,"value":1430}," — without ",{"type":41,"tag":67,"props":1432,"children":1434},{"className":1433},[],[1435],{"type":47,"value":771},{"type":47,"value":1437},", a comment on Post A and a comment on Post B end up in the same digest.",{"type":41,"tag":184,"props":1439,"children":1440},{},[1441,1446],{"type":41,"tag":56,"props":1442,"children":1443},{},[1444],{"type":47,"value":1445},"Push only when offline",{"type":47,"value":1447}," — sending push to an online user duplicates the In-App alert.",{"type":41,"tag":184,"props":1449,"children":1450},{},[1451,1461,1463,1469],{"type":41,"tag":56,"props":1452,"children":1453},{},[1454,1456],{"type":47,"value":1455},"HTTP step needs ",{"type":41,"tag":67,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":47,"value":1233},{"type":47,"value":1462}," — without it, downstream steps can't read response properties via ",{"type":41,"tag":67,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":47,"value":1468},"{{ steps.\u003Cid>.\u003Cprop> }}",{"type":47,"value":159},{"type":41,"tag":161,"props":1471,"children":1473},{"id":1472},"references",[1474],{"type":47,"value":1475},"References",{"type":41,"tag":180,"props":1477,"children":1478},{},[1479,1488,1508,1517,1534],{"type":41,"tag":184,"props":1480,"children":1481},{},[1482,1486],{"type":41,"tag":71,"props":1483,"children":1484},{"href":700},[1485],{"type":47,"value":490},{"type":47,"value":1487}," — full decision tree and per-channel guidance",{"type":41,"tag":184,"props":1489,"children":1490},{},[1491,1495,1497,1502,1503],{"type":41,"tag":71,"props":1492,"children":1493},{"href":460},[1494],{"type":47,"value":265},{"type":47,"value":1496}," — behavior matrix, preference & digest interactions, ",{"type":41,"tag":67,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":47,"value":475},{"type":47,"value":477},{"type":41,"tag":67,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":47,"value":372},{"type":41,"tag":184,"props":1509,"children":1510},{},[1511,1515],{"type":41,"tag":71,"props":1512,"children":1513},{"href":812},[1514],{"type":47,"value":715},{"type":47,"value":1516}," — windows, keys, conversational digest patterns",{"type":41,"tag":184,"props":1518,"children":1519},{},[1520,1524,1526,1532],{"type":41,"tag":71,"props":1521,"children":1522},{"href":916},[1523],{"type":47,"value":1255},{"type":47,"value":1525}," — JSON-Logic snippets and Framework ",{"type":41,"tag":67,"props":1527,"children":1529},{"className":1528},[],[1530],{"type":47,"value":1531},"skip",{"type":47,"value":1533}," equivalents",{"type":41,"tag":184,"props":1535,"children":1536},{},[1537,1541],{"type":41,"tag":71,"props":1538,"children":1539},{"href":1241},[1540],{"type":47,"value":930},{"type":47,"value":1542}," — the 9 reference flows with severity\u002Fcritical\u002Finteraction tables",{"type":41,"tag":161,"props":1544,"children":1546},{"id":1545},"see-also",[1547],{"type":47,"value":1548},"See Also",{"type":41,"tag":180,"props":1550,"children":1551},{},[1552,1572,1605,1627,1640],{"type":41,"tag":184,"props":1553,"children":1554},{},[1555,1563,1565,1570],{"type":41,"tag":71,"props":1556,"children":1557},{"href":150},[1558],{"type":41,"tag":67,"props":1559,"children":1561},{"className":1560},[],[1562],{"type":47,"value":157},{"type":47,"value":1564}," — author step content (subject, body, ",{"type":41,"tag":67,"props":1566,"children":1568},{"className":1567},[],[1569],{"type":47,"value":145},{"type":47,"value":1571},", headers, conditions) for Dashboard or Novu MCP workflows",{"type":41,"tag":184,"props":1573,"children":1574},{},[1575,1583,1585,1591,1592,1597,1598,1603],{"type":41,"tag":71,"props":1576,"children":1577},{"href":73},[1578],{"type":41,"tag":67,"props":1579,"children":1581},{"className":1580},[],[1582],{"type":47,"value":107},{"type":47,"value":1584}," — implement these designs in code (",{"type":41,"tag":67,"props":1586,"children":1588},{"className":1587},[],[1589],{"type":47,"value":1590},"workflow()",{"type":47,"value":117},{"type":41,"tag":67,"props":1593,"children":1595},{"className":1594},[],[1596],{"type":47,"value":123},{"type":47,"value":117},{"type":41,"tag":67,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":47,"value":130},{"type":47,"value":1604},", Bridge)",{"type":41,"tag":184,"props":1606,"children":1607},{},[1608,1618,1620,1625],{"type":41,"tag":71,"props":1609,"children":1611},{"href":1610},"..\u002Fmanage-preferences",[1612],{"type":41,"tag":67,"props":1613,"children":1615},{"className":1614},[],[1616],{"type":47,"value":1617},"manage-preferences\u002F",{"type":47,"value":1619}," — how ",{"type":41,"tag":67,"props":1621,"children":1623},{"className":1622},[],[1624],{"type":47,"value":372},{"type":47,"value":1626}," interacts with subscriber-level preferences",{"type":41,"tag":184,"props":1628,"children":1629},{},[1630,1638],{"type":41,"tag":71,"props":1631,"children":1632},{"href":250},[1633],{"type":41,"tag":67,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":47,"value":257},{"type":47,"value":1639}," — how severity surfaces visually in the Inbox",{"type":41,"tag":184,"props":1641,"children":1642},{},[1643,1651],{"type":41,"tag":71,"props":1644,"children":1645},{"href":228},[1646],{"type":41,"tag":67,"props":1647,"children":1649},{"className":1648},[],[1650],{"type":47,"value":235},{"type":47,"value":1652}," — invoking a workflow once it's designed",{"items":1654,"total":1757},[1655,1671,1683,1689,1703,1723,1734,1746],{"slug":1656,"name":1656,"fn":1657,"description":1658,"org":1659,"tags":1660,"stars":1668,"repoUrl":1669,"updatedAt":1670},"env-setup","configure Novu environment variables","Create or update Novu environment variables in the user's project safely (never expose the secret key to the client). Complements the official Novu skills by covering project-level env configuration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1661,1664,1667],{"name":1662,"slug":1663,"type":16},"Configuration","configuration",{"name":1665,"slug":1666,"type":16},"Environment Variables","environment-variables",{"name":21,"slug":22,"type":16},39301,"https:\u002F\u002Fgithub.com\u002Fnovuhq\u002Fnovu","2026-07-13T06:21:58.740401",{"slug":1672,"name":1672,"fn":1673,"description":1674,"org":1675,"tags":1676,"stars":23,"repoUrl":24,"updatedAt":1682},"novu-dashboard-workflows","author Novu workflow step content","Author step content for Novu workflows defined in the Dashboard or generated\u002Fedited 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.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1677,1680,1681],{"name":1678,"slug":1679,"type":16},"MCP","mcp",{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},"2026-07-13T06:21:22.380822",{"slug":4,"name":4,"fn":5,"description":6,"org":1684,"tags":1685,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1686,1687,1688],{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"slug":1690,"name":1690,"fn":1691,"description":1692,"org":1693,"tags":1694,"stars":23,"repoUrl":24,"updatedAt":1702},"novu-framework-integration","build code-first notification workflows","Build code-first notification workflows with @novu\u002Fframework. Use when defining workflows in TypeScript (Zod \u002F JSON Schema \u002F Class Validator), composing channel steps (email, SMS, push, chat, in-app) with action steps (delay, digest, custom), exposing Step Controls for non-technical teammates, rendering React\u002FVue\u002FSvelte Email templates, hosting the Bridge Endpoint inside Next.js, Express, NestJS, Remix, Nuxt, SvelteKit, H3, or AWS Lambda, syncing to Novu Cloud via CLI \u002F GitHub Actions, securing production with HMAC, or implementing translations, hydration, multi-channel orchestration, and LLM-powered notification logic in code.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1695,1698,1699],{"name":1696,"slug":1697,"type":16},"Backend","backend",{"name":21,"slug":22,"type":16},{"name":1700,"slug":1701,"type":16},"TypeScript","typescript","2026-07-13T06:21:20.83585",{"slug":1704,"name":1704,"fn":1705,"description":1706,"org":1707,"tags":1708,"stars":23,"repoUrl":24,"updatedAt":1722},"novu-inbox-integration","integrate Novu in-app notification inbox","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.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1709,1712,1715,1718,1719],{"name":1710,"slug":1711,"type":16},"Frontend","frontend",{"name":1713,"slug":1714,"type":16},"JavaScript","javascript",{"name":1716,"slug":1717,"type":16},"Next.js","next-js",{"name":21,"slug":22,"type":16},{"name":1720,"slug":1721,"type":16},"React","react","2026-07-13T06:21:11.359078",{"slug":1724,"name":1724,"fn":1725,"description":1726,"org":1727,"tags":1728,"stars":23,"repoUrl":24,"updatedAt":1733},"novu-manage-preferences","configure Novu notification preferences","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\u002Fopt-out, configuring per-channel delivery preferences, or building a preferences management UI.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1729,1730],{"name":21,"slug":22,"type":16},{"name":1731,"slug":1732,"type":16},"Operations","operations","2026-07-13T06:21:30.061407",{"slug":1735,"name":1735,"fn":1736,"description":1737,"org":1738,"tags":1739,"stars":23,"repoUrl":24,"updatedAt":1745},"novu-manage-subscribers","manage Novu notification subscribers and topics","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.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1740,1743,1744],{"name":1741,"slug":1742,"type":16},"API Development","api-development",{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16},"2026-07-16T06:00:28.792114",{"slug":1747,"name":1747,"fn":1748,"description":1749,"org":1750,"tags":1751,"stars":23,"repoUrl":24,"updatedAt":1756},"novu-trigger-notification","trigger Novu notification workflows","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.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1752,1755],{"name":1753,"slug":1754,"type":16},"Automation","automation",{"name":21,"slug":22,"type":16},"2026-07-13T06:21:23.63132",8,{"items":1759,"total":1802},[1760,1766,1772,1778,1786,1791,1797],{"slug":1672,"name":1672,"fn":1673,"description":1674,"org":1761,"tags":1762,"stars":23,"repoUrl":24,"updatedAt":1682},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1763,1764,1765],{"name":1678,"slug":1679,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"slug":4,"name":4,"fn":5,"description":6,"org":1767,"tags":1768,"stars":23,"repoUrl":24,"updatedAt":25},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1769,1770,1771],{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16},{"name":18,"slug":19,"type":16},{"slug":1690,"name":1690,"fn":1691,"description":1692,"org":1773,"tags":1774,"stars":23,"repoUrl":24,"updatedAt":1702},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1775,1776,1777],{"name":1696,"slug":1697,"type":16},{"name":21,"slug":22,"type":16},{"name":1700,"slug":1701,"type":16},{"slug":1704,"name":1704,"fn":1705,"description":1706,"org":1779,"tags":1780,"stars":23,"repoUrl":24,"updatedAt":1722},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1781,1782,1783,1784,1785],{"name":1710,"slug":1711,"type":16},{"name":1713,"slug":1714,"type":16},{"name":1716,"slug":1717,"type":16},{"name":21,"slug":22,"type":16},{"name":1720,"slug":1721,"type":16},{"slug":1724,"name":1724,"fn":1725,"description":1726,"org":1787,"tags":1788,"stars":23,"repoUrl":24,"updatedAt":1733},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1789,1790],{"name":21,"slug":22,"type":16},{"name":1731,"slug":1732,"type":16},{"slug":1735,"name":1735,"fn":1736,"description":1737,"org":1792,"tags":1793,"stars":23,"repoUrl":24,"updatedAt":1745},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1794,1795,1796],{"name":1741,"slug":1742,"type":16},{"name":14,"slug":15,"type":16},{"name":21,"slug":22,"type":16},{"slug":1747,"name":1747,"fn":1748,"description":1749,"org":1798,"tags":1799,"stars":23,"repoUrl":24,"updatedAt":1756},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1800,1801],{"name":1753,"slug":1754,"type":16},{"name":21,"slug":22,"type":16},7]