From 016729b6c08b971d5e932f6a5bf80a79088f6a6f Mon Sep 17 00:00:00 2001 From: soyalejolopez <88358406+soyalejolopez@users.noreply.github.com> Date: Fri, 11 Sep 2026 22:17:20 -0500 Subject: [PATCH 1/2] feat: add Copilot Analytics Reports Navigator Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- copilot-analytics-samples/README.md | 1 + .../CHANGELOG.md | 12 + .../README.md | 117 + .../index.html | 2613 +++++++++++++++++ .../preview.webp | Bin 0 -> 120786 bytes 5 files changed, 2743 insertions(+) create mode 100644 copilot-analytics-samples/copilot-analytics-reports-navigator/CHANGELOG.md create mode 100644 copilot-analytics-samples/copilot-analytics-reports-navigator/README.md create mode 100644 copilot-analytics-samples/copilot-analytics-reports-navigator/index.html create mode 100644 copilot-analytics-samples/copilot-analytics-reports-navigator/preview.webp diff --git a/copilot-analytics-samples/README.md b/copilot-analytics-samples/README.md index d25516f1..f65d27b4 100644 --- a/copilot-analytics-samples/README.md +++ b/copilot-analytics-samples/README.md @@ -14,6 +14,7 @@ The following table summarizes the available samples within this directory. Plea | [Copilot-PurviewAudit-PBI-Report](./Copilot_Audit_PBI/) | Offers a Power BI template designed to visualize granular Copilot usage 🔍 based on specific audit events captured in Microsoft Purview. Helps track frequency and types of Copilot interactions across supported M365 applications (subject to audit log configuration and availability). | Microsoft Purview Audit Logs 🛡️ | | [Copilot-Usage-Users-and-Apps](./copilot-usage-users-and-apps/) | Offers a Power BI template designed to show how a Viva Insights Person Query export can be used to visualize user and application data in PowerBI. Helps visualize where additional training investments may be needed in order to help increase license utilization. | Microsoft Viva Insights (Advanced Insights Analyst Workbench) 🧠 | | [Copilot-Interaction-Report (PowerShell)](./copilot-interaction-report/) | A PowerShell sample that pulls Microsoft 365 Copilot **enterprise interaction history** directly from the Microsoft Graph API and renders a self-contained **HTML dashboard** (no Power BI required) — surfaces used, top users, friction/error rates, prompt-intent breakdown, and a sortable per-user leaderboard. 🖥️ | Microsoft Graph (`getAllEnterpriseInteractions`) 🔌 | +| [Copilot Analytics Reports Navigator](./copilot-analytics-reports-navigator/) | An interactive guide for comparing 21 documented Microsoft reports and 22 public community projects by purpose, metrics, access location, data timing, and documented release status. | Public Microsoft documentation and public community project pages | ## General Prerequisites 📋 diff --git a/copilot-analytics-samples/copilot-analytics-reports-navigator/CHANGELOG.md b/copilot-analytics-samples/copilot-analytics-reports-navigator/CHANGELOG.md new file mode 100644 index 00000000..09c8b2c5 --- /dev/null +++ b/copilot-analytics-samples/copilot-analytics-reports-navigator/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog + +All notable changes to the Copilot Analytics Reports Navigator are documented here. + +## 1.0.0 - 2026-09-11 + +- Added a self-contained interactive navigator covering 21 documented Microsoft reports and 22 + public community projects. +- Added comparison details for reporting purpose, metrics, access location, data timing, and + documented release status. +- Clarified that the navigator does not query a tenant, connect to reporting data, or imply that + every listed report is generally available. diff --git a/copilot-analytics-samples/copilot-analytics-reports-navigator/README.md b/copilot-analytics-samples/copilot-analytics-reports-navigator/README.md new file mode 100644 index 00000000..508c0c75 --- /dev/null +++ b/copilot-analytics-samples/copilot-analytics-reports-navigator/README.md @@ -0,0 +1,117 @@ +--- +title: "Copilot Analytics Reports Navigator" +type: analytics +category: "Interactive" +summary: "Compare 21 Microsoft reports and 22 public community projects by purpose, metrics, location, timing, and release status." +author: + - "Alejandro Lopez" +version: 1.0.0 +published: 2026-09-11 +updated: 2026-09-11 +tags: + - copilot + - analytics + - reporting + - adoption +format: interactive +interactiveKind: guide +preview: preview.webp +featured: false +status: active +whatItIs: >- + A self-contained interactive navigator for comparing 21 documented Microsoft reports and + 22 public community projects related to Microsoft Copilot analytics and reporting. +whyUseIt: + - "Find reports by the questions they answer, the metrics they include, where they are accessed, and when their data becomes available." + - "Compare documented Microsoft reports with public community projects without treating every item as generally available." + - "Review public preview and verify-status labels before choosing a reporting approach." +howToUse: |- + 1. Open the published navigator or download `index.html` and open it in a modern browser. + 2. Use the question picker, search, or available filters to find relevant reports. + 3. Open the linked public documentation or project page to confirm current availability and requirements. + 4. Use the navigator as a selection guide; it does not query a tenant or connect to reporting data. +prerequisites: + - "Modern web browser" + - "Access to the products, roles, licenses, and data sources required by any report you choose to use" +--- + +# Copilot Analytics Reports Navigator + +The Copilot Analytics Reports Navigator is a self-contained browser guide for finding and comparing +Microsoft Copilot analytics reports. It covers 21 reports documented by Microsoft and 22 public +community projects. + +The navigator helps readers compare what each report is for, which metrics it includes, where it is +accessed, when its data becomes available, and its documented release status. Public preview and +verify-status labels are shown where appropriate. Not every listed report is generally available. + +The navigator is a reference and selection guide. It does not sign in, query a tenant, connect to +reporting data, or collect user information. + +## Use the navigator + +1. Open the published interactive navigator or download and open [`index.html`](./index.html) in a + modern browser. +2. Browse or filter the catalog based on the reporting question you need to answer. +3. Compare the listed metrics, access location, data timing, and release-status notes. +4. Follow the linked public documentation or community project page to confirm current + availability, licensing, permissions, and setup requirements before implementation. + +Product availability, report names, metrics, portal locations, licensing, and release status can +change. Verify current details in the linked public source before making a production decision. + +## Applies To + +- Microsoft 365 Copilot +- Microsoft Copilot analytics and adoption reporting +- Microsoft 365 admin center +- Viva Insights +- Microsoft Purview +- Public community reporting projects + +## Author + +| Author | Original Publish Date | +| --- | --- | +| Alejandro Lopez | 2026-09-11 | + +## Version history + +See [CHANGELOG.md](./CHANGELOG.md). + +## Issues + +Please report any issues you find to the [issues list](https://github.com/microsoft/FastTrack/issues). + + + +## Support Statement + +The scripts, samples, and tools made available through the FastTrack Open Source initiative are +provided as-is. These resources are developed in partnership with the community and do not represent +official Microsoft software. As such, support is not available through premier or other Microsoft +support channels. If you find an issue or have questions please reach out through the issues list and +we'll do our best to assist, however there is no associated SLA. + +## Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Legal Notices + +Microsoft and any contributors grant you a license to the Microsoft documentation and other content +in this repository under the [MIT License](../../LICENSE), and grant you a license to any code in the +repository under the [MIT License](../../LICENSE-CODE). + +Microsoft, Windows, Microsoft Azure and/or other Microsoft products and services referenced in the +documentation may be either trademarks or registered trademarks of Microsoft in the United States +and/or other countries. The licenses for this project do not grant you rights to use any Microsoft +names, logos, or trademarks. Microsoft's general trademark guidelines can be found at +http://go.microsoft.com/fwlink/?LinkID=254653. + +Privacy information can be found at https://privacy.microsoft.com/en-us/ + +Microsoft and any contributors reserve all others rights, whether under their respective copyrights, +patents, or trademarks, whether by implication, estoppel or otherwise. diff --git a/copilot-analytics-samples/copilot-analytics-reports-navigator/index.html b/copilot-analytics-samples/copilot-analytics-reports-navigator/index.html new file mode 100644 index 00000000..9a1a10e3 --- /dev/null +++ b/copilot-analytics-samples/copilot-analytics-reports-navigator/index.html @@ -0,0 +1,2613 @@ + + + + + +Copilot Analytics Reports Navigator — Public edition + + +
Public-source edition. Report guidance is linked to public Microsoft Learn documentation; community projects link to anonymously accessible public repositories or pages. Reviewed 2026-09-11.
+ + + +
+
+
+

The Copilot reporting landscape

+

Every official Microsoft report on one map. Select any report to open its details.

+
+
+
+
+

Reports are organized by the customer decision they support (rows) and how deep the analysis goes (columns). Placement reflects each report's primary use; some span more than one intent.

+ +
+
+ +Report landscape matrix +A four-by-four matrix mapping the 21 official Microsoft reports. Columns run left to right from a broad operational view to a deep diagnostic view; rows are the customer decision each report supports. + + + + + + + + + + +Microsoft Copilot readiness report + +Readiness + + +Microsoft Copilot usage report + +Copilot usage + + +Microsoft Copilot Chat usage report + +Copilot Chat + + +Microsoft 365 Copilot Connectors usage report (Preview) + +Connectors · Preview + + +Microsoft Copilot Search usage report (Preview) + +Copilot Search · Preview + + +Cowork usage report + +Cowork usage + + +AI adoption category in Adoption Score + +AI Adoption Score + + +Ready-to-use Copilot Analytics reports + +Ready-to-use reports + + +Microsoft Copilot adoption report + +Copilot adoption + + +Copilot headlines report (preview) + +Headlines · Preview + + +Sales agent adoption report + +Sales adoption + + +Microsoft Copilot Dashboard (mixed availability; agent metrics are preview) + +Copilot Dashboard · Mixed + + +Microsoft Copilot impact report + +Copilot impact + + +Copilot business impact report + +Business impact + + +Microsoft Copilot Agents usage report (Preview) + +Agents usage · Preview + + +Agent Dashboard (Preview) + +Agent Dashboard · Preview + + +Copilot Studio agents report (mixed availability; business outcome data is preview) + +Studio agents · Mixed + + +Copilot Studio Monitor + +Studio Monitor + + +Microsoft Copilot Credits report (public availability status unclear) + +Copilot Credits · Verify status + + +Consumption Dashboard (mixed availability; GitHub page is preview) + +Consumption Dashboard · Mixed + + +Power Platform admin center Copilot Studio consumption analytics + +PPAC consumption + + + +
+

Report landscape by customer decision (rows) and analytical depth (columns, from a broad operational view on the left to a deep diagnostic view on the right):

+
    +
  • Plan and drive adoption: Readiness, Copilot usage, Copilot Chat, Connectors, Copilot Search, Cowork usage, AI Adoption Score, Ready-to-use reports, Copilot adoption, Copilot headlines, Sales adoption.
  • +
  • Explain impact and outcomes: Copilot Dashboard, Copilot impact, Business impact.
  • +
  • Govern the agent portfolio: Agents usage, Agent Dashboard, Studio agents report, Studio Monitor.
  • +
  • Track consumption and cost: Copilot Credits, Consumption Dashboard, PPAC consumption.
  • +
+
+
+
+
    +
  • Matches current filters
  • +
  • Outside current filters
  • +
  • Select any node to open its details
  • +
+
+

Showing all 21 reports. Search or filter below to spotlight a subset.

+ +
+
+

How to use it: start with the leftmost report that answers the question, then move right only when the customer needs deeper segmentation or diagnostics.

+
+
+
+
+
+

Find a report

+

Start here. Pick the question you need to answer and we'll recommend the right Microsoft in-product report, the metrics that decide it, and where to find it. This points you to a report to open — it doesn't query any customer's data.

+
+
+
+ + +

Each question maps to one recommended report. Change the question to update the recommendation.

+
+
+
+

Primary report

+

Microsoft Copilot usage report

+

Use this as the official licensed-user adoption baseline.

+
+
+

Decisive metrics

+
  • Enabled users
  • active users
  • active-user rate
  • adoption trend
  • active users by Microsoft 365 app/feature
  • active days
+
+
+

Freshness

+

Activity for a UTC day typically appears within 48 hours; daily validation can backfill the past three days.

+
+
+

Where to find it

+

Microsoft 365 admin center › Reports › Usage › Microsoft Copilot › Copilot › Usage.

+
+
+
+ +
+
+
+

Go deeper with

+

Microsoft Copilot Dashboard

+

Copilot Dashboard adds the leader-facing adoption-and-impact view over the same population.

+
+ +
+
+
+
+
+
+
+

Search & filter the report directory

+

Search or filter the 21 in-product reports and the directory below updates to match. The report map at the top of the page dims to match these filters too.

+
+
+ +
+
+
+
+

Report directory

+

Twenty-one official Microsoft reports across four product surfaces. The search and filters above apply here; open a row for the full detail.

+
+

Active filters: none. Showing all reports.

+ + +
+
+ +
+
+

Microsoft 365 admin center9

+

The primary tenant-level surface. Nine reports covering license readiness, adoption, agents, connectors, search, Cowork, credits, and habit signals.

+
+
+
+
+ +Microsoft Copilot readiness report +Use this first to size the technically ready population and plan the next license wave. +48-72 hours +Public docs + +
+
+

Customer asks

+

Show our Microsoft Copilot readiness: how many users hold the prerequisite licenses, are on an eligible update channel, and are strong Copilot candidates based on app use.

+
+
+
Use this when
Use this first to size the technically ready population and plan the next license wave.
+
Metrics included
Total prerequisite licenses, users on eligible update channel, assigned licenses, available licenses, Teams meetings use, Teams chat use, Outlook email use, Office document use, suggested Copilot candidates
+
Story these metrics tell
Size the technically ready population, identify deployment blockers, and build the next license wave. Suggested candidates are a weekly top-25% cohort based on app use, not a performance ranking.
+
Where
Microsoft 365 admin center › Reports › Usage › Microsoft Copilot › Copilot › Readiness.
+
Timing
Report is available within 72 hours; usage data can have up to 72 hours latency; 28-day window.
+
Requirements
AI Administrator; eligible prerequisite licenses and update channels; Copilot licenses for candidate features.
+
Blockers
New setup/license data has not aged 72 hours; user details are anonymized by default; suggested candidates are a weekly top-25% cohort and must not be used for employee performance ranking.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Microsoft Copilot usage report +Use this as the official licensed-user adoption baseline. +48-72 hours +Public docs + +
+
+

Customer asks

+

Show whether our assigned Microsoft Copilot licenses are turning into repeat use: enabled vs active users, the active-user rate, adoption trend, and which apps drive it.

+
+
+
Use this when
Use this as the official licensed-user adoption baseline.
+
Metrics included
Enabled users, active users, active-user rate, adoption trend, active users by Microsoft 365 app/feature, active days, last activity date, retention/engagement indicators
+
Story these metrics tell
Show whether paid licenses are turning into repeat use, which apps carry adoption, and where enablement should focus. Use this as the official licensed-user baseline.
+
Where
Microsoft 365 admin center › Reports › Usage › Microsoft Copilot › Copilot › Usage.
+
Timing
Activity for a UTC day typically appears within 48 hours; daily validation can backfill the past three days.
+
Requirements
AI Administrator; Microsoft Copilot licenses.
+
Blockers
Last activity can be blank when usage occurs less than 24h after license assignment; time windows differ from Viva Insights; Purview audit logs are not an equivalent usage-report source.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Microsoft Copilot Chat usage report +Use this for the unlicensed Copilot Chat population; keep it separate from licensed Copilot usage. +48-72 hours +Public docs + +
+
+

Customer asks

+

Show adoption of Microsoft Copilot Chat among users who do not have a Microsoft Copilot license: active users, average daily active users, total prompts, and which entry points drive prompts.

+
+
+
Use this when
Use this for the unlicensed Copilot Chat population; keep it separate from licensed Copilot usage.
+
Metrics included
Total active users, average daily active users, total prompts, average prompts per active user, usage by entry point/app, active days, last activity date
+
Story these metrics tell
Explain adoption of Copilot Chat among users without a Microsoft Copilot license and identify the entry points driving prompt behavior. Do not mix this population with licensed Copilot usage.
+
Where
Microsoft 365 admin center › Reports › Usage › Microsoft Copilot › Copilot Chat.
+
Timing
Activity typically appears within 48 hours after the UTC day.
+
Requirements
AI Administrator; users without a Microsoft Copilot license.
+
Blockers
Currently covers only unlicensed users; use Microsoft Copilot usage report for licensed-user Chat activity.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Microsoft Copilot Agents usage report (preview) +Use this to decide which agents to promote, govern, or investigate. +~1 hour +Preview + +
+
+

Customer asks

+

Show which agents our users actually use: total active users, licensed vs unlicensed active users, active agents, agent responses, and a breakdown by creator type.

+
+
+
Use this when
Use this to decide which agents to promote, govern, or investigate.
+
Metrics included
Total active users, licensed active users, unlicensed active users, total active agents, agent responses, users by creator type, agents by creator type, per-user, per-agent, and agent-user activity, last activity date
+
Story these metrics tell
Identify which agents are actually used, whether adoption is licensed or unlicensed, and whether Microsoft, third-party, org-built, or user-built agents drive the behavior. Use it to decide which agents to promote, govern, or investigate.
+
Where
Microsoft 365 admin center › Reports › Usage › Microsoft Copilot › Agents.
+
Timing
Within one hour of interaction.
+
Requirements
AI Administrator; agent activity.
+
Blockers
Public preview; only 7/30-day ranges; Cowork is a separate report; SharePoint agents used in Teams are not currently included.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Microsoft 365 Copilot Connectors usage report (preview) +Use this to separate a connector that is configured from a connector that is actually used. +~1 hour +Preview + +
+
+

Customer asks

+

Show whether our configured Microsoft 365 Copilot connectors are grounding real responses: connections used by Copilot and by agents, active connector users, and connector-grounded responses.

+
+
+
Use this when
Use this to separate a connector that is configured from a connector that is actually used.
+
Metrics included
Connections used by Copilot, connections used by agents, active connector users, connector-grounded responses, adoption trend, per-user connector activity, per-connector activity, last activity date
+
Story these metrics tell
Prove whether configured connectors are grounding real responses and which connections create value. Use it to separate 'connector configured' from 'connector actually used.'
+
Where
Microsoft 365 admin center › Reports › Usage › Microsoft Copilot › Connectors.
+
Timing
Within one hour.
+
Requirements
AI Administrator; licensed Microsoft Copilot users; configured connectors.
+
Blockers
Public preview; Cowork connector usage is not supported; opening Copilot without a connector-grounded response does not count.
+
+Official Microsoft Learn source +
+
+
+ +
+
+ +Cowork usage report +Use retention and task mix to distinguish curiosity from durable workflow adoption. +Timing not stated +Public docs + +
+
+

Customer asks

+

Show whether Cowork adoption is growing and sticky: active Cowork users, total and average tasks, retained users, week-over-week trend, and the mix of user-initiated vs scheduled tasks.

+
+
+
Use this when
Use retention and task mix to distinguish curiosity from durable workflow adoption.
+
Metrics included
Active Cowork users, total Cowork tasks, average tasks per user, retained users, week-over-week trend, daily active users, user-initiated tasks, scheduled tasks, active days, last activity date, grace-period status
+
Story these metrics tell
Explain whether Cowork adoption is growing, whether users return, and whether scheduled work is becoming part of operations. Use retention and task mix to distinguish curiosity from durable workflow adoption.
+
Where
Microsoft 365 admin center › Copilot › Cowork › Overview or Usage.
+
Timing
No fixed latency stated; use the Last updated timestamp.
+
Requirements
Appropriate Microsoft 365 usage-report permission; Cowork enabled.
+
Blockers
User-detail history begins 2026-04-01; check Last updated; usage/billing access must be configured.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Microsoft Copilot Credits report (status unclear) +Use this for operational billing controls and anomaly follow-up, not broad ROI claims. +~1 hour +Verify status + +
+
+

Customer asks

+

Show what is driving our Copilot Credit consumption: total credits used, cumulative and daily credits, credits by user, by agent, by billing policy, and high-usage alerts.

+
+
+
Use this when
Use this for operational billing controls and anomaly follow-up, not broad ROI claims.
+
Metrics included
Total credits used, cumulative and daily credits, credits by user, credits by agent, credits by billing policy, credits by user-agent pair, high-usage alerts, last activity date
+
Story these metrics tell
Connect metered agent use to the users, agents, and policies causing spend. Use it for operational billing controls and anomaly follow-up, not broad ROI claims.
+
Where
Microsoft 365 admin center › Reports › Usage › Microsoft Copilot › Credits.
+
Timing
Within 1 hour, but manually refresh for the latest.
+
Requirements
Pay-as-you-go billing policy, enabled agent usage, AI Administrator.
+
Blockers
Public availability status is unclear: the current page title omits “Preview,” while the page body still describes preview history and preview alerts. Verify the current status before representing it as generally available or preview. History is limited to 30 days, no data is available before 2025-05-03, and the view does not auto-refresh after recent usage.
+
+Official Microsoft Learn source +
+
+
+
+
+ +AI adoption category in Adoption Score +Use the trend to choose enablement actions; never use it for employee performance evaluation. +Timing not stated +Public docs + +
+
+

Customer asks

+

Show whether Copilot is becoming a repeat weekly habit across our licensed population: the AI adoption score, active days per licensed user, 28-day usage frequency, and how we compare to peers.

+
+
+
Use this when
Use the trend to choose enablement actions; never use it for employee performance evaluation.
+
Metrics included
AI adoption score, active days per licensed user, 28-day usage frequency, adoption by app/feature, peer benchmark, 30/90/180-day trends, organizational-message eligible cohorts
+
Story these metrics tell
Tell whether Copilot is becoming a repeat weekly habit across the licensed population and how the organization compares to peers. Use the trend to choose enablement actions; never use it for employee performance evaluation.
+
Where
Microsoft 365 admin center › Reports › Adoption Score › AI adoption › View details.
+
Timing
No fixed latency; rolling 28-day score window.
+
Requirements
At least one Copilot licensed user; Organizational Message Writer only for nudges; Global Administrator for sentiment upload.
+
Blockers
Not performance; current release does not respect group opt-outs for the AI adoption category.
+
+Official Microsoft Learn source +
+
+
+
+
+
+
+

Viva Insights dashboards and ready reports4

+

Governed, leader-facing dashboards and ready-to-use reports you consume without building a query.

+
+
+
+
+ +Microsoft Copilot Dashboard (mixed availability) +Use this to give leaders one adoption-and-impact narrative across groups. +Up to 6 days +Mixed + +
+
+

Customer asks

+

Give leaders a shared Copilot adoption-and-impact story: licensed employees, active users and percentage, adoption by app/feature/group, six-month trends, benchmarks, and assisted-hours signals.

+
+
+
Use this when
Use this to give leaders one adoption-and-impact narrative across groups.
+
Metrics included
Licensed employees, active Copilot users, active-user percentage, adoption by app/feature/group, six-month trends, internal/external benchmarks, Copilot assisted hours/value, collaboration impact, sentiment/survey results, group and job-function comparisons
+
Story these metrics tell
Give leaders a shared adoption-and-impact narrative across groups, not just license counts. Use it to find where adoption is strong, where impact signals are emerging, and which teams need targeted enablement.
+
Where
Viva Insights › Microsoft Copilot Dashboard (Teams app or web).
+
Timing
Refreshes daily, previous 28-day window, up to 6-day delay; newly assigned licenses up to 7 days.
+
Requirements
Business/enterprise Microsoft 365 or Office 365 plus Exchange Online; at least 50 Viva Insights licenses or 1 Copilot license to start processing; eligible leader/manager/delegate/global analyst access; org data optional but needed for richer attributes.
+
Blockers
Agent metrics on the dashboard are in public preview. Other limits include the minimum-group privacy threshold, stale/incomplete hierarchy or organizational data, and initial/new license processing.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Agent Dashboard (preview) +Use this to spot agents or groups that need promotion, governance, or deeper diagnosis. +Up to 6 days +Preview + +
+
+

Customer asks

+

Describe our organization's agent landscape and momentum: active agents, active and returning users, sessions, Copilot Credits, adoption by group, and creator/publisher/agent-type breakdowns.

+
+
+
Use this when
Use this to spot agents or groups that need promotion, governance, or deeper diagnosis.
+
Metrics included
Active agents, active users, returning users, sessions, Copilot Credits, active users using credits, adoption by group/org/job/license, weekly/monthly trends, creator/publisher/agent-type breakdown, agent-specific usage
+
Story these metrics tell
Describe the organization's agent landscape and adoption momentum, then identify agents or groups that need promotion, governance, or deeper diagnosis. Treat preview and six-day delay carefully.
+
Where
Viva Insights › Agent Dashboard (preview).
+
Timing
Previous 28 days, up to 6-day delay.
+
Requirements
At least 50 Copilot licenses and agent activity; Agent 365 view also needs Agent 365 licensing; eligible leader/analyst/delegate access.
+
Blockers
Public preview; unavailable in national/regional clouds; minimum group threshold; All agents toggle absent without A365.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Consumption Dashboard (mixed availability) +Use this for management insight into consumption; use official billing systems for charges. +Dashboard timing not stated +Mixed + +
+
+

Customer asks

+

Show where our AI consumption concentrates: active users, total Copilot Credits, sessions, credit trend, service and team breakdowns, usage-intensity segments, and users near spending limits.

+
+
+
Use this when
Use this for management insight into consumption; use official billing systems for charges.
+
Metrics included
Active users, total Copilot Credits, session count, credit trend, service breakdown, team/organization/job-function breakdown, usage-intensity segments, spending-policy limits, users near limits, GitHub Copilot requests by mode/model/language, code completions and acceptance (preview)
+
Story these metrics tell
Show where AI consumption concentrates, which services and teams drive it, and which policies are nearing limits. Use official billing systems for charges; this dashboard is for management insight.
+
Where
Viva Insights › Consumption Dashboard.
+
Timing
Dashboard refresh latency is not stated. Daily export: usually about two days behind (timing varies); weekly export: 2–8 days behind. Only complete periods are exported.
+
Requirements
Insights Analyst with global partition, Manager, or Microsoft 365 Global Administrator.
+
Blockers
Official billing remains admin center/GitHub; non-global analysts lack access; access cannot be delegated; Microsoft 365 service data currently Cowork + Work IQ; GitHub page preview.
+
+Official Microsoft Learn source +Export data timing +
+
+
+
+
+ +Ready-to-use Copilot Analytics reports +Use this when the question matches an available card; otherwise move to Advanced Reporting. +Timing not stated +Public docs + +
+
+

Customer asks

+

Show me the ready-to-use Copilot Analytics reports available to us: Copilot Studio agent adoption/impact cards, Sales agent adoption cards, and any analyst-shared reports.

+
+
+
Use this when
Use this when the question matches an available card; otherwise move to Advanced Reporting.
+
Metrics included
Copilot Studio agent adoption/impact cards, Sales agent adoption cards, analyst-shared report metrics, report availability/ownership metadata
+
Story these metrics tell
Let leaders consume a governed report without building a query or opening Power BI Desktop. Use it when the question matches an available card or analyst-shared report; otherwise move to Advanced Reporting.
+
Where
Viva Insights web app › Reports.
+
Timing
Depends on underlying report/query publication; no shared latency stated.
+
Requirements
Copilot Dashboard automatic access or enabled manager, delegate access, Viva Insights Analyst with global partition, or Global Administrator.
+
Blockers
"No reports available" means no ready report or no analyst-shared report; recipients cannot customize shared reports.
+
+Official Microsoft Learn source +
+
+
+
+
+
+
+

Viva Advanced Reporting6

+

Analyst-built Power BI templates from Viva Insights > Analysis > Create analysis > Copilot. Deeper segmentation, impact, and business-outcome analysis.

+
+
+
+
+ +Microsoft Copilot adoption report +Use cohort and group comparisons to focus change management and learn from power groups. +Up to 6 days +Public docs + +
+
+

Customer asks

+

Show where Copilot habits are forming: active users and percentage, actions per active user, adoption trend by group, app/feature usage, and power/habitual/novice/non-user cohorts.

+
+
+
Use this when
Use cohort and group comparisons to focus change management and learn from power groups.
+
Metrics included
Active users and percentage, actions per active user, adoption trend by group, app/feature usage, power/habitual/novice/non-user cohorts, usage frequency, usage consistency, power-user concentration, internal/external benchmarks
+
Story these metrics tell
Move from 'who used it' to 'where habits are forming.' Use cohort and group comparisons to focus change management and learn from power groups without ranking individuals.
+
Where
Viva Insights › Analysis › Create analysis › Copilot › adoption template (Power BI Desktop).
+
Timing
Copilot metrics through current date minus up to 6 days; collaboration metrics through current date minus up to 2 days; optional auto-refresh runs when Viva Insights updates collaboration data. Up to 13 months of Copilot metric history.
+
Requirements
Insights Analyst; current Power BI Desktop; measured employees need Copilot or Viva Insights licenses; privacy minimum group.
+
Blockers
Cohorts describe groups, not individuals. Benchmarks depend on population size; small groups fall below privacy thresholds.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Copilot headlines report (preview) +Use it as an analyst triage page, then validate any headline with the supporting visuals before acting. +Timing not stated +Preview + +
+
+

Customer asks

+

Scan our organization for the few Copilot adoption or impact movements that deserve attention first: power-user headlines, external benchmarks, impact headlines, and notable group changes over time.

+
+
+
Use this when
Use it as an analyst triage page, then validate any headline with the supporting visuals before acting.
+
Metrics included
Power-user headlines, external benchmarks, impact headlines, recharge-momentum/retention signals, interesting group changes over time, differences from similar employees
+
Story these metrics tell
Scan a large organization for the few adoption or impact movements that deserve attention first. Use it as an analyst triage page, then validate any headline with the supporting visuals before acting.
+
Where
Viva Insights › Analysis › Create analysis › Copilot › headlines template (Power BI Desktop).
+
Timing
Report-page end-to-end latency is not stated; check query completion, data quality, and refresh.
+
Requirements
Insights Analyst; Power BI Desktop November 2024 or later; suitable org attributes; privacy minimum group.
+
Blockers
Preview and no stated latency: headlines are prompts to investigate, not conclusions. Validate before acting.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Microsoft Copilot impact report +Use this to relate Copilot activity to work-pattern change, as relationships, not proof of cause. +Up to 6 days +Public docs + +
+
+

Customer asks

+

Connect Copilot activity to changes in how we work: active users, total Copilot actions, assisted hours/value, actions across meetings, email, Teams chat and documents, and before/after collaboration behavior.

+
+
+
Use this when
Use this to relate Copilot activity to work-pattern change, as relationships, not proof of cause.
+
Metrics included
Active users, total Copilot actions, Copilot assisted hours/value, meetings, email, Teams chat, documents, and Copilot Chat actions, collaboration behavior before/after adoption, Copilot vs non-Copilot comparisons, cohort/group comparisons
+
Story these metrics tell
Connect Copilot activity to changes in work patterns and estimated assisted time. Frame results as relationships, not proof that Copilot alone caused the change.
+
Where
Viva Insights › Analysis › Create analysis › Copilot › impact template (Power BI Desktop).
+
Timing
Copilot metrics through current date minus up to 6 days; collaboration metrics through current date minus up to 2 days; optional auto-refresh runs when Viva Insights updates collaboration data. Up to 13 months of Copilot metric history.
+
Requirements
Insights Analyst licensed with Viva Insights; current Power BI Desktop; measured employees need both Copilot and Viva Insights licenses; privacy minimum group.
+
Blockers
Assisted hours are modeled estimates. Before/after and Copilot-vs-non-Copilot are correlations, not causation.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Copilot business impact report +Use it to form a testable value hypothesis, not a causal claim. +Up to 6 days +Public docs + +
+
+

Customer asks

+

Relate Copilot behavior to outcomes we already measure: upload our business outcome measures and show usage intensity, features used by favorable-outcome groups, and likelihood relationships between usage and outcomes.

+
+
+
Use this when
Use it to form a testable value hypothesis, not a causal claim.
+
Metrics included
Uploaded business outcome measures, Copilot usage intensity, features used by favorable-outcome groups, likelihood relationships between usage behaviors and outcomes, inactive/low-use group opportunity, Copilot assisted hours/value, potential assisted value
+
Story these metrics tell
Connect Copilot behavior to outcomes the customer already measures, such as deal volume or case-resolution time. Use it to form a testable value hypothesis, not a causal claim; other business conditions may explain differences.
+
Where
Viva Insights › Analysis › Create analysis › Copilot › business impact template (Power BI Desktop).
+
Timing
Copilot metrics through current date minus up to 6 days; collaboration metrics through current date minus up to 2 days; optional auto-refresh runs when Viva Insights updates collaboration data. Up to 13 months of Copilot metric history.
+
Requirements
Insights Analyst; current Power BI Desktop; uploaded business outcome data; measured employees with Viva Insights + Copilot licenses; include at least 65 Copilot and 65 non-Copilot users; privacy minimum group.
+
Blockers
Outcome relationships are associations; other business conditions may explain them. Requires clean uploaded outcome measures.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Copilot Studio agents report (mixed availability) +Require at least four weeks of production/default-environment usage before treating results as meaningful. +Timing not stated +Mixed + +
+
+

Customer asks

+

Compare our Copilot Studio agents across the portfolio: total and active agents, sessions, conversational vs autonomous split, satisfaction, resolution rate, abandonment, escalations, and top agents.

+
+
+
Use this when
Require at least four weeks of production/default-environment usage before treating results as meaningful.
+
Metrics included
Total/active agents, total and engaged sessions, conversational vs autonomous split, top agents, satisfaction score, resolution rate, abandonment, escalations, actions/triggers/topics, usage type, maker-led inputs
+
Story these metrics tell
Compare agent adoption and effectiveness across the portfolio and identify candidates to promote, redesign, or retire. Require at least four weeks of production/default-environment usage before treating results as meaningful.
+
Where
Viva Insights › Analysis › Create analysis › Copilot › Copilot Studio agents template (Power BI Desktop).
+
Timing
Report-page end-to-end latency is not stated; check query completion, data quality, and refresh.
+
Requirements
Insights Analyst; Power BI Desktop; tenant has at least 50 Copilot licenses; Copilot Studio license; agent published in Production and default environment with usage; data flow enabled; at least four weeks of usage.
+
Blockers
The business outcome data feature is in public preview. Declarative, Agent Builder, and external non-Studio agents are excluded; less than four weeks of usage cannot run.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Sales agent adoption report +Use group/app comparisons to focus coaching and deployment. +Up to 6 days +Public docs + +
+
+

Customer asks

+

Show where Sales agent use is embedded in seller workflows: active/weekly/monthly users, actions per person, adoption by group and by app, top feature, and actions for customer email, sales meetings, and CRM work.

+
+
+
Use this when
Use group/app comparisons to focus coaching and deployment.
+
Metrics included
Active/weekly/monthly Sales agent users, actions per person per week/month, adoption by group, adoption by app, top feature, actions for customer email, sales meetings, and CRM work, usage trend, month-over-month change
+
Story these metrics tell
Show where Sales agent use is embedded in seller workflows and which sales tasks drive adoption. Use group/app comparisons to focus coaching and deployment.
+
Where
Viva Insights › Analysis › Create analysis › Copilot › Sales agent adoption template (Power BI Desktop).
+
Timing
Copilot metrics through current date minus up to 6 days; collaboration metrics through current date minus up to 2 days; optional auto-refresh runs when Viva Insights updates collaboration data. Up to 13 months of Copilot metric history.
+
Requirements
Insights Analyst; current Power BI Desktop; Copilot for Sales app installed and licensed for measured employees; privacy minimum group.
+
Blockers
Requires connected sales/CRM data. Small seller groups fall below privacy thresholds and won't render.
+
+Official Microsoft Learn source +
+
+
+
+
+
+
+

Copilot Studio and Power Platform2

+

Agent-level effectiveness and tenant consumption for Copilot Studio agents.

+
+
+
+
+ +Copilot Studio Monitor +Use transcript-level evidence and outcomes to decide what to tune on a single agent. +~1 hour +Public docs + +
+
+

Customer asks

+

Diagnose one Copilot Studio agent end to end: daily/monthly active users, sessions, resolution, abandonment, escalation, satisfaction, themes/topics, triggers, action outcomes, and transcript detail.

+
+
+
Use this when
Use transcript-level evidence and outcomes to decide what to tune on a single agent.
+
Metrics included
Daily/monthly active users, sessions/runs, resolution, abandonment, escalation, satisfaction score/comments, themes/topics, triggers, action outcomes, summary insights, transcript/session detail
+
Story these metrics tell
Diagnose one agent's adoption, effectiveness, user friction, and failure modes. Use transcript-level evidence and outcomes to decide what to tune; test-panel activity and unauthenticated-user limitations matter.
+
Where
Copilot Studio › your agent › Analytics / Monitor.
+
Timing
Up to 1 hour after a session ends; analytics up to 360 days; transcript/session detail 28/29 days.
+
Requirements
Agent owner or Analytics Viewer; Bot Transcript Viewer for transcripts; authentication required for active-user metrics.
+
Blockers
Test panel excluded; unauthenticated agents cannot produce active-user metrics; transcript window shorter than aggregate analytics.
+
+Official Microsoft Learn source +
+
+
+
+
+ +Power Platform admin center Copilot Studio consumption analytics +Pair it with Copilot Studio Monitor when the customer needs effectiveness, not just consumption. +Timing not stated +Public docs + +
+
+

Customer asks

+

Manage Copilot Studio consumption across the tenant: message consumption, session count, session duration, capacity usage, and tenant-wide consumption by agent.

+
+
+
Use this when
Pair it with Copilot Studio Monitor when the customer needs effectiveness, not just consumption.
+
Metrics included
Message consumption, session count, session duration, capacity usage, tenant-wide consumption by agent
+
Story these metrics tell
Manage consumption-based capacity across the tenant and spot where message/session volume is driving cost. Pair it with Copilot Studio Monitor when the customer needs effectiveness, not just consumption.
+
Where
Power Platform admin center › Licensing › Copilot Studio › Summary.
+
Timing
Not stated; check the analytics date in the admin center.
+
Requirements
Power Platform Administrator for tenant-wide visibility, or Copilot Studio author for owned agents; consumption-based agents.
+
Blockers
Consumption only, not per-agent effectiveness; use Monitor for effectiveness.
+
+Official Microsoft Learn source +
+
+
+
+
+

Audit logs are diagnostics, not an adoption report: Microsoft Purview audit logging supports compliance and security investigation. Aggregate usage counts assembled from audit data are not guaranteed to match the official usage reports, because the two systems capture different events with different retention and processing. Use audit logs for investigation, not adoption reporting. Purview audit log activities Purview auditing overview

+
+
+
+

FinOps and consumption telemetry

+

Answer three customer questions about Copilot consumption cost: what exists today, where customers hit gaps, and what interim options FastTrack can offer using public, shipped capabilities.

+
+
+
+

Available today Public

+

Five official surfaces already report Copilot credits and usage-based consumption: Microsoft 365 Cost Management, the Viva Insights Consumption Dashboard and its export, Power Platform admin center / Copilot Studio, and Azure Cost Management.

+
+
+

Interim path Public

+

Where a single surface stops short, FastTrack joins the daily export, the Consumption Dashboard, and Azure billing records into per-user, leadership, and chargeback views using only shipped capabilities.

+
+
+
+
+

Available today

+Public source +
+

Five official surfaces already report Copilot usage-based consumption and credits. All facts here come from public Microsoft Learn documentation.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Public reporting and billing surfaces available today.
SurfaceWhat it answersSignals and limitsPublic sources
Microsoft 365 admin center › Copilot › Cost ManagementThe operational and governance plane for supported Microsoft 365 usage-based services. The user view shows credit limit, usage, last activity, and session count; user detail breaks down daily consumption, policies, and services or agents.
  • Group daily usage, assigned spending policy, and monthly limit per user.
  • Agents and services show active users, credits, and sessions, including Cowork and the Work IQ API.
  • Spending policies scope users, groups, or services with monthly and per-user limits, alerts, and hard caps.
Manage Copilot credits
Copilot credits overview
Viva Insights Consumption DashboardLeadership and group reporting at company and group level, with Organization and Job function filters. The Microsoft 365 service currently covered is Cowork and the Work IQ API.
  • Active users, credits, sessions, trends, and service or team breakdowns.
  • Intensity segments and spending-policy proximity.
  • The GitHub preview page is separate; official billing remains in Microsoft 365 admin center and GitHub surfaces.
Consumption Dashboard
Consumption Dashboard export Public previewA daily or weekly zip with PersonServiceCreditsMetrics.csv and PeopleMetaData.csv, joined by PeopleHistoricalId.
  • Metrics: PersonId (hashed unless enabled), ServiceId, ServiceName, SpendingPolicyId, MetricDate, SessionCount, SpendingPolicyLimit, TotalCreditsUsed, UserLimit, and IsCopilotLicensed.
  • Metadata: Organization and optional JobFunction.
  • Daily data is usually about two days behind (timing varies); weekly 2–8 days behind. Only complete periods are exported. GitHub is not included.
Export consumption metrics
Power Platform admin center and Copilot StudioPPAC reports daily consumption by product, environment, and agent, billed versus nonbillable, up to 3 months of detailed daily data or 12 months monthly. Studio Monitor shows billed-credit trends and activity cost distribution with a few hours' lag.
  • Capacity allocation and per-agent limits are available.
  • The MCSMessages, licensing/allocationsV2, and allocationsV2/availability API, version 2024-10-01, manages allocation and tenant-pool enforcement.
  • It is not a detailed consumption-extraction API.
Manage credits and capacity
Consumption analytics
Manage allocations API
Azure Cost ManagementThe billing and reconciliation source for subscription, resource, meter, and invoice, with up to 24 hours' lag. Microsoft 365 Cost Management reports credits, policies, and users; Azure reports billed currency.
  • Cowork, Studio, and Work IQ may appear under the Microsoft Copilot Studio service.
  • Actual versus amortized cost matters for P3 showback and chargeback.
  • Capacity Pack consumption is not visible in Azure Cost Management.
Compare dashboard views
+
+
+

How FastTrack can use these surfaces now

+
    +
  • Use the export for leadership rollups, cost-center joins, recurring spend reviews, and chargeback or showback prototypes.
  • +
  • Use Microsoft 365 Cost Management for operational governance and Azure billing records for financial reconciliation.
  • +
  • Document latency and product boundaries before combining Microsoft 365, GitHub, PPAC, and Azure data.
  • +
+
+
+
+
+

Typical customer gaps and how FastTrack can help now

+Public source +
+

Where today's surfaces stop short, and what a FastTrack resource can recommend in the interim using only shipped capabilities.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
What is available today, where the gap is, and the interim FastTrack guidance for each common consumption ask.
Customer askAvailable todayGapInterim FastTrack guidance
Credit usage by userCost Management, the Credits report, and the Consumption export all show per-user credits.No single reconciled per-user view across every surface.Start in Cost Management or the Consumption export; treat it as the per-user baseline.
Model usage by userSession and credit totals per user and service.The Microsoft 365 export has no per-model breakdown; the GitHub dashboard's model breakdown is only for GitHub Copilot.Set expectations that per-model attribution is not in the M365 export today; scope model questions to the GitHub surface where they apply.
Leadership and org aggregationConsumption Dashboard with Organization and JobFunction joins.Depends on org data quality and privacy minimum-group thresholds.Validate the org attributes and thresholds first, then use the dashboard for leadership rollups.
Cross-tool comparisonSeparate M365, GitHub, PPAC, and Azure surfaces.No unified join; GitHub is excluded from the M365 export.Join the surfaces manually on user and service; document that GitHub is a separate feed.
Automated exportDaily or weekly export, or a Viva custom consumption query into Fabric or a data lake.Not real-time; trails by up to a few days.Schedule the export or custom query into the customer's lake; plan for the latency window.
Chargeback and showbackUser and service credits joinable to org and cost center.Credits are not a universal dollar amount, so totals can differ from invoices.Join credits to cost center, aggregate, then reconcile to valid Azure records and rates before publishing figures.
Billing source of truthMicrosoft 365 Cost Management for operations; Azure for the invoice.Two sources answer two questions.Use Cost Management operationally and Azure for financial reconciliation; never mix the two as one number.
+
+
+
+ +Consumption reporting workflow +A left-to-right workflow: telemetry sources feed a user and service daily export, which is joined with organization metadata, rolled up to leadership and cost center, reconciled against Azure, and finally used for chargeback or showback. + + + + + + + +Telemetry sources +M365, PPAC, Azure + +User / service +daily export + +Org metadata +join + +Leadership / +cost-center rollup + +Azure +reconciliation + +Chargeback / +showback + + + + + + + +
+
Public reference flow: telemetry sources → user/service daily export → org metadata join → leadership / cost-center rollup → Azure reconciliation → chargeback / showback.
+
+
+
+
+
+

Last resort: custom Analytics Hub reports

+

Open this only after the in-product reports above cannot answer the customer's need. These are community, GitHub-only, experimental projects from the public Analytics Hub catalog. There is no shared data-availability time and no Microsoft support path.

+
+
+Show 22 custom projectsexperimental · GitHub-only +
+

Review each project's README, permissions, data handling, and maintenance state before use. Support is through GitHub only.

+ +

Showing 22 of 22 custom projects

+ +
+
+
+ +Super Usage Adoption +Use when you still need a person-level habit profile of your power users on top of the official adoption reports. +Public project +GitHub-only + +
+
+

Customer asks

+

Who are our Copilot super users, and how did they get there?

+
+
+
Metric types and description
Adoption, Productivity. Power BI template on Viva Insights person-query data. Profiles your super users, what they use, how habits form, where they cluster, so you can replicate the pattern.
+
Story this custom view tells
Profiles your super users so you can see the pattern behind them and replicate it across the org.
+
Use when you still need
Use when you still need a person-level habit profile of your power users on top of the official adoption reports.
+ + + + + +
Source data
Viva Insights
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Super User Impact +Use when you still need a peer-matched impact comparison for your power-user cohort. +Public project +GitHub-only + +
+
+

Customer asks

+

What's the measurable impact of super users on work patterns?

+
+
+
Metric types and description
Impact, Productivity. Companion to Super Usage Adoption. Quantifies the work-pattern delta super users produce, collaboration, focus time, meeting load, vs comparable peers. Same Viva query feeds both.
+
Story this custom view tells
Quantifies the measurable work-pattern change super users produce next to similar peers.
+
Use when you still need
Use when you still need a peer-matched impact comparison for your power-user cohort.
+ + + + + +
Source data
Viva Insights
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +AI-in-One Dashboard +Use when you still need one combined dashboard spanning Copilot, Chat, Agents, and third-party AI in a single file. +Public project +GitHub-only + +
+
+

Customer asks

+

I want a single dashboard showing all Copilot and Agent activity.

+
+
+
Metric types and description
Adoption, Chat usage, Agents, License readiness. One unified Power BI report covering Microsoft 365 Copilot, Copilot Chat (licensed + unlicensed), Agents, and third-party AI signals. The flagship if you only deploy one template.
+
Story this custom view tells
Puts every Copilot and agent signal on one page for a single cross-surface view.
+
Use when you still need
Use when you still need one combined dashboard spanning Copilot, Chat, Agents, and third-party AI in a single file.
+ + + + + +
Source data
Purview + Entra
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Copilot Chat & Agent Intelligence +Use when you still need department-level Chat and Agent breakdowns kept entirely inside the tenant. +Public project +GitHub-only + +
+
+

Customer asks

+

How are people using Copilot Chat and Agents across our org?

+
+
+
Metric types and description
Chat usage, Agents. Two Power BI templates on Purview audit logs + Entra: one for Copilot Chat (licensed + unlicensed), one for Agents. By user, app, department, no third-party analytics, no data leaves the tenant.
+
Story this custom view tells
Two focused templates that break Chat and Agent behavior down by user, app, and department without data leaving the tenant.
+
Use when you still need
Use when you still need department-level Chat and Agent breakdowns kept entirely inside the tenant.
+ + + + + +
Source data
Purview + Entra
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +GitHub Copilot Impact +Use when you still need developer-side GitHub Copilot metrics alongside the Microsoft 365 reports. +Public project +GitHub-only + +
+
+

Customer asks

+

How are developers adopting GitHub Copilot?

+
+
+
Metric types and description
Developer productivity, Adoption. Per-team and per-user GitHub Copilot usage, chat vs agent, language, model, acceptance rates, pulled straight from the GitHub Enterprise REST API.
+
Story this custom view tells
Shows developer adoption of GitHub Copilot straight from the Enterprise metrics API.
+
Use when you still need
Use when you still need developer-side GitHub Copilot metrics alongside the Microsoft 365 reports.
+ + + + + +
Source data
GitHub Enterprise
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +What I Did: Copilot Impact Report +Use when you still need an individual, demo-ready story of your own Copilot-assisted work. +Public project +GitHub-only + +
+
+

Customer asks

+

What did I personally build with GitHub Copilot this week, and what's the leverage?

+
+
+
Metric types and description
Developer productivity, Productivity. Personal-leverage report. Points a script at your local VS Code / Copilot session logs and summarizes what shipped, where Copilot helped, and the multiplier on your week.
+
Story this custom view tells
Turns your local Copilot session logs into a personal leverage narrative.
+
Use when you still need
Use when you still need an individual, demo-ready story of your own Copilot-assisted work.
+ + + + + +
Source data
Local Copilot sessions
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +What Cowork Did For Me +Use when you still need a personal, category-level Cowork ROI view beyond the aggregate Cowork usage report. +Public project +GitHub-only + +
+
+

Customer asks

+

I want to see business processes that Cowork helped me with and its impact.

+
+
+
Metric types and description
ROI, Productivity, Impact. Personal ROI report for Microsoft Copilot Cowork. Harvests your OneDrive Cowork session history, classifies each task into research-anchored categories, and renders a single-file HTML report with Time Saved, professional-services-equivalent value, and a mapping to the four Value Pillars.
+
Story this custom view tells
Harvests your OneDrive Cowork history into a single-file ROI report mapped to Value Pillars.
+
Use when you still need
Use when you still need a personal, category-level Cowork ROI view beyond the aggregate Cowork usage report.
+ + + + + +
Source data
Local Cowork sessions (OneDrive)
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +M365 Copilot Readiness Report +Use when you still need a rank-ordered readiness and champion-candidate list per org. +Public project +GitHub-only + +
+
+

Customer asks

+

Who's ready to be enabled on Copilot, and who should I groom as a champion?

+
+
+
Metric types and description
Adoption, License readiness, Customization. Ranks every user by Microsoft 365 fluency (Outlook, Word, Excel, PowerPoint, Teams) so you can stage enablement waves and surface the natural champion candidates in each org, defended with audit data, not gut feel.
+
Story this custom view tells
Ranks users by app fluency so you can stage enablement waves and spot champion candidates with audit data.
+
Use when you still need
Use when you still need a rank-ordered readiness and champion-candidate list per org.
+ + + + + +
Source data
Purview + Entra
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Adoption & Sentiment Report +Use when you still need sentiment joined to usage tiers from your own survey. +Public project +GitHub-only + +
+
+

Customer asks

+

How do employees feel about Copilot, and does that match actual usage?

+
+
+
Metric types and description
Sentiment, Adoption. Four-page Power BI template by olivierpecheux/Microsoft: Adoption Overview, Sentiment Analysis, Comments Analysis, and Saved Time Analysis. Ships with a 12-question recommended Copilot survey, drop into Microsoft Forms, match the UPN column to the Copilot Activity export, and the report stitches sentiment to actual usage by tier (Bottom 25% → Top 10%).
+
Story this custom view tells
Joins survey sentiment to actual usage tiers so you can see whether feeling matches behavior.
+
Use when you still need
Use when you still need sentiment joined to usage tiers from your own survey.
+ + + + + +
Source data
M365 Admin + Survey
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +PAX: Portable Audit eXporter +Use when you still need an automated, large-scale audit and directory export pipeline behind the templates. +Public project +GitHub-only + +
+
+

Customer asks

+

How do I automate pulling audit logs without manual exports?

+
+
+
Metric types and description
Data export. Enterprise-grade PowerShell exporter for Microsoft 365 audit logs and Entra directory data. Pulls from Purview, Entra, or both, supports Entra-only mode with no Purview dependency. Handles billions of events, no row limits, lands data wherever you need it, lake, warehouse, BI. The automation layer behind the Purview + Entra templates.
+
Story this custom view tells
The automation layer that lands Purview and Entra data wherever your BI needs it, with no row limits.
+
Use when you still need
Use when you still need an automated, large-scale audit and directory export pipeline behind the templates.
+ + + + + +
Source data
Purview + Entra (Microsoft Graph)
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +M365 Copilot Productivity ROI Calculator +Use when you still need to model ROI assumptions on top of the Super Usage data. +Public project +GitHub-only + +
+
+

Customer asks

+

I want to tell an ROI story from the Superuser report.

+
+
+
Metric types and description
ROI, Impact. Browser-only ROI modeler that pairs with the Super Usage Adoption Power BI report. Export the heatmap visual from Power BI as a CSV, drop it into the calculator, sweep assumptions, and generate a defensible value story. The Power BI report does the data work; the calculator does the modeling. No install required for the calc itself.
+
Story this custom view tells
Pairs with the Super Usage report to turn exported heatmap data into a modeled ROI narrative in the browser.
+
Use when you still need
Use when you still need to model ROI assumptions on top of the Super Usage data.
+ + + + + +
Source data
Power BI export (Super Usage Heatmap CSV)
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Copilot Cowork Billing Report +Use when you still need RLS-scoped department chargeback for Cowork credits. +Public project +GitHub-only + +
+
+

Customer asks

+

I want to determine the chargeback and department-level cost allocation.

+
+
+
Metric types and description
Impact, ROI. RLS-ready Power BI report for Cowork credit consumption, chargeback modeling, optimization, and billing analysis.
+
Story this custom view tells
Models Cowork credit chargeback and department-level cost allocation.
+
Use when you still need
Use when you still need RLS-scoped department chargeback for Cowork credits.
+ + + + + +
Source data
Copilot credit consumption + Entra export
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Cowork Chargeback (Web App) +Use when you still need quick, client-side Cowork chargeback scenario modeling. +Public project +GitHub-only + +
+
+

Customer asks

+

I want a lightweight web app that lets me do scenario modeling for Cowork credits.

+
+
+
Metric types and description
Impact, ROI. Client-side chargeback app that allocates Cowork credits to departments and users with export-ready outputs.
+
Story this custom view tells
A lightweight app for scenario-modeling Cowork credit chargeback in the browser.
+
Use when you still need
Use when you still need quick, client-side Cowork chargeback scenario modeling.
+ + + + + +
Source data
Copilot credit consumption + Entra export
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Cowork Policy Helper (Web App) +Use when you still need to assign and track Cowork spend policies and exceptions. +Public project +GitHub-only + +
+
+

Customer asks

+

I need to assign Cowork spend policies and track exceptions.

+
+
+
Metric types and description
License readiness, Impact. Policy assignment and exception management app for governing Cowork spend tiers.
+
Story this custom view tells
Assigns Cowork spend policies and manages the exceptions to them.
+
Use when you still need
Use when you still need to assign and track Cowork spend policies and exceptions.
+ + + + + +
Source data
Copilot consumption + Entra user attributes
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +FinOps & FOCUS Cost Report (Web App) +Use when you still need Cowork cost views aligned to FinOps FOCUS definitions. +Public project +GitHub-only + +
+
+

Customer asks

+

I need Cowork cost views aligned to FinOps FOCUS definitions.

+
+
+
Metric types and description
Impact, ROI. Browser app presenting Cowork costs with FinOps Framework and FOCUS-aligned cost lenses.
+
Story this custom view tells
Reframes Cowork spend in FinOps FOCUS terms finance teams recognize.
+
Use when you still need
Use when you still need Cowork cost views aligned to FinOps FOCUS definitions.
+ + + + + +
Source data
Cowork consumption + billing context
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Cowork ROI Model (Web App) +Use when you still need to model Cowork ROI scenarios from assumptions alone. +Public project +GitHub-only + +
+
+

Customer asks

+

I want to model Cowork ROI scenarios.

+
+
+
Metric types and description
Impact, ROI, Productivity. Interactive ROI model with research-based category defaults and user-entered assumptions (no tenant payload required).
+
Story this custom view tells
Models Cowork ROI scenarios with no tenant payload required.
+
Use when you still need
Use when you still need to model Cowork ROI scenarios from assumptions alone.
+ + + + + +
Source data
User-entered assumptions + research defaults
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +CustomizeCopilot Add-on Library +Use when you still need custom pages layered onto an existing Viva Insights template. +Public project +GitHub-only + +
+
+

Customer asks

+

I want to add custom pages or extend my Viva Insights reports.

+
+
+
Metric types and description
Customization. Drop-in Power BI add-on pages and visualizations that extend the Viva Insights-based templates with custom views, Champion ID, segment overlays, more.
+
Story this custom view tells
Extends the Viva Insights templates with custom views without rebuilding them.
+
Use when you still need
Use when you still need custom pages layered onto an existing Viva Insights template.
+ + + + + +
Source data
Viva Insights
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Personal Copilot Dashboard +Use when you still need an individual, benchmarked view of your own Copilot, agent, and Cowork usage. +Public project +GitHub-only + +
+
+

Customer asks

+

I want a personal dashboard of my own Copilot, agent, and Cowork usage vs my org.

+
+
+
Metric types and description
Adoption, Productivity, Agents. Self-service Power BI template that turns your own Copilot Dashboard export into a personal view of adoption, hours saved, feature-level leverage, agent usage, and Cowork credits, with org benchmarks, a personalized user-category, and next-step learning. Loads Copilot, Agent, and Cowork exports in any combination.
+
Story this custom view tells
Turns your own Copilot Dashboard export into a personalized adoption-and-value view with next steps.
+
Use when you still need
Use when you still need an individual, benchmarked view of your own Copilot, agent, and Cowork usage.
+ + + + + +
Source data
Copilot Dashboard export (Viva Insights)
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +ESS Insights, Employee Self-Serve Business Value +Use when you still need a transcript-based value dashboard for an Employee Self-Service agent. +Public project +GitHub-only + +
+
+

Customer asks

+

How is my Employee Self-Service (ESS) Copilot Studio agent performing, adoption, deflection, and value?

+
+
+
Metric types and description
Agents, Impact, ROI. Drop-in Power BI template for the Microsoft ESS Copilot Studio agent (works for any agent). A nine-page executive dashboard built from the ConversationTranscript Dataverse table, adoption, resolution vs escalation, time-to-knowledge, tickets deflected, hours saved and dollar value, plus in-conversation feedback. No custom logging or extra pipelines.
+
Story this custom view tells
Builds an executive ESS-agent dashboard from Dataverse transcripts with no extra logging.
+
Use when you still need
Use when you still need a transcript-based value dashboard for an Employee Self-Service agent.
+ + + + + +
Source data
Copilot Studio transcripts (Dataverse)
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +ValueLens for Microsoft Copilot +Use when you still need a Business-Value-Advisory ROI narrative across every Copilot signal. +Public project +GitHub-only + +
+
+

Customer asks

+

I need a defensible ROI narrative for Microsoft Copilot & agent adoption.

+
+
+
Metric types and description
Impact, ROI, Adoption, License readiness, Agents. Business Value Advisory Power BI template that unifies every Copilot & agent adoption signal into hours saved, assisted value, and adoption/readiness, a defensible ROI story aligned to Microsoft's Frontier Firm framework. Ships with SharePoint, Fabric, and Dataverse deployment paths.
+
Story this custom view tells
Assembles a defensible ROI story aligned to Microsoft's Frontier Firm framework.
+
Use when you still need
Use when you still need a Business-Value-Advisory ROI narrative across every Copilot signal.
+ + + + + +
Source data
Purview audit logs
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Consumption Central for Microsoft Copilot +Use when you still need a single cross-product Copilot spend and forecast view. +Public project +GitHub-only + +
+
+

Customer asks

+

What are we spending on Copilot credits across every product, and where is it going?

+
+
+
Metric types and description
ROI, Impact. One Power BI template for Copilot credit consumption and cost across four products, Cowork/Work IQ, Copilot Studio, GitHub Copilot, and Azure AI Foundry. Group spend by your own org attributes, forecast to the end of the billing period, and see overage against prepaid packs. Local CSV, Fabric, and Viva Direct deployment paths, each with a synthetic sample dataset. Reports spend; it does not enforce limits.
+
Story this custom view tells
Puts four products' Copilot spend on one page and forecasts against prepaid packs.
+
Use when you still need
Use when you still need a single cross-product Copilot spend and forecast view.
+ + + + + +
Source data
Viva Insights consumption + PPAC + GitHub Copilot + Azure Cost Management
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+ +Agent Evaluator for Copilot Studio +Use when you still need transcript-level agent evaluation with credit consumption in one template. +Public project +GitHub-only + +
+
+

Customer asks

+

How well are my Copilot Studio agents performing, what do they resolve, what do people ask for, and what does it cost?

+
+
+
Metric types and description
Agents, Impact. One Power BI template for deep Copilot Studio agent evaluation, sessions, turns, errors, sub-agent calls, quality & performance, topics, knowledge grounding, CSAT and message-credit consumption. Reads the conversation transcripts themselves, so every number has a real conversation behind it. Local CSV, Dataverse and Fabric paths, chosen by one parameter; sample data included.
+
Story this custom view tells
Reads the conversation transcripts themselves, so every number has a real conversation behind it.
+
Use when you still need
Use when you still need transcript-level agent evaluation with credit consumption in one template.
+ + + + + +
Source data
Copilot Studio transcripts (Dataverse) + Power Platform admin center
+
+

No shared data-availability time. Review the README, permissions, data handling, and maintenance state, and get support through GitHub only.

+Source and project +
+
+
+
+
+
+
+
+
+

Sources

+

Public Microsoft Learn pages behind the 21 in-product reports and the FinOps surfaces, plus the public Analytics Hub catalog. Each community card also links directly to its public project page.

+
+

Public sources

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Public source pages for each report, the FinOps surfaces, and the Analytics Hub catalog
1Microsoft Copilot readiness reporthttps://learn.microsoft.com/microsoft-365/admin/activity-reports/microsoft-365-copilot-readiness?view=o365-worldwide
2Microsoft Copilot usage reporthttps://learn.microsoft.com/microsoft-365/admin/activity-reports/microsoft-365-copilot-usage?view=o365-worldwide
3Microsoft Copilot Chat usage reporthttps://learn.microsoft.com/microsoft-365/admin/activity-reports/microsoft-copilot-usage?view=o365-worldwide
4Microsoft Copilot Agents usage report (preview)https://learn.microsoft.com/microsoft-365/admin/activity-reports/microsoft-365-copilot-agents-new?view=o365-worldwide
5Microsoft 365 Copilot Connectors usage report (preview)https://learn.microsoft.com/microsoft-365/admin/activity-reports/microsoft-365-copilot-connectors-usage?view=o365-worldwide
6Microsoft Copilot Search usage report (preview)https://learn.microsoft.com/microsoft-365/admin/activity-reports/microsoft-365-copilot-search-usage?view=o365-worldwide
7Cowork usage reporthttps://learn.microsoft.com/microsoft-365/admin/activity-reports/cowork-usage-report?view=o365-worldwide
8Microsoft Copilot Credits report (status unclear)https://learn.microsoft.com/microsoft-365/admin/activity-reports/microsoft-365-copilot-credits?view=o365-worldwide
9AI adoption category in Adoption Scorehttps://learn.microsoft.com/microsoft-365/admin/adoption/ai-adoption-score
10Microsoft Copilot Dashboardhttps://learn.microsoft.com/viva/insights/org-team-insights/copilot-dashboard
11Agent Dashboard (preview)https://learn.microsoft.com/viva/insights/org-team-insights/agent-dashboard
12Consumption Dashboard (mixed availability)https://learn.microsoft.com/viva/insights/org-team-insights/ai-cost-dashboard
13Ready-to-use Copilot Analytics reportshttps://learn.microsoft.com/viva/insights/org-team-insights/copilot-analytics-reports
14Microsoft Copilot adoption reporthttps://learn.microsoft.com/viva/insights/advanced/analyst/templates/microsoft-365-copilot-adoption
15Copilot headlines report (preview)https://learn.microsoft.com/viva/insights/advanced/analyst/templates/copilot-headlines
16Microsoft Copilot impact reporthttps://learn.microsoft.com/viva/insights/advanced/analyst/templates/microsoft-365-copilot-impact
17Copilot business impact reporthttps://learn.microsoft.com/viva/insights/advanced/analyst/templates/copilot-business-impact
18Copilot Studio agents reporthttps://learn.microsoft.com/viva/insights/advanced/analyst/templates/copilot-studio-agents
19Sales agent adoption reporthttps://learn.microsoft.com/viva/insights/advanced/analyst/templates/copilot-for-sales-adoption
20Copilot Studio Monitorhttps://learn.microsoft.com/microsoft-copilot-studio/analytics-overview
21Power Platform admin center Copilot Studio consumption analyticshttps://learn.microsoft.com/microsoft-365/copilot/microsoft-365-copilot-reports-for-admins#power-platform-reports-and-copilot-studio-analytics
22Microsoft Analytics Hub cataloghttps://github.com/microsoft/Analytics-Hub
23Manage Copilot credits (Cost Management)https://learn.microsoft.com/microsoft-365/copilot/usage-based-billing-manage-copilot-credits
24Copilot credits overviewhttps://learn.microsoft.com/microsoft-365/copilot/usage-based-billing-overview-copilot-credits
25Export consumption metricshttps://learn.microsoft.com/viva/insights/org-team-insights/export-ai-cost-metrics
26Manage Copilot Studio credits and capacityhttps://learn.microsoft.com/power-platform/admin/manage-copilot-studio-copilot-credits-capacity
27Copilot Studio consumption analyticshttps://learn.microsoft.com/microsoft-copilot-studio/analytics-consumption
28Manage Copilot credit allocations (API)https://learn.microsoft.com/power-platform/admin/programmability-tutorial-manage-copilot-credit-allocations
29Compare dashboard views (Microsoft 365 vs Azure)https://learn.microsoft.com/microsoft-365/copilot/usage-based-billing-compare-dashboard-views
+
+

Source scope: public Microsoft Learn documentation and anonymously accessible public project pages. Date reviewed: 2026-09-11. Community projects are provided as-is by their named public repository owners; review each project's documentation, permissions, data handling, license, and maintenance state before use.

+
+
+ + + Back to top + + + diff --git a/copilot-analytics-samples/copilot-analytics-reports-navigator/preview.webp b/copilot-analytics-samples/copilot-analytics-reports-navigator/preview.webp new file mode 100644 index 0000000000000000000000000000000000000000..d4231655bd3d24528ad835400ee4010477b79cfe GIT binary patch literal 120786 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 Date: Fri, 11 Sep 2026 22:46:13 -0500 Subject: [PATCH 2/2] feat: cross-list interactive guides in planning Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/CATALOG-METADATA.md | 12 +- index.html | 27 +++- tools/catalog-build/package.json | 3 +- .../catalog-build/test-category-filtering.js | 130 ++++++++++++++++++ 4 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 tools/catalog-build/test-category-filtering.js diff --git a/docs/CATALOG-METADATA.md b/docs/CATALOG-METADATA.md index 059ecdf5..8491a322 100644 --- a/docs/CATALOG-METADATA.md +++ b/docs/CATALOG-METADATA.md @@ -64,12 +64,22 @@ prerequisites: | --- | --- | --- | | `tags` | string list | Lowercase discovery terms. Prefer a few specific tags over many broad ones. | | `format` | enum | One of `ps1`, `bundle`, `declarative`, `interactive`, `pptx`, `pbix`, or `md`. This replaces the former `artifact` label. | -| `interactiveKind` | enum | Only for `format: interactive`. Set `guide` for a walkthrough or implementation/decision guide, or `tool` for a calculator or utility. Defaults to `tool`, which the catalog labels "Interactive tool"; `guide` is labeled "Interactive guide". | +| `interactiveKind` | enum | Only for `format: interactive`. Set `guide` for a walkthrough or implementation/decision guide, or `tool` for a calculator or utility. Defaults to `tool`, which the catalog labels "Interactive tool"; `guide` is labeled "Interactive guide". A `guide` is also cross-listed under **Guides & planning** (see below), while a `tool` is not. | | `preview` | string | Optional relative path (inside the resource folder) to a screenshot the catalog detail page renders above the description, for example `preview.webp`. Use an optimized local image (WebP or PNG). No URLs, absolute paths, `..`, or backslashes. Omit it for resources without a screenshot. | | `featured` | boolean | Use sparingly for resources selected for catalog promotion. Default is `false`. | | `status` | enum | `active`, `preview`, or `archived`. Default is `active`. | | `url` | HTTPS URL | Optional GitHub or destination URL. When omitted, the generator derives a GitHub URL from the resource path. | +## Guides & planning cross-listing + +The catalog site keeps every resource's `type` exactly as authored, but the root catalog's **Guides & planning** selection is a virtual, cross-topic collection. It lists every `strategy` resource **plus** any interactive guide (`format: interactive` with `interactiveKind: guide`) regardless of that resource's own `type`. + +- An interactive guide keeps its own category too. An `analytics` interactive guide appears under both **Analytics** (by its `type`) and **Guides & planning** (as a guide). +- Interactive tools and calculators (`format: interactive` without `interactiveKind: guide`) are **not** cross-listed; they stay only under their own `type`. +- Cross-listing is display-only. It never changes `type`, badges, tags, folders, URLs, the **All** listing, related-resource suggestions, or `catalog.json`. The **Guides & planning** count reflects this same cross-listed set, and each resource still renders as a single card with no duplicates. + +Set `interactiveKind: guide` (rather than the default `tool`) when you want a walkthrough or implementation/decision guide to be discoverable under **Guides & planning** in addition to its own category. This is purely a browsing convenience in the site; the metadata schema and generated catalog are unchanged. + ## Detail-page content These fields answer what the resource is, why someone should consider it, and how to use it. diff --git a/index.html b/index.html index ffd44c0c..6c56ba1c 100644 --- a/index.html +++ b/index.html @@ -1696,6 +1696,23 @@

Related resources

return t && t.colorVar ? `var(${t.colorVar}-bg)` : 'var(--surface-hover)'; }; + // --- CATEGORY MEMBERSHIP --- + // Single source of truth for "does this resource belong to the selected + // category?" Interactive guides (format: interactive + interactiveKind: guide) + // are virtually cross-listed under "Guides & planning" (the strategy category) + // in addition to their own type, so an Analytics guide appears in both Analytics + // and Guides & planning. This never mutates r.type: badges, metadata, folders, + // URLs, the All listing, related resources, and counts all reflect the original + // type. See docs/CATALOG-METADATA.md ("Guides & planning cross-listing"). + /* @category-predicate:start */ + const isInteractiveGuide = (r) => r.format === 'interactive' && r.interactiveKind === 'guide'; + const matchesCategory = (r, typeId) => { + if (typeId === 'all') return true; + if (typeId === 'strategy') return r.type === 'strategy' || isInteractiveGuide(r); + return r.type === typeId; + }; + /* @category-predicate:end */ + const formatArtifact = (artifact, resource) => { if (artifact === 'interactive') { return resource && resource.interactiveKind === 'guide' ? 'Interactive guide' : 'Interactive tool'; @@ -1922,8 +1939,8 @@

Related resources

r.name.toLowerCase().includes(q) || r.description.toLowerCase().includes(q) || r.tags.some(t => t.toLowerCase().includes(q)); - // Type Match - const matchType = state.type === 'all' || r.type === state.type; + // Type Match (interactive guides also surface under Guides & planning) + const matchType = matchesCategory(r, state.type); // Tag Match const matchTag = state.tag === 'all' || r.tags.includes(state.tag); @@ -2036,7 +2053,7 @@

Related resources

if (t.id === 'script') { countDisplay = "12"; } else if (!t.soon) { - countDisplay = RESOURCES.filter(r => r.type === t.id).length; + countDisplay = RESOURCES.filter(r => matchesCategory(r, t.id)).length; } const btn = document.createElement('button'); @@ -2083,7 +2100,7 @@

Related resources

} else if (t.soon) { countDisplay = 0; } else { - countDisplay = RESOURCES.filter(r => r.type === t.id).length; + countDisplay = RESOURCES.filter(r => matchesCategory(r, t.id)).length; } const btn = document.createElement('button'); @@ -2131,7 +2148,7 @@

Related resources

const q = tempState.q.toLowerCase(); const baseResources = RESOURCES.filter(r => { const matchQ = !q || r.name.toLowerCase().includes(q) || r.description.toLowerCase().includes(q) || r.tags.some(t => t.toLowerCase().includes(q)); - const matchType = tempState.type === 'all' || r.type === tempState.type; + const matchType = matchesCategory(r, tempState.type); return matchQ && matchType; }); diff --git a/tools/catalog-build/package.json b/tools/catalog-build/package.json index 816c68a4..d12df40f 100644 --- a/tools/catalog-build/package.json +++ b/tools/catalog-build/package.json @@ -5,8 +5,9 @@ "type": "module", "scripts": { "build": "node index.js", - "check": "node index.js --check && node test-traffic-workflow.js", + "check": "node index.js --check && node test-traffic-workflow.js && node test-category-filtering.js", "check:traffic-workflow": "node test-traffic-workflow.js", + "check:category-filtering": "node test-category-filtering.js", "build:stats": "node build-stats.js", "check:stats": "node build-stats.js --check", "create:vote-discussions": "node create-vote-discussions.js" diff --git a/tools/catalog-build/test-category-filtering.js b/tools/catalog-build/test-category-filtering.js new file mode 100644 index 00000000..ef873a4d --- /dev/null +++ b/tools/catalog-build/test-category-filtering.js @@ -0,0 +1,130 @@ +import { readFileSync } from 'node:fs'; +import { dirname, join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +// Validates the root catalog's "Guides & planning" cross-listing behavior. +// Interactive guides (format: interactive + interactiveKind: guide) must surface +// under Guides & planning (the strategy category) in addition to their own type, +// without ever mutating r.type, duplicating cards, or broadening other categories. + +const toolDirectory = dirname(fileURLToPath(import.meta.url)); +const indexPath = join(toolDirectory, '..', '..', 'index.html'); +const indexSource = readFileSync(indexPath, 'utf8'); + +function assert(condition, message) { + if (!condition) throw new Error(message); +} + +// --- Extract the real predicate shipped in index.html (single source of truth) --- +const predicateMatch = indexSource.match( + /\/\* @category-predicate:start \*\/([\s\S]*?)\/\* @category-predicate:end \*\// +); +assert(predicateMatch, 'Could not locate the @category-predicate block in index.html.'); +const predicateSource = predicateMatch[1]; + +const factory = new Function(`${predicateSource}; return { matchesCategory, isInteractiveGuide };`); +const { matchesCategory, isInteractiveGuide } = factory(); + +// --- Wiring assertions: every matcher/count path must use the central helper --- +assert( + (indexSource.match(/const matchesCategory =/g) || []).length === 1, + 'matchesCategory must be defined exactly once (one central reusable predicate).' +); +assert( + indexSource.includes('const matchType = matchesCategory(r, state.type);'), + 'Main filtering (getFilteredResources) must use matchesCategory.' +); +assert( + indexSource.includes('const matchType = matchesCategory(r, tempState.type);'), + 'Temp-state tag/search facet filtering must use matchesCategory.' +); +assert( + (indexSource.match(/RESOURCES\.filter\(r => matchesCategory\(r, t\.id\)\)\.length/g) || []).length === 2, + 'Category tile counts and pill counts must both use matchesCategory.' +); +assert( + indexSource.includes('RESOURCES.filter(r => r.type === resource.type'), + 'Related resources must keep original-type (r.type) semantics, not the cross-listing.' +); +assert( + !indexSource.includes('r.type === state.type') && !indexSource.includes('r.type === tempState.type'), + 'No filtering path may keep the old direct r.type === state.type comparison.' +); + +// --- Representative dataset covering every required scenario --- +const dataset = [ + { slug: 'strategy-md', type: 'strategy', format: 'md' }, + { slug: 'strategy-guide', type: 'strategy', format: 'interactive', interactiveKind: 'guide' }, + { slug: 'strategy-tool', type: 'strategy', format: 'interactive' }, + { slug: 'analytics-report', type: 'analytics', format: 'pbix' }, + { slug: 'analytics-guide', type: 'analytics', format: 'interactive', interactiveKind: 'guide' }, + { slug: 'analytics-tool', type: 'analytics', format: 'interactive' }, + { slug: 'prompt-interactive-nokind', type: 'prompt', format: 'interactive' }, + { slug: 'agent-bundle', type: 'agent', format: 'bundle' }, + { slug: 'script-ps1', type: 'script', format: 'ps1' } +]; +const bySlug = Object.fromEntries(dataset.map(r => [r.slug, r])); + +// Mirror of getFilteredResources() so scenarios exercise the same predicate wiring. +const selectSlugs = (typeId, q = '', tag = 'all') => { + const query = q.toLowerCase(); + return dataset + .filter(r => { + const matchQ = !query || r.slug.toLowerCase().includes(query); + const matchTag = tag === 'all'; + return matchQ && matchesCategory(r, typeId) && matchTag; + }) + .map(r => r.slug); +}; + +// 1. Strategy markdown retained (still in strategy, still not another type). +assert(matchesCategory(bySlug['strategy-md'], 'strategy'), 'Strategy markdown must remain under Guides & planning.'); +assert(matchesCategory(bySlug['strategy-md'], 'all'), 'Strategy markdown must remain in the All listing.'); +assert(!matchesCategory(bySlug['strategy-md'], 'analytics'), 'Strategy markdown must not leak into Analytics.'); + +// 2. Analytics interactive guide appears in BOTH Analytics and Guides & planning. +assert(matchesCategory(bySlug['analytics-guide'], 'analytics'), 'Analytics guide must appear under Analytics (original type).'); +assert(matchesCategory(bySlug['analytics-guide'], 'strategy'), 'Analytics guide must be cross-listed under Guides & planning.'); +assert(isInteractiveGuide(bySlug['analytics-guide']), 'Analytics guide must satisfy the interactive-guide predicate.'); + +// 3. Unrelated interactive tool excluded from Guides & planning (stays in its own type). +assert(!matchesCategory(bySlug['analytics-tool'], 'strategy'), 'Interactive tool must not be cross-listed under Guides & planning.'); +assert(matchesCategory(bySlug['analytics-tool'], 'analytics'), 'Interactive tool must remain under its own type.'); + +// 4. Missing interactiveKind excluded from Guides & planning. +assert(!isInteractiveGuide(bySlug['prompt-interactive-nokind']), 'Interactive resource without a kind is not a guide.'); +assert(!matchesCategory(bySlug['prompt-interactive-nokind'], 'strategy'), 'Missing-kind interactive must not be cross-listed.'); + +// 5. No duplicate cards in any selection, including All. +for (const typeId of ['all', 'strategy', 'analytics', 'prompt', 'agent', 'script']) { + const slugs = selectSlugs(typeId); + assert(new Set(slugs).size === slugs.length, `Duplicate cards detected under "${typeId}".`); +} +assert(selectSlugs('all').length === dataset.length, 'All listing must include every resource exactly once.'); + +// 6. Counts, search, and temp-state filtering stay consistent with the cross-listed set. +const strategyCount = dataset.filter(r => matchesCategory(r, 'strategy')).length; +const expectedStrategy = ['strategy-md', 'strategy-guide', 'strategy-tool', 'analytics-guide']; +assert(strategyCount === expectedStrategy.length, `Guides & planning count must equal the cross-listed set (${expectedStrategy.length}).`); +assert( + JSON.stringify(selectSlugs('strategy')) === JSON.stringify(expectedStrategy), + 'Guides & planning selection must equal the cross-listed set.' +); +// The count path and the main filtering path must agree. +assert(strategyCount === selectSlugs('strategy').length, 'Strategy count and strategy filtering must match.'); +// Analytics count is unchanged and still includes the guide (cross-listing never removes originals). +assert(selectSlugs('analytics').length === 3, 'Analytics count must be unaffected by cross-listing.'); +assert(selectSlugs('analytics').includes('analytics-guide'), 'Analytics guide must stay counted under Analytics.'); +// Search within Guides & planning still honors the cross-listing. +assert( + JSON.stringify(selectSlugs('strategy', 'analytics-guide')) === JSON.stringify(['analytics-guide']), + 'Searching within Guides & planning must find the cross-listed analytics guide.' +); +// Temp-state facet base uses the same predicate, so its membership matches the main filter. +assert( + JSON.stringify(selectSlugs('strategy', 'guide')) === + JSON.stringify(dataset.filter(r => r.slug.includes('guide') && matchesCategory(r, 'strategy')).map(r => r.slug)), + 'Temp-state facet filtering must stay consistent with main filtering.' +); + +console.log('Guides & planning cross-listing predicate and wiring are valid.');