Building, integrating, or customizing apps and workflows within Microsoft Teams using developer tools and APIs
Based on the official Microsoft documentation and practical development experience, it is highly recommended to stick with the Teams SDK / Bot Framework rather than relying purely on Microsoft Graph APIs, especially since your app requires a dashboard tab, dual authentication, and bot-like identity.
While Graph API plays a crucial supplementary role (like proactive app installation), the Bot Framework is the primary, supported path for notification bots. Here is a breakdown of why, and a comparison of the two approaches:
-While you can send messages via Graph, it is generally not designed to replace a standalone bot for several reasons:
+Graph APIs usually require Delegated permissions to send chat/channel messages, meaning the message will appear as if it was sent by the authenticated user (or a generic service account), not a dedicated "Bot" identity. Application permissions for posting standard messages are heavily restricted or unsupported (mostly reserved for migration APIs).
+Because Graph is an HTTP-level REST API, you are responsible for building the entire infrastructure to manage authentication tokens, conversation IDs, retry logic, and state.
+Graph API is subject to stricter throttling limits (e.g., roughly 1 message per second per channel/chat per app/user).
+You can achieve this via Graph (e.g., using TeamsAppInstallation.ReadWriteSelfForUser.All and posting directly), but you still run into the identity issues mentioned above.
-Teams SDK / Bot Framework:
+Messages are sent under the bot's actual name and avatar, providing a professional and clear experience for the end user.
+The SDK natively handles authentication, state management, retry logic, rate limits, and targeting (users vs. chats vs. teams).
+It offers first-class support for Adaptive Cards. If you ever want your notifications to be actionable (e.g., adding a button to "Approve" an event directly in the chat), the Bot Framework handles this seamlessly via Task Modules and action routing. Graph-only setups require massive workarounds to handle interactive button clicks.
+This is natively supported. You can save the conversation reference or use Graph just to proactively install the app for the user, and then hand it off to the SDK to send the message. The Teams Toolkit even has a scaffolded template specifically for "Notification-only" bots.
+Because your use case involves a Tab and dual-authentication, the Teams SDK is the clear winner. You can package the Bot, the Tab, and the SSO logic into a single app manifest. You can use the Teams JS SDK alongside the Microsoft Graph Toolkit to handle the Microsoft login, while managing your external platform auth on your dashboard's backend.
At this time, some developers use Graph for very simple outbound messages (like pushing a static Adaptive Card to a specific channel) or if their backend is already heavily reliant on Graph for M365 administrative tasks. Some also use Graph to send Activity Feed Notifications (via the /teamwork/sendActivityNotification endpoint) rather than standard chat messages.
However, almost all official guidance, production apps and Teams Toolkit samples use the Bot Framework for the actual message delivery.
If you choose the Graph API route, your biggest roadblocks will be the inability to post consistently as a "Bot" (due to app-permission restrictions), the massive overhead of managing tokens/conversation IDs yourself, and a major technical debt if you ever decide to make those notifications interactive in the future.
Please refer the following official documents:
Send chatMessage in a channel or a chat
https://github.com/OfficeDev/Microsoft-Teams-Samples
Hope this helps clarify the best path forward for your project! Let me know if you have any questions about the Teams Toolkit setup.
Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.