Type something to search...

Attendance Tracking from Microsoft Teams Report

Summary

I built this to stop matching Microsoft Teams attendance by hand. It cleans up participant names, fuzzy-matches them against the official roster, and shows the result in a Streamlit app.

Problem

Tracking attendance from Microsoft Teams used to mean lining up an attendance report against a participant database by hand.

What made it painful:

  • The names in a Teams report never match the official roster
    • Names come out abbreviated
    • Some rows carry only a first and last name
    • Others carry Teams labels like (Unverified), (External), (guest)
    • Capitalization, punctuation and formatting all drift
  • There was a lot of it
    • 10+ classes, all handled the same way
    • Several sessions per class, each with dozens of participants
  • Doing it by hand is slow
    • It takes hours, and mistakes are almost guaranteed
    • Auditing the result is hard, and keeping it consistent is harder

So attendance became hours of work nobody should do by hand.


Solution

I wrote a Python script that: reads the Teams report, cleans the names, matches them against the roster, and totals who showed up.

graph LR
    A[Upload Participant DB] --> B[Upload Teams Report]
    B --> C{Process}
    C --> D[Normalize Names]
    D --> E[Fuzzy Match]
    E --> F[Set Status]
    F --> G[Download Results]

Workflow:

  1. Upload the participant database
  2. Upload the Microsoft Teams attendance report
  3. The system takes it from there:
    • Cleans and standardizes participant names
    • Applies fuzzy matching with a threshold you can tune
    • Determines attendance status
    • Aggregates attendance data across sessions
  4. You download the finished sheet.

It runs as a Streamlit web application, so the people who actually need it never touch Python.

Messy Teams names matched against the official roster

Demo from uploads to downloadable result


Impact

Work that took an evening now finishes in minutes, and the numbers are consistent across classes. I have reused it across 10+ classes without changing the workflow:

  • ⏱️ Time back
    • Name matching runs on its own now
  • πŸ“‰ Fewer mistakes
    • Name matching is standardized and consistent
  • πŸ“Š Clean, structured attendance data
    • Easier to analyze, report and audit
  • πŸš€ Reusable
    • Runs across multiple classes with no workflow changes
  • πŸ’Ό Ready for real use
    • Fits Edu-Tech programs, training programs and stakeholder reporting

Tech Stack

  • Python
  • Pandas for data processing and aggregation
  • RapidFuzz for fuzzy string matching
  • Regex (re) for text preprocessing and normalization
  • Streamlit for the web interface
  • Microsoft Teams attendance report as the data source

Extras (Optional)

  • The fuzzy matching threshold is configurable, so it adapts to how messy the data is
  • Parsing, matching, and reporting live in separate modules, so I could retune the threshold without touching the rest
  • What I’d add next:
    • CSV / Excel export
    • Analytics dashboard
    • Direct database or LMS integration
    • Automated attendance reporting
  • The threshold is the part I would not trust blindly. I still set it by eye on each new dataset, and a truly messy name list will fool it at any threshold.