---
title: Product Groups
description: A product group is the folder your products live in, and it is also the page customers land on in the store. Groups decide how a set of products is presented — as a pricing grid or as a domain…
url: "https://rackhelm.com/documentation/product-groups/"
updated: "2026-09-24"
category: "Products & Catalogue"
---

# Product Groups

A product group is the folder your products live in, and it is also the page customers land on in the store. Groups decide how a set of products is presented — as a pricing grid or as a domain search box — they carry the icon on the group's store card, and they hold settings that every product inside them inherits. This article is for operators working in the admin area.

## Before you start

> **Note:** Viewing the catalogue requires `view_products`. The create, edit and delete routes sit behind `edit_products`, and `ProductGroupController` then checks a `staff_panel` capability that has no permission record at all — it is not a `PermissionEnum` case, so it is never seeded and cannot be ticked on the Roles screen. In a default install only **Super Admin** can save a group. See [Roles & Permissions](/docs/roles-and-permissions/).

## Where groups live

Groups are not a separate screen. Open **Catalogue → Catalogue & Groups** (`/admin/products`) and you get one panel per group, each with its own product table, plus a final **Uncategorized Products** panel for anything with no group. Creating and editing a group both happen in a modal on this page, opened with the **New Group** button in the top right or **Edit Group** in a group's **⋯** menu.

![The admin Catalogue and Groups screen showing one collapsible panel per product group with a products table inside each](/wp-content/uploads/rackhelm-docs/catalogue-products-index.png)
Each group gets its own header, product count badge and table; the ⋯ menu on the right is where group editing, mass add-on assignment and deletion live.

> **Note:** A group literally named `System` is filtered out of this screen and cannot be used as a bulk-move destination. It is created at install with **Include in Store** off and holds internal products such as *Credit Deposit*. The breadcrumb on this page reads **Catalog / Products & Groups** while the sidebar entry reads **Catalogue & Groups**; they are the same screen.

## Creating a group

1. Open **Catalogue → Catalogue & Groups**.
2. Click **New Group**. The modal has three tabs: **General**, **Display & SEO** and **Configurable Options**. It always reopens on **General**.
3. Give the group a **Group Name** and, optionally, a **Description** (a rich-text editor — the HTML is sanitised on save).
4. Choose a **Page Layout**: **Product Grid** or **Domain Search**.
5. Pick a **Store Icon**, or leave it on *Automatic (match group name)*.
6. On **Display & SEO**, set the sort order, the visibility switches and any search-engine metadata.
7. On **Configurable Options**, tick any custom fields every product in the group should ask for. See [Configurable Options](/docs/configurable-options/).
8. Click **Create Group**. You are returned to the catalogue list with *"Product group “…” created."*

![The Create Product Group modal open on the General tab showing name, description, page layout and the Store Icon picker with its preview swatch](/wp-content/uploads/rackhelm-docs/catalogue-group-create-modal.png)
The Page Layout radio decides whether the group's store page renders pricing cards or a domain search box; the Store Icon sits below it.

## The Store Icon

The **Store Icon** field on the **General** tab sets the glyph on the group's card on `/store`. It is a searchable picker over the same Boxicons catalogue the navigation editor uses, with a live preview swatch to the left of the field. The help text reads: *"Shown on the group's card on the store page. Leave as Automatic to pick one from the group name."*

![The Store Icon field in the group modal, with the preview swatch on the left and the searchable Boxicons drop-down open beside it](/wp-content/uploads/rackhelm-docs/catalogue-group-icon-picker.png)
The Store Icon picker, with its preview swatch. The first entry is "Automatic (match group name)".

Left on *Automatic (match group name)*, the icon is matched against the group's name, first fragment wins:

| If the group name contains… | Icon used |
| --- | --- |
| domain | `bx bx-globe` |
| ssl, certificate | `bx bx-lock-alt` |
| security | `bx bx-shield-quarter` |
| email, mail | `bx bx-envelope` |
| reseller | `bx bx-store-alt` |
| dedicated | `bx bx-hdd` |
| vps | `bx bx-chip` |
| cloud | `bx bx-cloud` |
| game, minecraft | `bx bx-joystick` |
| backup | `bx bx-data` |
| licen (licence / license) | `bx bx-key` |
| web, hosting, server | `bx bx-server` |
| anything else | `bx bx-package` |

The list is longer than this — seo, marketing, design, develop, website, support and maintenance all have their own defaults — but the shape is the same: the first fragment found in the name wins, so *Dedicated Servers* gets the hard-disk icon rather than the generic server one.

> **Warning:** The store card only has a slot for the icon on the **Modern Dark** and **Modern Clean** store templates. On **Classic (Default)** the cards carry no icon at all, so picking one changes nothing a customer can see. The template is chosen under **Platform Settings → General & System → Store Template**. Choosing an icon while the store is on Classic is not an error and nothing warns you.

> **Note:** The icon lands in a `class` attribute, so it is restricted to letters, digits, spaces, underscores and hyphens, up to 100 characters. A value outside that set is discarded on save and the group silently reverts to *Automatic*. The icon also does not change the admin catalogue: the group header on **Catalogue & Groups** keeps a fixed folder glyph either way.

## Page Layout: Product Grid vs Domain Search

This is the single most consequential setting on a group, because it changes the customer-facing page completely.

| Layout | Stored as | What the customer sees at `/store/{group}` |
| --- | --- | --- |
| **Product Grid** | `show_type` = 0 | A row of pricing cards, one per product with **Include in Store** on. Products with **Highlight Product** set get a "Most Popular" badge. |
| **Domain Search** | `show_type` = 1 | A "Search for your new domain" box that queries the registrar products in this group and returns availability and pricing, each result badged **Available** or **Taken**. |

Domain Search also changes how configurable options behave: in a Domain Search group every assigned custom field is offered on the order page, regardless of its per-assignment **Show on Order Page** switch. That is what keeps the `DomainName` field visible.

### Currency badges on the group page

Since multi-currency pricing arrived in 1.0.1.1, a product that is not sold in the currency the visitor is browsing in still appears on the group page, but with its price shown in the first currency it *is* sold in and a badge in place of the order button:

- **Sold in USD only** (with the relevant code) — plus a **Shop in USD** button that switches the visitor's currency, where they are allowed to switch.
- A customer who cannot switch because their account holds credit sees *"Your account holds credit in GBP; contact support to switch."* instead of the button.
- **Not currently available** — the product has no price in any active currency.

These are product settings, not group settings; the group page is simply where they surface. A single-currency store shows none of this.

## How groups drive store URLs

Groups and products are addressed by their internal UUIDs, not by a text slug:

| URL | Shows |
| --- | --- |
| `/store` | Every group with **Include in Store** on, ordered by **Group Sort Order**. A group containing exactly one visible product shows that product's name and description and links straight to it instead of to the group page. |
| `/store/{group}` | The group page in the layout chosen above. |
| `/order/{group}/{product}` | The order/configuration page for one product. This is the link the product editor's **Direct Link to Product** box gives you. |

Two switches control who can reach these:

- **Include in Store** — the group appears on `/store`.
- **Allow Direct Link** — the group page can still be reached by its URL even when it is not listed.

With **both** switches off, `/store/{group}` returns a 404. Turning either one on makes the group page reachable; only **Include in Store** also lists it on `/store`. Use "hidden but linkable" for a group you want to send to a specific customer without publishing it.

## Group settings reference

| Field | What it does |
| --- | --- |
| **Group Name** | Required. Shown as the store page heading and as the panel title in the admin catalogue. Also what *Automatic* matches the store icon against. |
| **Description** | Rich text, shown under the heading on the group's store page. Sanitised on save, and shown tag-free (140 characters) in the admin panel header. |
| **Page Layout** | Required. **Product Grid** or **Domain Search** — see above. |
| **Store Icon** | Boxicons class for the group's card on `/store`. *Automatic (match group name)* by default. Modern Dark and Modern Clean templates only. |
| **Group Sort Order** | Integer, default `0`. Lower numbers appear first on `/store`. |
| **Include in Store** | Default on. Lists the group on `/store`. |
| **Allow Direct Link** | Default on. Lets the group page be opened by URL when it is not listed. |
| **Show Cycle Savings** | Default off. On a product's order page, works out and shows how much a longer billing cycle saves against the shortest priced cycle with a term of at least one month. The create modal labels it **Show Cycle Savings Calculator** and the edit modal **Show Cycle Savings**; it is the same setting. |
| **SEO Title** | Up to 255 characters. Overrides the page title on the group's store page. |
| **SEO Description** | Meta description. The counter targets 160 characters; a **Generate with AI** button can draft one from the group name and description. |
| **SEO Image (Open Graph)** | JPEG, PNG, GIF or WebP, maximum 2 MB. Used as the social preview image. Leave blank when editing to keep the existing image. |
| **Configurable Options** | Custom fields inherited by every product in the group, each with its own **Show on Order Page**, **Show in Admin** and **User Changeable** switches. |

## Group-level actions

The **⋯** menu on a group header gives you:

- **Add Product** — opens the product editor with this group pre-selected.
- **Mass Assign Addons** — attach or detach one add-on across *every* product in the group in a single operation. Assigning skips products that already have it; unassigning ignores products that do not. An empty group answers *"There are no products in this group to modify."*
- **Edit Group** — reopens the tabbed modal against this group.
- **Delete Group** — see the warning below.

Ticking product rows inside a group reveals a bulk bar with **Move** and **Delete**. Move sends the ticked products to another group or to *— Uncategorized —*; only rows ticked on the page you are looking at are affected.

## Troubleshooting

| Symptom | Cause and fix |
| --- | --- |
| The delete confirmation says products will be uncategorised, but deleting fails. | The confirmation text — *"Delete this group? Products inside will be uncategorized."* — is out of step with the actual rule. A group that still contains any product is refused with *"You can’t delete this group because it still contains products. Move or delete them first."*, and a group whose products belong to an order in `paid`, `active` or `processing` status is refused first with *"You can’t delete this group because N product(s) in it are assigned to active customers. Move/archive those products first."* Move the products to another group, then delete. |
| Opening `/admin/product-groups` gives a server error. | Those routes have no views. Manage groups from the modals on **Catalogue & Groups**. |
| The store icon I picked does not appear. | The store is on the **Classic (Default)** template, which has no icon slot. Switch to Modern Dark or Modern Clean under **General & System → Store Template**, or accept that the icon is inert. |
| The store icon reverted to the automatic one after saving. | The value contained a character outside `A–Z a–z 0–9`, space, underscore and hyphen and was discarded. Pick from the drop-down rather than pasting a class. |
| The icon picker's search box will not accept typing. | Reload the page. The picker is a select2 inside a Bootstrap modal; if the page's scripts loaded out of order the modal's focus trap can swallow the search field. |
| A group is missing from `/store`. | **Include in Store** is off. That is the only test `/store` applies to groups — a group with no visible products still gets a card, and the reserved `System` group is hidden because it ships with **Include in Store** off. |
| `/store/{group}` returns 404. | Both **Include in Store** and **Allow Direct Link** are off. Turn one on. |
| The Domain Search box returns nothing. | A Domain Search group only works when it contains products wired to a registrar integration. Check the product's **Provisioning** tab. |
| Saving a group gives a 403. | The group controller checks a `staff_panel` capability that has no permission record, so it cannot be granted from the Roles screen and only Super Admin passes it. Sign in as a Super Admin. |
| Products in a group show "Sold in USD only" instead of an order button. | Those products are limited to currencies that do not include the one the visitor is browsing in. Fix it on the product, under its currency pricing, not on the group. |
| The savings figures do not appear on the order page. | **Show Cycle Savings** is a group setting, not a product one, and it needs at least two priced cycles with a term of one month or more to compare. |
