> ## Documentation Index
> Fetch the complete documentation index at: https://docs.komaa.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Upload to Microsoft Teams and go live

> Upload the app package as a custom app or publish it to your organization, register your agent in StandIn, and place the first call.

Part 3 of the [Microsoft Teams setup](/teams/overview). You have the [app package](/teams/app-package) -
now put it in front of Microsoft Teams users. Pick the route that matches how widely the bot should be
available.

## Choose an upload route

<Tabs>
  <Tab title="Microsoft Teams client (fastest)">
    Best for testing and personal use. In Microsoft Teams, go to **Apps → Manage your apps → Upload an app**:

    <Frame caption="Microsoft Teams: Apps > Manage your apps > Upload an app.">
      <img src="https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-an-app.png?fit=max&auto=format&n=pa0qxKzF_T-m0SMe&q=85&s=3f6d15629a62821426320d36fb290eec" alt="Microsoft Teams Apps page with Manage your apps and the Upload an app button highlighted" width="914" height="719" data-path="images/teams/teams-upload-an-app.png" />
    </Frame>

    Choose **Upload a custom app** and select the zip. The bot is then available to **you**; open
    it and call.

    <Frame caption="Pick Upload a custom app for a package you built or downloaded from StandIn.">
      <img src="https://mintcdn.com/komaa/pa0qxKzF_T-m0SMe/images/teams/teams-upload-custom-app.png?fit=max&auto=format&n=pa0qxKzF_T-m0SMe&q=85&s=899fa3fa8a6d71413bdd6b96434f7489" alt="Microsoft Teams Upload an app dialog with the Upload a custom app option highlighted" width="500" height="293" data-path="images/teams/teams-upload-custom-app.png" />
    </Frame>

    This requires **custom app upload** to be allowed for your account - if the button is missing,
    ask your Microsoft Teams admin (policy reference:
    [Manage custom app policies and settings](https://learn.microsoft.com/en-us/microsoftteams/teams-custom-app-policies-and-settings)).

    Official walkthrough: [Upload your app in Microsoft Teams](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/deploy-and-publish/apps-upload).
  </Tab>

  <Tab title="Developer Portal">
    Best when you want validation and versioning. Go to
    [dev.teams.microsoft.com](https://dev.teams.microsoft.com/) → **Apps → Import app** and upload
    the zip (or **New app** and paste the manifest fields in the GUI). The portal validates the
    manifest, hosts the icons, and can then **Preview in Microsoft Teams**, **Download** the finished
    package, or **Publish → Publish to your org**.

    Official reference: [Microsoft Teams Developer Portal](https://learn.microsoft.com/en-us/microsoftteams/platform/concepts/build-and-test/teams-developer-portal).
  </Tab>

  <Tab title="Publish to your org">
    Best for making the bot callable by **everyone in your tenant**. Either publish from the
    Developer Portal (**Publish → Publish to your org**) or have an admin upload the zip directly
    in the **Microsoft Teams admin center** (**Microsoft Teams apps → Manage apps → Upload new app**). A Microsoft Teams admin
    approves the pending app before it appears for users.

    Official reference: [Publish a custom app to your organization](https://learn.microsoft.com/en-us/microsoftteams/upload-custom-apps).
  </Tab>
</Tabs>

## Register your agent in StandIn

In your StandIn dashboard, register your **Agent calling URL**
(`wss://<your-public-host>/msteams/calling`) and the matching HMAC `secret`. The
[quickstart](/quickstart#3-register-the-agent-voice-url) covers both, and
[Expose your agent](/expose) covers making that URL reachable.

On this SDK there is no chat URL to set: `ChatChannel` dials out to StandIn. The
optional **Agent chat URL** field applies only when you serve Microsoft Teams chat yourself.

## Place the first call

Before you do, prove the agent side on its own. The SDK ships an install check that rings your
handler on loopback and reports whether audio came back, with no tunnel and no tenant involved, so a
silent first call does not leave you guessing which of the two halves is at fault: Checking the
install ([Python](/python-sdk/checking-the-install),
[TypeScript](/typescript-sdk/checking-the-install)).

Then search for the app in Microsoft Teams (or open it under **Apps → Built for your org** after an
org publish) and **call the bot**. StandIn answers, dials your worker, and your agent speaks.

<Note>
  **First chat message ignored?** Using **OpenClaw**, its chat channel drops direct messages from
  senders you have not approved (`dmPolicy: pairing`, the default) - approve yourself with
  `openclaw pairing approve msteams <CODE>`. Using **Hermes**, an unknown sender gets a
  **pairing-code reply** instead of an answer - approve it with `hermes pairing approve teams <CODE>`
  (with `TEAMS_ALLOWED_USERS` set, unlisted senders are dropped silently instead). Details:
  [the bot ignores Microsoft Teams chat](/troubleshooting#the-bot-answers-calls-but-ignores-microsoft-teams-chat-dm-pairing).
</Note>

## If something does not work

* Bot never joins the call → check the **calling webhook** on the
  [Microsoft Teams channel](/teams/azure-bot#6-enable-calling-and-set-the-webhook) and that
  [Graph permissions](/teams/azure-bot#8-grant-graph-permissions) are admin-consented.
* Bot joins but stays silent → usually a `secret` mismatch or an unreachable Agent calling URL;
  see [Troubleshooting](/troubleshooting).
* Upload rejected → re-check the [package layout](/teams/app-package#packaging-it-manually) (files
  at the zip root) and bump the manifest `version` on republish.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.