Inspiration

Teams that keep policies, procedures and contracts in Confluence need to know that the page people read is the page somebody signed off. We read the reviews of the most installed simple approval app on the Marketplace (1,627 installs and 3.39 stars when we measured it on November 4, 2026) and the same complaints came back: the status stays "approved" after a new version is published, the approval has to be renewed by hand, adding a label resets every approval, and the report only shows "my approvals".

What it does

Reapprove for Confluence stores every approval with the page version it was given to.

  • Under the page title a byline shows the state: Not requested, Approval pending 1/3, Approved (v7), Rejected or Needs re-approval.
  • Request approval from up to 20 people, with the rule "everyone must approve" or "any one approver is enough". Approvers get a Confluence comment that @mentions them, so the bell and the e-mail carry the page title.
  • When someone edits an approved page, the state turns to Needs re-approval and the same approvers are mentioned again to review the new version. No workflow to configure.
  • Labels and comments do not create a page version, so they do not reset an approval. A request nobody has answered yet follows the newest version silently, so a burst of edits does not spam anyone.
  • Rejecting requires a written reason. Nobody can name themselves as approver of their own request (four-eyes rule, refused in the backend).
  • Approvers who have not answered get a reminder comment after 3 days and then every 7 days.
  • A space page, Approvals, lists every page with its state, the approved version and the current version, with counts that filter the list, and exports the full history as CSV for audits. A global page, My approvals, lists what waits for you, oldest first.

How we built it

A Forge app for Confluence Cloud with UI Kit: confluence:contentBylineItem, confluence:spacePage and confluence:globalPage, one trigger on avi:confluence:updated:page and two scheduled triggers (reminders, and weekly personal data reporting). Decisions are one Forge storage (KVS entity) record per approver per round, and those records are the audit history. Page titles and versions are read live as the user, so restricted pages stay hidden in the lists. The approval rules are a pure module covered by 31 node:test tests. The app is Runs on Atlassian: Forge storage only, no remote backend, no egress. Six scopes: read:page:confluence, write:comment:confluence, read:confluence-content.summary, read:confluence-user, storage:app and report:personal-data.

Challenges we ran into

Deciding what counts as "the page changed". Comparing by page version, and not by any page event, is what keeps labels from resetting approvals. The second one was noise: mentioning the approvers on every edit would spam them, so a round with no decision yet just follows the latest version, and only a round that already has a decision starts over. A test also pins that a note or rejection reason from an old round does not carry into the new one.

Accomplishments that we're proud of

The app was created on November 4, 2026, during Codegeist, and Atlassian approved it for the Marketplace on November 13, 2026 after the app review, the security questionnaire and the Privacy & Security tab. It is live at https://marketplace.atlassian.com/apps/3231212993/reapprove-for-confluence and free for up to 10 users.

What we learned

An approval is a fact about one version of a page, not about the page. Once the data model says that, re-approval, the audit history and the space overview stop being features to maintain and become queries over the same records.

What's next for Reapprove for Confluence

Groups and teams as approvers, an approval expiry date for pages that must be reviewed every year, and a Rovo agent action that answers "which approved policies changed this month".

Share this project:

Updates

Submission history