With the announcement that Delve blogs will be retiring you may want to see what blogs exist in your tenant. Delve blogs create their own site collection but do not show up in the admin center or when you use the SharePoint PowerShell module and the Get-SPOSite cmdlet. Thankfully PnP Powershell does return this. I put together a PowerShell script to find blogs and put a report together including the number of posts.
First, install PnP PowerShell if you haven’t already. I recommend installing via the PowerShell gallery with the command:
- Install-Module SharePointPnPPowerShellOnline
Here is a script to find and export the blog information using PnP Powershell. Ensure you fill in your own variables for your tenant and the file path.
try {
#variables -> enter your own domain and output path
$creds = Get-Credential
$tenantadmin = "https://domain-admin.sharepoint.com"
$outputfilepath = "c:\temp\delveblogexport.csv"
#connect to tenant to get blog sites
Connect-PnPOnline $tenantadmin -Credentials $creds
$sites = Get-PnPTenantSite -Template POINTPUBLISHINGPERSONAL#0
$resultsarray = @()
#loop through sites to get details for blog
foreach($s in $sites){
Connect-PnPOnline $s.Url -Credentials $creds
$list = Get-PnPList -Identity "Pages"
$pagecount = $list.ItemCount
$listlastmodified = $list.LastItemUserModifiedDate
$contributor = Get-PnPGroupMembers -Identity "Contributors" | select Email
#add to export object
$obj = New-Object PSObject
Add-Member -InputObject $obj -MemberType NoteProperty -Name DelveBlogUrl -Value $s.Url
Add-Member -InputObject $obj -MemberType NoteProperty -Name BlogPageCount -Value $pagecount
Add-Member -InputObject $obj -MemberType NoteProperty -Name LastModified -Value $listlastmodified
Add-Member -InputObject $obj -MemberType NoteProperty -Name Email -Value $contributor.Email
$resultsarray += $obj
$obj = $null
Disconnect-PnPOnline
}
#export results
$resultsarray | Export-Csv -Path $outputfilepath -NoTypeInformation
Write-Host "Complete" -ForegroundColor Green
}
catch
{
Write-Host $_.Exception.Message -ForegroundColor Red
}
The results will include the URL of the site, the page count, last modified, and the email of the blog site owner.

If you want other details per page you can go directly to the pages library to view by applying “pPg/Forms/AllItems.aspx” to the blog site url. As an example:
When you go to the pages library you can download the posts. They exist in a JSON blob. This may be a good way to extract blog posts before they are removed via Microsoft.

To view the posts you will still go through “portals/hub/personal/drew” path vs “portals/personal/drew”.
Another path to get some of this information is through the User Profiles that exist. Each user profile includes a link to their Delve blog. So if you get all existing user profiles you can find where that value is filled in. The best way to get this at scale is through SharePoint search. I put together a script to do this as well. I included batching logic on the results which will be needed in large tenants as the max search results is only 500.
try
{
#variables -> enter your own domain and output path
$creds = Get-Credential
$tenantadmin = "https://domain-admin.sharepoint.com"
$outputfilepath = "c:\temp\delvebloguserprofileexport.csv"
$returnproperties = @("PreferredName","AccountName","WorkEmail")
$sourceid = "B09A7990-05EA-4AF9-81EF-EDFAB16C4E31" #this is consistent across tenants
$maxresults = 100
$startrow = 0
#connect to tenant to search
Connect-PnPOnline $tenantadmin -Credentials $creds
$resultsarray = @()
Do{
#perform search query
$results = Submit-PnPSearchQuery -Query "*" -SourceId $sourceid -SelectProperties $returnproperties -StartRow $startrow -MaxResults $maxresults -SortList @{LastModifiedTime="Descending"}
$rowcount = $results.RowCount
#loop through results in row
foreach($res in $results.ResultRows){
#get user profile properties
$props = Get-PnPUserProfileProperty -Account $res.AccountName
#check if blog site exists
if($props.UserProfileProperties.'SPS-PointPublishingUrl' -ne ""){
#add to export object
$obj = New-Object PSObject
Add-Member -InputObject $obj -MemberType NoteProperty -Name DelveBlogUrl -Value $props.UserProfileProperties.'SPS-PointPublishingUrl'
Add-Member -InputObject $obj -MemberType NoteProperty -Name WorkEmail -Value $props.UserProfileProperties.WorkEmail
$resultsarray += $obj
$obj = $null
}
}
$startrow = $startrow + $rowcount + 1
}
while ($rowcount -ne 0)
#export results
$resultsarray | Export-Csv -Path $outputfilepath -NoTypeInformation
Write-Host "Finished" -ForegroundColor Green
}
catch
{
Write-Host $_.Exception.Message -ForegroundColor Red
}
This is not the most efficient way to get this information but it could be helpful to double check the SharePoint sites approach. This is also a handy way to loop through user profiles via search.