Zebra Skimmers · Redesign Plan

Data Design

Mapping the metaobjects, metafields, and shop settings to every UI element on every page in the IA. Companion to the main plan, the schemas document, the spec schema, and the mockups. The point: anyone implementing a section knows exactly which field renders into it.
§ 01

The data layer, grouped by intent.

Six clusters of metaobjects and shop-level metafields. Three are designed and specified — Documents, Relationships, Specs — and three others span Compatibility (uses existing native types), AI (the policy pair), and Shop singletons (admin-editable copy and references). Anything not in this section is either a Shopify primitive (product, variant, collection) or a content type implied by a specific page — see § 04 for the implied set.

Spec'd in schema docs Shop / theme setting Future metaobject — see § 04 Shopify native ×Hardcoded in Liquid
CLUSTER 01 · DOCUMENTS

product_document

Files attached to products — datasheets, manuals, drawings, certifications, SDS. Replaces the per-product PDF page-scrape that gave every product 46 attachments. The 51 unique documents in the catalog become explicit, reusable metaobject entries.

shoptheme.shop_documents
producttheme.documents
varianttheme.documents
type: list<product_document>
FEEDS · D, I, L, M
CLUSTER 02 · CURATED RELATIONSHIPS

product_relationship

Editorial parent-curated links between products — required accessories, replacement parts, frequently-bought-together, upgrade paths. Replaces the empty related_products array on every current product and the prose-only relationship descriptions.

producttheme.related_products
type: list<product_relationship>
relationship_type: accessory · required_accessory · replacement_part · upgrade · ...
FEEDS · D, I
CLUSTER 03 · COMPATIBILITY

fits_products (no metaobject)

Variant-granular compatibility, declared by the child (the part) rather than the parent. The "tube replacement" knows which reach variants it fits; the PDP queries this in reverse to show fitting parts. Uses native variant_reference — no new metaobject type needed.

producttheme.fits_products
type: list<variant_reference>
queried by: products where theme.fits_products contains <current_variant>
FEEDS · D, K, L
CLUSTER 04 · SPECIFICATIONS

product_spec_group · product_spec_row

Structured specification data. Group is the category (Performance, Electrical, etc.); row is the value, with US/metric units, comparable/filterable flags, and variant-override support. Same data feeds PDP spec table, comparison view, collection filters, printable spec sheet, JSON-LD, and the Find Your Fit rules engine.

producttheme.specs
varianttheme.specs (overrides product-level by key)
type: list<product_spec_row>
row.groupproduct_spec_group
FEEDS · A, D, E, F, G, K
CLUSTER 05 · AI POLICY

ai_policy · ai_crawler_policy

Admin-editable AI metadata. Single-entry ai_policy renders the meta tags in head on every page; multi-entry ai_crawler_policy drives the robots.txt template. Each crawler is one entry that the merchant can enable / disable without code.

shoptheme.ai_policy (single)
shoptheme.ai_crawler_policies
type: list<ai_crawler_policy>
FEEDS · ALL · <head> · robots.txt · /llms.txt
CLUSTER 06 · SHOP SINGLETONS

shop.theme.* (no metaobject)

One-off admin-editable copy and references that don't justify a metaobject. Hero headline, featured product reference, contact info, brand tagline. Shopify shop metafields with theme namespace, accessed via Liquid theme settings or direct metafield reads.

shop.theme.hero_headline
shop.theme.hero_body
shop.theme.featured_product (product_reference)
shop.theme.contact_phone, contact_emails
shop.theme.warranty_intro, warranty_terms
...and similar
FEEDS · A, M, P · all editorial pages
§ 02

Coverage matrix.

Rows are data sources. Columns are the fourteen pages in the IA. A check means the data source materially drives content on that page. The matrix reads diagonally as expected: PDP and Collection are the heaviest consumers; FAQ and Distributors barely touch the existing metaobjects (they need their own — see § 04).

Data source ADEFGHIJKLMNOP
DOCUMENTS · product_document
product.theme.documents ·
variant.theme.documents
shop.theme.shop_documents ·
RELATIONSHIPS · product_relationship
product.theme.related_products
COMPATIBILITY · fits_products
product.theme.fits_products
SPECIFICATIONS · product_spec_group / row
product.theme.specs ·
variant.theme.specs
product_spec_group (structure)
AI · ai_policy / ai_crawler_policy
shop.theme.ai_policy (meta tags)
shop.theme.ai_crawler_policies (robots.txt) Site-wide · /robots.txt template + /llms.txt Worker
SHOP SINGLETONS · shop.theme.*
shop.theme.featured_product
shop.theme.hero_* (copy)
shop.theme.contact_* (phone, emails, hours) ·
shop.theme.warranty_* (intro, terms)
shop.theme.about_* (hero, stats)
IMPLIED · NEW METAOBJECTS (see § 04)
product_video ··
distributor
faq_item / glossary_term
company_milestone
finder_intent_path / finder_step
learn_category / learn_article ·

primary data source for this page · · secondary or partial use

§ 03

Per-page data maps.

Each page shown as a stacked schematic of its sections with numbered callouts, and a binding table listing every UI element with its data source. Use this as the implementation reference when building the Liquid templates — the table tells you the exact metafield path and any filter / sort logic the renderer needs.

Mock A · 06.1

Homepage — featured product, three intent paths, bestsellers grid

Three things above the fold (brand statement, featured product, intent paths) plus a bestseller grid below. Featured product is driven by a single shop metafield reference; bestsellers are dynamic from Shopify's BEST_SELLING sort.

1Site header
2Hero · tag, headline, CTAs
3Featured product
4Three intent paths
5Bestsellers grid (4)
1Site header
Brand / logo link×Hardcoded link to /
Main nav (5 items)linklists.main-menu
Search / Account / CartShopify native sections
2Hero
"Made in Ohio · Since 1994" tagshop.theme.brand_tagline
Headline (with serif emphasis)shop.theme.hero_headline · rich text with <em> permitted
Subtitleshop.theme.hero_body
Primary CTA (Find your fit)shop.theme.hero_cta_primary · text + link
Secondary CTA (Talk to sales)shop.theme.hero_cta_secondary
3Featured product
Product referenceshop.theme.featured_product · product_reference
Image, title, description.featuredImage, .title, .descriptionHtml
Spec quartet (capacity, savings, ROI, warranty)product.theme.specs · filter comparable=true · sort display_priority · take 4
Priceproduct.priceRange.minVariantPrice
"See full family" CTA×Hardcoded link to product's parent collection
4Intent paths
Three intent cardsfinder_intent_path metaobject (see § 04) · OR Liquid section blocks for v1
5Bestsellers grid
Product listproducts(sortKey: BEST_SELLING, first: 4)
Card image, title, priceShopify native fields
Spec pill (capacity)product.theme.specs · filter key=capacity · first match
Spec pills (2 more)product.theme.specs · filter comparable=true · take 2
Stock pillproduct.totalInventory > 0
Mock D · 06.4

Product detail page — sticky sidebar, six anchored sections

The PDP is the heaviest consumer of the data layer. Every cluster except AI has primary feeds here. The variant picker triggers re-rendering of Specs and Parts & accessories without a page reload — both read variant-level metafields client-side after the picker change event.

1Site header + breadcrumb
2Image gallery
3Product info + variant pickers + CTAs
4Overview prose
5Specifications (grouped)
6Documents (PDFs)
7Installation (videos)
8Parts & accessories
9Reviews
1Header + breadcrumb
Breadcrumb trailproduct.collections · primary collection chain + product.title
2Image gallery
Primary imageproduct.featuredImage · or selectedVariant.image
Thumbnail stripproduct.media · images + videos mixed
3Product info + pickers
Family label ("Tube oil skimmer · ZVA8 family")product.theme.specs · filter key=product_family
Titleproduct.title
Short descriptionproduct.descriptionHtml · first paragraph
PriceselectedVariant.price
Stock pillselectedVariant.availableForSale + inventoryQuantity
SKU / MOQ / Lead timeselectedVariant.sku + theme.specs filtered (lead_time, moq)
Reach picker (variant axis 1)product.options[0] · post variant cleanup (see Phase 1 audit)
Voltage picker (variant axis 2)product.options[1]
Add to cart / Request quoteCart action / draft order action
Trust rowshop.theme.pdp_trust_badges · list of 3 items
4Overview
Overview proseproduct.descriptionHtml · or product.theme.overview_rich if extracted
Inline product linksResolved from product.theme.related_products at render
5Specifications
Group headings (PERFORMANCE, ELECTRICAL...)product_spec_group.label · sorted by display_order
Spec rows (label + value + unit)product.theme.specsvariant.theme.specs · variant overrides product by key
"(this variant)" annotationRendered when row source = variant.theme.specs (overrode product)
US + metric valuesvalue_number_us / unit_us · value_number_metric / unit_metric · render-time conversion when one absent
Print spec sheet buttonLink to /products/<handle>/spec-sheet.pdf · same data, print CSS
6Documents
Document cardsproduct.theme.documentsselectedVariant.theme.documents · dedupe by metaobject id
Type label (MANUAL, DATASHEET, INSTALL...)product_document.document_type
File sizeproduct_document.file_size_bytes · auto-derived for file_reference
Description / blurbproduct_document.description
7Installation
Video cardsproduct.theme.videos · filter video_topic=install (product_video metaobject — see § 04)
"See all install videos" link×Hardcoded link to /support/install filtered to this product
8Parts & accessories
Section header pill ("Filtered to fit ZVA8-08 · 115 VAC")Composed from selectedVariant.title + variant options
Curated relationships (always shown)product.theme.related_products · grouped by relationship_type · required first
Compatibility relationshipsStorefront query: products where theme.fits_products contains <selectedVariant.id>
"Fits" pill on each cardRendered when product appears in compatibility result
Variant-picker change behaviorClient-side: re-query on variant change · no page reload
9Reviews
Aggregate ratingReviews app (Judge.me / Loox / native) · standard integration
Individual reviewsSame reviews app
Mock E · 06.5

Collection page — spec-driven filter rail + product cards

The filter rail introspects spec rows flagged filterable=true across all products in the collection. No hardcoded facets per collection template.

1Breadcrumb + page title
2"Find Your Fit" inline banner
3Filter rail
4Product grid
1Header
Title, description, countcollection.title, .description, .productsCount
2Find Your Fit banner
Banner copy + CTAcollection.metafields.theme.fyf_banner · per-collection override, fallback shop default
3Filter rail
Skimmer type facetNative Shopify product_type filter
Reach range sliderAggregate spec_rows[key=reach_depth].value_number_us across products · min/max derived
Voltage / Mount style checkboxesAggregate spec_rows[filterable=true, group=electrical|mechanical] · unique values
Availability toggleNative Shopify availability filter
"Made in USA" toggle (future)spec_rows[key=country_of_origin] · boolean facet
4Product cards
Image, title, SKU, price, stockShopify native
Spec pills (3 per card)product.theme.specs · filter comparable=true · sort display_priority · take 3
Sort dropdownShopify native + custom keys (best match driven by Find Your Fit answers if persisted)
Mock F · 06.6

Compare tool — 2-4 products side-by-side

Pure derivation from spec data. The URL /products/compare?items=... encodes product handles and optional variant SKUs. No backing data store — the comparison is computed from the participating products' spec rows.

1Page header + count
2Column heads (image, name, price, CTA per product)
3Grouped spec rows
4Footer · permalink + actions
1Page header
Title with product countComputed from URL parameter items length
2Column heads (per product)
Selected products + variantsURL state: ?items=zva8-sidewinder:zva8-08,bpf1-12-belt-skimmer,...
Image, name, subtitle, priceShopify native per resolved variant
Add to cart per columnCart action
3Comparison body
Group rows (Capacity, Connectivity, ...)product_spec_group · union of groups across compared products · sorted by display_order
Spec rowsUnion of spec_rows[comparable=true] indexed by key · variant-level wins over product-level
Missing value cell (em-dash)Rendered when key absent from a product · hover "Not specified"
Unit normalizationRender-time conversion when products use different units for same key
4Footer
PermalinkCurrent URL · deeplinkable
Print comparisonwindow.print() · print CSS hides chrome
Quote requestDraft order with all selected variants as line items
Mock G · 06.7

Find Your Fit — intent entry

The intent paths and step questions are the bulk of the configuration. v1 can ship the entry screen as hardcoded section blocks; v2 should move them to a finder_intent_path metaobject so the merchant can adjust without code (see § 04).

1Step indicator
2Hero question + standfirst
3Three intent cards
4Skip-to-shop footer
1Step indicator
Step labels + current×Hardcoded by template · current derived from URL state
2Hero
Headline + standfirstshop.theme.fyf_entry_headline + fyf_entry_standfirst
3Intent cards (3)
Each card: number, title, body, linkfinder_intent_path metaobject · multi-entry · sort by display_order · see § 04
v1 fallback×3 hardcoded section blocks until metaobject ships
4Behind-the-scenes
Spec-row filtering on later stepsproduct_spec_row matched against user answers · recommendation engine
URL state?p=1&q1=tramp&q2=... · deep links work
Mock H · 06.8

Learn hub — editorial categories + recent

Replaces the 18-lesson nav. Built primarily on Shopify Blog (articles + tags + author) with a thin metaobject layer for category curation and a featured article reference at the shop level.

1Search input
2Featured article hero
3Three category cards
4Recent articles grid
1Search
Predictive search scoped to /learnShopify predictive search · resource_types: ARTICLE, PAGE, METAOBJECT
2Featured article
Featured article referenceshop.theme.featured_learn_article · article_reference
Title, excerpt, hero image, byline.title, .excerpt, .image, .author
Category tag (FEATURED · COOLANT 101)article.tags · first tag
3Category cards
Three categories with descriptions + countslearn_category metaobject (see § 04) · or 3 hardcoded blog refs for v1
Item count per categoryarticles(tag: category_handle) count
4Recent
Article cardsarticles(sortKey: PUBLISHED_AT, reverse: true, first: 4)
Mock I · 06.9

Application guide article — editorial template

Native Shopify Article with article-level metafields for the editorial framing (standfirst, reviewer credit) and a related-products list. Same template handles Coolant 101 lessons and longer-form white papers.

1Breadcrumb
2Article hero (category, headline, standfirst, byline)
3Article body (prose, figures, blockquote)
4Related products
1Breadcrumb
LEARN / APPLICATION GUIDESDerived from article.blog.handle · or article.tags
2Hero
Category labelarticle.tags[0] + date
Headline (with serif em)article.title · em markers in content allowed
Standfirstarticle.metafields.editorial.standfirst
Byline (author · reviewed by)article.author + article.metafields.editorial.reviewer
3Body
Rich-text contentarticle.contentHtml
Inline product links×Authored as anchor tags in article body
Figures + captions<figure> elements in body · figcaption styled to mono
Pull quote (Instrument Serif)<blockquote> elements · auto-styled
4Related products
Product cardsarticle.metafields.related.products · list<product_reference>
Card spec lineproduct.theme.specs · first comparable row
Mock J · 06.10

FAQ + Glossary — two views, one template

The most metaobject-needed page on the list. Both faq_item and glossary_term are net new in § 04. v1 could ship with structured content in a single Shopify page — but it won't be search-indexable as discrete units, won't deduplicate across product pages, and won't emit JSON-LD FAQPage / DefinedTerm schemas cleanly.

1View toggle (FAQ / Glossary)
2Search input (spans both)
3FAQ side · grouped accordions
4Glossary side · alphabet index + term cards
1Toggle
FAQ / Glossary tabsURL state: /learn/faq · /learn/glossary
2Search
Predictive searchShopify predictive search · metaobjects + pages scope
3FAQ side
Category headings + countsAggregate from faq_item.category · see § 04
Q&A accordionsfaq_item metaobjects · fields: question, answer, category, display_order
FAQPage JSON-LDAuto-emitted from faq_item entries
4Glossary side
Alphabet indexComputed from glossary_term.label[0] · letters with terms highlighted
Term cards (label, category, definition)glossary_term metaobjects · see § 04
DefinedTerm JSON-LDAuto-emitted from glossary_term entries
Cross-link to PDPsglossary_term.related_products field · optional
Mock K · 06.11

Find parts by model — variant-aware results

Pure expression of the fits_products data layer. The customer types a SKU or model, the system resolves it to a specific variant, then queries products whose theme.fits_products metafield contains that variant.

1Search input · model entry
2Popular models pills
3Resolved model header
4Parts grid
1Search input
Free-text model / SKU / barcodePredictive search against variant.sku + variant.barcode + product titles
"Identify by photo" link (future)Workers AI vision pipeline · reads nameplate · matches SKU
2Popular models
Quick-pick pillsshop.theme.popular_parts_models · list<variant_reference>
3Resolved model
Model title + variant specsvariant.title + variant.theme.specs filtered to comparable
4Parts results
Parts list (filtered to variant)Storefront query: products where theme.fits_products contains <resolved variant.id>
"Fits this variant" pillRendered on every result · query result is by definition matching
Card spec lineproduct.theme.specs · first comparable
Mock L · 06.12

Install & troubleshooting — support hub

Aggregates documents and videos across the catalog, filtered by document_type and audience. Each guide auto-links to the parts it references via metafield cross-references.

1Search
2Task category cards (4)
3Featured videos (3)
4Recent guides list
1Search
Scoped predictive searchShopify predictive · metaobjects scope · filter document_type=install_guide / troubleshooting
2Task categories
Four category cards×Hardcoded section blocks (Installation / Maintenance / Replacement / Troubleshooting)
Item count per categoryAggregate product_document.document_type counts across catalog
3Featured videos
Featured install videosshop.theme.featured_install_videos · list<product_video> (see § 04)
4Recent guides
Guide cardsAggregate product_document entries with type in (install_guide, manual, troubleshooting) sorted by revision_date
Card "references parts" lineInferred from parts whose fits_products matches the product owning the document
Mock M · 06.13

Warranty & returns — register, claim, terms

Mostly editorial copy from shop metafields, plus the existing native warranty registration form section (PR #35 — already shipped). Terms are rendered from a single shop metafield so updates don't require a code change.

1Hero · "Lifetime warranty"
2Register form (left col)
3Claim flow (right col)
4Warranty terms
1Hero
"Lifetime" pillshop.theme.warranty_headline_pill
Headline + standfirstshop.theme.warranty_headline + warranty_intro
2Register form
Form fields (8)×Existing PR #35 native form section · contact[...] field naming · tag warranty-registration
Submit routingShopify Flow on tag
3Claim flow
Three-step descriptionshop.theme.warranty_claim_steps · list of {label, body}
Urgent callout (phone)shop.theme.contact_phone · same source as Mock P
4Terms
"Covered" / "Not covered" sectionsshop.theme.warranty_terms_rich · rich text · admin-editable
PDF versionshop.theme.shop_documents · filter document_type=warranty
Mock N · 06.14

About / Made in USA — editorial brand page

Editorial layout with a hero photograph, brand story prose, by-the-numbers grid, and a milestone timeline. Two new metaobjects implied: company_stat and company_milestone.

1Hero (serif italic year)
2Plant photograph
3"Why we exist" + "By the numbers"
4Timeline
5Visit address
1Hero
Headlineshop.theme.about_headline · rich text with em for year
Section label ("SINCE 1994 · SOLON, OHIO")shop.theme.about_tagline
2Plant photo
Hero imageshop.theme.about_hero_image · file_reference
Captionshop.theme.about_hero_caption
3Story + stats
"Why we exist" bodyshop.theme.about_body · rich text
Stat rows (years, units, countries...)company_stat metaobject (see § 04) · {label, value} pairs
4Timeline
Year rowscompany_milestone metaobject (see § 04) · {year, description} · sorted by year
5Visit
Address + phoneshop.address + shop.theme.contact_phone
Mock O · 06.15

Distributors — 68 partners, 42 countries

Largely a single new metaobject (distributor) driving the map, the search, and the list. The "become a distributor" path is form-based; the portal sign-in is Phase 4.

1Hero + intro
2Map with pins
3Search input
4Distributor list (grouped by region)
5"Become a distributor" + portal sign-in
1Hero
Page introshop.theme.distributors_intro
2Map
Pin coordinatesdistributor.latitude, distributor.longitude (see § 04)
3Search
Country / state / postal inputClient-side filter against distributor.country + .region + .service_zip_codes
4Distributor list
Each row (region, name, phone, contact)distributor metaobject · fields below
Region groupingdistributor.continent
5Apply + Sign-in
Become a distributor formContact form · tag distributor-application
Portal sign-in (Phase 4)×Customer accounts B2B · placeholder for now
Mock P · 06.16

Contact — phone-first, form-second

Almost entirely shop metafields. The form is the same Shopify Contact-form backbone used for warranty registration and the distributor application, with tag-based routing.

1Hero · "Talk to a human"
2Phone card (with "currently open" pill)
3Email departments
4Mailing address
5Message form
1Hero
Headline + standfirstshop.theme.contact_headline + contact_intro
2Phone
Phone number (large)shop.theme.contact_phone
Hours lineshop.theme.business_hours · {timezone, days, open, close}
"Currently open" pillComputed client-side from business_hours + Date.now()
3Email departments
Department blocks (Sales, Support, Distributors)shop.theme.contact_departments · list of {label, email, description}
4Mailing address
Address blockshop.address · Shopify native
5Form
"What's this about?" dropdownHardcoded options · sets contact form tag for Flow routing
Form fieldsShopify Contact form section · standard fields
Submit routingShopify Flow routes by tag: contact-sales / contact-support / contact-partners / contact-press
§ 04

Metaobjects the IA implies beyond v1.

Working through the page maps surfaced six additional metaobject types the design needs that aren't covered by the three already specified. Each card lists the type, the page(s) that consume it, why it's worth creating versus hardcoding, and a verdict on whether to ship it in v1 or defer. The combined effect of deferring all six is a v1 with a small number of hardcoded sections and limited admin editability — acceptable trade for getting the data layer out, then adding admin power in v2.

IMPLIED 01 · NEEDED FOR D, H, I, L

product_video

The AI Search pipeline already structures videos with clean fields (title, platform, video_id, watch_url, embed_url, thumbnail_url). Five videos per major product, mostly install and demo content. Without a metaobject, videos stay as third-party iframe embeds in product descriptions — unsearchable, unfilterable, no JSON-LD VideoObject emission.

Verdict · Ship in Phase 1 alongside product_document. Same data-layer release, similar shape, the AI Search corpus already has the source data.
IMPLIED 02 · NEEDED FOR J

faq_item · glossary_term

The FAQ + Glossary page can't realistically be a single rich-text page if the search needs to find individual entries, if items need to cross-link from product PDPs, or if JSON-LD FAQPage / DefinedTerm schemas should emit cleanly. The current site has duplicate FAQ pages partly because there was no structured single source of truth.

Verdict · Ship in Phase 1. Cheap schema (4-5 fields each), big payoff in indexability and structured data emission.
IMPLIED 03 · NEEDED FOR O

distributor

68 distributors across 42 countries. The list is the source of truth for the map, the searchable list, and downstream regional routing on contact forms. Without a metaobject, the distributor list lives in a spreadsheet, the map is hand-maintained, and updates require code changes.

Verdict · Ship in Phase 1. Single-purpose, well-bounded schema, immediate merchant value.
IMPLIED 04 · NEEDED FOR N

company_stat · company_milestone

"By the numbers" rows (32 years, ~140k skimmers shipped, 42 countries) and the timeline of milestones (1994 founding through 2026 redesign). Could be hardcoded as Liquid section blocks, but every catalog has the same need — and once specified, the same metaobjects work for any merchant. Theme-Store-friendly.

Verdict · Defer to Phase 2. Hardcode in v1 as section blocks, promote to metaobjects when polishing for Theme Store submission.
IMPLIED 05 · NEEDED FOR G

finder_intent_path · finder_step

The Find Your Fit configuration. v1 can ship with hardcoded paths and questions baked into Liquid templates because the recommendation rules don't change often. v2 should expose the question tree as metaobjects so the merchant can A/B test entry points without a code change.

Verdict · Defer to Phase 2 or 3. Hardcode v1. The data layer driving recommendations (product_spec_row) is what matters; the question UI can ossify and still work.
IMPLIED 06 · NEEDED FOR H, I

learn_category

The three Learn hub categories (Coolant 101, Application Guides, Glossary & FAQ) with their descriptions and item counts. Shopify Blogs are categorized by tag; learn_category would be the merchandising layer on top — a category landing image, an editorial description, optional ordering of articles within.

Verdict · Defer to Phase 2. v1 ships with 3 hardcoded category sections referencing blog tags. Promote to metaobject when adding more categories becomes inevitable.

Ship-in-Phase-1 set: the three specified metaobjects (product_document, product_relationship, ai_policy + ai_crawler_policy), the two spec metaobjects (product_spec_group, product_spec_row), plus three from above: product_video, faq_item, glossary_term, and distributor. That's nine metaobject types total — a reasonable v1 ceiling. Phase 2 adds the four deferred types.