Files
mozimo.in/docs/shopify-catalog-inventory.md
T
tanshu de0553d0d4 Wayfinder: chart the Shopify headless commerce map
The route from "mozimo.in displays Shopify products" to "mozimo.in sells them",
as a plan with a phase spine and gates, plus the open decision tickets that
still shape it and the evidence they rest on.

- .scratch/shopify-headless-commerce/: plan.md (phases and gates), map.md (the
  wayfinder map), 10 open decision tickets
- CONTEXT.md: Storefront / Theme store / Cart / Parity vocabulary
- docs/adr/0001-0003: Checkout stays Shopify-hosted, one Variant per product,
  the checkout domain stays shop.mozimo.in
- docs/research/ and docs/shopify-catalog-inventory.md: verified store facts,
  the Cart API probe, and the catalogue inventory

Raw Shopify doc scrapes under .scratch/shopify-research/ are ignored: they are
working material, not record.
2026-10-14 09:00:42 +05:30

857 lines
95 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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://<domain>/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.**