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

# Microsoft Teams notifications

> Connect a Teams bot to G360 so alerts and reports arrive as direct messages or channel posts.

Connect a Microsoft Teams bot to G360 to send alerts and scheduled reports as direct messages or channel posts.

<Note>
  This page covers **Teams notifications** — G360 sending messages to Teams. The [Microsoft Teams analytics integration](/g360/teams) is separate.
</Note>

## Before you start

* A Microsoft 365 administrator with access to [Teams Developer Portal](https://dev.teams.microsoft.com) and the Teams admin center.
* A G360 administrator account.
* Your G360 messaging endpoint. It must use HTTPS with a valid certificate and end with a trailing slash:

  ```text Messaging endpoint theme={null}
  https://g360.yourcompany.com/api/v1/chat/messages/
  ```

Setup takes about 20 minutes, plus a few hours for Microsoft to roll out the app.

| Part | What you do                  | Where                  |
| ---- | ---------------------------- | ---------------------- |
| 1    | Create the bot               | Teams Developer Portal |
| 2    | Create the app               | Teams Developer Portal |
| 3    | Enter the credentials        | G360                   |
| 4    | Publish to your organization | Teams admin center     |
| 5    | Use it in alerts and reports | G360                   |

## Part 1: Create the bot

In Teams Developer Portal:

<Steps>
  <Step title="Create the bot">
    Go to **Tools → Bot management**, select **+ New Bot**, enter a name such as `G360 Alerts`, and select **Create bot**.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/01-1.1-create-bot.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=bb44e5d5189faab96f56ed877de3db17" alt="Teams Developer Portal Bot management page with the New Bot dialog" width="1309" height="360" data-path="images/g360/chat/teams/01-1.1-create-bot.png" />
    </Frame>

    Bots created here are single tenant by default, which G360 expects.
  </Step>

  <Step title="Set the endpoint">
    Open the bot, go to **Configure**, paste your messaging endpoint into **Endpoint address**, and select **Save**.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/02-1.2-set-endpoint.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=5f17555b9fddd4aaba2d38c0bd4e1526" alt="Bot Configure page with the Endpoint address field" width="919" height="497" data-path="images/g360/chat/teams/02-1.2-set-endpoint.png" />
    </Frame>
  </Step>

  <Step title="Create a client secret">
    Go to **Client secrets**, select **Add a client secret for your bot**, and copy the secret.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/03-1.3-client-secret.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=8f641aa4a0bdcff1921d86567fa947d0" alt="Bot Client secrets page listing a secret hint and its expiry date" width="932" height="220" data-path="images/g360/chat/teams/03-1.3-client-secret.png" />
    </Frame>

    <Warning>
      The secret is shown once. If you lose it, create another.
    </Warning>
  </Step>

  <Step title="Copy the Bot ID">
    Copy the **Bot ID** from the bot page. You use it in the app, the manifest, and G360.
  </Step>
</Steps>

## Part 2: Create the app

<Steps>
  <Step title="Create the app">
    Go to **Apps**, select **+ New app**, enter a name, and select **Add**.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/04-2.1-create-app.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=369b0ebb161ddf077b8bb0a16fc87089" alt="Teams Developer Portal Add app dialog" width="856" height="256" data-path="images/g360/chat/teams/04-2.1-create-app.png" />
    </Frame>
  </Step>

  <Step title="Fill in basic information">
    1. Go to **Configure → Basic information** and complete every required field: short and long description, developer name, website, privacy policy URL, and terms of use URL.
    2. Paste your **Bot ID** into **Application (client) ID** and select **Save**.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/05-2.2-basic-information.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=af6a5d48623a478fefb1f2db0392dce3" alt="Basic information page with app names, descriptions, and developer details" width="925" height="408" data-path="images/g360/chat/teams/05-2.2-basic-information.png" />
    </Frame>

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/06-2.2-application-client-id.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=aaabe06c8e52eea88402dc61370ee2f9" alt="Application (client) ID field on the Basic information page" width="1038" height="308" data-path="images/g360/chat/teams/06-2.2-application-client-id.png" />
    </Frame>

    <Warning>
      **Application (client) ID** must be the Bot ID. Any other value fails with *"RSC permissions require webApplicationInfo.appId"*.
    </Warning>

    3. Go to **Configure → Branding** and upload a **Color icon** (192 × 192 px) and an **Outline icon** (32 × 32 px, transparent).

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/07-2.2-branding.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=cdd37ac6c4c219aa48f91b83f9bd79ad" alt="Branding page with color icon and outline icon upload fields" width="1320" height="558" data-path="images/g360/chat/teams/07-2.2-branding.png" />
    </Frame>
  </Step>

  <Step title="Attach the bot">
    1. Go to **Configure → App features** and select the **Bot** tile.
    2. Under **Identify your bot**, choose **Select an existing bot** and pick the bot from Part 1.
    3. Under scopes, select **Personal** and **Team**, then select **Save**.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/08-2.3-select-existing-bot.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=a1bc2d2e467359485071099ea0aa1ea9" alt="Identify your bot section with Select an existing bot chosen" width="803" height="204" data-path="images/g360/chat/teams/08-2.3-select-existing-bot.png" />
    </Frame>

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/09-2.3-bot-scopes.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=4edc0aee9b74e93b46f8ff6ad909ee7d" alt="Bot scopes with Personal and Team selected" width="608" height="344" data-path="images/g360/chat/teams/09-2.3-bot-scopes.png" />
    </Frame>

    Both scopes are required. **Personal** enables direct messages. **Team** enables channel posts.
  </Step>

  <Step title="Add permissions">
    Go to **Configure → Permissions**:

    1. Select **Send the user notifications**.
    2. Under **Team permissions → Application**, select **TeamMember.Read.Group**.
    3. Select **Save**.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/10-2.4-permissions.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=db052b5c97dc53c02adaa29450f35e2d" alt="Permissions page with TeamMember.Read.Group selected under team application permissions" width="953" height="396" data-path="images/g360/chat/teams/10-2.4-permissions.png" />
    </Frame>

    `TeamMember.Read.Group` lets G360 match Teams users to G360 users. Without it, nobody can receive direct messages.
  </Step>

  <Step title="Check the manifest">
    The portal builds `manifest.json` from the settings in the previous steps. Use the [reference manifest](#app-manifest) to confirm it is correct, or to fix any field the portal forms don't set.

    1. Go to **Configure → App package editor** and open `manifest.json`.

           <Frame>
             <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/11-2.5-app-package-editor.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=146abeb6431c97db8cf8b186c0daf806" alt="App package editor showing manifest.json" width="1276" height="446" data-path="images/g360/chat/teams/11-2.5-app-package-editor.png" />
           </Frame>

    2. Compare it with the [reference manifest](#app-manifest). Check these fields in particular:

       | Field                                        | Must be                                        |
       | -------------------------------------------- | ---------------------------------------------- |
       | `bots[0].botId`                              | Your Bot ID                                    |
       | `webApplicationInfo.id`                      | Your Bot ID, same as `botId`                   |
       | `id`                                         | The portal-generated app ID. Do not change it. |
       | `bots[0].scopes`                             | `["personal", "team"]`                         |
       | `supportsChannelFeatures`                    | `"tier1"`, in quotes                           |
       | `authorization.permissions.resourceSpecific` | Includes `TeamMember.Read.Group` (Application) |

    3. If a field differs or is missing, edit it in the editor. You can also paste the reference manifest over the file. If you do, keep the portal's `id` value, replace `YOUR-BOT-ID` in both places, and replace the `developer`, `name`, and `description` values with your own.

    4. Select **Save**, then **Update**.
  </Step>

  <Step title="Download the package">
    Go to **Publish → App package** and select **Download app package**. Keep the `.zip` file for Part 4.
  </Step>
</Steps>

## Part 3: Enter the credentials in G360

In G360, go to **Settings → Teams Settings**.

### Credentials

| Field                       | Value                                                      |
| --------------------------- | ---------------------------------------------------------- |
| **APPLICATION (CLIENT) ID** | Bot ID                                                     |
| **DIRECTORY (TENANT) ID**   | Tenant ID from **Microsoft Entra admin center → Overview** |
| **CLIENT SECRET**           | Secret from Part 1                                         |
| **BOT DISPLAY NAME**        | Optional, for example `G360 Alerts`                        |

Select **Verify & save**. G360 checks the credentials with Microsoft and saves them only if they work.

<Frame caption="Settings → Teams Settings, Credentials section.">
  <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/12-3-g360-teams-settings.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=fbd8d6f3d83545029d123fffc78cb081" alt="G360 Teams Settings credentials section with client ID, tenant ID, client secret, and bot display name fields" width="1333" height="463" data-path="images/g360/chat/teams/12-3-g360-teams-settings.png" />
</Frame>

The secret is stored encrypted and never shown again. To change another field later, leave **CLIENT SECRET** blank to keep the saved one.

### Where this bot is installed

This section stays empty until you publish the app in Part 4.

* **Reload** — re-reads what G360 already knows, without calling Teams. Teams notifies G360 of channel and member changes, so this is usually enough.
* **Sync with Teams** — checks every team with Microsoft and removes deleted ones. Teams sends no notification when a team is deleted, so use this to clear them.

### Send a message

Pick a channel and a person, then send a test message. The test uses the same delivery path as alerts and reports, so if it works here, it works there. G360 reports each destination separately.

## Part 4: Publish to your organization

Individual users install nothing.

| Who                 | What                                         | How often |
| ------------------- | -------------------------------------------- | --------- |
| Microsoft 365 admin | Uploads the app and installs it for everyone | Once      |
| Team owner or admin | Adds the bot to a team for channel posts     | Per team  |

<Steps>
  <Step title="Upload to the org catalog">
    In the Teams admin center, go to **Teams apps → Manage apps**, select **Upload new app → Upload**, and choose your `.zip`. Some tenants show **Actions → Upload new app**.

    <Frame caption="Source: Microsoft Learn">
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/13-4.1-upload-new-app.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=ea1ebd17b4bf5aa2754f6c8961133391" alt="Teams admin center Manage apps page with the Upload new app option" width="1273" height="224" data-path="images/g360/chat/teams/13-4.1-upload-new-app.png" />
    </Frame>

    The app can take a few hours to appear. Uploading makes the app available but does not install it for anyone.
  </Step>

  <Step title="Install it for everyone">
    This step enables direct messages. Go to **Teams apps → Setup policies**. If there is no **Installed apps** section, use Path A. Otherwise, use Path B.

    <Frame caption="Source: Microsoft Learn">
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/14-4.2-app-setup-policies.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=9c94631e0a10050c177b78f07b8ff6b5" alt="Teams admin center app setup policies page" width="624" height="289" data-path="images/g360/chat/teams/14-4.2-app-setup-policies.png" />
    </Frame>

    <Tabs>
      <Tab title="Path A: app centric management">
        1. Go to **Teams apps → Manage apps** and select your app.
        2. Select **Edit installs**, choose everyone in your organization, and select **Apply**.

        <Frame caption="Source: Microsoft Learn">
          <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/15-4.2-path-a-edit-installs.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=d0ab96382241a4c5e3543cb63a34d67e" alt="Edit installs panel for an app in the Teams admin center" width="928" height="538" data-path="images/g360/chat/teams/15-4.2-path-a-edit-installs.png" />
        </Frame>
      </Tab>

      <Tab title="Path B: app setup policies">
        1. Go to **Teams apps → Setup policies**, select **Global (Org-wide default)**, then **Edit**.
        2. Under **Installed apps**, select **Add apps**.
        3. Find your app, select **Add**, then **Save**.

        <Frame caption="Source: Microsoft Learn">
          <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/16-4.2-path-b-add-apps.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=c3513193c84911fb680e70b23240ed1f" alt="Add installed apps panel in a Teams app setup policy" width="703" height="446" data-path="images/g360/chat/teams/16-4.2-path-b-add-apps.png" />
        </Frame>
      </Tab>
    </Tabs>

    Changes take a few hours to reach users.
  </Step>

  <Step title="Add the bot to a team">
    To post in a team's channels, add the app to that team.

    * **Admin:** in **Manage apps**, select your app → **Add to team** → pick the team → **Apply**.
    * **Team owner:** in Teams, go to the team → **More options (…) → Manage team → Apps → Add an app**, and pick it from **Built for your org**.

    <Frame caption="Source: Microsoft Learn">
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/17-4.3-add-to-team.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=4c07efa2628e448df1b9687c21666891" alt="Add to team dialog in the Teams admin center" width="1005" height="470" data-path="images/g360/chat/teams/17-4.3-add-to-team.png" />
    </Frame>
  </Step>

  <Step title="Confirm">
    In G360, go to **Settings → Teams Settings** and select **Reload**. The team appears under **Where this bot is installed** within a few seconds.

    <Frame>
      <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/18-4.4-confirm-installed.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=a31ab93a37bd1acaba645f957a43530f" alt="Where this bot is installed section listing a team and the Direct chats row" width="1057" height="254" data-path="images/g360/chat/teams/18-4.4-confirm-installed.png" />
    </Frame>
  </Step>
</Steps>

## Part 5: Use Teams in alerts and reports

In [Schedule Alert](/g360/schedule-alert) or [Schedule Report](/g360/schedule-report), select **Teams** under **Notification Channels**, then choose how to notify:

| Option                                     | Result                                                                               |
| ------------------------------------------ | ------------------------------------------------------------------------------------ |
| **Direct message**                         | Private message to each person. Falls back to the channel if someone is unreachable. |
| **Post in the channel and @mention**       | Posts in each channel and tags the people involved.                                  |
| **Post in the channel without mentioning** | Posts in each channel without tags.                                                  |

<Frame>
  <img src="https://mintcdn.com/na-f445b234/wodMLXKz9qD0s9Za/images/g360/chat/teams/19-5-schedule-report-teams.png?fit=max&auto=format&n=wodMLXKz9qD0s9Za&q=85&s=d137b9d2d67ea6a891aa11e72987abaf" alt="G360 Schedule New Report page with Teams selected and the How to notify options open" width="1344" height="527" data-path="images/g360/chat/teams/19-5-schedule-report-teams.png" />
</Frame>

A person can receive direct messages only when:

* The app is installed for them (Part 4, step 2).
* Their Teams email matches their G360 login email exactly.

Anyone else does not appear in the people list, so alerts never reach the wrong person.

## Troubleshooting

<AccordionGroup>
  <Accordion title="&#x22;RSC permissions require webApplicationInfo.appId&#x22;">
    **Application (client) ID** is empty or not the Bot ID. Paste the Bot ID in **Configure → Basic information** and select **Save**.
  </Accordion>

  <Accordion title="&#x22;supportsChannelFeatures must be included&#x22; or &#x22;Value false is not of the expected type String&#x22;">
    Set `"supportsChannelFeatures": "tier1"` in the App package editor. The value is a quoted string, not `true`, `false`, or `null`.
  </Accordion>

  <Accordion title={`"We couldn't parse the app manifest"`}>
    Usually a wrong icon size (192 × 192 color, 32 × 32 outline) or a required field left blank in **Basic information**.
  </Accordion>

  <Accordion title="&#x22;Invalid Bot. Please make sure the bot is registered and Teams channel is enabled&#x22;">
    This happens only for bots created in the Azure portal. Create the bot in Teams Developer Portal instead.
  </Accordion>

  <Accordion title="The app is installed, but nothing appears in G360">
    1. Confirm **APPLICATION (CLIENT) ID** in G360 equals `botId` in the manifest. G360 ignores events from any other bot, so a mismatch shows no error — the install looks fine in Teams but nothing reaches G360.
    2. Confirm the bot endpoint ends in `/api/v1/chat/messages/`, including the trailing slash.
    3. Wait a few hours for the app and policy changes to roll out.
    4. Select **Reload**. The page does not refresh on its own.
  </Accordion>

  <Accordion title="The endpoint shows &#x22;Method not allowed&#x22; in a browser">
    Expected. The endpoint accepts messages only from Microsoft.
  </Accordion>

  <Accordion title="A test request to the endpoint returns {&#x22;error&#x22;: &#x22;Unauthorized.&#x22;}">
    Expected. Every request needs a valid Microsoft signature. This response confirms the endpoint is reachable and the security check works.
  </Accordion>

  <Accordion title="A deleted team is still listed">
    Select **Sync with Teams**.
  </Accordion>

  <Accordion title="&#x22;That team, channel or chat no longer exists in Teams.&#x22;">
    The alert targets a deleted channel. G360 stops sending to that channel after the first failure. Edit the alert and pick an existing channel.
  </Accordion>

  <Accordion title="Someone is missing from the people list">
    Their Teams email does not match their G360 login email, or they have no G360 account.
  </Accordion>

  <Accordion title="Nobody gets direct messages; everything goes to channels">
    The app is not installed for users yet. Complete Part 4, step 2, and allow time for it to take effect.
  </Accordion>

  <Accordion title="Someone left a team but still gets messages">
    Expected. They still have the app. Access ends when they are removed from G360 or the app is uninstalled for them.
  </Accordion>

  <Accordion title="Alerts stopped after the client secret expired">
    Create a new client secret in Teams Developer Portal, paste it into **CLIENT SECRET**, and select **Verify & save**.
  </Accordion>
</AccordionGroup>

<Tip>
  When you contact support, send the Bot ID, the failed step, the exact error, and whether the team appears under **Where this bot is installed**. Never send the client secret.
</Tip>

## Reference

### App manifest

Replace `YOUR-BOT-ID` in both `bots[0].botId` and `webApplicationInfo.id`. Keep the portal-generated `id` — that is the app ID, not the Bot ID.

```json manifest.json theme={null}
{
  "$schema": "https://developer.microsoft.com/jsonschemas/teams/v1.30/MicrosoftTeams.schema.json",
  "manifestVersion": "1.30",
  "version": "1.0.0",
  "id": "APP-ID-GENERATED-BY-THE-PORTAL",
  "name": { "short": "G360 Alerts", "full": "G360 Alerts" },
  "developer": {
    "name": "Your Company",
    "websiteUrl": "https://yourcompany.com",
    "privacyUrl": "https://yourcompany.com/privacy",
    "termsOfUseUrl": "https://yourcompany.com/terms"
  },
  "description": { "short": "G360 alerts", "full": "G360 alerts" },
  "icons": { "outline": "outline.png", "color": "color.png" },
  "accentColor": "#6264A7",
  "supportsChannelFeatures": "tier1",
  "bots": [
    {
      "botId": "YOUR-BOT-ID",
      "scopes": ["personal", "team"],
      "isNotificationOnly": true,
      "supportsCalling": false,
      "supportsVideo": false
    }
  ],
  "validDomains": [],
  "devicePermissions": ["notifications"],
  "webApplicationInfo": {
    "id": "YOUR-BOT-ID",
    "resource": "https://yourcompany.com"
  },
  "authorization": {
    "permissions": {
      "resourceSpecific": [
        { "name": "TeamMember.Read.Group", "type": "Application" }
      ]
    }
  }
}
```

| Field                     | Requirement                          |
| ------------------------- | ------------------------------------ |
| `supportsChannelFeatures` | The string `"tier1"`, in quotes      |
| `webApplicationInfo.id`   | Must equal `botId`                   |
| `id`                      | The app ID, different from `botId`   |
| `scopes`                  | Both `personal` and `team`           |
| `isNotificationOnly`      | `true` — the bot only sends messages |

<Info>
  **Attach report PDFs:** a notification-only bot cannot attach files, because Teams asks the recipient to approve each file and a notification-only bot cannot receive that answer. Set `isNotificationOnly` to `false` and add `"supportsFiles": true`. Users can then message the bot, which ignores what they send.
</Info>

### Settings summary

| Item                    | Value                                            |
| ----------------------- | ------------------------------------------------ |
| Messaging endpoint      | `https://<your-g360-host>/api/v1/chat/messages/` |
| Bot type                | Single tenant (Developer Portal default)         |
| Manifest version        | 1.30                                             |
| Bot scopes              | `personal` and `team`                            |
| Application (client) ID | The Bot ID                                       |
| RSC permission          | `TeamMember.Read.Group` (Application)            |
| Identity match          | Teams email = G360 login email                   |
