Site architecture · v0.1 · 2026-04-29

Site architecture & per-page specs

Every page that needs to exist, in build order. Each card carries the four fields we use to call a page "done": purpose, sections (in order), data sources, and the acceptance criteria.

How to read this

This is the working reference we pull up while building. Cards are grouped by type (Customer-facing pages → Templates → Utility & policy). Within each group they appear roughly in build order — the order we tackle them in once the brand direction is locked.

"Done" criteria are testable. A page is finished when every item under "Done when" passes. No vibes. This protects velocity and makes hand-off to Jessar's team unambiguous.

Out of scope (intentionally): store locator (replaced with Partners), dealer portal (link to existing system), retailer application form, customer accounts, cart/checkout, blog. These are explicit decisions logged in PROJECT.md §9.

Customer pages
22
build targets
Templates
2
hero PDP + standard PDP
Utility
3
search · 404 · sitemap
Bilingual
100%
EN + FR every page
Total
27
distinct entries

Sitemap (top-level)

Two shopping axes: by sub-brand (10 sub-brand pages, hand-curated) or by category (5 cross-cutting collections). Visitors can also land directly on a product (hero PDP or standard PDP).
jessar.ca
├── /                                  # Home
│
├── /brands/                          # Sub-brand index (optional landing — may redirect to /)
│   ├── /brands/js-gourmet/
│   ├── /brands/js-maison/
│   ├── /brands/beauty-cover/
│   ├── /brands/cook-and-fresca/
│   ├── /brands/ibake/
│   ├── /brands/limpus/
│   ├── /brands/pop-fluff/
│   ├── /brands/veraroma/             # sub-line of JS Gourmet
│   ├── /brands/jessar-lighting/
│   └── /brands/xtricity/
│
├── /collections/                     # Category collections (cross-brand)
│   ├── /collections/kitchen-and-dining/
│   ├── /collections/home-and-bath/
│   ├── /collections/lighting/
│   ├── /collections/electrical/
│   └── /collections/cleaning/
│
├── /products/{handle}                 # PDP — hero or standard template, ~3,211 products
│
├── /partners/                        # Retailer logos (Costco, Linen Chest, Staples, etc.)
├── /about/                           # Brand story
├── /become-a-dealer/                 # B2B contact form
├── /contact/                         # General contact
├── /policies/privacy/                # Privacy Policy
├── /policies/terms/                  # Terms of Service
│
├── /search                           # Search results
├── /404                              # Not found
└── /sitemap.xml                      # SEO sitemap (auto-generated by Shopify)

FR mirror via /fr/ prefix or hreflang switch — Translate & Adapt handles routing.
Per-page specs
  1. Home
  2. Sub-brand: JS Gourmet
  3. Sub-brand: JS Maison
  4. Sub-brand: Beauty Cover
  5. Sub-brand: Cook & Fresca
  6. Sub-brand: IBake
  7. Sub-brand: Limpus
  8. Sub-brand: Pop Fluff
  9. Sub-brand: Veraroma
  10. Sub-brand: Jessar Lighting
  11. Sub-brand: Xtricity
  12. Collection: Kitchen & Dining
  13. Collection: Home & Bath
  14. Collection: Lighting
  15. Collection: Electrical
  16. Collection: Cleaning
  17. Hero PDP template
  18. Standard PDP template
  19. Partners
  20. About
  21. Become a dealer
  22. Contact
  23. Privacy Policy
  24. Terms of Service
  25. Search results
  26. 404 Not Found
  27. URL & taxonomy decisions
Customer-facing pages
01

Home

/
Purpose
Establish brand presence in 5 seconds. Route visitors to the right sub-brand or category. Demonstrate breadth without overwhelming. Dual-mode entry — consumer can browse, B2B can find "Become a dealer."
Sections
(1) Hero — single brand statement with italic-emphasis · (2) Sub-brand grid — 10 tiles · (3) Featured hero collection carousel — 4–6 hero products from jessar.is_hero=true · (4) "Designed in Quebec since 1968" story strip · (5) Partners ribbon — retailer logos · (6) Become-a-dealer CTA · (7) Newsletter signup · (8) Footer.
Data
Hero copy → theme customizer text settings (EN + FR). Sub-brand grid → 10 sub_brand metaobject records. Featured collection → "hero" auto-collection (rule: jessar.is_hero = true). Partners ribbon → partner_retailer metaobject list. Story strip → theme customizer text. Newsletter → Shopify default form, list goes to Klaviyo or Shopify Email.
Done when
All 10 sub-brand tiles route to live sub-brand pages (no dead clicks). Featured collection shows 4–6 products with images, no broken links. Partners ribbon shows ≥6 retailer logos at full quality. EN + FR copy locked. Mobile layout holds at <640px without overflow. Lighthouse performance score ≥85 on mobile, page loads ≤2.5s on 4G.
Sub-brand pages (10 — same template, 10 instances)

Each sub-brand page uses the same template populated from the sub_brand metaobject record. Differences are in copy, accent color, and curated product set. Pages 02-11 share the spec below; the deltas are the metaobject content.

02

JS Gourmet

/brands/js-gourmet
Purpose
Establish JS Gourmet's identity (Jessar's kitchen line — knives, cookware, serving, drinkware). Showcase the breadth, route visitors to category subsets within the sub-brand, surface the heroes from this sub-brand.
Sections
(1) Sub-brand hero — wordmark + tagline + narrative paragraph (from metaobject) · (2) Featured heroes within this sub-brand · (3) Category strip within sub-brand (e.g., Knives · Cookware · Serving · Drinkware) — clickable to filtered views · (4) Full collection grid (paginated) with filtering · (5) Brand story panel · (6) Cross-link to other Jessar sub-brands · (7) Become-a-dealer CTA · (8) Footer.
Data
All page-level content from the sub_brand metaobject (name, tagline, narrative, accent_color, page_url, logo). Product list = automatic collection rule jessar.sub_brand = JS Gourmet. Hero subset = same rule + jessar.is_hero = true. Filtering = native Hyper filter UI on metafields (clas-1 / clas-2 / material).
Done when
Metaobject record fully populated EN + FR. Auto-collection rule pulls correct product count (cross-checked against unified DB). Filter facets work. ≥3 hero products surface in the heroes strip. Cross-links to ≥4 other sub-brands. Mobile holds.
03

JS Maison

/brands/js-maison
Purpose
Same template as JS Gourmet. JS Maison is Jessar's home line (storage, organization, soft goods).
Spec
Identical structure to JS Gourmet — see above. Differences live in the metaobject record (narrative copy, accent color, category strip labels).
Done when
Metaobject populated EN + FR · auto-collection rule active · filters work · mobile holds.
04

Beauty Cover

/brands/beauty-cover
Purpose
Bath / personal care. Same template, sub-brand-specific narrative.
Spec
Same as JS Gourmet template.
Done when
Metaobject populated · collection rule active · ≥1 hero product in the strip (or hide the strip if zero) · mobile holds.
05

Cook & Fresca

/brands/cook-and-fresca
Purpose
Sub-line within the kitchen world (likely fresh-food storage / Italian-leaning). Same template.
Spec
Same as JS Gourmet template.
Done when
Same gates as JS Gourmet.
06

IBake

/brands/ibake
Purpose
Baking-specific products (pans, mats, tools). Same template.
Spec
Same as JS Gourmet template.
Done when
Same gates as JS Gourmet.
07

Limpus

/brands/limpus
Purpose
Cleaning / utility products (likely owns the 6- SKU prefix once the intern's mapping returns). Same template.
Spec
Same as JS Gourmet template.
Done when
Same gates as JS Gourmet · mapping confirmation from intern.
08

Pop Fluff

/brands/pop-fluff
Purpose
Sub-brand identity TBD on intern mapping. Same template.
Spec
Same as JS Gourmet template.
Done when
Same gates as JS Gourmet · mapping confirmation from intern.
09

Veraroma

/brands/veraroma
Purpose
Sub-line under JS Gourmet (per logo evidence "Veraroma by JS Gourmet"). Same template, with parent-brand cross-link to JS Gourmet.
Spec
Same as JS Gourmet template + a small "Part of JS Gourmet" badge linking to the parent.
Done when
Same gates as JS Gourmet · parent-brand badge wired.
10

Jessar Lighting

/brands/jessar-lighting
Purpose
Owns the 5- SKU prefix (358 products, lighting). Same template, sub-brand-specific narrative.
Spec
Same as JS Gourmet template.
Done when
Same gates as JS Gourmet.
11

Xtricity

/brands/xtricity
Purpose
Owns the 1- + 4- SKU prefixes (LED bulbs + electrical, ~595 products). Same template.
Spec
Same as JS Gourmet template.
Done when
Same gates as JS Gourmet.
Category collection pages (5)
12

Kitchen & Dining

/collections/kitchen-and-dining
Purpose
The largest collection — cross-cuts JS Gourmet, Cook & Fresca, IBake, Veraroma. For visitors who shop by category not brand.
Sections
(1) Collection hero — image + headline · (2) Sub-category strip (Cookware · Knives · Bakeware · Serving · Drinkware · Storage) · (3) Filter rail (price, sub-brand, material, in-stock) · (4) Product grid (paginated, 24/page) · (5) Featured editorial block — "What we're known for" · (6) Cross-link to sub-brand pages · (7) Footer.
Data
Auto-collection rule: internal_clas_1 = KITCH (or whatever maps). Filters bind to jessar.sub_brand, jessar.materials, native price + stock. Editorial block → theme customizer block.
Done when
≥1,200 products in collection (matches unified DB count for kitchen-tagged SKUs). Filters return correct counts. Sub-category strip routes to filtered URLs. Mobile filter rail collapses to drawer cleanly.
13

Home & Bath

/collections/home-and-bath
Purpose
JS Maison + Beauty Cover products. Storage, organization, bath, soft goods.
Spec
Same template as Kitchen & Dining. Sub-categories adjusted (Bath · Storage · Laundry · Decor · Soft goods).
Done when
Same gates · sub-category list correct · ≥1 featured hero.
14

Lighting

/collections/lighting
Purpose
All Jessar Lighting products plus any lighting from Xtricity (LED bulbs).
Spec
Same template. Sub-categories: Touch lamps · Floor lamps · Table lamps · LED bulbs · Specialty.
Done when
Same gates · LED bulbs filterable by wattage / fitting type (metafield-driven).
15

Electrical

/collections/electrical
Purpose
Xtricity electrical products (outlets, plugs, switches). Heavily B2B; specs-forward.
Spec
Same template. Sub-categories: Outlets · Plugs · Switches · Wire & cable · Accessories.
Done when
Same gates · UPC + customs code visible on cards (B2B-friendly listing).
16

Cleaning

/collections/cleaning
Purpose
Limpus + Pop Fluff + any utility cleaning. Owns the 6- prefix mostly.
Spec
Same template. Sub-categories: Mops & brooms · Sponges · Utility tools · Laundry · Surface care.
Done when
Same gates · intern's prefix mapping resolves Limpus/Pop Fluff ownership before launch.
Templates (used by all PDPs)
17

Hero PDP template Template

/products/{handle}
Purpose
The Caraway-style storytelling page. Used by the 20 hero products. Drives conversion (B2B inquiry, retailer interest, brand credibility).
Sections
(1) Site header · (2) Breadcrumbs · (3) Hero — image stack + sub-brand pill + italic-emphasis title + lede + meta row + dual CTA · (4) Story (Caraway centerpiece) · (5) Build / Materials & craft (4-col grid) · (6) Made for / Use cases (3 tiles) · (7) Specs panel (dark inverse, B2B sell-sheet) · (8) Sub-brand block · (9) Become-a-dealer CTA · (10) Complete the set / cross-sell · (11) Footer.
Data
Native fields (title, images, weight, dimensions, SKU). Metafields: jessar.romance_lede, jessar.audience_tag, jessar.story_headline, jessar.story_body, jessar.lifestyle_hero, jessar.materials (json), jessar.use_cases (json), jessar.upc, jessar.qty_per_container, jessar.qty_per_package, jessar.care_instructions, jessar.customs_code, jessar.catalog_pdf, jessar.related_products, jessar.sub_brand (metaobject ref), jessar.is_hero (boolean — must be true). Specs section visible always; Story / Build / Made-for sections render only if is_hero=true.
Visibility
Template auto-applies to any product with jessar.is_hero=true. The 20 picks Michael selects flip this flag via the build pass.
Done when
Render is ported to Hyper Liquid with 5 RevShift custom sections (rs-story-block, rs-build-grid, rs-use-tiles, rs-specs-panel, rs-sub-brand-block) — each carrying inline RevShift - YYYY-MM-DD comments and a per-file change-log entry under /docs/shopify_code_changes/. Bilingual smoke-test on 7-99096 passes (EN + FR via Translate & Adapt). Lifestyle-hero placeholder renders cleanly when metafield is empty. Lighthouse ≥85 mobile.
18

Standard PDP template Template

/products/{handle}
Purpose
The non-hero PDP for the other ~3,191 products. Specs-forward, fast to scan, B2B-friendly.
Sections
(1) Site header · (2) Breadcrumbs · (3) Hero — image gallery + title + sub-brand pill + short description + dual CTA · (4) Specs table (full B2B detail) · (5) Sub-brand mini-block (one-line ref) · (6) Cross-sell — automatic recommendations · (7) Footer.
Data
Native fields + same B2B metafields as hero (UPC, qty_per_container, customs_code, care_instructions, catalog_pdf). Skips the storytelling metafields (story_*, lifestyle_hero, materials json, use_cases). Cross-sell uses Shopify automated recommendations (no manual curation per SKU at this volume).
Visibility
Default product template. Used when jessar.is_hero is false or not set. ~3,191 products.
Done when
Template renders correctly for any sub-brand. Specs table populates from metafields when present (gracefully hides empty rows). Bilingual smoke-test on 3 products from different sub-brands. Mobile gallery swipe works.
Static pages
19

Partners Static

/partners
Purpose
Replaces the original "store locator" decision. Shows the major retailers carrying Jessar products as a credibility signal. Routes B2B visitors to "Become a dealer" if they're a retailer themselves.
Sections
(1) Hero — "Where to find us" headline + intro · (2) Major retailers grid — logos at full quality (Costco, Linen Chest, Staples, etc.) · (3) "Looking to carry Jessar?" CTA → /become-a-dealer · (4) Footer.
Data
partner_retailer metaobject records. Logos sourced by Sean from public sources (per Q17 resolution).
Done when
≥6 retailer logos at full quality. EN + FR copy. Become-a-dealer CTA links correctly. Mobile grid holds.
20

About Static

/about
Purpose
Tell the Jessar story: Quebec roots, family business, what they make, why retailers trust them. Establish credibility for buyers and end-customers alike.
Sections
(1) Hero — italic-emphasis statement on what Jessar is · (2) Story body — narrative across 2-3 paragraphs · (3) "Designed in Quebec" map / location section · (4) Sub-brand grid (linking to all 10) · (5) Partners ribbon · (6) Become-a-dealer CTA · (7) Footer.
Data
Theme customizer text fields (EN + FR via Translate & Adapt). Sub-brand grid pulls metaobjects.
Done when
EN + FR narrative locked. Map/location image at full quality. ≥4 sub-brands surface in the grid. Mobile holds.
21

Become a dealer Static

/become-a-dealer
Purpose
B2B inquiry capture. Routes retailers who want to carry Jessar products to a structured contact form (or email).
Sections
(1) Hero — "Carry Jessar in your store" headline · (2) Why-us value props (3 bullets) · (3) Inquiry form — name · company · location · estimated annual volume · message · (4) Existing-retailer note ("Already a dealer? Login at [external URL]") · (5) Footer.
Data
Theme customizer + Shopify Forms (or a simple contact form app). Submissions go to Jessar's sales email. Existing dealer login = link to existing Jessar portal.
Done when
Form submits successfully to test email. Form fields are bilingual. Existing-dealer link routes correctly. Mobile form holds.
22

Contact Static

/contact
Purpose
General contact for press, customer service, partnerships, anything not B2B-dealer.
Sections
(1) Hero · (2) Direct contact — phone, email, address (Saint-Eustache HQ) · (3) Generic contact form · (4) Map · (5) Footer.
Data
Theme customizer for contact info. Address sourced from Phase 5 location setup (341 Allée du Golf, Saint-Eustache, QC J7R 0L5).
Done when
Contact info matches Phase 5 location. Form submits. Map renders. Mobile holds.
Policy pages (legal)
23

Privacy Policy Policy

/policies/privacy
Purpose
Quebec Law 25 + PIPEDA compliance. Drafted using Shopify's built-in template; awaiting Jessar legal confirmation.
Sections
Standard Shopify policy sections: data collection, use, sharing, cookies, contact, etc.
Data
Shopify Settings → Policies → Privacy Policy (already populated EN by Sean, awaiting legal sign-off; FR via Translate & Adapt once EN locks).
Done when
Jessar legal confirms EN. FR translated. Footer link wired. Cookie banner (if any) references this page.
24

Terms of Service Policy

/policies/terms
Purpose
Standard Shopify ToS template. Awaiting Jessar legal confirmation.
Sections
Standard Shopify ToS sections.
Data
Shopify Settings → Policies → Terms (drafted EN, awaiting legal; FR via Translate & Adapt).
Done when
Jessar legal confirms EN. FR translated. Footer link wired.
Utility pages (Shopify defaults, lightly themed)
25

Search results Utility

/search
Purpose
Search across all products. Default Shopify search; light styling to match the brand.
Sections
(1) Search input · (2) Results grid (paginated, same product card style as collection pages) · (3) Empty-state message if zero results · (4) Footer.
Data
Shopify native search index. Considers product title, description, vendor, tags, and (optional) metafields.
Done when
Search returns expected results for "knife" / "lamp" / "JS Gourmet" / "Costco". Empty state has helpful copy + CTA. EN + FR.
26

404 Not Found Utility

/404
Purpose
Catch-all for missing pages. Important during migration since some old WP URLs won't have direct redirects.
Sections
(1) "Page not found" headline · (2) Helpful copy + search input · (3) Top sub-brand tiles (helpful re-routes) · (4) Footer.
Data
Theme customizer text. Sub-brand tiles pull from metaobjects.
Done when
Triggers correctly on missing URL. Search input works. EN + FR. Sub-brand tiles render.
27

URL & taxonomy decisions Reference

— meta —
URL pattern
Sub-brand pages: /brands/{handle} (e.g., /brands/js-gourmet). Category collections: /collections/{handle} (e.g., /collections/kitchen-and-dining). Products: /products/{handle} — handle = Shopify-generated from product title (we override only when needed). Static pages: simple slug (/partners, /about). Policies: /policies/{slug} (Shopify default). FR mirror: /fr/... via Shopify's Markets routing — auto-generated when FR locale is published.
Slug strategy
Hyphens, lowercase, no accents (js-gourmet not JS-Gourmet; kitchen-and-dining not kitchen-&-dining). FR slugs translated where it matters semantically (e.g., /fr/marques/js-gourmet) — Translate & Adapt handles per-page slug translation.
Filter / facet strategy
Collection pages filter by: price range, sub-brand (via jessar.sub_brand), in-stock, and 1–2 collection-specific facets (Lighting → wattage; Kitchen → material; Electrical → amperage). Sub-brand pages filter by category strip (clas-1) + same price/stock. Search uses Shopify default. Facets are metafield-driven — no third-party filter app, native Hyper UI.
Canonical / SEO
Each product has one canonical URL: /products/{handle}. Collection-filtered URLs are noindex to avoid duplicate content. Hreflang auto-emitted per Shopify locale config (already set: EN primary + FR published).
301 redirect rules
From WP migration: 1,250 product URLs → new /products/{handle}; 452 category URLs → new /collections/{handle} (manual review of weak / abandoned WP categories — 34 don't get redirects, just route to home); 470 misc URLs → home with utm tracking. Applied via Shopify URL Redirects after bulk import.
Done when
All 27 pages live at the URL pattern above. /sitemap.xml includes all of them. Hreflang headers correct. Sample of 50 old WP URLs land at correct new home (no 404s on tracked URLs).
What's NOT in scope (explicitly)
Killed
Store locator — replaced by Partners. Dealer portal — link to existing Jessar system. Retailer application form — out of scope; Become-a-dealer captures inquiries to email. Customer accounts — no DTC accounts in v1 (no transactions). Cart / Checkout — no transactions. Blog — Jessar didn't have one in WP; not adding. Refund / Shipping policy pages — Sean ruled out (no transactions, not applicable).
Deferred
Hero PDP variant tooling (color swatches with linked variant routing) — works out of the box on Hyper; deeper variant treatment is post-launch. Newsletter automation flows — set up the form at launch, build the journey in retainer Phase 6.