Microsoft Teams Auto-Attendance tracking is a brand new feature in the Confirm Platform that enables customers to automatically track attendance of learners on MS Teams webinars. These can be both online or hybrid sessions.
The following instructions are designed to reduce implementation time and provide clarity on the jobs to be done, and the responsibilities for you and Confirm.
If you require any assistance please contact Confirm Support.
Pre-requisites
- A Microsoft 365 tenant with Azure Active Directory
- Admin access to the Azure Portal for app registration
- Admin consent rights for Microsoft Graph API permissions
- PowerShell access for configuring Application Access Policies (if using webinars)
One time set up
The LXP can automatically fetch attendance data from Microsoft Teams meetings linked to Event Sessions. When a session ends, the system pulls attendance reports from the Microsoft Graph API and matches attendees to enrolled users by email address.
Two types of Teams meeting URLs are supported:
- Legacy URLs - contain organiser context in the URL parameters (e.g. copied from a Teams calendar invite). These work automatically, but MS have now deprecated them, so most customers will use the new short form.
- New Short URLs - created via Teams' "Get a link" or "Copy join link" feature. These require the Meeting Owner Email field to be set on the session, so the system can look up the organiser via the Graph API
Step 1: Create an Azure Application
- Log in to the Azure Portal
- Navigate to App registrations
- Click New registration
- Give the application a name (e.g. "LXP Teams Integration") and click Register.
Step 2: Create a Client Secret
- In the sidebar, click Manage, then select Certificates & secrets
- Click New client secret and add a description
- Important: Copy and safely store the client secret value immediately - it will not be shown again
Step 3: Copy your credentials
- Go to the Overview page of your app registration
- Copy the Application (client) ID
- Copy the Directory (tenant) ID
- Use the client secret you saved in Step 2
- All credentials are encrypted before being stored in the LXP
Step 4: Configure API Permissions
- In the sidebar, click API permissions
- Click Add a permission > Microsoft Graph > Application permissions
- Add the following permissions
| Permission | Purpose |
| OnlineMeetings.Read.All | Read online meeting details |
| OnlineMeetingArtifact.Read.All | Read online meeting artifacts (attendance reports) |
| User.Read.All | Read all users' full profiles (required for the newer short URL attendance tracking) |
Important: After adding permissions, click Grant admin consent to activate them.
Why is User Read All needed?
When a Teams meeting link is a "short URL" (i.e. generated via "Get a link"), it does not contain the organiser's Azure AD identifier. The system needs to resolve the organiser's ID from their email address using the Microsoft Graph /users/{email} endpoint - this requires User.Read.All.
Step 5: Application Access Policy
For the application to access webinar attendance data, an application access policy must be configured via Microsoft PowerShell.
See the Microsoft documentation on Application Access Policies for details.
Step 6: Configure the Service in the LXP
- Contact Learning Support to enable the Microsoft 365 Integration Service
Step 7: Send credentials from steps 2-3 to Confirm Support
- Send the credentials from Steps 2-3:
- Tenant ID - The Directory (Tenant) ID from your Azure AD app registration
- Application (Client) ID - The Application (Client) ID from your Azure AD app registration
- Client Secret - The client secret generated for your Azure AD application
Note: This is the end of the One-Time setup. The next steps are per-Event.
Set up for each meeting
When creating or editing an Event Session, ensure you setup the following:
Step 1 - Session Type
Set the Session Type to Online or Hybrid to allow for a meeting URL,
Step 2 - Meeting Link
Paste the Teams meeting URL copied above. The system automatically detects it as a Teams meeting.
Step 3 - Meeting Owner Email
Enter the email address of the meeting organiser.
Important: The meeting owner email must belong to a user in your Microsoft 365 tenant. This is the person who created/owns the Teams meeting - they must be the meeting organiser.
The meeting owner is not required to attend the meeting, as the Graph API can fetch attendance data regardless of whether the organiser attended.
How Attendance Tracking works
Automatic Flow
- An admin creates an Event Schedule with Sessions linked to Teams meetings
- Learners sign up for the schedule
- The Teams meeting takes place
- After the session's scheduled end time, the system automatically triggers an attendance sync job
- The job authenticates with Microsoft Graph using the stored credentials
- It resolves the meeting organiser:
- Primary: Extracts the organiser's Azure AD ID from the URL's context parameter
- Fallback: If no context is found, looks up the organiser by email via GET /users/{email}
- It resolves the meeting organiser
- It fetches attendance reports from the Graph API for the meeting
- It matches attendees to signed-up learners by email address (case-insensitive)
- Attendance status is calculated and saved to each learner's signup record
Manual Refresh
Admins can also manually trigger an attendance refresh from the Session's Manage Attendance page by clicking Refresh Attendance. This is useful if:
- The automatic sync hasn't run yet
- You want to get updated data after a session that is still in progress
- There was an error during the automatic sync
There is a cooldown period between manual refreshes to avoid rate limiting.
Attendance status calculation
Attendance status is calculated based on the percentage of the meeting the learner attended:
| Status | Condition |
| Fully Attended | Attended >= 10% of meeting duration (default threshold) |
| Partially Attended | Attended > 0% but < 10% of meeting duration |
| No Show | No attendance data found |
The system uses "grace windows" to handle timing differences - if a meeting starts early or runs late compared to the scheduled times, learners are not penalised for joining at the scheduled start time.
Attendance matching
Attendees are matched to enrolled learners by comparing the email address from the Teams attendance report with the learner's email in the LXP (case-insensitive match). If a match cannot be found, the attendance record is logged but not applied.
Trouble shooting
No attendance data returned
- Check the meeting URL - ensure it's a valid Teams meeting link
- Check Meeting Owner Email - required for short URLs. Must be a valid user in your M365 tenant
- Check API permissions - ensure all three permissions are granted with admin consent
- Check Application Access Policy - required for webinar meetings
- Timing - attendance reports may not be available immediately after a meeting ends. Wait a few minutes and try refreshing
"Could not determine organiser ID"
This means the system could not find the meeting organiser. Either:
- The URL doesn't contain a context parameter (short URL), AND
- The Meeting Owner Email is not set, OR
- The email couldn't be resolved via the Graph API (check User.Read.All permission)
Connection test fails
- Verify the Tenant ID, Client ID, and Client Secret are correct
- Ensure the client secret has not expired
- Check that admin consent has been granted for the API permissions
Attendance shows for some users but not others
- Attendees are matched by email address. If a learner's LXP email differs from their Teams email, no match will be made
- The learner must have an active signup for the session to receive attendance marking
Manage session attendance
Once registered, attendees will be marked as ‘Fully Attended’, ‘Partially Attended’ or a ‘No Show’ depending on their participation in the webinar. If the Session Type is set to ‘Hybrid’ then administrators can mark in person attendees manually or in bulk. You can also override the automatically generated attendance status if required. Attendance is stored and shown on Manage Attendance; Refresh Attendance re-pulls the latest from Teams, which only returns data once Microsoft has finished the post-meeting report.