Teams apps – Help me use the Teams bot with a compliance policy

We are nearly complete on an AI solution – it is being built on top of Microsoft Teams and Azure OpenAI APIs. We call it SSW YakShaver.

The product has a blocking issue. We are recording a Teams call (and screen) and we have hit something called a “compliance policy”.

The below is what we plan to do from here. I would have assumed we would have gone with Option 1 (using the Teams bot with a compliance policy) but it seems like we are going to use the Graph API (simpler).



I got this email from the YakShaver team:

We have been trying to get the compliance policy working in MS Teams (Option1), but have pretty much given up.

We have decided to do Option 2 below followed by Option 2.1.

We are *not* doing Option 1.

Here are all the points we have learnt.

Then the user flow.

Then the pros and cons.

Option 1: Media Stream – Application hosted or compliance recording bot (Not recommended)

Using a Teams bot with a compliance policy to record the audio and video, it will record every participants sound individually, those who are not in the policy will not be recorded.

  • Complexity – on the backend
  • We need the compliance policy on everyone in the call for them to be recorded
  • User adds bot to the call or meeting, it will directly start to record, when the user kick out the bot it will stop.
  • The bot will send an api call to the endpoint /api/call
  • After this we need to connect with Microsoft Media Stream
    • From the Media Stream we can get the video stream.
  • We need to add in a way to store the videos so that Media Stream to do this
    • Suggestion: Use data blob (YakShaver Teams bot store video in datablob, and media stream pulls it)
      • We could send it directly to the api, but according to Uly we need to store the video somewhere so the final PBI can have a link to it.
      • When we’re using the compliancy policy it’s not recording as normally and the video will not be stored in Stream as it would normally would be

User flow

  1. User adds bot to the call or meeting.
  2. It will directly start to record, and the user can tell the task.
  3. When the user kicks out the bot, it will stop the recording and send of the task.

✅ Pros:

  1. No frontend needed, just an instruction page
  2. Easy on the user end, the user never needs to start recording and stop recording, instead the user can just add and remove the bot.

❌ Cons:

  1. Complexity of coding on the backend
  2. Saving Audio and video files is a problem
  3. Audio might be recorded separately among participants, and if so, it requires coding to re-join them together
  4. We need extra work to notify the user that they are being recorded
  5. Potential legal issue because we record it and we are responsible for it, we need some extra safety rules on the recorded audios
  6. We need to run the whole thing on the windows VM.

Info – Application Hosted Bot

Option 2: Use the Graph API (Recommended)

Using the Graph API to do the work, the user manually start and stop recording, and then the YakShaver will get the transcrips for the user manually.

  • Delegated auth flow, everyone can be recorded.
  • Access to transcript need a PAT (personal access token)
  • We can’t access the start and stop recording from the API so this has to be done manually.
  • User start recording, user end recording
  • Since the user is starting and stopping the recording – the recording is stored on their account and everyone in the meeting has access to it
    • That’s why we need their PAT to access the recording/transscript
    • Later: investigate how we can move the recording to another location where everyone have access

User flow (⚠️worse flow, but quicker to develop and cheaper $ Azure costs)

  1. User start recording
  2. User click on YakShaver tab button before or after recording
  3. User stop recording
  4. The YakShaver will do the task

✅ Pros:

  1. Less software complexity
  2. No need to save video stream and no need to merge transcripts.
  3. We have the UI so the YakShaver can track the issue being created and show it on the UI
  4. It’s already been proved to work in POC
  5. We can sell it to a client because it’s all using delegated permissions

❌ Cons:

  1. We need some front-end work, pop ups, SSOs to manage user credentials.
  2. More steps on the user end, manual recording is annoying and not natural.

User Flow – Options to skip the extra clicks (7 clicks in total):

Option 2 requires us to manually start and stop the recording in Teams. The following are 2 options to get around that.

Option 2.1: Azure Communication Service

Use communication service to automate the call record process – need a POC after Graph is done.

✅ Pros:

– It’s easy to use

– We can get rid of the compliance policy which is much much simpler!!!!!

– I can see the potential of making YakShaver into a commercial project.

– We can define our own compliance rule rather than rely on Azure to set up the compliance policy

❌ Cons:

– Calls have to be initialized from communication services

– It’s our responsibility to notify recording – very important

– We have to do compliance recording policy ourselves if we make it commercial later – might need a lawyer

How Azure Communication Services endpoints work with the Graph API?

Things we are sure of from the documentation:

  1. Azure Communication services can initialize a call, if the call is from Azure communication services, we can record it anytime
  2. Azure Communication services might be able record teams call but it might not.
  3. The call might not be on Teams.

When the users are calling the other user from YakShaver

  1. Can call another user from YakShaver and click record on YakShaver
  2. Users being invited to another call
  3. Inside that call, everything will be recorded

When 2 users are on a call and all of a sudden they decide to use YakShaver

  1. YakShaver will call them
  2. All users will be muted on teams
  3. All users will be invited to another call
  4. The newly created group call will be recorded

What happens if it’s a scheduled meeting

  1. We don’t need Azure communication service, the delegated flow should just be working….

Option 2.2: Click script

  • Could use this if Option 2.1 fails
  • What user interaction with computer can’t be done with an old-school click script?

Microsoft Graph API – Help me access former employees’ email messages

We have built a cool reporting tool that uses the Microsoft Graph API to produce insights into employees’ email data.

However, when an employee leaves the company, we are no longer able to access that former employee’s email messages. This makes sense normally, but not in our scenario.

We need former employees’ email data or we have incomplete and potentially misleading reports.

Microsoft Graph API should provide a method to access former employees’ email data, either through a dedicated endpoint or by incorporating a flag or parameter in the existing API requests.

Help me kindly know I am not connected to the internet

I wish all Microsoft applications behaved the same when offline. 

Ideally, they would all have a black bar (or reverse when in dark mode), when they had reduced functionality.

I am on a plane with no wifi…

⚠️This new green message when you are offline, is pretty unfriendly:

Figure: Bad example – Don’t say “server error” when I didn’t do anything wrong
Figure: Good example – Tell me I have no internet connection

Help me customize Azure Access Review emails

SysAdmins find it a lot of work to keep giving people permissions to resources like Azure.

I wanted to say that we’re now really enjoying using Azure Access Reviews. We’ve written about how we use it on

At SSW we have so many Teams and Groups – almost all set to public. Since people can join so many, they poke around, join a group, and never leave. That means they are included in every calendar appointment and every team email and the noise was reported as an employee dissatisfaction.

Access Review has been invaluable because it effortlessly removes users when they no longer need access. We have set it to run every 3 months and they need to say they are still a member.

❌ The Access Review email does not look like anything SSW SysAdmins would send, so it gets deleted mistakenly by many people in our company.

Having the ability to customize the email is important.


  • Email subject – Give the ability to edit
  • Email body – Give the ability to edit text
  • Email body – Give the ability to add an image
  • Email body – Having placeholders for significant fields, like Group, would be ideal (see ‘SSW SugarLearning’ in the image)
  • From address – Currently employees think it is ⚠️spam from Microsoft, not from SSW SysAdmins. So it would be a big bonus if we could send the notifications from our own email address to prevent any confusion.
Figure: ❌ Bad example – Email shows limited context and looks just like a lot of other notifications that we get

Microsoft Forms and Delve – Help me find the Forms Responses (aka surveys) I have answered

When I fill in forms for my company, I should be able to find each one (just like I do a Microsoft Word doc I created).

I understand that a Form is not a file stored in a Document Library like other Office docs, but I do think you could hack something so it could be surfaced.

Figure: In this view I should be able to see the Microsoft Forms responses I’ve submitted

TinaCMS – Help overcome the limitation for open-source projects?

TinaCMS is awesome and has the best editor. It can be used on a public site like where the users are known and will be added to the database.

However for a public site like SSW Rules where users are _any_ github users, then the problem is each user needs to be added to the database _before_ they can make any changes.

FYI – TinaCMS also has the issue of not allowing GitHub users to directly contribute to the content repo like what NetlifyCMS and Keystatic allow. This means no more GitHub green squares!!

Note: Similar products such as NetlifyCMS (aka DecapCMS now) do not have this limitation, nor does Keystatic.

Figure: See my green contributions to SSW.Rules.Content under Contribution activity

Microsoft Teams Approvals App – Help me allow users to be in multiple approver groups

Video: Rick Su explains the issue (2 min)

The Approvals app is great for simple scenarios like purchase approvals and event attendance approvals.

There is a problem with more complex approvals. Say you need approvals from 2 out of 5 designated people, then validation stops this from being done.

The current validation does not allow the same person to be in multiple approver groups. This validation should be removed.

Figure: ❌ It is a problem that the same individual user cannot be assigned to multiple approver groups.

There are other solutions that allow this such as and


The Microsoft Teams Approvals App should allow the same individual user to appear in multiple approver groups.  

This modification would give the flexibility to allow more complex approval scenarios.

Microsoft Teams – Help me forward chat history

I work in the China office, and we keep reverting to WeChat because it offers this feature which is super useful. It is missing from Teams.

I want to be able to forward a group of messages in my private chat with someone else not in the chat. This often happens when a problem comes up in the discussion and I realized I have already discussed a similar issue. Therefore, I want to share a section of my chat history to them quickly.

❌ My current workarounds:
Option 1: Copy + paste the messages one by one to the other chat.
Option 2: Take a long screenshot of the chat history and share the image.

✅ Suggestion:
Allow people to cherry-pick messages in their chat and forward them in a bundle.

❌ Figure: I want to forward just the section in the red box to someone else (but I don’t want to share irrelevant information about my annual review)
✅ Figure: WeChat lets me combine and forward selected messages

Help me use full screen mode in Outlook

When screen sharing in Teams or other applications, you want to be able to reduce noise as much as possible. One way to do this is by using full screen mode.

✅ Chrome – F11 works

✅ Edge – F11 works

❌ Outlook new email – F11 doesn’t work (does nothing)

❌ Word – F11 doesn’t work (does nothing)

❌ Excel – F11 doesn’t work (goes to Charts)

❌ Figure: F11 key goes to Charts in Excel
Figure: Full screen in Edge with F11