DEV Community

Mikhail Klimenko
Mikhail Klimenko

Posted on Originally published at horizonventures.app

How to list Confluence pages on a page without writing CQL

Short answer. You do not need to learn a query language. The filter by label macro builds the query for you from a form: you add filters from a list and fill in values, and it accepts twelve of them, including space, title, text, creator, contributor and child pages. For a simple list of pages under this one, the child items macro is two clicks. The walls you eventually hit are these three: no relative dates, so "not touched in six months" is out of reach; anything label-based depends on labels somebody has to apply; and the search results macro belongs to the legacy editor that is being retired.

The four native macros

Macro What it lists Good for
Child items (was children display) Items under a parent you choose, to a depth you set. Updates itself when pages are added or renamed. An index at the top of a section.
Content tree (was page tree) An expandable tree of a space or a branch of it. Navigation on a landing page.
Filter by label (was content by label) Anything matching the filters you add: label, title, text, type, space, creator, contributor, mentioned user, date created, last modified, child pages, all subpages. Everything that is not a plain hierarchy.
Content properties report (was page properties report) A table built from the content properties macro placed on source pages, found by label. Structured registers you planned in advance.

There is also the search results macro, which runs a search query and prints the hits. It works today, and it is part of the legacy editor whose deprecation started in January 2026, so it is not where a new process should live.

Filter by label deserves more credit than it gets

The name is misleading and it costs the macro a lot of users. Labels are the first filter offered, not the only one. You add filters from a menu and each one takes plain values; the CQL is assembled behind the form.

The operators follow simple rules worth knowing before you fight the form:

  • OR: several values in one filter. Label a, label b, or both.
  • AND: add the same filter twice, once per value. Only some filters allow this; if a filter cannot be added twice, it does not support AND.
  • NOT: a minus sign before the value excludes it.

With space, contributor and all subpages available, this covers a surprising amount: everything in three spaces written by a particular team, everything below a given page with a given label, everything mentioning a person. If you left this macro alone because you assumed it needed labels, go back and look again.

Where the native path stops

Relative dates do not exist

This is the big one. The date filters are documented as returning items created on this date and items last updated on this date. A date, not a period. So the question people actually ask, which is "what has nobody touched since last year", cannot be expressed: you can pin a list to a date, but a pinned date is stale the week after you set it, and the list quietly stops meaning what its heading says.

Labels are a habit, not a fact

Label-based lists work beautifully in spaces where labelling is disciplined, and they are empty in every other space. Nobody labels a page they wrote in a hurry three years ago, which is precisely the page an audit is looking for. A list built on labels shows you the tidy part of the wiki and hides the rest, which is the opposite of useful when you are hunting for neglect.

The properties report reports on a structure, not a space

The content properties report reads pages that carry the content properties macro and finds them by label. If the pages were not set up that way in advance, the report is empty and no amount of filter-tweaking helps. It is a fine tool for a register you designed, and the wrong tool for finding out what is in a space you inherited.

The screen most people never open

If the goal is an audit rather than a list on a page, the native answer is not a macro at all. Each space has a content manager in its space settings, and it has a Last active filter: content nobody has viewed, commented on or updated within a period, defaulting to 180 days. That is exactly the query the macros cannot express, and it is free.

Two things to know before you plan around it. It lives in space settings, so it is an administrator's screen: readers of the space never see it, and you cannot put its result on a page for a team to work through. And bulk actions on what it finds, archiving or deleting in one go, require Premium or Enterprise. On Standard you get the list and you work through it by hand.

So what should you use

What you want Use
An index of the pages below this one Child items macro
Navigation for a whole space Content tree macro
A live list by author, space, title or label Filter by label macro
A table of fields you planned in advance Content properties report
A one-off clean-up of forgotten pages Content manager, Last active filter
A standing list of neglect, visible to the team Nothing native does this

That last row is the honest gap. Everything above it is free and already in your site.

What the manual version costs

Say you own four spaces and you review neglected documentation each quarter. Opening the content manager per space, setting the filter, exporting nothing because there is no export, and copying the interesting titles into a review page by hand: about forty minutes if the spaces are small, and the result is a snapshot that is out of date by the time anyone reads it.

Forty minutes a quarter is nothing. The cost is not the minutes; it is that the list lives in a screenshot on a review page, so nobody trusts it, and the pages it names are still there next quarter.

Disclosure: I build Confluence apps. One of ours, Smart Search, exists for the gap in that last row: lists defined by relative periods, "not updated in 180 days", built from checkboxes, running across several spaces at once and visible to ordinary readers on an ordinary page rather than only to admins in space settings. If your case is covered by the rows above it, and most cases are, use the native macros: they are free, they are supported, and they will outlive any app.

Questions people ask

Do I have to learn CQL?
No. Filter by label builds the query from a form. Twelve filters, values typed in plain text.

How do I list the child pages of this page?
The child items macro. Pick the parent, set the depth, done. It updates itself as pages are added or renamed.

Can I list pages nobody has touched in six months?
Not with the macros: the date filters take a date, not a period. Use the content manager in space settings, which filters by last active over a period you choose.

Can I combine filters with AND?
Yes, by adding the same filter twice with one value each. Filters that cannot be added twice do not support AND. A minus sign before a value excludes it.

Why is my page properties report empty?
It only reads pages carrying the content properties macro, matched by label. No macro on the source pages, no rows.

Should I use the search results macro?
It works, but it belongs to the legacy editor, whose deprecation began in January 2026. Do not build a process on it.

Related: how to find stale pages in Confluence.

Top comments (0)