
Sameer Mhaisekar
DevRel Engineer, SquaredUp & Microsoft MVP
As a Microsoft MVP, like me you’re also involved in a bunch of things at any given time. May it be tracking engagements across your social media channels, statistics for your blog podcast or YouTube channel, or recording the events you’re part of.
To avoid having to switch so many platforms to track these stats, I created a dashboard that brings everything together so I can quickly and easily consume all things that matter at once. Here’s how!
I created a folder, under which I’ve separated out my platforms and their related metrics. Let’s go through them one by one.
Starting with a simple dashboard that reads from the public MVP profile page and extracts key fields using a PowerShell script.

Here’s the script I used:
$profileUrl = $variable.mvpurl
if ($profileUrl -notmatch '/profile/(?<Id>[0-9a-fA-F-]+)$') {
Write-Error "Profile URL does not end with a GUID: $profileUrl"
exit 1
}
$profileId = $Matches.Id
$apiUrl = "https://mavenapi-prod.azurewebsites.net/api/mvp/UserProfiles/public/$profileId"
try {
$headers = @{
"Origin" = "https://mvp.microsoft.com"
"Referer" = "https://mvp.microsoft.com/"
"Accept" = "application/json"
}
$response = Invoke-RestMethod -Uri $apiUrl -Headers $headers -Method Get
}
catch {
Write-Error "Failed to retrieve profile $($profileId): $_"
exit 1
}
$userprofile = $response.userProfile
if (-not $userprofile) {
Write-Error "No userProfile node returned for $profileId."
exit 1
}
[pscustomobject]@{
FirstName = $userprofile.firstName
LastName = $userprofile.lastName
FullName = ($userprofile.firstName, $userprofile.lastName | Where-Object { $_ }) -join ' '
Headline = $userprofile.headline
CompanyName = $userprofile.companyName
Country = $userprofile.addressCountryOrRegionName
YearsInProgram = $userprofile.yearsInProgram
Roles = ($userprofile.functionalRoles -join ', ')
TechFocus = ($userprofile.technologyFocusArea -join ', ')
AwardCategory = ($userprofile.awardCategory -join ', ')
}This dashboard displays my LinkedIn analytics. Unfortunately there’s no easy way to stream this data straight from LinkedIn using API so this dashboard connects to an export of statistics and uses the Excel plugin to read from the exported file.
If you are using any other platforms like X or Discord etc. that provide an API for this data, you can connect to it using the WebAPI tile as well.

This dashboard queries the YouTube analytics API to get basic data from the channels specified.
For CMS platforms like WordPress, Sanity, etc. or podcasting platforms like Spotify, Buzzsprout, etc. you can connect to them via their APIs as well.
You can use either the PowerShell script or the WebAPI tile to connect to this data.

Sample script:
# YouTube Channel Analytics Script
# Requires YouTube Data API v3 key from Google Cloud Console
# Configure your API key and Channel IDs here
$ApiKey = "<key>"
$ChannelIds = @(
"<ID>"
)
# Configuration
$TopVideosCount = 5 # Number of top videos to fetch
$RecentVideosCount = 5 # Number of recent videos to fetch
# API endpoints
$baseUrl = "https://www.googleapis.com/youtube/v3"
function Get-ChannelStatistics {
param([string]$channelId, [string]$apiKey)
$url = "$baseUrl/channels?part=statistics,snippet,contentDetails,brandingSettings,topicDetails&id=$channelId&key=$apiKey"
try {
$response = Invoke-RestMethod -Uri $url -Method Get
if ($response.items.Count -eq 0) {
return $null
}
$channel = $response.items[0]
$stats = $channel.statistics
$snippet = $channel.snippet
$contentDetails = $channel.contentDetails
# Calculate derived metrics
$avgViewsPerVideo = if ([int]$stats.videoCount -gt 0) {
[math]::Round([int64]$stats.viewCount / [int]$stats.videoCount, 2)
} else { 0 }
$channelAgeInDays = ((Get-Date) - [datetime]$snippet.publishedAt).Days
$videosPerMonth = if ($channelAgeInDays -gt 0) {
[math]::Round(([int]$stats.videoCount / $channelAgeInDays) * 30, 2)
} else { 0 }
$result = [PSCustomObject]@{
ChannelId = $channelId
ChannelName = $snippet.title
Description = $snippet.description.Substring(0, [Math]::Min(100, $snippet.description.Length)) + "..."
CustomUrl = if ($snippet.customUrl) { $snippet.customUrl } else { "N/A" }
Country = if ($snippet.country) { $snippet.country } else { "N/A" }
SubscriberCount = [int64]$stats.subscriberCount
HiddenSubscribers = $stats.hiddenSubscriberCount
TotalViews = [int64]$stats.viewCount
TotalVideos = [int]$stats.videoCount
AvgViewsPerVideo = $avgViewsPerVideo
VideosPerMonth = $videosPerMonth
ChannelCreated = [datetime]$snippet.publishedAt
ChannelAgeYears = [math]::Round($channelAgeInDays / 365.25, 1)
UploadsPlaylistId = $contentDetails.relatedPlaylists.uploads
TopicCategories = if ($channel.topicDetails.topicCategories) {
($channel.topicDetails.topicCategories | ForEach-Object { $_.Split('/')[-1] }) -join ", "
} else { "N/A" }
}
return $result
}
catch {
return $null
}And lastly, a plain and simple dashboard using the Excel plugin connected to an Excel sheet I manually maintain and update to keep track of all the events I’m participating in.
Simply save the file on your OneDrive, and provide the path to it in the tile configuration.

This collection of dashboards is a massive time and effort-saver for me when I want an oversight of all the things I’ve been working on - especially when you’re filling in the MVP renewal form - we all know the struggle! Interested to try out? Sign up to SquaredUp for free, or connect with me if you’re interested in working together!