# Canonical shop categories

All catalogue products map into one of these buckets (plus **Other**).

| Slug | Label | Icon asset |
|------|-------|------------|
| `vas_airtime` | VAS / Airtime | `assets/categories/cat-airtime.png` |
| `home_essentials` | Home Essentials | `assets/categories/cat-home.png` |
| `bakery` | Bakery | `assets/categories/cat-bakery.png` |
| `fresh_produce` | Fresh Fruits & Veg | `assets/categories/cat-fresh.png` |
| `dairy_eggs` | Dairy & Eggs | `assets/categories/cat-dairy.png` |
| `meat_poultry` | Meat & Poultry | `assets/categories/cat-meat.png` |
| `other` | Other | `assets/categories/cat-other.png` |

## Legacy pipeline → canonical

| Pipeline bucket | Canonical |
|-----------------|-----------|
| `fresh_produce` | `fresh_produce` |
| `dairy_bakery_chilled` | `dairy_eggs` |
| `household_cleaning` | `home_essentials` |
| `staples`, `pantry`, `premium`, `basket_builders` | `other` |

Keyword rules in `api/index.php` (`normalize_bucket`) also map bakery, meat, VAS/airtime, etc.

## App behaviour

- **Home & Shop tabs** always show all 7 categories in fixed order (`ShopCategories.mergeWithApi`).
- **API** `GET ?r=aisles` returns canonical buckets with counts.
- **API** `GET ?r=products&bucket=` filters by canonical slug (normalizes legacy values).
