Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions docs/toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -1833,6 +1833,31 @@
items:
- name: Overview
href: solution-guidance/Office-365-development-patterns-and-practices-solution-guidance.md
- name: Assess and transform classic pages
href: transform/assess-sharepoint-modernization.md
items:
- name: Assess classic pages
href: transform/assessment-tool-classic-pages.md
items:
- name: Requirements
href: transform/assessment-tool-classic-pages-requirements.md
- name: Run the assessment
href: transform/assessment-tool-classic-pages-run.md
- name: Interpret and prioritize
href: transform/assessment-tool-classic-pages-report.md
- name: Publishing page readiness
href: transform/assessment-tool-publishing-coverage.md
- name: Reference
items:
- name: Classic pages CSV files
href: transform/assessment-tool-classic-pages-csv.md
- name: Common CSV files
href: transform/assessment-tool-common-reports.md
- name: Transform classic pages
href: transform/modernize-userinterface-site-pages.md
items:
- name: Transform with PnP PowerShell
href: transform/modernize-userinterface-site-pages-powershell.md
- name: Modernizing your classic SharePoint sites
items:
- name: Overview
Expand Down
44 changes: 44 additions & 0 deletions docs/transform/assess-sharepoint-modernization.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
title: Assess and transform classic SharePoint pages
description: Assess classic SharePoint pages, prioritize remediation, and continue into page transformation with PnP PowerShell.
ms.date: 07/27/2026
ms.localizationpriority: high
ms.service: sharepoint
---

# Assess and transform classic SharePoint pages

Use the Microsoft 365 Assessment tool to discover classic pages and understand their page-transformation readiness. Then use the assessment results to prioritize remediation and transform selected pages with PnP PowerShell.

This guidance focuses only on classic page assessment and its handoff to page transformation.

## Page modernization workflow

[!INCLUDE [classic-page-modernization-workflow](../../includes/snippets/assessment/classic-page-modernization-workflow.md)]

## Use assessment output for transformation

| Assessment output | Transformation decision |
| --- | --- |
| `PageUrl`, `PageType`, `Layout` | Identify the source page and transformation path. |
| `HomePage`, `UncustomizedHomePage` | Select home pages and simple early migration waves. |
| `MappingPercentage`, `UnmappedWebParts` | Find pages that need Web Part remediation or mapping changes. |
| `classicpagewebparts.csv` | Review the exact Web Part type, position, visibility, and mapping result. |
| `ModifiedAt`, `classicpageauditusage.csv` | Prioritize active content and avoid transforming unused pages without a business need. |
| `classicpublishingsitesummaries.csv` | Size publishing-page work and identify used layouts. |

Mapping readiness is an input to planning, not a guarantee that the transformed page will preserve every visual or business behavior.

## Next steps

1. [Review the Classic pages assessment requirements](assessment-tool-classic-pages-requirements.md).
1. [Run the Classic pages assessment](assessment-tool-classic-pages-run.md).
1. [Interpret and prioritize the page results](assessment-tool-classic-pages-report.md).
1. [Review publishing-page readiness](assessment-tool-publishing-coverage.md), when applicable.
1. [Transform selected pages with PnP PowerShell](modernize-userinterface-site-pages-powershell.md).

## Reference

- [Classic pages assessment CSV reference](assessment-tool-classic-pages-csv.md)
- [Common assessment CSV reference](assessment-tool-common-reports.md)
- [Page transformation guidance](modernize-userinterface-site-pages.md)
234 changes: 234 additions & 0 deletions docs/transform/assessment-tool-classic-pages-csv.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
---
title: Classic pages assessment CSV reference
description: Understand the page, web part, usage, web, site, and publishing CSV files generated by the Microsoft 365 Assessment tool.
ms.date: 07/27/2026
ms.localizationpriority: high
ms.service: sharepoint
---

# Classic pages assessment CSV reference

A Classic report always exports the common assessment files and the Classic component files. Files for components that weren't selected can contain only headers.

For the common file schemas and join keys, see [Common assessment CSV reference](assessment-tool-common-reports.md).

The page-specific output is:

| File | Granularity |
| --- | --- |
| `classicpages.csv` | One row per discovered classic page. |
| `classicpagewebparts.csv` | One row per extracted web part. |
| `classicwebpartunique.csv` | One row per unique web part type across the assessment. |
| `classicpageauditusage.csv` | One row per page with audit activity, plus coverage-status rows when required. |
| `classicwebsummaries.csv` | One row per web. |
| `classicsitesummaries.csv` | One row per site collection. |
| `classicpublishingsitesummaries.csv` | One row per publishing portal site collection. |

`classicpageauditusage.csv` is created only when audit collection writes rows. It isn't created when `--skipusageinformation` is used.

## File relationship

```text
scans.csv
|-- properties.csv
|-- history.csv
|-- sitecollections.csv
| |-- classicsitesummaries.csv
| |-- classicpublishingsitesummaries.csv
| `-- classicpageauditusage.csv *
|-- webs.csv
| |-- classicwebsummaries.csv
| `-- classicpages.csv
| `-- classicpagewebparts.csv
`-- classicwebpartunique.csv
```

`classicwebpartunique.csv` is scan-wide. The `*` marks site-scoped output: `classicpageauditusage.csv` isn't a strict child of `classicpages.csv`, although individual page activity rows can optionally join to assessed pages.

## Join keys

Use these keys when combining files:

| Relationship | Keys |
| --- | --- |
| Page to web part | `ScanId`, `SiteUrl`, `WebUrl`, `PageUrl` |
| Audit page activity to an assessed page | `ScanId`, `SiteUrl`, `PageUrl` when the page exists in both files |
| Audit coverage row to a site | `ScanId`, `SiteUrl` |
| Page to web summary | `ScanId`, `SiteUrl`, `WebUrl` |
| Web summary to site summary | `ScanId`, `SiteUrl` |
| Publishing summary to site summary | `ScanId`, `SiteUrl` |

`classicpageauditusage.csv` has three row shapes:

- Page activity rows use the server-relative page URL. They join to `classicpages.csv` only when that page was included in the assessment scope.
- Standard site-level coverage rows use the server-relative site URL. These rows surface failed, skipped, empty, or partial site coverage and don't represent a page.
- An unexpected post-scan exception creates a site-level row with `QueryStatus=error` and the absolute site URL in `PageUrl`.

Use `ScanId` and `SiteUrl` for every site-level coverage row; don't join those rows to `classicpages.csv`.

## `classicpages.csv`

| Column | Description |
| --- | --- |
| `ScanId` | Assessment identifier. |
| `SiteUrl` | Absolute site-collection URL. |
| `WebUrl` | Site-collection-relative web URL. `/` represents the root web. |
| `PageUrl` | Server-relative page URL. |
| `PageName` | Page title or derived file name. |
| `PageType` | `WikiPage`, `WebPartPage`, `PublishingPage`, `BlogPage`, `ASPXPage`, or `DelveBlogPage`. |
| `ListUrl` | Server-relative URL of the containing library or list. |
| `ListTitle` | Title of the containing library or list. |
| `ListId` | Identifier of the containing library or list. |
| `ModifiedAt` | Last modification time. |
| `Layout` | Detected wiki or web part layout, or publishing layout name. |
| `HomePage` | Indicates whether this page is the web's welcome page. |
| `UncustomizedHomePage` | Indicates whether the home page still matches the recognized default configuration. |
| `ModifiedBy` | Last modifier. Empty when `--skipuserinformation` is used. |
| `WebPartCount` | Number of extracted web parts. A zero can also remain when enrichment failed before extraction completed. |
| `MappingPercentage` | Rounded percentage of extracted web parts with usable mappings. A zero with `WebPartCount=0` on an enriched page can indicate an enrichment failure. |
| `UnmappedWebParts` | De-duplicated short type names for unmapped web parts. |
| `RemediationCode` | Page classification: `CP1` Web Part, `CP2` Wiki, `CP3` Publishing, `CP4` Blog, or `CP5` ASPX. It can be empty for a Delve Blog page. |

Detailed `Layout`, `WebPartCount`, `MappingPercentage`, and `UnmappedWebParts` analysis applies to Wiki, Web Part, and Publishing pages. Don't treat default values on Blog, ASPX, or Delve Blog rows as completed mapping analysis.

For an enriched page with no web parts, `MappingPercentage` is 100 by convention.

If a Wiki, Web Part, or Publishing row has `WebPartCount=0` and `MappingPercentage=0`, review the assessment log for a per-page enrichment failure.

## `classicpagewebparts.csv`

This file contains extracted web parts from Wiki, Web Part, and Publishing pages.

| Column | Description |
| --- | --- |
| `ScanId` | Assessment identifier. |
| `SiteUrl` | Absolute site-collection URL. |
| `WebUrl` | Site-collection-relative web URL. `/` represents the root web. |
| `PageUrl` | Server-relative page URL. |
| `WebPartIndex` | Zero-based index in the extracted page inventory. |
| `WebPartType` | Raw mapping key. It is usually an assembly-qualified type, but wiki text, image, and video parts use synthetic type values. |
| `WebPartTypeShort` | Portion of `WebPartType` before the first comma. The namespace is retained. |
| `WebPartTitle` | Configured web part title. |
| `WebPartProperties` | JSON-serialized properties when `--exportwebpartproperties` is used. |
| `ZoneId` | Web part zone identifier when available. |
| `Row` | Detected page row. |
| `Column` | Detected page column. |
| `Order` | Order within the zone or layout cell. |
| `Hidden` | Indicates whether the web part is hidden. |
| `IsClosed` | Indicates whether the web part is closed. |
| `IsMappable` | Indicates whether the embedded model contains a usable mapping. |

## `classicwebpartunique.csv`

This file is scan-wide. It doesn't contain `SiteUrl` or `WebUrl`.

| Column | Description |
| --- | --- |
| `ScanId` | Assessment identifier. |
| `WebPartType` | Raw mapping key. It is usually an assembly-qualified type, but wiki content can use synthetic type values. |
| `InMappingFile` | Indicates whether the type has an entry in the embedded mapping file. |
| `PageCount` | Number of distinct pages on which the type was found. |

`InMappingFile=true` doesn't guarantee that the entry has a usable mapping. Use `IsMappable` in `classicpagewebparts.csv` for the transformation-readiness decision.

## `classicpageauditusage.csv`

| Column | Description |
| --- | --- |
| `ScanId` | Assessment identifier. |
| `SiteUrl` | Absolute site-collection URL. |
| `PageUrl` | Server-relative page URL for page rows. Site-level coverage rows use the server-relative site URL, except an unexpected `error` row, which contains the absolute site URL. |
| `AuditViewsCount` | Number of `ClassicPageViewed` events. |
| `AuditCreatesCount` | Number of `ClassicPageCreated` events. |
| `AuditEditsCount` | Number of `ClassicPageEdited` events. |
| `AuditUniqueUsers` | Approximate distinct-user signal across the three operations. It saturates at 10,000; a value of 10,000 means at least 10,000 users. |
| `AuditWindowStart` | Start of the queried window in UTC. |
| `AuditWindowEnd` | End of the queried window in UTC. |
| `QueryStatus` | `succeeded`, `partial`, `failed`, `skipped`, or `error`. |
| `SkipReason` | Permission, cloud, timeout, query, or partial-data explanation when applicable. |

The file intentionally omits `WebUrl`. Join to `classicpages.csv` by `ScanId`, `SiteUrl`, and `PageUrl`.

If `QueryStatus=partial`, counts are a lower bound. If `QueryStatus` is `failed` or `skipped`, don't use the zero counts as activity evidence.

An `error` row represents an unexpected post-scan exception. It is a site-level coverage row, and its `PageUrl` is currently the absolute site URL rather than a server-relative URL.

## `classicwebsummaries.csv`

This file is shared by Classic components. The table below documents only page-related columns.

Page-related columns include:

| Column | Description |
| --- | --- |
| `ScanId`, `SiteUrl`, `WebUrl` | Web identity. |
| `Template` | Web template. |
| `LastItemUserModifiedDate` | Last user modification time recorded for the web. |
| `ClassicPages` | Total discovered classic pages except `DelveBlogPage` rows. |
| `ClassicWikiPages` | Wiki page count. |
| `ClassicASPXPages` | ASPX page count. |
| `ClassicBlogPages` | Blog page count. |
| `ClassicWebPartPages` | Web Part page count. |
| `ClassicPublishingPages` | Publishing page count. |
| `ModernPages` | Modern page count. |
| `PagesWithWebParts` | Enriched classic pages with extracted web parts. |
| `MappableWebPartPages` | Pages with web parts and a mapping percentage of 100. |
| `UnmappedWebPartPages` | Pages with at least one unmapped web part. |
| `AvgMappingPercentage` | Average across pages in `PagesWithWebParts`. |
| `UncustomizedHomePages` | Recognized default home-page count. |
| `IsModernSite` | Indicates a modern site classification. |
| `IsClassicPublishingSite` | Indicates a classic publishing web. |
| `IsModernCommunicationSite` | Indicates a modern communication site. |
| `RemediationCode` | Web-level remediation classification. |
| `AggregatedRemediationCodes` | De-duplicated component remediation codes. |

The file also contains columns for other Classic components. They are outside this page-assessment reference.

The current page-type rollups don't include `DelveBlogPage` rows, although those rows are present in `classicpages.csv`.

## `classicsitesummaries.csv`

Page-related columns include:

| Column | Description |
| --- | --- |
| `ScanId`, `SiteUrl` | Site-collection identity. |
| `LastItemUserModifiedDate` | Last user modification time recorded for the site collection. |
| `RootWebTemplate` | Root web template. |
| `SubWebTemplates` | Templates found in subwebs. |
| `SubWebCount` | Number of subwebs. |
| `SubWebDepth` | Maximum subweb depth. |
| `ClassicPages` | Total discovered classic pages except `DelveBlogPage` rows. |
| `ClassicWikiPages` | Wiki page count. |
| `ClassicASPXPages` | ASPX page count. |
| `ClassicBlogPages` | Blog page count. |
| `ClassicWebPartPages` | Web Part page count. |
| `ClassicPublishingPages` | Publishing page count. |
| `ModernPages` | Modern page count. |
| `PagesWithWebParts` | Enriched classic pages with extracted web parts. |
| `MappableWebPartPages` | Pages with web parts and a mapping percentage of 100. |
| `UnmappedWebPartPages` | Pages with at least one unmapped web part. |
| `AvgMappingPercentage` | Average across pages in `PagesWithWebParts`. |
| `UncustomizedHomePages` | Recognized default home-page count. |
| `AggregatedRemediationCodes` | De-duplicated component remediation codes. |

The file also contains site-level columns for other Classic components. They are outside this page-assessment reference.

The current page-type rollups don't include `DelveBlogPage` rows, although those rows are present in `classicpages.csv`.

## `classicpublishingsitesummaries.csv`

This file contains one row per site collection that has at least one publishing web.

| Column | Description |
| --- | --- |
| `ScanId` | Assessment identifier. |
| `SiteUrl` | Absolute publishing portal site-collection URL. |
| `NumberOfWebs` | Number of publishing webs. |
| `NumberOfPages` | Number of classic publishing pages. |
| `UsedPageLayouts` | De-duplicated publishing page layouts. |
| `LastPageUpdateDate` | Most recent publishing-page modification time. |

The file also contains master-page fields populated by another Classic component. They are outside this Page Assessment reference.

For legacy publishing fields that aren't represented by this file, see [Understand publishing portal coverage](assessment-tool-publishing-coverage.md).
Loading