"How do we find the pages nobody maintains any more?" comes up here constantly, usually right before an audit or a migration. Confluence Cloud has more native answers than people expect, and each one stops at a specific, slightly surprising point. Here they are in the order I would try them, with the catch for each.
1. The content manager (Premium and Enterprise)
Space settings, then Content manager. Above the table there is a Last active filter: pages with no views, no comments and no updates in the period you choose. It is the closest thing to a built-in stale page report, and when you act on the result you can archive up to 500 items at once.
- It is a paid feature. Atlassian's documentation says Standard admins do not have access to the content manager, so on Free and Standard this route is closed.
- Six months is the ceiling. The period is a dropdown: over 7 days, 1 month, 3 months, 6 months. "Untouched for two years" is not on it.
- It skips every page that has children. This is the one that catches people. Atlassian leaves parent pages out so that nested pages are not archived from under their inherited permissions. Sensible, but the stale parent page with three stale children under it never appears, and nothing on the screen tells you the list is shorter than the truth.
- It works one space at a time, on an admin screen the rest of the team never sees.
2. Advanced search
The search screen filters by space, contributor, label and last modified date, including "before" a date you pick. Set the space, set the date to a year ago, sort by date. For a first look this is often enough, and it works on every plan.
The catch: the result lives in the search screen. You cannot hand it to a team as a page to work through, and next quarter you build it again from scratch.
3. An automation rule with CQL
Confluence automation's scheduled trigger accepts a CQL query, so a rule like type = page AND space = ENG AND lastModified < now("-180d") can run weekly and notify the page owners. This is the only native route here that understands a relative period, and it keeps working without anyone remembering to run it.
The catch: it notifies, it does not list. Owners get emails, nobody gets one place showing what is still open, and a page whose owner left the company notifies nobody.
4. The filter by label macro
The one macro that puts a live list of pages on a page. Despite the name, labels are only the first of its filters: space, creator, contributor and last modified date are there too.
The catch: the date filters take a date, not a period. "Last updated on or before 1 March" is possible; "not touched for 180 days" is not. A pinned date is wrong the week after you set it, and the list quietly stops meaning what its heading says.
Running the audit so it does not have to be redone
- One space, not the whole site. A site-wide list of 800 pages gets closed and never reopened. One space with 40 candidates gets dealt with.
- Cut-off by content type. Runbooks go stale in months, policies live for years, onboarding is wrong the day the tooling changes. One cut-off for everything is noise.
- Not edited is not the same as not used. A correct page can be read every day for three years without an edit. Use the date to build a shortlist, then judge each page on what it says.
- Archive rather than delete. An archived page leaves search and navigation, keeps its history and can be restored. That is usually what people mean by "delete it".
- Put retirement into the process. If decommissioning a service does not include "archive its documentation", the list is exactly as long next year.
Disclosure: I build Confluence apps, and one of them, Smart Search, fills the gap in route 4: a macro that keeps a live list on a page with a relative condition such as "not updated for 180 days", across spaces, built from dropdowns rather than written in CQL (the query is visible if you want it). It does not see page views, so "not edited" is what it measures; the content manager's "no views" signal, where you have it, is a better test of "not used". Marketplace listing.