# Live Shopify Catalog Inventory — mozimo.in Read-only inventory of the live Shopify store behind `mozimo.in`, taken from the **Storefront GraphQL API**. Every value below is a raw API reading. No recommendations, no inferred intent. ## Provenance | Item | Value | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | Store domain | `e21i4d-0q.myshopify.com` (public domain `shop.mozimo.in`) | | API version requested | `2026-10` | | API version served | `2026-10` — every response carried `X-Shopify-API-Version: 2026-10` | | Token mode | **minted** — the cached minted token at `.cache/shopify-token.json` (32 hex) was reused; no new token was minted during this capture | | Endpoint | `POST https:///api/2026-10/graphql.json` with `X-Shopify-Storefront-Access-Token` | | Response metadata | `extensions.cost` present (requestedQueryCost only; no throttle-status object returned) | ### Version fall-through (verified by direct request) | Version requested | `X-Shopify-API-Version` returned | HTTP | | -------------------------------------------------------- | -------------------------------- | ---- | | 2026-10 | 2026-10 | 200 | | 2026-07 | 2026-07 | 200 | | 2026-01 | 2026-01 | 200 | | **2025-01** (the version pinned in `src/lib/shopify.ts`) | **2025-10** | 200 | | 2025-10 | 2025-10 | 200 | `publicApiVersions` as reported by the API itself: | handle | displayName | supported | | -------- | --------------------------- | --------- | | 2025-10 | 2025-10 (Unsupported) | false | | 2026-01 | 2026-01 | true | | 2026-04 | 2026-04 | true | | 2026-07 | 2026-07 | true | | 2026-10 | 2026-10 (Latest) | true | | 2027-01 | 2027-01 (Release candidate) | false | | unstable | unstable | false | So the repo's pinned `2025-01` is **not** falling forward to the oldest supported stable version (2026-01); Shopify currently answers it as **2025-10**, a version the API itself flags as _Unsupported_. All data in this document was captured at `2026-10`, where every field below was confirmed present. ### Credential mode Both modes are populated in `.env`, but `src/lib/shopify.ts` prefers the static token when set (`if (STATIC_TOKEN) return STATIC_TOKEN;`). This capture did the opposite: it used the **cached minted token**, because it was present and working. - `SHOPIFY_STOREFRONT_ACCESS_TOKEN` — present (static 32-hex token) - `SHOPIFY_CLIENT_ID` + `SHOPIFY_CLIENT_SECRET` — present - `.cache/shopify-token.json` — present, token 32 hex, minted `2026-09-06T05:38:21Z` Both tokens authenticate (`{ shop { name } }` → 200). The static token was not used for this report, so the scope findings below (e.g. the missing selling-plan scope) are the **minted token's** scopes and are unverified for the static token. ### Scope-limited fields (access denied — not absent) | Query | Error | Required scope | | --------------------------------- | ------------- | ---------------------------------------------------- | | `Product.sellingPlanGroups` | ACCESS_DENIED | `unauthenticated_read_selling_plans` | | `QueryRoot.locations` | ACCESS_DENIED | `unauthenticated_read_product_pickup_locations` | | `Shop.shopPayInstallmentsPricing` | ACCESS_DENIED | `unauthenticated_read_shop_pay_installments_pricing` | --- ## 1. Store basics | Field | Value | | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | Shop name | `Mozimo Hand Crafted Chocolates` | | Shop GID | `gid://shopify/Shop/74467967222` | | Primary domain | `shop.mozimo.in` → `https://shop.mozimo.in` (`sslEnabled: true`) | | Storefront host | `e21i4d-0q.myshopify.com` | | Money format | `Rs. {{amount}}` | | Shop description | empty string | | Customer account URL | `null` (legacy customer accounts are not exposed under the modern Customer Accounts API) | | Contact information | `null` | | Legal notice | `null` | | Subscription policy | `null` | | Terms of sale | `null` | | Policies populated | four of six: `termsOfService`, `refundPolicy`, `privacyPolicy`, `shippingPolicy` — each with title, URL and a full HTML body | | Ships to countries | **29 country codes** (see below) — not just India | | Brand | `brand.logo.image.url` present (`Mozimo_Logo.svg`); `shortDescription` and `slogan` are `null` | | Social login | `socialLoginProviders` returns a list with no usable fields exposed | | Shop-level metafield | `shop.metafield(namespace:"custom", key:"tagline")` → `null` | | Store policies note | the shipping policy body states "This website currently ships to addresses within India only" and "We are currently delivering Pan India", while `shipsToCountries` lists 29 destinations — the two disagree | `shipsToCountries` in full (29): `AE`, `AT`, `AU`, `BE`, `CA`, `CH`, `CZ`, `DE`, `DK`, `ES`, `FI`, `FR`, `GB`, `HK`, `IE`, `IL`, `IN`, `IT`, `JP`, `KR`, `MY`, `NL`, `NO`, `NZ`, `PL`, `PT`, `SE`, `SG`, `US` Payment-related settings visible from the Storefront API (this is essentially the whole surface): | `paymentSettings` field | Value | | ------------------------------ | ---------------------------------------------- | | `countryCode` | `IN` | | `currencyCode` | `INR` | | `enabledPresentmentCurrencies` | `["INR"]` | | `acceptedCardBrands` | `[]` — empty | | `supportedDigitalWallets` | `[]` — empty | | `shopifyPaymentsAccountId` | `null` | | `cardVaultUrl` | `https://checkout.pci.shopifyinc.com/sessions` | There is **no payment-provider/gateway disclosure** on the Storefront API: no gateway names, no UPI/COD settings, no PaymentSettings beyond the table above. `acceptedCardBrands` and `supportedDigitalWallets` being empty lists is the default shape for a token without payment-detail scopes — treat "no card brands" as **unverified**, not as a real store configuration. The refund policy body does contain operational detail (24-hour claim window, refunds via "net banking, pay wallets") but it does not name a gateway. ### Locale | Field | Value | | -------------------- | ------------------------------------------------------------ | | Country | `IN` — India, currency `INR` (₹), unitSystem `METRIC_SYSTEM` | | Language | `EN` — English | | `availableCountries` | only `IN` (India) | | `availableLanguages` | only `EN` | | `shipsToCountries` | 29 codes (listed above) | Note the asymmetry that matters for reading this document: `Localization` offers **only India** (`availableCountries` = `["IN"]`), while `Shop.shipsToCountries` lists 29 destinations. The three shop-level metafields probed (`custom.tagline`, `custom.store_currency`, `facts.storage`) all return `null`. --- ## 2. Full product catalogue **Total: 61 products.** The catalogue is **4× larger** than the hardcoded product set in `src/data/catalog.ts`, which amounts to 27 `product(...)` entries covering **15 unique handles** (the `bestsellers`, `gifting`, `pantry` and `giftingTabs` exports overlap heavily). There is no `productsCount` field on `QueryRoot` and no `totalCount` on `ProductConnection` at 2026-10 (`Field 'productsCount' doesn't exist on type 'QueryRoot'`; `Field 'totalCount' doesn't exist on type 'ProductConnection'`), so the count is a full pagination walk to `pageInfo.hasNextPage: false`, not an API-reported total. The last page returned `hasNextPage: false`, so 61 is exact. Catalogue-wide observations (all 61 products): | Attribute | Value | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | | `productType` | `""` (empty string) for **all 61** products — no type set anywhere | | `tags` | `[]` for **all 61** products — no tags set anywhere | | `vendor` | `Mozimo Hand Crafted Chocolates` for 60; **`My Store`** for one: `pistachio-dragees` | | `availableForSale` (product) | `true` for all 61 | | `availableForSale` (variant) | `true` for all 61 | | `currentlyNotInStock` | `false` for all 61 | | `totalInventory` | `0` or negative for all 61 (maximum value seen: `0`) | | `quantityAvailable` | `0` for 16 products, negative for 45, positive for **none** | | `isGiftCard` | `false` for all 61 | | `requiresSellingPlan` | `false` for all 61 | | `compareAtPrice` | `null` on every variant; `compareAtPriceRange.minVariantPrice.amount` is `0` on every product — **nothing is on sale** | | `sku` | `null` or `""` on every variant — no SKUs anywhere | | `barcode` | not populated (queried per variant; none returned) | | `images` | **exactly 1 on 60 products, 2 on one** (`1-kg-bark-box`); `hasNextPage: false` on a `first: 250` images connection for every product | | `media` | every media node is `IMAGE`; no video, no 3D model | | `altText` | `null` on **every image of every product** (0 products have any alt text) | | `weight` | populated on every variant, always unit `GRAMS` (0–5500 g) | | `publishedAt` | non-null for all 61 | | `createdAt` range | `2025-03-03T06:06:07Z` → `2026-03-25T11:18:38Z` | | `updatedAt` range | `2026-05-25T10:48:07Z` → `2026-10-06T00:59:46Z` | | `taxable` / `requiresShipping` | `true` for every variant | **Inventory caveat.** `totalInventory` and `quantityAvailable` are _not_ access-denied here — they are returned, and they read `0` or negative (−1 to −20) on all 61 products while every product still reports `availableForSale: true`. Overselling past zero does not flip a product to unavailable in the Storefront API, so "availability" and "in stock" disagree across the whole catalogue. Whether fulfilment is actually possible is **not determinable** from the Storefront API. Product query argument `query:` was tested and **appears to be ignored by this store's Storefront API**: `products(first: 250, query: "available_for_sale:true")` and `products(first: 250, query: "gift_card:true")` both returned the full unfiltered 61, identical to no query. Filter-based counts are therefore **unverified**; the `isGiftCard` field (all `false`) is the reliable gift-card signal. Full catalogue (alphabetical by handle; `qty` = `quantityAvailable` from the variant, `tInv` = product `totalInventory`, `imgs` = image count): | # | handle | title | vendor | variant title | selectedOptions | price ₹ | compareAt | qtyAvail | totalInv | available | imgs | collections | | --: | ----------------------------------------- | ---------------------------------------- | ------------------------------ | --------------- | ------------------------------------------ | ------- | --------- | -------- | -------- | --------- | ---: | ------------------------------------------------------------------------------- | | 1 | `1-kg-bark-box` | 1 kg Bark Box | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 5700.0 | — | 0 | 0 | yes | 2 | `gift-collection`, `diwali`, `hampers-boxes` | | 2 | `200-gas-bark-box` | 200 gms Bark Box | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 1200.0 | — | 0 | 0 | yes | 1 | `best-sellers`, `gift-collection`, `diwali` | | 3 | `4-pralines-box` | 4 Pralines Box | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 440.0 | — | -2 | -2 | yes | 1 | `pralines` | | 4 | `9-pralines-box` | 9 Pralines Box | Mozimo Hand Crafted Chocolates | `1` | [{"name":"Title","value":"1"}] | 990.0 | — | -3 | -3 | yes | 1 | `gift-collection`, `pralines` | | 5 | `bars-box` | Bars Box | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 1050.0 | — | 0 | 0 | yes | 1 | `gift-collection`, `diwali` | | 6 | `cocoa-bean-shell` | Cocoa Bean Shell | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 220.0 | — | 0 | 0 | yes | 1 | `mozimo-delights` | | 7 | `kunafa-chocolate-bar` | Kunafa Chocolate Bar | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 1600.0 | — | -6 | -6 | yes | 1 | `best-sellers`, `diwali` | | 8 | `matcha-hazelnut-dragees-100gm` | Matcha Hazelnut Dragees 100gm | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 550.0 | — | -1 | -1 | yes | 1 | `dragees`, `best-sellers` | | 9 | `matcha-strawberry-praline` | Matcha Strawberry Praline (Box of 4) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 440.0 | — | -1 | -1 | yes | 1 | `pralines` | | 10 | `mozimo-almond-bark-45` | Mozimo Almond Bark 45% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -2 | -2 | yes | 1 | `bark` | | 11 | `mozimo-almond-bark-60` | Mozimo Almond Bark 60% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | 0 | 0 | yes | 1 | `bark` | | 12 | `mozimo-almond-dragees-45` | Mozimo Almond Dragees 45% | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 900.0 | — | -1 | -1 | yes | 1 | `dragees` | | 13 | `mozimo-almond-dragees-60` | Mozimo Almond Dragees 60% | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 900.0 | — | -2 | -2 | yes | 1 | `dragees` | | 14 | `mozimo-almond-praline-bark` | Mozimo Almond Praline Bark | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 1200.0 | — | -2 | -2 | yes | 1 | `bark`, `pralines-bark` | | 15 | `mozimo-almond-slivers-rocks` | Mozimo Almond Slivers Rocks | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -3 | -3 | yes | 1 | `rocks-orangettes` | | 16 | `mozimo-assorted-bark-box` | Mozimo Assorted Bark Box | Mozimo Hand Crafted Chocolates | `1` | [{"name":"Title","value":"1"}] | 1200.0 | — | -1 | -1 | yes | 1 | `bark` | | 17 | `mozimo-carnival-celebration-l` | Mozimo Carnival Celebration (L) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 3900.0 | — | 0 | 0 | yes | 1 | `gift-collection`, `diwali`, `hampers-boxes` | | 18 | `mozimo-carnival-celebration-m` | Mozimo Carnival Celebration (M) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 3000.0 | — | 0 | 0 | yes | 1 | `best-sellers`, `gift-collection`, `diwali`, `hampers-boxes` | | 19 | `mozimo-carnival-celebration-s` | Mozimo Carnival Celebration (S) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 2400.0 | — | -2 | -2 | yes | 1 | `gift-collection`, `diwali`, `hampers-boxes` | | 20 | `mozimo-celestial-l` | Mozimo Celestial Hamper | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 8500.0 | — | 0 | 0 | yes | 1 | `frontpage`, `best-sellers`, `new-arrivals`, `gift-collection`, `hampers-boxes` | | 21 | `mozimo-celestial-s` | Mozimo Celestial (S) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 4500.0 | — | -2 | -2 | yes | 1 | `gift-collection`, `diwali`, `hampers-boxes` | | 22 | `mozimo-chocolate-muesli-200gm` | Mozimo Chocolate Muesli 200gm | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 300.0 | — | -2 | -2 | yes | 1 | `frontpage`, `new-arrivals` | | 23 | `mozimo-chocolate-muesli-400gm` | Mozimo Chocolate Muesli 400gm | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 550.0 | — | -3 | -3 | yes | 1 | `frontpage`, `best-sellers`, `new-arrivals` | | 24 | `mozimo-crunchy-granola-bark-45` | Mozimo Crunchy Granola Bark 45% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -1 | -1 | yes | 1 | `bark` | | 25 | `mozimo-dark-chocolate-bar-60` | Mozimo Dark Chocolate Bar 60% | Mozimo Hand Crafted Chocolates | `60gm` | [{"name":"Title","value":"60gm"}] | 265.0 | — | -5 | -5 | yes | 1 | `bars`, `best-sellers` | | 26 | `mozimo-dark-chocolate-bar-72` | Mozimo Dark Chocolate Bar 72% | Mozimo Hand Crafted Chocolates | `60gm` | [{"name":"Title","value":"60gm"}] | 265.0 | — | -1 | -1 | yes | 1 | `bars` | | 27 | `mozimo-dark-chocolate-bar-85` | Mozimo Dark Chocolate Bar 85% | Mozimo Hand Crafted Chocolates | `60gm` | [{"name":"Title","value":"60gm"}] | 265.0 | — | -1 | -1 | yes | 1 | `bars` | | 28 | `mozimo-fruits-and-nuts-bark-60` | Mozimo Fruits and Nuts Bark 60% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -1 | -1 | yes | 1 | `bark` | | 29 | `mozimo-fruits-nuts-45` | Mozimo Fruits & Nuts 45% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -2 | -2 | yes | 1 | `bark` | | 30 | `mozimo-gems-bark` | Mozimo Gems Bark | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -1 | -1 | yes | 1 | `bark` | | 31 | `mozimo-hazelnut-bark-sugar-free-45` | Mozimo Hazelnut Bark Sugar Free 45% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 550.0 | — | -8 | -8 | yes | 1 | `bark` | | 32 | `mozimo-hazelnut-dragees-45` | Mozimo Hazelnut Dragees 45% | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 900.0 | — | -1 | -1 | yes | 1 | `dragees`, `best-sellers` | | 33 | `mozimo-hazelnut-dragees-60` | Mozimo Hazelnut Dragees 60% | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 900.0 | — | -2 | -2 | yes | 1 | `dragees` | | 34 | `mozimo-hazelnut-praline-bark` | Mozimo Hazelnut Praline Bark | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 1200.0 | — | -2 | -2 | yes | 1 | `pralines-bark` | | 35 | `mozimo-hazelnuts-spread` | Mozimo Single Origin 45% Hazelnut Spread | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 550.0 | — | -5 | -5 | yes | 1 | `spreads`, `best-sellers` | | 36 | `mozimo-honey-comb` | Mozimo Honey Comb | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 400.0 | — | -4 | -4 | yes | 1 | `mozimo-delights` | | 37 | `mozimo-hot-chocolate-premix` | Mozimo Hot Chocolate Premix | Mozimo Hand Crafted Chocolates | `250gm` | [{"name":"Title","value":"250gm"}] | 825.0 | — | 0 | 0 | yes | 1 | `best-sellers`, `mozimo-delights` | | 38 | `mozimo-matcha-bark` | Mozimo Matcha Bark Box 200gm | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 1600.0 | — | 0 | 0 | yes | 1 | `frontpage`, `best-sellers` | | 39 | `mozimo-matcha-collection-box` | Mozimo Matcha Collection Box | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 3500.0 | — | 0 | 0 | yes | 1 | `frontpage`, `best-sellers`, `new-arrivals`, `gift-collection` | | 40 | `mozimo-milk-45-tuilles` | Mozimo Milk 45% Tuilles | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -2 | -2 | yes | 1 | `tuilles` | | 41 | `mozimo-milk-chocolate-bar-45` | Mozimo Milk Chocolate Bar 45% | Mozimo Hand Crafted Chocolates | `60gm` | [{"name":"Title","value":"60gm"}] | 265.0 | — | -20 | -20 | yes | 1 | `bars` | | 42 | `mozimo-nutty-bar` | Mozimo Nutty Bar | Mozimo Hand Crafted Chocolates | `1` | [{"name":"Title","value":"1"}] | 500.0 | — | -3 | -3 | yes | 1 | `bars`, `mozimo-delights` | | 43 | `mozimo-orangettes` | Mozimo Orangettes | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -7 | -7 | yes | 1 | `best-sellers`, `rocks-orangettes` | | 44 | `mozimo-pecan-bark` | Mozimo Pecan Bark | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 1200.0 | — | -2 | -2 | yes | 1 | `bark` | | 45 | `mozimo-pistachio-dragees` | Mozimo Pistachio Dragees | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 900.0 | — | 0 | 0 | yes | 1 | — | | 46 | `mozimo-praline-box-of-25` | Mozimo Praline (Box of 25) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 2700.0 | — | 0 | 0 | yes | 1 | `diwali` | | 47 | `mozimo-praline-box-of-36` | Mozimo Praline (Box of 36) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 3700.0 | — | 0 | 0 | yes | 1 | `best-sellers`, `diwali` | | 48 | `mozimo-praline-panetela` | Mozimo Praline Panetela | Mozimo Hand Crafted Chocolates | `12pc` | [{"name":"Title","value":"12pc"}] | 1300.0 | — | -1 | -1 | yes | 1 | `pralines` | | 49 | `mozimo-praline-panetela-1` | Mozimo Praline Panetela (Box of 12) | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 1300.0 | — | 0 | 0 | yes | 1 | `best-sellers`, `diwali` | | 50 | `mozimo-raspberry-bark` | Mozimo Raspberry Bark | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -2 | -2 | yes | 1 | `bark` | | 51 | `mozimo-rice-crispy-bark` | Mozimo Rice crispy Bark | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 1200.0 | — | -1 | -1 | yes | 1 | `bark` | | 52 | `mozimo-salted-butter-crunch-bark-45` | Mozimo Salted Butter Crunch Bark 45% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -2 | -2 | yes | 1 | `bark` | | 53 | `mozimo-sugar-free-dark-72-chocolate-bar` | Mozimo Sugar Free Dark 72% Chocolate Bar | Mozimo Hand Crafted Chocolates | `60gm` | [{"name":"Title","value":"60gm"}] | 330.0 | — | -6 | -6 | yes | 1 | `bars`, `best-sellers`, `sugar-free-chocolate-bar` | | 54 | `mozimo-sugar-free-milk-45-chocolate-bar` | Mozimo Sugar Free Milk 45% Chocolate Bar | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 330.0 | — | -1 | -1 | yes | 1 | `bars` | | 55 | `mozimo-white-chocolate-tuilles` | Mozimo White Chocolate Tuilles | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -1 | -1 | yes | 1 | `tuilles` | | 56 | `mozimo-whole-hazelnuts-bark-45` | Mozimo Whole Hazelnuts Bark 45% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -6 | -6 | yes | 1 | `bark` | | 57 | `mozimo-whole-hazelnuts-bark-60` | Mozimo Whole Hazelnuts Bark 60% | Mozimo Hand Crafted Chocolates | `100gm` | [{"name":"Title","value":"100gm"}] | 500.0 | — | -1 | -1 | yes | 1 | `bark` | | 58 | `pistachio-dragees` | Pistachio Dragees | My Store | `Default Title` | [{"name":"Title","value":"Default Title"}] | 900.0 | — | -1 | -1 | yes | 1 | `dragees` | | 59 | `pistachio-spread-60` | Pistachio Spread 60% | Mozimo Hand Crafted Chocolates | `200gm` | [{"name":"Title","value":"200gm"}] | 825.0 | — | -2 | -2 | yes | 1 | `spreads`, `best-sellers` | | 60 | `single-origin-coco-nibs` | Single Origin Coco Nibs | Mozimo Hand Crafted Chocolates | `150gm` | [{"name":"Title","value":"150gm"}] | 440.0 | — | -2 | -2 | yes | 1 | `mozimo-delights` | | 61 | `spreads-box` | Spreads Box | Mozimo Hand Crafted Chocolates | `Default Title` | [{"name":"Title","value":"Default Title"}] | 1650.0 | — | 0 | 0 | yes | 1 | `diwali` | --- ## 3. Variant structure — the key question ### Direct answer > **No product in this store has more than one variant.** All **61 of 61** > products have exactly **1 variant**; **0** products have 2 or more. > `variantsCount.count == 1` for every product, and total variant rows across the > catalogue = **61**. Every product without exception exposes a single option > named `Title` with exactly one selected value. ### How multi-size products are modelled: **separate products, not variants** The option is literally `Title` (Shopify's default single-variant option), and `selectedOptions` always has exactly one entry: | `selectedOptions` value | Products | | -------------------------------------------- | -------: | | `[{"name":"Title","value":"Default Title"}]` | 22 | | `[{"name":"Title","value":"100gm"}]` | 17 | | `[{"name":"Title","value":"200gm"}]` | 11 | | `[{"name":"Title","value":"60gm"}]` | 5 | | `[{"name":"Title","value":"1"}]` | 3 | | `[{"name":"Title","value":"250gm"}]` | 1 | | `[{"name":"Title","value":"150gm"}]` | 1 | | `[{"name":"Title","value":"12pc"}]` | 1 | No product exposes an option named `Size`, `Weight` or `Colour`, and no product offers two selectable values. Where a weight appears anywhere, it lives in the _variant title_ of a single-variant product (`60gm`, `100gm`, `200gm`, `250gm`, `150gm`, `12pc`, or a bare `1`), and the `Title` option carries it as its sole value. Size-family products are **separate products with separate handles**. Actual titles, variant titles and prices, as evidence: | handle | product title | variant title | price ₹ | collections | | ------------------------------- | ------------------------------- | --------------- | ------- | --------------------------------------------------------------------- | | `mozimo-carnival-celebration-s` | Mozimo Carnival Celebration (S) | `Default Title` | 2400.0 | gift-collection, diwali, hampers-boxes | | `mozimo-carnival-celebration-m` | Mozimo Carnival Celebration (M) | `Default Title` | 3000.0 | best-sellers, gift-collection, diwali, hampers-boxes | | `mozimo-carnival-celebration-l` | Mozimo Carnival Celebration (L) | `Default Title` | 3900.0 | gift-collection, diwali, hampers-boxes | | `mozimo-celestial-s` | Mozimo Celestial (S) | `Default Title` | 4500.0 | gift-collection, diwali, hampers-boxes | | `mozimo-celestial-l` | Mozimo Celestial Hamper | `Default Title` | 8500.0 | frontpage, best-sellers, new-arrivals, gift-collection, hampers-boxes | So Carnival S/M/L and Celestial S/L are **5 distinct products**, each with one `Default Title` variant. The size marker is inconsistent in the titles: Celestial L's title is `Mozimo Celestial Hamper` with no `(L)`, while its handle carries `-l`. Handles ending `-s`/`-m`/`-l` number exactly five: `mozimo-carnival-celebration-{s,m,l}`, `mozimo-celestial-{s,l}`. Other size/dimension families are likewise separate products: `mozimo-chocolate-muesli-200gm` vs `mozimo-chocolate-muesli-400gm`, `mozimo-praline-box-of-25` vs `mozimo-praline-box-of-36`, `1-kg-bark-box` vs `200-gas-bark-box`, and `mozimo-dark-chocolate-bar-60` / `-72` / `-85` plus `mozimo-milk-chocolate-bar-45`. **Conclusion for both cases: separate products only — never variants. There is no product in this store that serves several sizes as selectable options.** ### Full variant list — all 61 variants | handle | variant GID | variant title | selectedOptions | price | compareAtPrice | availableForSale | quantityAvailable | | ----------------------------------------- | --------------------------------------------- | ------------- | ------------------------------------------ | ------- | -------------- | ---------------- | ----------------- | | `1-kg-bark-box` | `gid://shopify/ProductVariant/49079272046838` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹5700.0 | null | true | 0 | | `200-gas-bark-box` | `gid://shopify/ProductVariant/49079244456182` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹1200.0 | null | true | 0 | | `4-pralines-box` | `gid://shopify/ProductVariant/47806947557622` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹440.0 | null | true | -2 | | `9-pralines-box` | `gid://shopify/ProductVariant/47806947590390` | 1 | [{"name":"Title","value":"1"}] | ₹990.0 | null | true | -3 | | `bars-box` | `gid://shopify/ProductVariant/49078921101558` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹1050.0 | null | true | 0 | | `cocoa-bean-shell` | `gid://shopify/ProductVariant/47806947459318` | 100gm | [{"name":"Title","value":"100gm"}] | ₹220.0 | null | true | 0 | | `kunafa-chocolate-bar` | `gid://shopify/ProductVariant/49079263101174` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹1600.0 | null | true | -6 | | `matcha-hazelnut-dragees-100gm` | `gid://shopify/ProductVariant/50112861831414` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹550.0 | null | true | -1 | | `matcha-strawberry-praline` | `gid://shopify/ProductVariant/49956310417654` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹440.0 | null | true | -1 | | `mozimo-almond-bark-45` | `gid://shopify/ProductVariant/47806946607350` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -2 | | `mozimo-almond-bark-60` | `gid://shopify/ProductVariant/47806946574582` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | 0 | | `mozimo-almond-dragees-45` | `gid://shopify/ProductVariant/47806946640118` | 200gm | [{"name":"Title","value":"200gm"}] | ₹900.0 | null | true | -1 | | `mozimo-almond-dragees-60` | `gid://shopify/ProductVariant/47806946869494` | 200gm | [{"name":"Title","value":"200gm"}] | ₹900.0 | null | true | -2 | | `mozimo-almond-praline-bark` | `gid://shopify/ProductVariant/47806947197174` | 200gm | [{"name":"Title","value":"200gm"}] | ₹1200.0 | null | true | -2 | | `mozimo-almond-slivers-rocks` | `gid://shopify/ProductVariant/47806946672886` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -3 | | `mozimo-assorted-bark-box` | `gid://shopify/ProductVariant/47806947623158` | 1 | [{"name":"Title","value":"1"}] | ₹1200.0 | null | true | -1 | | `mozimo-carnival-celebration-l` | `gid://shopify/ProductVariant/49079154082038` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹3900.0 | null | true | 0 | | `mozimo-carnival-celebration-m` | `gid://shopify/ProductVariant/49079147725046` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹3000.0 | null | true | 0 | | `mozimo-carnival-celebration-s` | `gid://shopify/ProductVariant/49079145595126` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹2400.0 | null | true | -2 | | `mozimo-celestial-l` | `gid://shopify/ProductVariant/49079213293814` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹8500.0 | null | true | 0 | | `mozimo-celestial-s` | `gid://shopify/ProductVariant/49079192748278` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹4500.0 | null | true | -2 | | `mozimo-chocolate-muesli-200gm` | `gid://shopify/ProductVariant/50137431736566` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹300.0 | null | true | -2 | | `mozimo-chocolate-muesli-400gm` | `gid://shopify/ProductVariant/50137463685366` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹550.0 | null | true | -3 | | `mozimo-crunchy-granola-bark-45` | `gid://shopify/ProductVariant/47806946541814` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -1 | | `mozimo-dark-chocolate-bar-60` | `gid://shopify/ProductVariant/47806947295478` | 60gm | [{"name":"Title","value":"60gm"}] | ₹265.0 | null | true | -5 | | `mozimo-dark-chocolate-bar-72` | `gid://shopify/ProductVariant/47806947098870` | 60gm | [{"name":"Title","value":"60gm"}] | ₹265.0 | null | true | -1 | | `mozimo-dark-chocolate-bar-85` | `gid://shopify/ProductVariant/47806947328246` | 60gm | [{"name":"Title","value":"60gm"}] | ₹265.0 | null | true | -1 | | `mozimo-fruits-and-nuts-bark-60` | `gid://shopify/ProductVariant/47806947852534` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -1 | | `mozimo-fruits-nuts-45` | `gid://shopify/ProductVariant/47806946279670` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -2 | | `mozimo-gems-bark` | `gid://shopify/ProductVariant/47806946509046` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -1 | | `mozimo-hazelnut-bark-sugar-free-45` | `gid://shopify/ProductVariant/47806947721462` | 100gm | [{"name":"Title","value":"100gm"}] | ₹550.0 | null | true | -8 | | `mozimo-hazelnut-dragees-45` | `gid://shopify/ProductVariant/47806946476278` | 200gm | [{"name":"Title","value":"200gm"}] | ₹900.0 | null | true | -1 | | `mozimo-hazelnut-dragees-60` | `gid://shopify/ProductVariant/47806946312438` | 200gm | [{"name":"Title","value":"200gm"}] | ₹900.0 | null | true | -2 | | `mozimo-hazelnut-praline-bark` | `gid://shopify/ProductVariant/47806947000566` | 200gm | [{"name":"Title","value":"200gm"}] | ₹1200.0 | null | true | -2 | | `mozimo-hazelnuts-spread` | `gid://shopify/ProductVariant/47806946771190` | 200gm | [{"name":"Title","value":"200gm"}] | ₹550.0 | null | true | -5 | | `mozimo-honey-comb` | `gid://shopify/ProductVariant/47806947164406` | 100gm | [{"name":"Title","value":"100gm"}] | ₹400.0 | null | true | -4 | | `mozimo-hot-chocolate-premix` | `gid://shopify/ProductVariant/47806946803958` | 250gm | [{"name":"Title","value":"250gm"}] | ₹825.0 | null | true | 0 | | `mozimo-matcha-bark` | `gid://shopify/ProductVariant/50112483590390` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹1600.0 | null | true | 0 | | `mozimo-matcha-collection-box` | `gid://shopify/ProductVariant/49947063976182` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹3500.0 | null | true | 0 | | `mozimo-milk-45-tuilles` | `gid://shopify/ProductVariant/47806946935030` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -2 | | `mozimo-milk-chocolate-bar-45` | `gid://shopify/ProductVariant/47806947361014` | 60gm | [{"name":"Title","value":"60gm"}] | ₹265.0 | null | true | -20 | | `mozimo-nutty-bar` | `gid://shopify/ProductVariant/47806946738422` | 1 | [{"name":"Title","value":"1"}] | ₹500.0 | null | true | -3 | | `mozimo-orangettes` | `gid://shopify/ProductVariant/47806947393782` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -7 | | `mozimo-pecan-bark` | `gid://shopify/ProductVariant/47806947033334` | 200gm | [{"name":"Title","value":"200gm"}] | ₹1200.0 | null | true | -2 | | `mozimo-pistachio-dragees` | `gid://shopify/ProductVariant/47806946345206` | 200gm | [{"name":"Title","value":"200gm"}] | ₹900.0 | null | true | 0 | | `mozimo-praline-box-of-25` | `gid://shopify/ProductVariant/49079282696438` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹2700.0 | null | true | 0 | | `mozimo-praline-box-of-36` | `gid://shopify/ProductVariant/49079289741558` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹3700.0 | null | true | 0 | | `mozimo-praline-panetela` | `gid://shopify/ProductVariant/47806947131638` | 12pc | [{"name":"Title","value":"12pc"}] | ₹1300.0 | null | true | -1 | | `mozimo-praline-panetela-1` | `gid://shopify/ProductVariant/49079278239990` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹1300.0 | null | true | 0 | | `mozimo-raspberry-bark` | `gid://shopify/ProductVariant/47806946705654` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -2 | | `mozimo-rice-crispy-bark` | `gid://shopify/ProductVariant/47806947066102` | 200gm | [{"name":"Title","value":"200gm"}] | ₹1200.0 | null | true | -1 | | `mozimo-salted-butter-crunch-bark-45` | `gid://shopify/ProductVariant/47806947786998` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -2 | | `mozimo-sugar-free-dark-72-chocolate-bar` | `gid://shopify/ProductVariant/47806947655926` | 60gm | [{"name":"Title","value":"60gm"}] | ₹330.0 | null | true | -6 | | `mozimo-sugar-free-milk-45-chocolate-bar` | `gid://shopify/ProductVariant/49080727372022` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹330.0 | null | true | -1 | | `mozimo-white-chocolate-tuilles` | `gid://shopify/ProductVariant/47806946902262` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -1 | | `mozimo-whole-hazelnuts-bark-45` | `gid://shopify/ProductVariant/47806946410742` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -6 | | `mozimo-whole-hazelnuts-bark-60` | `gid://shopify/ProductVariant/47806946377974` | 100gm | [{"name":"Title","value":"100gm"}] | ₹500.0 | null | true | -1 | | `pistachio-dragees` | `gid://shopify/ProductVariant/47801725092086` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹900.0 | null | true | -1 | | `pistachio-spread-60` | `gid://shopify/ProductVariant/47806947754230` | 200gm | [{"name":"Title","value":"200gm"}] | ₹825.0 | null | true | -2 | | `single-origin-coco-nibs` | `gid://shopify/ProductVariant/47806947426550` | 150gm | [{"name":"Title","value":"150gm"}] | ₹440.0 | null | true | -2 | | `spreads-box` | `gid://shopify/ProductVariant/49079091003638` | Default Title | [{"name":"Title","value":"Default Title"}] | ₹1650.0 | null | true | 0 | `sku` is `null`/`""` and `barcode` unset for every row above; `weight` is set (GRAMS) for every row; `taxable` and `requiresShipping` are `true` for every row. --- ## 4. Collections **16 collections**, returned complete by `collections(first: 50)` with no next page. Every collection's product list was read separately and none was truncated (`hasNextPage: false` on a `first: 250` products connection). | handle | title | products | image | description | | -------------------------- | ------------------------ | -------: | ----- | ------------------------------------------------------------------------------------------ | | `bark` | Barks | 15 | — | — | | `bars` | Bars | 7 | — | Chocolate Bars | | `best-sellers` | Best Sellers | 17 | yes | — | | `diwali` | Diwali | 12 | — | Diwali Gifting Collection | | `dragees` | Dragees | 6 | — | Dragees | | `frontpage` | Home page | 5 | — | — | | `gift-collection` | Gift Collection | 10 | yes | Discover the art of thoughtful gifting with Mozimo’s handcrafted chocolate gifting collect | | `hampers-boxes` | Hampers & Boxes | 6 | — | — | | `mozimo-delights` | Mozimo Delights | 5 | — | — | | `new-arrivals` | New Arrivals | 4 | yes | — | | `pralines` | Pralines | 4 | — | — | | `pralines-bark` | Pralines Bark | 2 | — | — | | `rocks-orangettes` | Rocks / Orangettes | 2 | — | — | | `spreads` | Spreads | 2 | — | Spreads | | `sugar-free-chocolate-bar` | Sugar Free Chocolate Bar | 1 | — | — | | `tuilles` | Tuilles | 2 | — | — | ### Membership of the main collections **`bark` (Barks) — 15** `mozimo-almond-bark-45`, `mozimo-almond-bark-60`, `mozimo-whole-hazelnuts-bark-45`, `mozimo-whole-hazelnuts-bark-60`, `mozimo-fruits-nuts-45`, `mozimo-fruits-and-nuts-bark-60`, `mozimo-gems-bark`, `mozimo-rice-crispy-bark`, `mozimo-raspberry-bark`, `mozimo-pecan-bark`, `mozimo-crunchy-granola-bark-45`, `mozimo-salted-butter-crunch-bark-45`, `mozimo-hazelnut-bark-sugar-free-45`, `mozimo-assorted-bark-box`, `mozimo-almond-praline-bark` **`bars` (Bars) — 7** `mozimo-dark-chocolate-bar-85`, `mozimo-dark-chocolate-bar-72`, `mozimo-dark-chocolate-bar-60`, `mozimo-milk-chocolate-bar-45`, `mozimo-sugar-free-dark-72-chocolate-bar`, `mozimo-sugar-free-milk-45-chocolate-bar`, `mozimo-nutty-bar` **`best-sellers` (Best Sellers) — 17** `mozimo-hot-chocolate-premix`, `200-gas-bark-box`, `kunafa-chocolate-bar`, `mozimo-celestial-l`, `mozimo-carnival-celebration-m`, `mozimo-dark-chocolate-bar-60`, `mozimo-sugar-free-dark-72-chocolate-bar`, `mozimo-hazelnut-dragees-45`, `mozimo-orangettes`, `mozimo-praline-box-of-36`, `mozimo-praline-panetela-1`, `mozimo-hazelnuts-spread`, `pistachio-spread-60`, `mozimo-matcha-collection-box`, `mozimo-matcha-bark`, `matcha-hazelnut-dragees-100gm`, `mozimo-chocolate-muesli-400gm` **`diwali` (Diwali) — 12** `bars-box`, `spreads-box`, `mozimo-carnival-celebration-s`, `mozimo-carnival-celebration-m`, `mozimo-carnival-celebration-l`, `mozimo-celestial-s`, `200-gas-bark-box`, `kunafa-chocolate-bar`, `1-kg-bark-box`, `mozimo-praline-panetela-1`, `mozimo-praline-box-of-25`, `mozimo-praline-box-of-36` **`gift-collection` (Gift Collection) — 10** `mozimo-celestial-l`, `1-kg-bark-box`, `mozimo-celestial-s`, `mozimo-carnival-celebration-l`, `mozimo-matcha-collection-box`, `mozimo-carnival-celebration-m`, `mozimo-carnival-celebration-s`, `200-gas-bark-box`, `bars-box`, `9-pralines-box` **`hampers-boxes` (Hampers & Boxes) — 6** `mozimo-celestial-s`, `mozimo-carnival-celebration-s`, `1-kg-bark-box`, `mozimo-celestial-l`, `mozimo-carnival-celebration-l`, `mozimo-carnival-celebration-m` **`dragees` (Dragees) — 6** `mozimo-almond-dragees-60`, `mozimo-almond-dragees-45`, `mozimo-hazelnut-dragees-60`, `mozimo-hazelnut-dragees-45`, `pistachio-dragees`, `matcha-hazelnut-dragees-100gm` **`pralines` (Pralines) — 4** `9-pralines-box`, `matcha-strawberry-praline`, `4-pralines-box`, `mozimo-praline-panetela` **`frontpage` (Home page) — 5** `mozimo-chocolate-muesli-400gm`, `mozimo-chocolate-muesli-200gm`, `mozimo-matcha-bark`, `mozimo-matcha-collection-box`, `mozimo-celestial-l` **`mozimo-delights` (Mozimo Delights) — 5** `mozimo-honey-comb`, `single-origin-coco-nibs`, `mozimo-nutty-bar`, `cocoa-bean-shell`, `mozimo-hot-chocolate-premix` **`new-arrivals` (New Arrivals) — 4** `mozimo-matcha-collection-box`, `mozimo-chocolate-muesli-200gm`, `mozimo-chocolate-muesli-400gm`, `mozimo-celestial-l` **`spreads` (Spreads) — 2** `mozimo-hazelnuts-spread`, `pistachio-spread-60` **`tuilles` (Tuilles) — 2** `mozimo-milk-45-tuilles`, `mozimo-white-chocolate-tuilles` **`rocks-orangettes` (Rocks / Orangettes) — 2** `mozimo-orangettes`, `mozimo-almond-slivers-rocks` **`pralines-bark` (Pralines Bark) — 2** `mozimo-almond-praline-bark`, `mozimo-hazelnut-praline-bark` **`sugar-free-chocolate-bar` (Sugar Free Chocolate Bar) — 1** `mozimo-sugar-free-dark-72-chocolate-bar` **Products in no collection at all: `mozimo-pistachio-dragees`** (published and `availableForSale: true`, yet in zero collections). `mozimo-hazelnut-bark-sugar-free-45` sits in `bark` only and is **not** in `sugar-free-chocolate-bar`. ### Divergence from `src/data/catalog.ts` Hardcoded collection URLs found in `catalog.ts` (`collections`, `signatures`, `giftingTabs`, `experienceTiles`) versus live: | hardcoded `url:` | live status | live product count | | ------------------------------ | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | | `/collections/bars` | exists | 7 | | `/collections/bark` | exists | 15 | | `/collections/pralines` | exists | 4 | | `/collections/spreads` | exists | 2 | | `/collections/dragees` | exists | 6 | | `/collections/tuilles` | exists | 2 | | `/collections/gift-collection` | exists | 10 | | `/collections/best-sellers` | exists | 17 | | `/collections/diwali` | exists | 12 | | `/collections/all` | **not returned by `collection(handle:"all")`** (`null`) | — (Shopify's built-in "all" pseudo-collection is not exposed via this handle on the Storefront API) | Named-collection divergences: | `catalog.ts` collection name | hardcoded `url` | live collection with that name | Divergence | | ---------------------------- | ------------------------------ | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | Bars | `/collections/bars` | `bars` — "Bars" | name matches; live count 7 | | Barks | `/collections/bark` | `bark` — "Barks" | name matches; live count 15 | | Pralines | `/collections/pralines` | `pralines` — "Pralines" | name matches; live count 4 | | Spreads | `/collections/spreads` | `spreads` — "Spreads" | name matches; live count 2 | | Dragees | `/collections/dragees` | `dragees` — "Dragees" | name matches; live count 6 | | Tuilles & Rocks | `/collections/tuilles` | `tuilles` — "Tuilles" **and** `rocks-orangettes` — "Rocks / Orangettes" | **merged in code, split in Shopify**: `mozimo-orangettes` and `mozimo-almond-slivers-rocks` live in `rocks-orangettes`, not `tuilles` | | Gifting | `/collections/gift-collection` | `gift-collection` — "Gift Collection" | name matches; live count 10 | `signatures` in `catalog.ts` points only at existing handles (`gift-collection`, `pralines`, `bars`, `all`) but its entries "The Signature Box", "The Praline Collection", "The Dark Collection", "The Festive Collection", "The Chocolate Bar" and "The Mozimo Gifts" have **no corresponding collection objects in the store** — they are editorial constructs, not Shopify collections. Seven Shopify collections have a live counterpart referenced from code: bars, bark, pralines, spreads, dragees, tuilles, plus gift-collection for the Gifting entry. Collections that exist in Shopify but are **absent from `catalog.ts`** entirely (no hardcoded `url` references them): `best-sellers` (17), `diwali` (12), `hampers-boxes` (6), `frontpage` (5), `mozimo-delights` (5), `new-arrivals` (4), `pralines-bark` (2), `rocks-orangettes` (2, but its products are miscategorised under `tuilles` in code), `sugar-free-chocolate-bar` (1). Only `best-sellers` and `diwali` appear in code at all, and only as CTA URLs inside `giftingTabs`, not as data. `giftingTabs` in `catalog.ts` (7 tabs; 4 with product lists): | tab id | name | note | hardcoded product handles | all handles live? | | -------------- | ---------------- | ---------------- | ---------------------------------------------------------------------------------------- | ----------------- | | `signature` | Signature | From ₹265 | `mozimo-dark-chocolate-bar-85`, `9-pralines-box`, `bars-box` | yes | | `best-sellers` | Best Sellers | From ₹825 | `pistachio-spread-60`, `mozimo-almond-dragees-60`, `kunafa-chocolate-bar`, `spreads-box` | yes | | `exquisite` | Exquisite | From ₹2,400 | `mozimo-carnival-celebration-s`, `mozimo-carnival-celebration-m` | yes | | `premium` | Premium | From ₹3,900 | `mozimo-carnival-celebration-l`, `mozimo-celestial-s` | yes | | `seasonal` | Seasonal | Limited editions | none (`mode: "seasonal"`) | n/a | | `corporate` | Corporate & Bulk | At scale | none (`mode: "enquiry"`) | n/a | | `bespoke` | Bespoke Gifting | Made to order | none (`mode: "enquiry"`) | n/a | Tab CTAs point to `/collections/gift-collection` (all but `best-sellers`, which points to `/collections/best-sellers`). Live `best-sellers` contains **17** products; the code's tab lists only 4 of them. Hardcoded product handles in `catalog.ts` (`bestsellers`, `gifting`, `pantry`, `giftingTabs`, `seasonal`) versus live — **all 15 resolve**: | handle | live title | live price ₹ | in code as | | ------------------------------- | ------------------------------- | ------------ | ----------------------------------- | | `mozimo-dark-chocolate-bar-85` | Mozimo Dark Chocolate Bar 85% | 265.0 | bestsellers, signature tab | | `9-pralines-box` | 9 Pralines Box | 990.0 | bestsellers, signature tab | | `pistachio-spread-60` | Pistachio Spread 60% | 825.0 | bestsellers, best-sellers tab | | `mozimo-almond-dragees-60` | Mozimo Almond Dragees 60% | 900.0 | bestsellers, best-sellers tab | | `kunafa-chocolate-bar` | Kunafa Chocolate Bar | 1600.0 | bestsellers, best-sellers tab | | `mozimo-carnival-celebration-s` | Mozimo Carnival Celebration (S) | 2400.0 | bestsellers, gifting, exquisite tab | | `mozimo-carnival-celebration-m` | Mozimo Carnival Celebration (M) | 3000.0 | gifting, exquisite tab | | `mozimo-carnival-celebration-l` | Mozimo Carnival Celebration (L) | 3900.0 | gifting, premium tab | | `mozimo-celestial-s` | Mozimo Celestial (S) | 4500.0 | gifting, premium tab | | `bars-box` | Bars Box | 1050.0 | gifting, signature tab | | `spreads-box` | Spreads Box | 1650.0 | gifting, best-sellers tab | | `single-origin-coco-nibs` | Single Origin Coco Nibs | 440.0 | pantry | | `cocoa-bean-shell` | Cocoa Bean Shell | 220.0 | pantry | | `mozimo-hot-chocolate-premix` | Mozimo Hot Chocolate Premix | 825.0 | pantry | | `mozimo-honey-comb` | Mozimo Honey Comb | 400.0 | pantry | Also referenced in code: `rakhi-bark-box-200gm` (as `"/products/rakhi-bark-box-200gm"`) — **this handle does not exist in the live catalogue**. By contrast the live catalogue has **46 products that appear nowhere in `catalog.ts`**, including whole families with no code representation: the entire matcha line (`mozimo-matcha-bark`, `mozimo-matcha-collection-box`, `matcha-hazelnut-dragees-100gm`, `matcha-strawberry-praline`), the muesli line (`mozimo-chocolate-muesli-200gm` / `-400gm`), the 1 kg and 200 g bark boxes, `mozimo-celestial-l` (₹8500, the most expensive product), the praline boxes of 25/36, the sugar-free bars and bark, and 15 of the 17 `best-sellers` entries. --- ## 5. Discounts, gift cards, selling plans All of the following were queried explicitly against 2026-10. | Thing | Query attempted | Result | | ------------------------ | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | | Discount codes (list) | `discountCodes(first: 5)` on `QueryRoot` | **Field does not exist**: `Field 'discountCodes' doesn't exist on type 'QueryRoot'` | | Discount nodes (list) | `discountNodes(first: 5)` on `QueryRoot` | **Field does not exist**: `Field 'discountNodes' doesn't exist on type 'QueryRoot'` | | Gift cards (list) | `giftCards(first: 5)` on `QueryRoot` | **Field does not exist**: `Field 'giftCards' doesn't exist on type 'QueryRoot'` | | Gift card products | `Product.isGiftCard` over all 61 products | `false` × 61 — **no gift-card product exists** | | Selling plans | `Product.sellingPlanGroups(first: 5)` | ACCESS_DENIED — requires `unauthenticated_read_selling_plans` (minted token lacks it) | | Selling plans (indirect) | `Product.requiresSellingPlan` over all 61 products | `false` × 61 — no product requires a selling plan | | Cart discount codes | `Cart.discountCodes` (`CartDiscountCode { code, applicable }`) | Field exists on `Cart`; only reachable with a live cart id. No code values are enumerable | | Cart applied discounts | `Cart.discountApplications`, `Cart.appliedGiftCards` | Fields exist on `Cart`; only reachable with a live cart id | | Empty cart probe | `cartCreate(input: { lines: [] })` | Succeeded (id returned, no userErrors). Nothing configured can be read without adding lines | **Findings, stated as absence where that is the evidence:** - The Storefront API at 2026-10 exposes **no queryable list of discount codes and no queryable list/type of automatic discounts**. Discount data is only reachable per-cart (`Cart.discountCodes` / `Cart.discountApplications`). Whether the store has any discount configured is therefore **unverified** from the Storefront API — it cannot be enumerated. - **No gift cards**: no `QueryRoot.giftCards`, and no product with `isGiftCard: true`. This is a genuine absence, not a scope error. - **No subscription/selling plans in evidence**: `requiresSellingPlan` is `false` for all 61 products, and the one query that could confirm selling-plan groups is scope-blocked. The strongest honest statement is: no product requires a selling plan; selling-plan _groups_ are unverified (access denied). - `Shop.subscriptionPolicy` and `Shop.termsOfSale` exist as policies, which only indicates the store has a subscription policy text configured, not that any selling plan exists. --- ## 6. Metafield coverage Coverage was measured by querying product metafields with an explicit `identifiers` list (the Storefront API's `Product.metafields` requires `identifiers` and cannot be paginated — `first:` is rejected with "does not accept argument 'first'", and empty identifiers return `[]`). The identifier list covered every key `src/lib/shopify.ts` queries, plus plausible variants. Any metafield key **outside** that list cannot be enumerated through the Storefront API and would show as absent here — flagged as **unverified**. Keys queried: `custom.tagline`, `custom.ingredients`, `custom.ingredients_list`, `custom.storage`, `custom.energy_kcal`, `custom.protein_g`, `custom.total_fat_g`, `custom.saturated_fat_g`, `custom.carbohydrate_g`, `custom.sugar_g`, `custom.added_sugar_g`, `custom.sodium_mg`, `custom.nutrition`, `custom.weight`, `custom.allergens`, `custom.shelf_life`, `facts.nutrition`, `facts.ingredients`, `facts.storage`, `facts.allergens`, `facts.tagline`. ### Which keys are actually populated (product level) | Key | Type | Products populated (of 61) | | ---------------------------------------------------------- | ------------------------ | -------------------------: | | `custom.ingredients` | `multi_line_text_field` | 20 | | `custom.energy_kcal` | `number_decimal` | 20 | | `custom.protein_g` | `number_decimal` | 20 | | `custom.total_fat_g` | `number_decimal` | 20 | | `custom.saturated_fat_g` | `number_decimal` | 20 | | `custom.sodium_mg` | `number_decimal` | 20 | | `custom.carbohydrate_g` | `number_decimal` | 20 | | `custom.sugar_g` | `number_decimal` | 18 | | `custom.added_sugar_g` | `number_decimal` | 17 | | `custom.tagline` | `single_line_text_field` | **1** | | `custom.storage` | — | 0 | | `custom.ingredients_list` | — | 0 | | `custom.nutrition` | — | 0 | | `custom.weight` / `custom.allergens` / `custom.shelf_life` | — | 0 | | `facts.nutrition` | — | **0** | | `facts.ingredients` | — | **0** | | `facts.storage` | — | **0** | | `facts.allergens` / `facts.tagline` | — | 0 | The `facts.*` namespace is **completely empty across the catalogue**. The compat path in `shapeProduct` (`facts.nutrition` JSON array, `facts.ingredients`, `facts.storage`) will never fire for any product. No collection-level metafields were populated either (the same identifier list was queried on all 16 collections; every entry was `null`). ### Products with NO metafields at all: 41 of 61 Products with zero populated metafields from the queried list, so both **ingredients and nutrition are absent** (those are the fields shown on product pages). All **41**, alphabetical — this is the same list that appears as `0/8` in the per-product table at the end of this section: `1-kg-bark-box`, `200-gas-bark-box`, `9-pralines-box`, `bars-box`, `cocoa-bean-shell`, `kunafa-chocolate-bar`, `matcha-strawberry-praline`, `mozimo-almond-bark-45`, `mozimo-almond-bark-60`, `mozimo-almond-praline-bark`, `mozimo-assorted-bark-box`, `mozimo-carnival-celebration-l`, `mozimo-carnival-celebration-m`, `mozimo-carnival-celebration-s`, `mozimo-celestial-l`, `mozimo-celestial-s`, `mozimo-crunchy-granola-bark-45`, `mozimo-fruits-and-nuts-bark-60`, `mozimo-fruits-nuts-45`, `mozimo-gems-bark`, `mozimo-hazelnut-bark-sugar-free-45`, `mozimo-hazelnut-praline-bark`, `mozimo-honey-comb`, `mozimo-matcha-bark`, `mozimo-matcha-collection-box`, `mozimo-milk-45-tuilles`, `mozimo-nutty-bar`, `mozimo-pecan-bark`, `mozimo-praline-box-of-25`, `mozimo-praline-box-of-36`, `mozimo-praline-panetela`, `mozimo-praline-panetela-1`, `mozimo-raspberry-bark`, `mozimo-rice-crispy-bark`, `mozimo-salted-butter-crunch-bark-45`, `mozimo-white-chocolate-tuilles`, `mozimo-whole-hazelnuts-bark-45`, `mozimo-whole-hazelnuts-bark-60`, `pistachio-dragees`, `single-origin-coco-nibs`, `spreads-box` ### Products with ingredient + nutrition coverage: 20 of 61 All 20 carry `custom.ingredients` and a majority of the eight nutrient fields. `custom.tagline` is populated on exactly **one** product in the whole store: `4-pralines-box` = `"Roasted almonds coated in our 45% dark milk chocolate"`. The 20 covered handles, alphabetical: `4-pralines-box`, `matcha-hazelnut-dragees-100gm`, `mozimo-almond-dragees-45`, `mozimo-almond-dragees-60`, `mozimo-almond-slivers-rocks`, `mozimo-chocolate-muesli-200gm`, `mozimo-chocolate-muesli-400gm`, `mozimo-dark-chocolate-bar-60`, `mozimo-dark-chocolate-bar-72`, `mozimo-dark-chocolate-bar-85`, `mozimo-hazelnut-dragees-45`, `mozimo-hazelnut-dragees-60`, `mozimo-hazelnuts-spread`, `mozimo-hot-chocolate-premix`, `mozimo-milk-chocolate-bar-45`, `mozimo-orangettes`, `mozimo-pistachio-dragees`, `mozimo-sugar-free-dark-72-chocolate-bar`, `mozimo-sugar-free-milk-45-chocolate-bar`, `pistachio-spread-60` Partial nutrition — fewer than 8 of 8 nutrient fields: | handle | fields present | missing | | ----------------------------------------- | ------------------------------------------------------------------------------------------------- | ---------------------------------------- | | `mozimo-sugar-free-dark-72-chocolate-bar` | 6/8 — `energy_kcal`, `protein_g`, `total_fat_g`, `saturated_fat_g`, `carbohydrate_g`, `sodium_mg` | `custom.sugar_g`, `custom.added_sugar_g` | | `mozimo-sugar-free-milk-45-chocolate-bar` | 6/8 — same six | `custom.sugar_g`, `custom.added_sugar_g` | | `pistachio-spread-60` | 7/8 — adds `sugar_g` | `custom.added_sugar_g` | Full nutrition — 17 products carry all 8 nutrient fields. Sample of a complete record (`mozimo-dark-chocolate-bar-85`): ``` custom.ingredients = "Cocoa Mass\nCocoa Butter\nSugar Grain\nSalt White\n" custom.energy_kcal = 485.66 custom.protein_g = 11.01 custom.total_fat_g = 41.03 custom.saturated_fat_g = 24.57 custom.carbohydrate_g= 42.39 custom.sugar_g = 14.9 custom.added_sugar_g = 14.9 custom.sodium_mg = 38.76 ``` Sample of a partial record (`mozimo-sugar-free-dark-72-chocolate-bar`): ``` custom.ingredients = "Cocoa Mass\nCocoa Butter\nErythritol\nStevia\nSalt White\n" custom.energy_kcal = 374.37 custom.protein_g = 9.15 custom.total_fat_g = 35.46 custom.saturated_fat_g = 21.22 custom.carbohydrate_g= 50.72 custom.sodium_mg = 38.76 custom.sugar_g = (absent) custom.added_sugar_g = (absent) ``` Per-product metafield table (all 61 products; `tagline` = `custom.tagline`, `ingr` = `custom.ingredients`, `nutr` = number of the 8 `custom.*` nutrient fields present, `facts` / `other` = any `facts.*` or other keys found): | handle | tagline | ingr | nutr | facts.* | other keys | | ----------------------------------------- | ------- | ---- | ---- | ------- | ---------------- | | `1-kg-bark-box` | — | — | 0/8 | — | — | | `200-gas-bark-box` | — | — | 0/8 | — | — | | `4-pralines-box` | yes | yes | 8/8 | — | `custom.tagline` | | `9-pralines-box` | — | — | 0/8 | — | — | | `bars-box` | — | — | 0/8 | — | — | | `cocoa-bean-shell` | — | — | 0/8 | — | — | | `kunafa-chocolate-bar` | — | — | 0/8 | — | — | | `matcha-hazelnut-dragees-100gm` | — | yes | 8/8 | — | — | | `matcha-strawberry-praline` | — | — | 0/8 | — | — | | `mozimo-almond-bark-45` | — | — | 0/8 | — | — | | `mozimo-almond-bark-60` | — | — | 0/8 | — | — | | `mozimo-almond-dragees-45` | — | yes | 8/8 | — | — | | `mozimo-almond-dragees-60` | — | yes | 8/8 | — | — | | `mozimo-almond-praline-bark` | — | — | 0/8 | — | — | | `mozimo-almond-slivers-rocks` | — | yes | 8/8 | — | — | | `mozimo-assorted-bark-box` | — | — | 0/8 | — | — | | `mozimo-carnival-celebration-l` | — | — | 0/8 | — | — | | `mozimo-carnival-celebration-m` | — | — | 0/8 | — | — | | `mozimo-carnival-celebration-s` | — | — | 0/8 | — | — | | `mozimo-celestial-l` | — | — | 0/8 | — | — | | `mozimo-celestial-s` | — | — | 0/8 | — | — | | `mozimo-chocolate-muesli-200gm` | — | yes | 8/8 | — | — | | `mozimo-chocolate-muesli-400gm` | — | yes | 8/8 | — | — | | `mozimo-crunchy-granola-bark-45` | — | — | 0/8 | — | — | | `mozimo-dark-chocolate-bar-60` | — | yes | 8/8 | — | — | | `mozimo-dark-chocolate-bar-72` | — | yes | 8/8 | — | — | | `mozimo-dark-chocolate-bar-85` | — | yes | 8/8 | — | — | | `mozimo-fruits-and-nuts-bark-60` | — | — | 0/8 | — | — | | `mozimo-fruits-nuts-45` | — | — | 0/8 | — | — | | `mozimo-gems-bark` | — | — | 0/8 | — | — | | `mozimo-hazelnut-bark-sugar-free-45` | — | — | 0/8 | — | — | | `mozimo-hazelnut-dragees-45` | — | yes | 8/8 | — | — | | `mozimo-hazelnut-dragees-60` | — | yes | 8/8 | — | — | | `mozimo-hazelnut-praline-bark` | — | — | 0/8 | — | — | | `mozimo-hazelnuts-spread` | — | yes | 8/8 | — | — | | `mozimo-honey-comb` | — | — | 0/8 | — | — | | `mozimo-hot-chocolate-premix` | — | yes | 8/8 | — | — | | `mozimo-matcha-bark` | — | — | 0/8 | — | — | | `mozimo-matcha-collection-box` | — | — | 0/8 | — | — | | `mozimo-milk-45-tuilles` | — | — | 0/8 | — | — | | `mozimo-milk-chocolate-bar-45` | — | yes | 8/8 | — | — | | `mozimo-nutty-bar` | — | — | 0/8 | — | — | | `mozimo-orangettes` | — | yes | 8/8 | — | — | | `mozimo-pecan-bark` | — | — | 0/8 | — | — | | `mozimo-pistachio-dragees` | — | yes | 8/8 | — | — | | `mozimo-praline-box-of-25` | — | — | 0/8 | — | — | | `mozimo-praline-box-of-36` | — | — | 0/8 | — | — | | `mozimo-praline-panetela` | — | — | 0/8 | — | — | | `mozimo-praline-panetela-1` | — | — | 0/8 | — | — | | `mozimo-raspberry-bark` | — | — | 0/8 | — | — | | `mozimo-rice-crispy-bark` | — | — | 0/8 | — | — | | `mozimo-salted-butter-crunch-bark-45` | — | — | 0/8 | — | — | | `mozimo-sugar-free-dark-72-chocolate-bar` | — | yes | 6/8 | — | — | | `mozimo-sugar-free-milk-45-chocolate-bar` | — | yes | 6/8 | — | — | | `mozimo-white-chocolate-tuilles` | — | — | 0/8 | — | — | | `mozimo-whole-hazelnuts-bark-45` | — | — | 0/8 | — | — | | `mozimo-whole-hazelnuts-bark-60` | — | — | 0/8 | — | — | | `pistachio-dragees` | — | — | 0/8 | — | — | | `pistachio-spread-60` | — | yes | 7/8 | — | — | | `single-origin-coco-nibs` | — | — | 0/8 | — | — | | `spreads-box` | — | — | 0/8 | — | — | ## 7. Currency and markets | Signal | Value | | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | Store currency | `INR` (from `paymentSettings.currencyCode`) | | Presentment currencies enabled | `["INR"]` — **one** | | `Shop.moneyFormat` | `Rs. {{amount}}` | | `Localization.country` | `IN`, currency `INR` (symbol `₹`) | | `Localization.language` | `EN` | | `availableCountries` | **only** `IN` (India) | | `availableLanguages` | **only** `EN` | | `shipsToCountries` | **29 codes** — `AE, AT, AU, BE, CA, CH, CZ, DE, DK, ES, FI, FR, GB, HK, IE, IL, IN, IT, JP, KR, MY, NL, NO, NZ, PL, PT, SE, SG, US` | | Currency code seen on every money field | `INR` on all 61 product prices, all 61 variant prices, and both price ranges — no second currency anywhere | The store returns a **single currency (INR)** at a **single localization country (India)**. Shopify Markets is either not configured or not exposing any additional market through the Storefront API with this token: `enabledPresentmentCurrencies` has one entry, `availableCountries` has one entry, and no query returned a currency code other than `INR`. There is one visible asymmetry: `Shop.shipsToCountries` lists 29 destinations including the `US`, `GB`, `AU`, `SG`, `AE` and most of the EU, while `Localization.availableCountries` exposes only `IN` and the shipping-policy body says the website "currently ships to addresses within India only" and "We are currently delivering Pan India". The Storefront API does not reconcile these. Whether a real multi-country market exists in admin is **unverified**; all the API will price or localize for is `INR`/`IN`. --- ## Appendix — what could not be determined Stated explicitly rather than guessed: 1. **Discount codes / automatic discounts** — no Storefront query exists (`discountCodes`, `discountNodes` are undefined fields on `QueryRoot`). Presence or absence is **unverified**. 2. **Selling-plan groups** — `Product.sellingPlanGroups` is ACCESS_DENIED with the minted token (`unauthenticated_read_selling_plans`). Only the negative signal `requiresSellingPlan: false` × 61 is available. **Unverified.** 3. **Real payment providers / gateways, UPI, COD** — not exposed by the Storefront API at all. **Unverified.** 4. **Metafield keys outside the queried identifier list** — `Product.metafields` cannot be paginated or enumerated at 2026-10; only known keys can be read. Any additional custom keys on products are invisible to this capture. **Unverified.** 5. **Pickup locations** — `QueryRoot.locations` ACCESS_DENIED (`unauthenticated_read_product_pickup_locations`). **Unverified.** 6. **Whether negative inventory is an intentional "made to order" model** — the API shows `quantityAvailable` of −1 to −20 with `availableForSale: true` on all 61 products. The API does not explain it. **Not determinable.** 7. **Whether a second Shopify Market exists in admin** — nothing on the Storefront API evidences it. **Unverified.** 8. **`acceptedCardBrands` / `supportedDigitalWallets` being empty** — most likely a token-scope artifact, not a store setting. **Unverified.** 9. **Static `SHOPIFY_STOREFRONT_ACCESS_TOKEN` token's scopes** — this capture used the minted token; the static token may have a different (possibly wider) scope set. **Unverified.**