Dev.to WebDev πŸ›  Dev πŸ‘ 0 πŸ“– 3 min read

Multi-Region OfferShippingDetails, CollectionPage ItemList & Dual-Dialect SEO in Shopify Liquid

When scaling a Shopify storefront from a single domestic market to eight international shipping destinations (US, CA, GB, AU, IE, NZ, DE, FR) without spinning up eight separate Shopify Plus expansion stores, three techni

When scaling a Shopify storefront from a single domestic market to eight international shipping destinations (US, CA, GB, AU, IE, NZ, DE, FR) without spinning up eight separate Shopify Plus expansion stores, three technical bottlenecks usually hold organic search performance back:

  1. Duplicate @type: "Product" JSON-LD blocks injected by theme sections and CRO snippetsβ€”often missing international OfferShippingDetails or VideoObject media links.
  2. Thin collection templates that output visual product cards in HTML without machine-readable CollectionPage + ItemList + FAQPage structured data for Google Merchant listings and AI Search crawlers.
  3. Single-dialect keyword cannibalization (for example, targeting US personalized stroller / crib blanket and baby sweater while missing UK, Irish, and Australian personalised pram / cot blanket and knitted baby jumper search intent).

Here is the zero-app Shopify Liquid architecture we shipped across Bloom Blankets to solve all three cleanly.

1. Consolidating Canonical Product Schema with Multi-Zone OfferShippingDetails

Google's Merchant Listing validator supports passing an array of shippingDestination country codes inside a single OfferShippingDetails node whenever countries share the same checkout shipping tier. Instead of duplicating 8 separate shipping blocks per product, we grouped our live Shopify Delivery Profiles into two regional tiers directly in Liquid:

  • Tier 1 (US, CA, GB, AU): $8.95 USD Standard Tracked Shipping (7–15 business days, plus 3–5 business days custom embroidery handling), dropping to $0 on orders $100+.
  • Tier 2 (IE, NZ, DE, FR): $15.95 USD International Tracked Shipping (10–30 business days).
{%- unless product.type == 'Service Add-On' -%}
  {%- assign bloom_vid = product.media | where: 'media_type', 'video' | first -%}
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "Product",
    "@id": {{ shop.url | append: '/products/' | append: product.handle | append: '#product' | json }},
    "name": {{ product.title | json }},
    "offers": {
      "@type": "Offer",
      "priceCurrency": "USD",
      "price": "{{ product.selected_or_first_available_variant.price | divided_by: 100.0 }}",
      "shippingDetails": [
        {
          "@type": "OfferShippingDetails",
          "shippingRate": { "@type": "MonetaryAmount", "value": "8.95", "currency": "USD" },
          "shippingDestination": [
            { "@type": "DefinedRegion", "addressCountry": "US" },
            { "@type": "DefinedRegion", "addressCountry": "CA" },
            { "@type": "DefinedRegion", "addressCountry": "GB" },
            { "@type": "DefinedRegion", "addressCountry": "AU" }
          ]
        }
      ]
    }{% if bloom_vid %},
    "subjectOf": {
      "@type": "VideoObject",
      "name": {{ product.title | append: ' β€” 3D Embroidery Close-Up' | json }},
      "thumbnailUrl": "https:{{ bloom_vid.preview_image | image_url: width: 1080 }}",
      "contentUrl": "{{ bloom_vid.sources[0].url }}"
    }{% endif %}
  }
  </script>
{%- endunless -%}

Notice the {%- unless product.type == 'Service Add-On' -%} guard: internal cart upsell SKUs (such as shipping protection or gift-bag add-ons) also receive <meta name="robots" content="noindex, follow"> in layout/theme.liquid so crawl budget stays 100% focused on indexable merchandise.

2. Zero-App CollectionPage + ItemList + Bottom-of-Grid FAQPage Schema

Important Shopify Liquid gotcha: Shopify Liquid does not allow parentheses inside {% if %} or {% unless %} tagsβ€”writing {% if a or (b and c) %} throws a Liquid syntax error: Expected dotdot but found comparison. Flat boolean chains and integer counters keep JSON commas 100% valid on page 1 of every collection:

{%- if current_page == 1 and collection.products_count > 0 -%}
  {%- assign schema_pos = 0 -%}
  <script type="application/ld+json">
  {
    "@context": "https://schema.org",
    "@type": "CollectionPage",
    "@id": {{ shop.url | append: collection.url | append: '#collectionpage' | json }},
    "mainEntity": {
      "@type": "ItemList",
      "itemListElement": [
        {%- for product in collection.products -%}
          {%- unless product.type == 'Service Add-On' or product.featured_image == blank or product.price <= 0 -%}
            {%- if schema_pos < 24 -%}
              {%- assign schema_pos = schema_pos | plus: 1 -%}
              {%- unless schema_pos == 1 -%},{%- endunless -%}
              {
                "@type": "ListItem",
                "position": {{ schema_pos }},
                "url": {{ shop.url | append: '/products/' | append: product.handle | json }},
                "name": {{ product.title | json }}
              }
            {%- endif -%}
          {%- endunless -%}
        {%- endfor -%}
      ]
    }
  }
  </script>
{%- endif -%}

You can inspect this live CollectionPage + FAQPage pairing across our 100% Organic Cotton Embroidered Knit Blankets, Personalized Chunky Knit Baby Name Sweaters & Jumpers, and Personalized Baby's First Christmas Ornaments 2026 collections.

3. Solving US vs. UK/AU/EU Dialect Split with Hub-and-Spoke Editorial Guides

Rather than stuffing awkward regional variants into product card titles, we paired clean above-the-fold collection headers with an editorial Hub-and-Spoke cluster that maps imperial (31.5" Γ— 39.5") and metric (80 Γ— 100 cm) nursery dimensions side by side:

Finally, check your layout/theme.liquid <title> tag on article templates! Many custom Shopify themes apply | truncate: 70 to page_title, which chops long-tail editorial titles mid-word in SERPs. Rendering {{ article.title | escape }} – {{ shop.name }} on request.page_type == 'article' while feeding article.excerpt into <meta name="description"> keeps every Hub-and-Spoke guide crisp across Google Search, Bing, and AI citation snippets.

πŸ“° Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.