Atlassian Confluence is a very flexible Wiki system. By default it is not possible to force a specified structure. Each user is able to create pages and name them as she/he wants to. We had the requirement to give all pages created by users in a special space a prefix with automatic page numbering in Atlassian Confluence. The Add-On Adaptavist Scriptrunner for Confluence will be necessary to achieve this requirement in our approach.
Adaptavist Scriptrunner includes a “Create Page” macro which has the possibility to create pages with variables in the title. There is a variable called $ident. If you place it on a page with the parameter $ident in the title it creates a page with incrementing numbers each time you click it. But if the user now changes this name it does not get updated any more and the next created page gets a number what should already be in use. This was not the solution we were looking for. However, Scriptrunner is a great tool – we will use the “Create Page” macro on the homepage to create pages but without the $ident variable.
Create Page Macro by Adaptavist Scriptrunner for Confluence
Place the macro onto the Confluence page where you want the user to start creating new pages. One necessary parameter in the macro will be “Labels“. In this example it is set to “apn“. This will add the label “apn” onto each page that we create with the button. Also set the parameter “Target Mode” to “Edit“. This is necessary to identify which pages should get an automatic page numbering.

Event Listener to achieve automatic page numbering
Adaptavist Scriptrunner for Confluence also offers to possibility to create Event Listeners. We will use this to add or check the page title. Everytime it gets updated it will execute and add the prefix if it is missing. The defined prefix will be stored in the page’s content properties. The current incremental number will be stored in the home page’s content properties of the space.
- Open “General Configuration” and navigate to “Event Listeners“
- Click “Create Listeners” -> Custom event listener
- Add “PageUpdateEvent” to Events parameter
- Copy and paste the following code into “Inline Script” section or save it as file and link it – then save the event listener
import com.atlassian.confluence.pages.Page import com.atlassian.confluence.core.ContentPropertyManager import com.atlassian.sal.api.component.ComponentLocator import com.atlassian.confluence.event.events.content.page.PageEvent def contentPropertyManager = ComponentLocator.getComponent(ContentPropertyManager) def event = event as PageEvent def page = event.getPage() def pageLabels = page.getLabels() def space = page.getSpace() def homePage = space.getHomePage() // Page created or updated inside of defined space if (space.getKey() == "APN"){ // Check if the page has one of the defined labels (apn, something) and define the PREFIX def pageNrPrefix = null if (pageLabels.toString().contains("apn")){ pageNrPrefix = "APN" } if (pageLabels.toString().contains("something")){ pageNrPrefix = "SOMETHING" } // If the defined label is set a prefix is defined and we can proceed if (pageNrPrefix){ // Get page numbering of current page def pageNr = null def pageNrString = null if (contentPropertyManager.getStringProperty(page, "pageNr")){ pageNr = contentPropertyManager.getStringProperty(page, "pageNr").toInteger() pageNrString = contentPropertyManager.getStringProperty(page, "pageNrString") } // Check if page count is already stored in homepage - if not set it if (!contentPropertyManager.getStringProperty(homePage, "${pageNrPrefix}PageCount")){ contentPropertyManager.setStringProperty(homePage, "${pageNrPrefix}PageCount", "0") } // Calculate next page number if it is a new page if (!pageNr){ // Get next number and save it to homepage def lastPageNr = contentPropertyManager.getStringProperty(homePage, "${pageNrPrefix}PageCount").toInteger() def nextPageNr = lastPageNr + 1 pageNr = nextPageNr pageNrString = "${pageNrPrefix}-${pageNr.toString()}" contentPropertyManager.setStringProperty(homePage, "${pageNrPrefix}PageCount", nextPageNr.toString()) // Save Page Number to current page contentPropertyManager.setStringProperty(page, "pageNr", pageNr.toString()) contentPropertyManager.setStringProperty(page, "pageNrString", pageNrString) } // Update Page Title if Page Number with prefix is not in page title if (page.getTitle().indexOf(pageNrString.toString()) != 0){ page.setTitle(pageNrString.toString() + " " + page.getTitle()) } } }
If you open the homepage of your space again and create a new page with the macro what we have placed before, it will get an automatic page numbering in the title called APN-1. The next page will receive APN-2 and so on.

If anybody removes the prefix from the page title, the event listener will add it again.
The space key on which the listener executes is defined in line 16 of the script. Adjust it to your needs.
The label what you use when you create a new page is defined in line 21 and the prefix of the page title in line 22. Also adjust these 2 strings.
The solution supports multiple different prefixes. An example for it are lines 24-26. Just multiply them as many times as you need different prefixes. If one is enough just remove them.