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.
This commit is contained in:
tanshu committed 2026-10-14 09:00:42 +05:30
1 parent bb0c78fec5
commit de0553d0d4
21 files changed
+3483

No files matched your search

+856
View File
@@ -0,0 +1,856 @@
# 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.**