Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu’s agent communication infrastructure to your agent code and back.
Agents are currently in private beta. Please contact us at [email protected] to get access.
Novu for Agents sits between chat providers and your code. Users can message your agent, and your agent can message them back on the same thread.When a user sends a message or interacts with your agent from a connected platform, Novu receives it, resolves identity and conversation state, and forwards the full context to agent brain. Your agent brain processes the message and replies; Novu delivers the response back to the platform.
A custom code agent is one where you build the agent brain with your own code. Use the Agent SDK, LangChain, and similar tools to implement it. Your agent brain receives the context object and processes it however you decide. Call an LLM, run business logic, route to a human, or combine all three.
Custom code agent message flow from a connected platform through Novu to your agent brain and back.
A managed agent is one where a platform (for example, Claude) manages the agent’s intelligence and provides system tools such as grep, web search, and connections to external tools like Linear and Notion via MCP.
Managed agent message flow where the platform manages intelligence and system tools.
A conversation is the stateful thread where communication happens. When a user sends a message from a connected provider, Novu creates a new conversation or loads the existing one for that thread. The conversation includes message history, metadata, participants, status, and platform context needed to process the next interaction.A conversation can include multiple participants. The agent is one participant in the conversation, but it is not the conversation itself. This distinction matters when you inspect conversations in the dashboard or build agent behavior around conversation state. A Slack thread, email thread, in-app Web Chat thread, or other provider-specific thread maps to a conversation in Novu automatically.
Participants are the people, agents, or systems involved in a conversation. When a user messages your agent from a provider, Novu tries to resolve that platform user to a known subscriber.
If a match exists, the handler receives subscriber information such as subscriber ID, name, or email. This subscriber is used to identify the user across conversations.
If no match exists, the user is tracked as a platform user and your agent brain should account for cases where subscriber data is unavailable.
Once identity is resolved later, they are upgraded to a full subscriber and future messages include their subscriber data. Subscriber identity helps your agent personalize responses, look up account details, or decide whether a conversation should be escalated. Identity resolution is provider-aware: a Slack user and an email sender may each have different identifiers at the provider level that Novu resolves to a single subscriber.
Novu calls your agent brain with the complete context: the message, conversation history, subscriber, and platform details. Your agent brain processes it with your LLM, business logic, or any system you choose and calls ctx.reply() in case of custom code agent or sends a reply message to the platform in case of managed agent.
{"docsConfig":{"theme":"luma","$schema":"https://mintlify.com/docs.json","name":"Novu","description":"The open-source notification infrastructure for agents and products. Send, receive, and track notifications across channels.","colors":{"primary":"#0e121b","light":"#FFFFFF","dark":"#FFFFFF"},"logo":{"light":"https://mintcdn.com/novu-c5de82d9/2Q_L4HxwUfLmJjB8/logo/light.svg?fit=max\u0026auto=format\u0026n=2Q_L4HxwUfLmJjB8\u0026q=85\u0026s=23e7050191303b6a0ac4a671dfed8df4","dark":"https://mintcdn.com/novu-c5de82d9/2Q_L4HxwUfLmJjB8/logo/dark.svg?fit=max\u0026auto=format\u0026n=2Q_L4HxwUfLmJjB8\u0026q=85\u0026s=bd7c54f6b7a7b5002ea7b525af3e169c","href":"https://docs.novu.co"},"favicon":"https://mintcdn.com/novu-c5de82d9/ZUl3xXp-4AASlrcI/favicon.svg?fit=max\u0026auto=format\u0026n=ZUl3xXp-4AASlrcI\u0026q=85\u0026s=b53c3afb6a8eaf11aff9db2c5d3f05a1","api":{"openapi":"https://spec.speakeasy.com/novu/novu/json-development-with-code-samples","examples":{"prefill":true}},"background":{},"navbar":{"links":[{"href":"https://novu.co/contact-us","label":"Contact Us"}],"primary":{"type":"button","label":"Get Started","href":"https://dashboard.novu.co/auth/sign-up"}},"footer":{"socials":{"x":"https://x.com/novuhq","github":"https://github.com/novuhq/novu","linkedin":"https://www.linkedin.com/company/novuco"},"links":[{"header":"Comparison","items":[{"label":"Novu vs Courier","href":"https://novu.co/comparison/courier"},{"label":"Novu vs Knock","href":"https://novu.co/comparison/knock"},{"label":"Novu vs MagicBell","href":"https://novu.co/comparison/magicbell"},{"label":"Novu vs SuprSend","href":"https://novu.co/comparison/suprsend"},{"label":"Novu vs In-house","href":"https://novu.co/comparison/building-in-house"}]},{"header":"Resources","items":[{"label":"Contact Support","href":"mailto:[email protected]"},{"label":"Changelog","href":"https://go.novu.co/changelog?utm_source=docs_footer"},{"label":"Roadmap","href":"https://roadmap.novu.co/roadmap"},{"label":"Contact Sales","href":"https://novu.co/contact-us"},{"label":"Read llms.txt","href":"/llms.txt"}]}]},"seo":{"metatags":{"og:type":"website","twitter:card":"summary_large_image"},"indexing":"all"},"icons":{"library":"lucide"},"integrations":{"gtm":{"tagId":"GTM-KXMC4XP2"},"plausible":{"domain":"docs.novu.co"}},"contextual":{"options":["copy","view","cursor","claude","chatgpt","mcp","add-mcp"],"display":"header"},"thumbnails":{"appearance":"dark","background":"https://mintcdn.com/novu-c5de82d9/vncv7ET97M5-dM6d/images/og/og-image-docs-v2.jpg?fit=max\u0026auto=format\u0026n=vncv7ET97M5-dM6d\u0026q=85\u0026s=26b59f5c597b5b1bea44cbc57cad5e3a","fonts":{"family":"Inter"}},"interaction":{"drilldown":true},"styling":{"latex":false},"navigation":{"global":{"anchors":[]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"novu-c5de82d9","hasAudioNarration":false,"actualSubdomain":"novu-c5de82d9","customDomains":["docs.novu.co"],"gitSource":{"type":"github","owner":"novuhq","repo":"novu","deployBranch":"next","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"collectionId":"c932d2b5-80fd-42cd-b7b7-3097a34ca75b","liveDeploymentHistoryId":"6ad784b2fabd5b964e3504c4","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad784b2fabd5b964e3504c4"},"feedback":{"thumbs":true,"edits":true,"issues":true,"agentFeedback":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"}},"buildId":"6ad784b2fabd5b964e3504c4","clientVersion":"0.0.3926","searchFilterCounts":[{"language":"default","tag":"Notify","count":216},{"language":"default","tag":"API Reference","count":160},{"language":"default","tag":"Resources","count":107},{"language":"default","tag":"Integrate Channels Providers","count":93},{"language":"default","tag":"Guides","count":86},{"language":"default","tag":"Data","count":63},{"language":"default","tag":"Getting Started","count":62},{"language":"default","tag":"Framework","count":52},{"language":"default","tag":"Agent Connect","count":41},{"language":"default","tag":"Sms","count":38}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"[email protected]","showHelpButton":true}},"hasChatPermissions":true,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"@media (min-width:1024px){#sidebar-content{width:16rem;min-width:16rem;max-width:16rem}}body:has(#home-content) nav[aria-label=Main] a[aria-current=location]{background:0 0!important;color:rgb(75 85 99)}html.dark body:has(#home-content) nav[aria-label=Main] a[aria-current=location]{color:rgb(156 163 175)}body:has(#home-content) nav[aria-label=Main] a[aria-current=location]:hover{background:rgb(3 7 18/.03)!important;color:rgb(17 24 39)}html.dark body:has(#home-content) nav[aria-label=Main] a[aria-current=location]:hover{background:rgb(255 255 255/.03)!important;color:rgb(229 231 235)}#home-content .hero-cards{margin-top:1.5rem}#home-content .card [data-component-part=card-image]{width:107.5%;max-width:none;margin:-3.75% -3.75% 0}"}],"page":{"pagePath":"agents/get-started/mental-model","slug":"/agents/get-started/mental-model","pageMetadata":{"title":"Mental model","description":"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu's agent communication infrastructure to your agent code and back.","href":"/agents/get-started/mental-model"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu’s agent communication infrastructure to your agent code and back.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,ul:`ul`,..._provideComponents(),...props.components},{Card,Columns,Frame,Heading,Note,OptimizedImage,Tab,Tabs}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!Columns)_missingMdxReference(`Columns`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);return _jsxs(_Fragment,{children:[_jsx(Note,{children:_jsxs(_components.p,{children:[`Agents are currently in private beta. Please contact us at `,_jsx(_components.a,{href:`mailto:[email protected]`,children:`[email protected]`}),` to get access.`]})}),`\n`,_jsx(_components.p,{children:`Novu for Agents sits between chat providers and your code. Users can message your agent, and your agent can message them back on the same thread.`}),`\n`,_jsx(_components.p,{children:`When a user sends a message or interacts with your agent from a connected platform, Novu receives it, resolves identity and conversation state, and forwards the full context to agent brain. Your agent brain processes the message and replies; Novu delivers the response back to the platform.`}),`\n`,_jsx(Heading,{level:`2`,id:`types-of-agents`,children:`Types of agents`}),`\n`,_jsx(_components.p,{children:`Novu supports two types of agents:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Custom code agent`}),`\n`,_jsx(_components.li,{children:`Managed agent`}),`\n`]}),`\n`,_jsxs(Tabs,{children:[_jsxs(Tab,{title:`Custom code agent`,id:`custom-code-agent`,children:[_jsx(_components.p,{children:`A custom code agent is one where you build the agent brain with your own code. Use the Agent SDK, LangChain, and similar tools to implement it. Your agent brain receives the context object and processes it however you decide. Call an LLM, run business logic, route to a human, or combine all three.`}),_jsx(Frame,{caption:`Custom code agent message flow from a connected platform through Novu to your agent brain and back.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/custom-code-agent/flow.png?fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=65f5f32b7ec78627101e4b5637ef0223`,alt:`Custom code agent`,\"data-og-width\":`1920`,width:`1920`,\"data-og-height\":`1025`,height:`1025`,\"data-path\":`images/agents/custom-code-agent/flow.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/custom-code-agent/flow.png?w=280\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=3ee2fab441baf00efaeb357fcbdcc2a6 280w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/custom-code-agent/flow.png?w=560\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=f3ea41eff4a78e864a323959b1d0b180 560w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/custom-code-agent/flow.png?w=840\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=4d79971825262232ee2f9aecdb4f6132 840w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/custom-code-agent/flow.png?w=1100\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=2afde9fa4888d884d2440478133cc5ea 1100w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/custom-code-agent/flow.png?w=1650\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=3b810fe909b82dd71567171b771e31cb 1650w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/custom-code-agent/flow.png?w=2500\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=bdabb184a24261b5f78a8ac66b186894 2500w`})}),_jsxs(_components.p,{children:[`Read more on how to `,_jsx(_components.a,{href:`/agents/get-started/ai-sdk`,children:`connect a custom code agent`}),`.`]})]}),_jsxs(Tab,{title:`Managed agent`,id:`managed-agent`,children:[_jsx(_components.p,{children:`A managed agent is one where a platform (for example, Claude) manages the agent’s intelligence and provides system tools such as grep, web search, and connections to external tools like Linear and Notion via MCP.`}),_jsx(Frame,{caption:`Managed agent message flow where the platform manages intelligence and system tools.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/managed-agent/flow.png?fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=3ab18531d3fab66bd16c63957bb00995`,alt:`Managed agent`,\"data-og-width\":`1672`,width:`1672`,\"data-og-height\":`941`,height:`941`,\"data-path\":`images/agents/managed-agent/flow.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/managed-agent/flow.png?w=280\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=eb9c4b633552c61ab24b14a27b2e7f6f 280w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/managed-agent/flow.png?w=560\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=db1c61387396102e3eda8aa9fd733479 560w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/managed-agent/flow.png?w=840\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=cb6be39978a775811b43bdeca9a03149 840w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/managed-agent/flow.png?w=1100\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=87d91151c46d5ef76a6c779778ddb294 1100w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/managed-agent/flow.png?w=1650\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=5f8156e206e9d06c03aef39415af159d 1650w, https://mintcdn.com/novu-c5de82d9/GgsvkDH1Mx055NRY/images/agents/managed-agent/flow.png?w=2500\u0026fit=max\u0026auto=format\u0026n=GgsvkDH1Mx055NRY\u0026q=85\u0026s=a781cfb69117c95e29a28e16fff49e5c 2500w`})}),_jsxs(_components.p,{children:[`Read more on how to `,_jsx(_components.a,{href:`/agents/managed-agent/overview`,children:`connect a managed agent`}),`.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`conversations`,children:`Conversations`}),`\n`,_jsx(_components.p,{children:`A conversation is the stateful thread where communication happens. When a user sends a message from a connected provider, Novu creates a new conversation or loads the existing one for that thread. The conversation includes message history, metadata, participants, status, and platform context needed to process the next interaction.`}),`\n`,_jsx(_components.p,{children:`A conversation can include multiple participants. The agent is one participant in the conversation, but it is not the conversation itself. This distinction matters when you inspect conversations in the dashboard or build agent behavior around conversation state. A Slack thread, email thread, in-app Web Chat thread, or other provider-specific thread maps to a conversation in Novu automatically.`}),`\n`,_jsx(Heading,{level:`2`,id:`participants-and-subscriber-identity`,children:`Participants and subscriber identity`}),`\n`,_jsx(_components.p,{children:`Participants are the people, agents, or systems involved in a conversation. When a user messages your agent from a provider, Novu tries to resolve that platform user to a known subscriber.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`If a match exists, the handler receives subscriber information such as subscriber ID, name, or email. This subscriber is used to identify the user across conversations.`}),`\n`,_jsx(_components.li,{children:`If no match exists, the user is tracked as a platform user and your agent brain should account for cases where subscriber data is unavailable.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Once identity is resolved later, they are upgraded to a full subscriber and future messages include their subscriber data. Subscriber identity helps your agent personalize responses, look up account details, or decide whether a conversation should be escalated. Identity resolution is provider-aware: a Slack user and an email sender may each have different identifiers at the provider level that Novu resolves to a single subscriber.`}),`\n`,_jsx(Heading,{level:`2`,id:`agent-brain`,children:`Agent brain`}),`\n`,_jsxs(_components.p,{children:[`Novu calls your agent brain with the complete context: the message, conversation history, subscriber, and platform details. Your agent brain processes it with your LLM, business logic, or any system you choose and calls `,_jsx(_components.code,{children:`ctx.reply()`}),` in case of custom code agent or sends a reply message to the platform in case of managed agent.`]}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(Columns,{cols:2,children:[_jsx(Card,{icon:`sparkles`,href:`/agents/get-started/ai-sdk`,title:`Connect AI SDK`,children:_jsx(_components.p,{children:`Connect a Vercel AI SDK agent to Slack.`})}),_jsx(Card,{icon:`link`,href:`/agents/get-started/langchain`,title:`Connect LangChain`,children:_jsx(_components.p,{children:`Connect a LangChain agent to Slack.`})}),_jsx(Card,{icon:`boxes`,href:`/agents/get-started/mastra`,title:`Connect Mastra`,children:_jsx(_components.p,{children:`Connect a Mastra agent to Slack.`})}),_jsx(Card,{icon:`hash`,href:`/agents/channels/slack`,title:`Slack`,children:_jsx(_components.p,{children:`Slack capabilities and setup links.`})}),_jsx(Card,{icon:`message-circle`,href:`/agents/channels/web-chat`,title:`Web Chat`,children:_jsx(_components.p,{children:`Headless chat in your product UI.`})}),_jsx(Card,{icon:`brain`,href:`/agents/managed-agent/overview`,title:`Managed agent`,children:_jsx(_components.p,{children:`Connect a managed Claude agent.`})}),_jsx(Card,{icon:`code`,href:`/api-reference/agents/agent-schema`,title:`Agents API reference`,children:_jsx(_components.p,{children:`Create, configure, and manage agents programmatically.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Mental model","description":"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu's agent communication infrastructure to your agent code and back.","href":"/agents/get-started/mental-model"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Types of agents","slug":"types-of-agents","depth":2,"children":[]},{"title":"Conversations","slug":"conversations","depth":2,"children":[]},{"title":"Participants and subscriber identity","slug":"participants-and-subscriber-identity","depth":2,"children":[]},{"title":"Agent brain","slug":"agent-brain","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"novu-c5de82d9","siteName":"Novu","title":"Mental model - Novu","contextualStarterQuestions":[{"_id":"6a914723b6e795055035517a","deploymentId":"6a3b890b89d2acbacf3fa68a","questionText":"How do I build a custom agent?","status":"active","generatedBy":"contextual","path":"agents/get-started/mental-model","createdAt":"2026-08-28T08:30:27.004Z","updatedAt":"2026-08-28T08:30:27.004Z","__v":0},{"_id":"6a914723b6e7950550355179","deploymentId":"6a3b890b89d2acbacf3fa68a","questionText":"What are the agent types?","status":"active","generatedBy":"contextual","path":"agents/get-started/mental-model","createdAt":"2026-08-28T08:30:27.004Z","updatedAt":"2026-08-28T08:30:27.004Z","__v":0},{"_id":"6a914723b6e7950550355178","deploymentId":"6a3b890b89d2acbacf3fa68a","questionText":"How do messages flow through Novu?","status":"active","generatedBy":"contextual","path":"agents/get-started/mental-model","createdAt":"2026-08-28T08:30:27.004Z","updatedAt":"2026-08-28T08:30:27.004Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-08-28T08:30:10.994Z","originalFileLocation":"agents/get-started/mental-model.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu\u0026#x27;s agent communication infrastructure to your agent code and back.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Novu\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Mental model - Novu\">\u003cmeta data-mint-head property=\"og:description\" content=\"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu\u0026#x27;s agent communication infrastructure to your agent code and back.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Novu\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.novu.co/agents/get-started/mental-model\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://novu-c5de82d9.mintlify.app/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Mental+model\u0026amp;description=Trace+how+inbound+messages+flow+from+Slack%2C+Teams%2C+WhatsApp%2C+email%2C+or+in-app+Web+Chat+through+Novu%27s+agent+communication+infrastructure+to+your+agent+code+and+\u0026amp;theme=1f1d5e862872d3ca3fce0f95\u0026amp;signature=d2b61ca4ac8fd5e7e392ccb4383e1a0f8158ac3c18877fc83da312153363cc72\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Mental model - Novu\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu\u0026#x27;s agent communication infrastructure to your agent code and back.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://novu-c5de82d9.mintlify.app/_mintlify/api/og/v2?division=Getting+Started\u0026amp;title=Mental+model\u0026amp;description=Trace+how+inbound+messages+flow+from+Slack%2C+Teams%2C+WhatsApp%2C+email%2C+or+in-app+Web+Chat+through+Novu%27s+agent+communication+infrastructure+to+your+agent+code+and+\u0026amp;theme=1f1d5e862872d3ca3fce0f95\u0026amp;signature=d2b61ca4ac8fd5e7e392ccb4383e1a0f8158ac3c18877fc83da312153363cc72\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/novu-c5de82d9/hif-BqO_gbG8zfWr/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Novu\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0e121b\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.novu.co/agents/get-started/mental-model\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/agents/get-started/mental-model.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.novu.co/#organization\",\"name\":\"Novu\",\"url\":\"https://docs.novu.co\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/novu-c5de82d9/2Q_L4HxwUfLmJjB8/logo/light.svg?fit=max\u0026auto=format\u0026n=2Q_L4HxwUfLmJjB8\u0026q=85\u0026s=23e7050191303b6a0ac4a671dfed8df4\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.novu.co#website\",\"name\":\"Novu\",\"url\":\"https://docs.novu.co\",\"publisher\":{\"@id\":\"https://docs.novu.co/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.novu.co/agents/get-started/mental-model#webpage\",\"url\":\"https://docs.novu.co/agents/get-started/mental-model\",\"name\":\"Mental model\",\"description\":\"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu's agent communication infrastructure to your agent code and back.\",\"dateModified\":\"2026-08-28T08:30:10.994Z\",\"isPartOf\":{\"@id\":\"https://docs.novu.co#website\"},\"breadcrumb\":{\"@id\":\"https://docs.novu.co/agents/get-started/mental-model#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.novu.co/agents/get-started/mental-model#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started\",\"item\":\"https://docs.novu.co/agents\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mental model\",\"item\":\"https://docs.novu.co/agents/get-started/mental-model\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.novu.co/agents/get-started/mental-model#article\",\"headline\":\"Mental model\",\"name\":\"Mental model\",\"description\":\"Trace how inbound messages flow from Slack, Teams, WhatsApp, email, or in-app Web Chat through Novu's agent communication infrastructure to your agent code and back.\",\"url\":\"https://docs.novu.co/agents/get-started/mental-model\",\"mainEntityOfPage\":{\"@id\":\"https://docs.novu.co/agents/get-started/mental-model#webpage\"},\"dateModified\":\"2026-08-28T08:30:10.994Z\",\"publisher\":{\"@id\":\"https://docs.novu.co/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.novu.co#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Novu\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Novu","nav":{"global":{"anchors":[]},"tabs":[{"tab":"Notify","pages":[{"title":"Notify","href":"/platform"}]},{"tab":"Agent Connect","groups":[{"group":"Getting Started","boost":3,"pages":[{"title":"Novu Connect - Agent Communication Infrastructure (ACI)","sidebarTitle":"Overview","href":"/agents"},{"title":"What is ACI?","description":"Learn what the Agent Communication Interface (ACI) is, what problems it solves, and how it helps AI agents talk to users across chat, email, and push.","href":"/agents/get-started/what-is-aci"},{"title":"Mental model","href":"/agents/get-started/mental-model"},{"title":"Agents and providers","description":"How Novu agents and provider connections route messages, resolve identity, and deliver replies across supported channels.","href":"/agents/get-started/agents-and-providers"},{"title":"Workflow-assigned agents","sidebarTitle":"Workflow-assigned agents","href":"/agents/workflow-agents"},{"group":"Quickstart","pages":[{"title":"Connect AI SDK to Slack","sidebarTitle":"Connect AI SDK","href":"/agents/get-started/ai-sdk"},{"title":"Connect LangChain to Slack","sidebarTitle":"Connect LangChain","href":"/agents/get-started/langchain"},{"title":"Connect Mastra to Slack","sidebarTitle":"Connect Mastra","href":"/agents/get-started/mastra"},{"title":"Connect Claude managed agent","sidebarTitle":"Claude Managed","href":"/agents/get-started/claude-managed"},{"title":"Connect AWS Claude managed agent","sidebarTitle":"AWS Claude Managed","href":"/agents/get-started/aws-claude"}]}]},{"group":"Channels","icon":"messages-square","pages":[{"title":"Overview","sidebarTitle":"Overview","href":"/agents/channels/overview"},{"title":"Slack","sidebarTitle":"Slack","href":"/agents/channels/slack"},{"title":"Microsoft Teams","sidebarTitle":"Microsoft Teams","href":"/agents/channels/microsoft-teams"},{"title":"WhatsApp","sidebarTitle":"WhatsApp","href":"/agents/channels/whatsapp"},{"title":"Telegram","sidebarTitle":"Telegram","href":"/agents/channels/telegram"},{"title":"Email","sidebarTitle":"Email","href":"/agents/channels/email"},{"group":"Web Chat","root":{"title":"Web Chat","sidebarTitle":"Web Chat","href":"/agents/channels/web-chat"},"tag":"Beta","pages":[{"title":"Messages","sidebarTitle":"Messages","href":"/agents/channels/web-chat/messages"},{"title":"Tools","sidebarTitle":"Tools","href":"/agents/channels/web-chat/tools"},{"title":"Generative UI","sidebarTitle":"Generative UI","href":"/agents/channels/web-chat/generative-ui"},{"title":"Conversations","sidebarTitle":"Conversations","href":"/agents/channels/web-chat/conversations"},{"group":"Recipes","pages":[{"title":"Use assistant-ui","sidebarTitle":"assistant-ui","href":"/agents/channels/web-chat/recipes/assistant-ui"}]},{"title":"Security","sidebarTitle":"Security","href":"/agents/channels/web-chat/security"}]}]},{"group":"Custom Code Agent","icon":"code","pages":[{"title":"Concepts","href":"/agents/custom-code-agent/concepts"},{"title":"Connecting your app","href":"/agents/custom-code-agent/connecting-your-app"},{"group":"Frameworks","pages":[{"title":"AI SDK reference","sidebarTitle":"AI SDK","href":"/agents/custom-code-agent/frameworks/ai-sdk"},{"title":"LangChain reference","sidebarTitle":"LangChain","href":"/agents/custom-code-agent/frameworks/langchain"},{"title":"Other frameworks reference","sidebarTitle":"Other","href":"/agents/custom-code-agent/frameworks/other"}]},{"group":"Building blocks","pages":[{"title":"Handlers and context","href":"/agents/custom-code-agent/building-blocks/handle-events"},{"title":"Reply","href":"/agents/custom-code-agent/building-blocks/reply"},{"title":"Emit custom events","sidebarTitle":"Emit","href":"/agents/custom-code-agent/building-blocks/emit"},{"title":"Typing indicator","href":"/agents/custom-code-agent/building-blocks/typing-indicator"},{"title":"Edit sent messages","href":"/agents/custom-code-agent/building-blocks/edit-sent-messages"},{"title":"Signals","href":"/agents/custom-code-agent/building-blocks/signals"},{"title":"Tool approval","href":"/agents/custom-code-agent/building-blocks/tool-approval"}]},{"title":"Connect Components","href":"/agents/custom-code-agent/connect-components"},{"title":"Going to production","href":"/agents/custom-code-agent/going-to-production"}]},{"group":"Managed Agent","icon":"bot","pages":[{"title":"Managed Agent Overview - Novu Connect","sidebarTitle":"Overview","href":"/agents/managed-agent/overview"},{"title":"Concepts","href":"/agents/managed-agent/concepts"},{"title":"Configure MCP servers","href":"/agents/managed-agent/configure-mcp-servers"},{"title":"Add skills","href":"/agents/managed-agent/add-skills"}]},{"group":"Observability","icon":"eye","pages":[{"title":"Agent Conversations","href":"/agents/conversations"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/api-reference"}]},{"tab":"Resources","menu":[{"item":"Guides","pages":[{"title":"Guides","href":"/guides"}]},{"item":"Framework","pages":[{"title":"Framework","href":"/framework"}]},{"item":"Community","pages":[{"title":"Community","href":"/community"}]}],"pages":[{"title":"Resources","href":"/guides"}]}]},"title":"Mental model - Novu","buildId":"dpl_9DauxEjb9gzCtcuhPQFbquJvx7FJ","deploymentId":"dpl_9DauxEjb9gzCtcuhPQFbquJvx7FJ","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-DpBmNN95.js","DynamicMarkdown-BY_qDhTn.js","zoom-image-lightbox-D4WcYaf4.js","PlusIcon-CwhPVjTe.js","lightbox-handle-r17bVUz3.js"]}