Backlog Organization

Hero image for Backlog Organization

Standardizing the management of the backlog is essential for maintaining clear and highly actionable backlogs. It also allows any Product Manager on the team to understand any project’s backlog with little effort.

Without standardization, it becomes extremely difficult and time-consuming for a Product Manager to understand how a backlog is organized, let alone how the product needs to be developed.

Depending on the project and the client’s requirements, the team might use different tools for backlog management. Regardless of the tool, how the team organizes the backlog revolves around the same concepts. Only their representation varies to adapt to the capabilities of the tool used.

Modules

Module representation in a backlog
Module representation in a backlog

Modules represent the main components of an application. They are the smallest denominator to which an application can be reduced. Each module contains several features.

For example, a food delivery applications will need an “Order Management” module which will regroup all features that help user place, track, and manage their orders.

In fact, there are several modules that are usually common to most applications: Application (the most generic module in an application), Authentication, and User Profile.

Naming & Slugs

Example Name Label
Order Management module Order Management #order-management
Customer Relationship Management module CRM #crm
Payment gateway module Payment #payment
Push notifications module Push Notifications #push-notifications

Module names should be as short and accurate as possible. There is no specific pattern for it and it is up to the Product Manager to identify names that fit this ideology best.

In addition to having a name, modules also need a slug for use in labels. The slug is a shorter, more condensed form of the name. Given how short module names are, the slug is typically a hyphenated version of the name.

Features

Module representation in a backlog
Module representation in a backlog

Features are coherent and standalone groups of user stories that define functionality in the application. A feature must belong to one and only one module (there is a hierarchical relationship between the two).

Module
└── Feature

A feature must be the smallest standalone piece of software which brings business value.

For example, “User can place order” is a feature belonging to the “Order Management” module. So is “User can track order progress in real-time”.

As the examples above show, features are small and standalone. Others companies might encompass both place and track the order as one feature. However, such an approach forces the Engineering team to deliver both for the feature to be complete.

In reality, if the “User can place order” feature is ready but “Track order real-time” isn’t, the former can still be released as a working, standalone feature to a production environment. It is the reason why a feature must be the smallest standalone piece of software which brings business value.

Writing a Feature

There is always a reason behind each feature. It is crucial to provide enough information for developers to understand the idea. When a feature is well-understood, it will give developers an excellent platform to work their magic on the implementation with the correct goals.

Product Managers used to write a “why” in each user story. However, it led to more downsides than benefits:

  • Because of the repetitive nature of the task, Product Managers did not always share enough context.
  • Important information about the “why” was sometimes too scattered across many small user stories.

To address those downsides, Product Managers now write the “why” at the feature level.

Providing Clear Context

Having the “why” at the feature level is an opportunity for Product Managers to put more thought into it while simultaneously spending less time working on it (by not having to write a “why” for every user story).

At the feature level, the “why” must be very clear and thoroughly detailed. It must outline:

  • The need for the feature (i.e., what problem it aims to solve).
  • How the feature aims to solve the problem (high-level only, details should live in the feature documentation).
  • Any relevant context that may help developers make the right decisions when implementing the feature (e.g., dependencies on other features or third-party systems).
  • Links to relevant resources and documentation.

Naming & Slugs

Example Name Label
Users can view the list of tickets User can list tickets $user-list-tickets
Admins can view the details of a specific ticket Admin can view ticket details $admin-view-ticket-details
Agents can create new tickets Agent can create ticket $agent-create-ticket
Agents must assign a ticket to an agent Agent must assign ticket $agent-assign-ticket
Admins can delete an existing ticket Admin can delete ticket $admin-delete-ticket

The above examples are very CRUD-like. Not all features can be described using this exact format but Product Managers should strive to follow this pattern as much as possible.

The naming for all features should follow a pattern that is somewhat similar to the user stories but in a shorter form.

The naming pattern, whenever possible, must be <user> <requirement> <action> <item> where:

  • <user> defines the type of user targeted by the feature.
  • <requirement> should be one of: can, must (used to highlight a hard requirement for a user to accomplish something).
  • <action> should be one of: list, view, create, delete.
  • <item> defines the item that is being developed.

When following this pattern is not possible, feature names should always be descriptive. Generic feature names are frowned upon. For example, if a pricing feature needs improvement, creating a feature named “Improve price display” is virtually useless as it doesn’t describe the update. Moreover, when multiple iterative improvements are being made to a feature a name such as “Improve price display” becomes useless and confusing.

Instead, be descriptive. If the menu feature needs to notify users when the price changed then the feature should be named “User can see notification when the prices changed”. This name is descriptive and helps understand the feature at a glance.

In addition to having a name, features also need a slug for use in labels. The slug is a shorter, more condensed form of the name.

When feature names can follow the recommended pattern, the slug pattern should be <user>-<action>-<item>.

When a feature name can’t follow the recommended pattern, its slug should follow the same ideology being short and condensed. For example: user-price-changed-notification.

In Practice

Below is a complete example of a feature:

Module: Order Management
Feature: User can view their past order
Labels: #order-managment $user-place-order @1.2.0
## Why

Returning customers want to quickly reference their previous food orders to reorder favorites, or resolve order issues. Without easy access to order history, customers spend time searching through emails or calling restaurants, leading to frustration and potential order abandonment. Order history with reorder functionality reduces friction for repeat purchases and increases customer lifetime value.


To make this happen, we need to build the order history feature:

- Display past orders
- Allowing user to filter the order list by time or status
- Showing the order details
- Allowing users to reorder with the same selection and information

Keep in mind that we need to handle the case when the product prices are changed, or users try to order from a closed restaurant.

## Documentation

- Feature documentation: https://www.notion.so/nimblehq/feature-documentation-link

Versions

Versioning software is a basic principle (this very documentation is versioned on GitHub). In the backlog, each user story must be associated with a released version to facilitate tracking and debugging.

Versions are identified by the label @x.x.x where x.x.x is the actual version number. For example, all user stories released as part of version 1.2.2 must have the label @1.2.2.

For the versioning numbers, the team follows Semantic Versioning best practices with the following format MAJOR.MINOR.PATCH:

  • MAJOR: when making backward incompatible changes.
  • MINOR: when adding functionality that is backward compatible.
  • PATCH: when making bug fixes that are backward compatible.

User Story Types

Module representation in a backlog
Module representation in a backlog

The team uses three types of user stories, even if a given backlog management tool offers more (or customizable) types: “User Story” (called “Feature” in some tools), “Bug”, and “Chore”.

Guide on writing user stories

Priority

Sprints should always be planned with the intent of completing all the stories. However, the Product Manager can determine the prioritization of the stories using the priority field. All projects should have the following priority fields setup:

Priority Fields
Priority Fields
  • High: The story has a higher priority, it needs to be picked up before other stories.
  • Medium: The default priority.
  • Low: Other stories with higher priority can be picked up first.

High

If a story is time-sensitive, meaning it needs to be addressed immediately and has consequences if not done so, it should be assigned a High priority. Developers should always prioritize high-priority stories over medium and low priorities. Examples of a high priority are:

  • Users are unable to login.
  • An API endpoint is not responding.
  • Credentials have expired.
  • The contact details on the website are no longer valid and needs to be changed immediately.
  • A hotfix that needs to be pushed to production.
  • Adding a functionality that unblocks another feature being worked on in the same sprint.

Medium

By default, all tasks should be assigned a Medium priority.

Low

If a story needs to be completed in a sprint and there is no urgency, it should be assigned a Low priority. Developers can prioritize other stories before a low-priority story.

Examples of a low priority are:

  • Minor changes to a UI element.
  • A chore to cleanup code that is not critical.
  • Writing documentation on a feature.

Labels

Labels (or tags) are heavily used in the backlogs. They help represent the backlog’s organization (with variations between backlog management tools) and any other sort of data visualization. It is important to use labels (there is no overuse) whenever something important needs to be tracked or presented.

For example, should there be a Request For Change for a product, the associated user stories should be labeled with the RFC number following the format rfc-<number>.

While there are a number of standardized labels, all labels don’t have to be standardized. It is at the Product Manager’s discretion to create and maintain relevant labels in their backlogs.

Standard Labels

There are a handful of standardized labels that are used throughout most backlog management tools.

  • Module label. Its pattern is #<module-name>. Example: #authentication.
  • Feature label. Its pattern is $<feature-name>. Example: $user-list-tickets.
  • Chore label. Its pattern is !<chore-name>. Example: !setup-ci-cd.
  • Version label. Its pattern is @<semver>. Example: @1.2.2.

Those standardized labels are not necessary with every backlog management tool but, when they are necessary, they must follow the above patterns.

Format

The standardized labels are prefixed with a symbol (e.g., # or $). Non-standardized labels must not be prefixed by any symbol.

The use of a symbol for the standardized labels allows for better sorting.

For example, when sorted alphabetically (a default in most tools), the modules authentication and user-profile would likely not be listed consecutively. Other labels would likely be in the middle.

Using a symbol forces the standardized labels to be listed consecutively. In the example above, #authentication and #user-profile will appear with all other module labels without others in-between.

Initial Label

As all projects must start with an exhaustive backlog, all the initial user stories must be labeled initial-scope. It will help later on with differentiating the initial project scope and the changes that made their way into the backlog and to the product. This label will give a snapshot of the project at its early stage.

Workflow

Taking a user story from “new” to “completed” requires going through a few specific steps. The team’s implementation workflow has five steps:

State Description
Backlog User stories that are not yet ready to be scheduled or even reviewed by the Engineering team. For example, ideas that the Product Manager doesn’t want to forget but require further research or preparatory work.
Ready for Development The user story has been scheduled and developers can pick it up and start implementing it.
In Development A developer has picked up the user story and is currently working on it.
In Code Review The developer finished the implementation and the code is being reviewed by peers.
Ready for QA The code has been successfully reviewed and was accepted requiring a round of manual Quality Assurance (QA).
Completed Quality Assurance has been done and the user story was deemed complete and finished.

If Quality Assurance fails, the user story is moved back to “In development” with a comment detailing why QA did not pass.

Product Development Workflow
Product Development Workflow