Shopify SEO ← Tillbaka

Schema för Shopify-butiker — vilka JSON-LD-typer behövs och hur undviker man duplicate-felen

Schema-markup är en av få SEO-investeringar med direkt mätbar effekt: rätt JSON-LD ger rich results i SERP, ökar CTR och förbättrar AI-citation-chans. Den här guiden visar vad en svensk Shopify-butik faktiskt behöver — och hur du undviker de vanliga felen som gör att Google ignorerar allt.

De fem schemas du behöver (i den här ordningen)

Glöm allt du läst om 30+ schema-typer. För en standard Shopify-butik räcker fem:

SchemaVarEffekt i SERP
OrganizationSitewide (theme.liquid)Knowledge Panel, entity disambiguation
ProductPer produktsidaPris, lager, rating i SERP
BreadcrumbListKollektion + produktBreadcrumb-pil i SERP
WebSiteSitewideSitelinks Search Box
FAQPageSidor med riktig FAQExpanderbara svar i SERP*

*FAQ-rich-results har minskats av Google 2023+, men strukturen är fortfarande värdefull för AI extraction (ChatGPT, Perplexity).

1. Organization (sitewide)

En enda Organization-schema sitewide. Lägg i theme.liquid i <head>.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "{{ shop.url }}/#organization",
  "name": "{{ shop.name }}",
  "url": "{{ shop.url }}",
  "logo": {
    "@type": "ImageObject",
    "url": "{{ 'logo.png' | asset_url }}",
    "width": 200,
    "height": 60
  },
  "description": "{{ shop.description | escape }}",
  "address": {
    "@type": "PostalAddress",
    "streetAddress": "Gatuadress 1",
    "addressLocality": "Stockholm",
    "postalCode": "111 22",
    "addressCountry": "SE"
  },
  "contactPoint": [{
    "@type": "ContactPoint",
    "contactType": "customer service",
    "telephone": "+46812345678",
    "email": "info@example.se",
    "availableLanguage": ["Swedish", "English"]
  }],
  "sameAs": [
    "https://www.linkedin.com/company/your-brand",
    "https://www.instagram.com/your-brand",
    "https://www.facebook.com/your-brand"
  ]
}
</script>
Tips: Använd @id med #organization. Då kan andra schemas referera den med {"@id": "..."} istället för att duplicera all information.

2. Product (per produktsida)

Detta är schemat som ger pris/rating/availability i SERP. Lägg i product.liquid eller main-product.liquid (OS 2.0).

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "Product",
  "@id": "{{ canonical_url }}#product",
  "name": "{{ product.title | escape }}",
  "description": "{{ product.description | strip_html | strip_newlines | escape | truncate: 500 }}",
  "image": [
    {% for image in product.images limit: 3 %}
      "{{ image | img_url: '1200x' }}"{% unless forloop.last %},{% endunless %}
    {% endfor %}
  ],
  "sku": "{{ product.selected_or_first_available_variant.sku }}",
  "brand": {
    "@type": "Brand",
    "name": "{{ product.vendor | default: shop.name | escape }}"
  },
  "offers": {
    "@type": "Offer",
    "url": "{{ canonical_url }}",
    "priceCurrency": "{{ shop.currency }}",
    "price": "{{ product.selected_or_first_available_variant.price | money_without_currency | replace: ',', '.' }}",
    "priceValidUntil": "{{ 'now' | date: '%Y' | plus: 1 }}-12-31",
    "availability": "{% if product.available %}https://schema.org/InStock{% else %}https://schema.org/OutOfStock{% endif %}",
    "itemCondition": "https://schema.org/NewCondition"
  }
}
</script>
Vanligt fel #1: Att skicka prisen som JavaScript-formaterad sträng (t.ex. "1 299,00 kr"). Google kräver maskinläsbart format: decimal med punkt, ingen valutasymbol, inga tusentalsavgränsare. Använd money_without_currency + replace: ',', '.'.
Vanligt fel #2: Att lägga till aggregateRating innan du har riktiga reviews (eller utan att kunna verifiera dem). Google har tagit bort rich results-eligibility 2023 för "self-serve ratings" — ratings måste komma från en verifierad app (Judge.me, Yotpo, Stamped) eller importeras från Google Reviews.

3. BreadcrumbList

Lägg på kollektions- och produktsidor. Hjälper Google visa breadcrumb-pil i SERP istället för bara URL:en.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    {
      "@type": "ListItem",
      "position": 1,
      "name": "Hem",
      "item": "{{ shop.url }}/"
    },
    {% if collection %}
    {
      "@type": "ListItem",
      "position": 2,
      "name": "{{ collection.title }}",
      "item": "{{ shop.url }}{{ collection.url }}"
    },
    {% endif %}
    {
      "@type": "ListItem",
      "position": {% if collection %}3{% else %}2{% endif %},
      "name": "{{ product.title | escape }}",
      "item": "{{ canonical_url }}"
    }
  ]
}
</script>

4. WebSite (sitewide, en gång)

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "@id": "{{ shop.url }}/#website",
  "url": "{{ shop.url }}",
  "name": "{{ shop.name }}",
  "inLanguage": "sv-SE",
  "publisher": { "@id": "{{ shop.url }}/#organization" },
  "potentialAction": {
    "@type": "SearchAction",
    "target": {
      "@type": "EntryPoint",
      "urlTemplate": "{{ shop.url }}/search?q={search_term_string}"
    },
    "query-input": "required name=search_term_string"
  }
}
</script>

5. FAQPage (endast på riktiga FAQ-sidor)

Inte på alla sidor. Lägg bara där du har en faktisk FAQ-sektion synlig på sidan.

<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "inLanguage": "sv-SE",
  "mainEntity": [
    {
      "@type": "Question",
      "name": "Hur lång leveranstid har ni?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "1–3 arbetsdagar med standardfrakt. Express samma dag om beställt före kl 12."
      }
    }
  ]
}
</script>

De fyra vanligaste schema-felen på Shopify

Fel 1: Duplicate Product schema (theme + app)

Många reviews-appar (Judge.me, Yotpo) lägger sin egen Product-schema med ratings. Om din theme också har Product-schema → två block för samma produkt → duplicate aggregateRating → Google ignorerar båda.

Fix: Stäng av theme's Product-schema och låt review-appen sköta det. Eller tvärtom — men bara en ska finnas.

Fel 2: aggregateRating utan reviews

Att hårdkoda "aggregateRating": {"ratingValue": "4.8", "reviewCount": "127"} i schemat utan att ha 127 reviews synliga på sidan = Google ger manual action.

Fix: Använd review-app som genererar schema dynamiskt från riktiga reviews.

Fel 3: Felaktig prisformat

Priset måste vara maskinläsbart: "1299.00" inte "1 299 kr". Annars rich results disabled.

Fel 4: Speakable på fel selectors

Om du lägger Speakable-schema som pekar på CSS-selectors som inte finns i DOM → varning i GSC.

Fix: Verifiera selectors finns. ".product-description", "h1" är säkra.

Validera ditt schema

  1. validator.schema.org — strikt validation av Schema.org-spec
  2. Google Rich Results Test — visar om Google ser ditt schema som rich-result-eligible
  3. Eller använd vår SEO-checker — den listar alla schema-typer på en URL och flaggar fel

Vad du absolut inte ska göra

ND

Niklas Dahlquist

VD och grundare på Dahlquist E-handelskonsulter. Har implementerat schema på 150+ Shopify-butiker. LinkedIn.