Direkt zum Inhalt springen
PerformanceCore Web VitalsSpeedLiquid

Shopify Performance optimieren: JavaScript ist das Problem

Der schnellste Hebel ist selten eine Speed-App, sondern weniger JavaScript. App-Audit, LCP-Bild, INP und CLS mit Messwerten und Code.

Justin KreutzmannJustin Kreutzmann14 min Lesezeit

Ein Shop, der in einer Sekunde lädt, konvertiert etwa dreimal so gut wie einer, der fünf Sekunden braucht. Portent hat dafür über 100 Millionen Seitenaufrufe ausgewertet und kommt im Handel auf 3,05 Prozent gegenüber 1,08 Prozent (Quelle: Portent). Den Faktor fünf gibt es auch, aber erst im Vergleich von einer zu zehn Sekunden. Jede weitere Sekunde Ladezeit frisst Conversion-Rate und organisches Ranking zugleich, denn seit 2024 sind Core Web Vitals ein harter Google-Ranking-Faktor.

In diesem Guide zeige ich Ihnen den technischen Weg zu einem Store, der alle drei Core Web Vitals in den grünen Bereich bringt: LCP, INP und CLS. Ich arbeite täglich mit Shopify-Stores, von Dawn-Themes bis zu hochgradig customisierten Plus-Setups, und teile hier, was wirklich wirkt.

Das Wichtigste in Kürze

  • Google hat 2026 die LCP-Zielmarke auf 2,0 Sekunden abgesenkt: Stores mit 2,5s sind bereits im gelben Bereich.
  • INP ersetzt FID vollständig und misst jede Interaktion der ganzen Session, nicht nur den ersten Klick.
  • Der App-Audit ist der schnellste ROI: Jede überflüssige App injiziert 50 bis 300 KB JavaScript direkt in den kritischen Pfad.
  • `fetchpriority="high"` am Hero-Image ist eine Zeile Code mit messbarem LCP-Impact von 0,3 bis 1,5 Sekunden.
  • Schon 0,1 Sekunden schnellere Ladezeit hoben die Conversion im Handel um 8,4 Prozent ([Deloitte Digital für Google, 30 Mio. Sitzungen](https://web.dev/case-studies/milliseconds-make-millions)).
  • Core Web Vitals werden am 75. Perzentil echter Nutzerdaten gemessen: Lab-Daten allein reichen nicht.

Core Web Vitals 2026: Die aktuellen Schwellenwerte

Google misst Core Web Vitals anhand des Chrome UX Report: echte Nutzerdaten, nicht Lighthouse-Labwerte. Entscheidend ist das 75. Perzentil: 75 % aller Seitenaufrufe müssen im grünen Bereich liegen.

MetrikWas sie misstGutVerbesserungsbedarfSchlecht
LCPGrößtes sichtbares Element< 2,0 s2,0 bis 4,0 s> 4,0 s
INPReaktionszeit auf Interaktionen< 200 ms200 bis 500 ms> 500 ms
CLSLayout-Stabilität< 0,10,1 bis 0,25> 0,25

Messung: Lab-Daten vs. Field-Daten

Bevor Sie optimieren, messen Sie den Ist-Zustand an den richtigen Stellen:

  1. Google Search Console → Core Web Vitals: Echte Nutzerdaten, wichtigste Quelle
  2. PageSpeed Insights: Kombiniert Lab (Lighthouse) + Field (CrUX)
  3. Chrome DevTools → Performance Tab: Detailed Waterfall für Debugging
  4. Shopify Admin → Online Store → Geschwindigkeit: Relativer Score, kein Absolut-Maßstab

LCP optimieren: Das Hero-Image als Flaschenhals

In 80 % der Shopify-Stores ist das Hero-Image das LCP-Element. Es lädt spät, weil der Browser es erst entdeckt, nachdem CSS und JavaScript verarbeitet wurden.

Hero-Image mit fetchpriority und Preload

sections/image-banner.liquid
{%- comment -%} LCP-Bild so früh wie möglich laden {%- endcomment -%}
{% if section.settings.image != blank %}
  {%- assign hero = section.settings.image -%}
  <link
    rel="preload"
    as="image"
    href="{{ hero | image_url: width: 1500 }}"
    imagesrcset="{{ hero | image_url: width: 375 }} 375w,
      {{ hero | image_url: width: 750 }} 750w,
      {{ hero | image_url: width: 1100 }} 1100w,
      {{ hero | image_url: width: 1500 }} 1500w"
    imagesizes="100vw"
    fetchpriority="high"
  >
{% endif %}
 
{%- comment -%} Im Body: eager + fetchpriority, nie lazy {%- endcomment -%}
{{ section.settings.image | image_url: width: 1500 | image_tag:
   loading: 'eager',
   fetchpriority: 'high',
   sizes: '(min-width: 1200px) 100vw, 100vw',
   widths: '375, 750, 1100, 1500',
   alt: section.settings.image.alt | escape }}

Responsive Images: Mobile nicht bestrafen

Ein 1.500-px-Bild auf einem 375-px-Smartphone lädt 4× mehr Bytes als nötig. Nutzen Sie srcset und sizes konsequent:

snippets/responsive-image.liquid
{%- comment -%} Für alle Bilder ausser dem LCP-Bild: lazy loading {%- endcomment -%}
{{ image | image_url: width: 800 | image_tag:
   loading: 'lazy',
   sizes: '(min-width: 1200px) {{ image_width }}vw, (min-width: 750px) 50vw, 100vw',
   widths: '375, 550, 750, 1100',
   width: image.width,
   height: image.height,
   alt: image.alt | escape }}

Faustregel: loading="eager" nur für das erste sichtbare Bild. Alles andere auf loading="lazy", und immer width + height setzen, sonst folgt ein CLS-Problem.

höhere Conversion bei 1 s statt 5 s LadezeitPortent, über 100 Mio. Seitenaufrufe
8,4 %
mehr Conversions durch 0,1 s schnelleren LoadDeloitte Digital für Google, Handel
53 %
der Mobile-Nutzer verlassen Seiten nach 3 sGoogle/SOASTA-Studie

INP verbessern: JavaScript ist das Problem

INP ist für die meisten Shopify-Stores der schwierigste Wert, weil jede installierte App JavaScript auf den Hauptthread lädt. INP misst jede Interaktion der gesamten Session (Variant-Selector, Add-to-Cart, Filter) und nimmt das schlechteste Ergebnis.

Der App-Audit: Ehrliche Bestandsaufnahme

Öffnen Sie Chrome DevTools → Coverage Tab (Ctrl+Shift+P → "Coverage"), laden Sie die Seite neu und sortieren Sie nach "Unused Bytes":

App-TypTypische Script-GrößeEntscheidung
Chat-Widget (Tidio, Zendesk)150 bis 300 KBFassade verwenden
Review-App (Judge.me, Loox)80 bis 200 KBNur auf Produktseiten laden
Pop-up/Gamification50 bis 150 KBKosten-Nutzen prüfen
Heat-Map (Hotjar, Lucky Orange)100 bis 250 KBNur für Analysephasen aktiv lassen
Social Proof (Fomo, Nudgify)30 bis 80 KBEntfernen, wenn Conversion-Impact < Kosten

Chat-Widget mit Fassade-Pattern

Chat-Widgets gehören zu den schwersten Einzelscripts. Laden Sie sie erst bei echter Interaktion:

snippets/chat-facade.liquid
<style>
  .chat-facade {
    position: fixed;
    bottom: 20px;
    right: 20px;
    width: 60px;
    height: 60px;
    border-radius: 50%;
    background: var(--color-button);
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    box-shadow: 0 4px 16px rgba(0,0,0,0.15);
    z-index: 100;
    border: none;
  }
</style>
 
<button
  class="chat-facade"
  onclick="loadTidioChat()"
  aria-label="Chat öffnen"
  type="button"
>
  <svg width="24" height="24" fill="white" viewBox="0 0 24 24" aria-hidden="true">
    <path d="M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2z"/>
  </svg>
</button>
 
<script>
  let tidioLoaded = false;
  function loadTidioChat() {
    if (tidioLoaded) return;
    tidioLoaded = true;
    const s = document.createElement('script');
    s.src = '//code.tidio.co/IHREN_KEY_EINFUEGEN.js';
    s.async = true;
    document.body.appendChild(s);
    document.querySelector('.chat-facade').style.display = 'none';
  }
</script>

Third-Party-Scripts nach erster Interaktion laden

Google Analytics, Facebook Pixel und Consent-Manager verarbeiten keine INP-kritischen Aktionen. Laden Sie sie erst, wenn der Nutzer wirklich interagiert. Auf der Bestellstatus-Seite gilt seit Kurzem ohnehin eine andere Regel für Nicht-Plus-Shops, dazu mehr in Shopify: Was am 26. August 2026 still kaputtgegangen ist:

snippets/deferred-scripts.liquid
<script>
  let thirdPartyLoaded = false;
 
  function loadThirdPartyScripts() {
    if (thirdPartyLoaded) return;
    thirdPartyLoaded = true;
 
    {%- comment -%} GTM ersetzt GA, Pixel und andere {%- endcomment -%}
    (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
    })(window,document,'script','dataLayer','GTM-XXXXXXX');
  }
 
  {%- comment -%} Trigger: erste Nutzerinteraktion {%- endcomment -%}
  ['scroll','click','touchstart','keydown'].forEach(function(evt) {
    window.addEventListener(evt, loadThirdPartyScripts, { once: true, passive: true });
  });
 
  {%- comment -%} Fallback: nach 5 Sekunden {%- endcomment -%}
  setTimeout(loadThirdPartyScripts, 5000);
</script>

CLS beheben: Layout-Stabilität sichern

CLS entsteht fast immer durch Bilder ohne Dimensionen, Webfonts mit FOUT oder Banner, die nachträglich ins Layout eingefügt werden.

Bilder mit expliziten Dimensionen

snippets/image-with-ratio.liquid
{%- comment -%} Immer width + height setzen, verhindert CLS {%- endcomment -%}
{{ image | image_url: width: 800 | image_tag:
   width: image.width,
   height: image.height,
   loading: 'lazy',
   alt: image.alt | escape }}
 
{%- comment -%} Alternativ: Aspect-Ratio-Container {%- endcomment -%}
<div style="aspect-ratio: {{ image.width }} / {{ image.height }}; overflow: hidden;">
  {{ image | image_url: width: 800 | image_tag:
     loading: 'lazy',
     style: 'width: 100%; height: 100%; object-fit: cover;',
     alt: image.alt | escape }}
</div>

Webfonts ohne Layout-Shift

font-display: swap ist Pflicht. Der size-adjust-Trick passt den Fallback-Font metrisch an, sodass der Swap keinen Layout-Shift verursacht:

assets/theme.css
@font-face {
  font-family: 'BrandFont';
  src: url('brandfont.woff2') format('woff2');
  font-display: swap;
  unicode-range: U+0000-00FF;
}
 
/* Fallback-Font metrisch angleichen */
@font-face {
  font-family: 'BrandFont-Fallback';
  src: local('Arial');
  size-adjust: 105%;
  ascent-override: 95%;
  descent-override: 22%;
  line-gap-override: 0%;
}
 
body {
  font-family: 'BrandFont', 'BrandFont-Fallback', Arial, sans-serif;
}

Kombinieren Sie das mit einem Preload-Link im <head>:

layout/theme.liquid
<link
  rel="preload"
  as="font"
  type="font/woff2"
  href="{{ 'brandfont.woff2' | asset_url }}"
  crossorigin
>

Server-seitige Optimierung: Liquid und TTFB

Schlechter Liquid-Code erhöht die Time to First Byte (TTFB), bevor der Browser überhaupt mit dem Rendern beginnen kann.

Liquid-Performance-Fallen

sections/collection.liquid
{%- comment -%} Schlecht: Alle Varianten aller Produkte durchloopen {%- endcomment -%}
{% for product in collection.products %}
  {% for variant in product.variants %}
    {% if variant.available %}{{ variant.title }}{% endif %}
  {% endfor %}
{% endfor %}
 
{%- comment -%} Besser: Nur die nötigen Daten, mit Paginierung {%- endcomment -%}
{% paginate collection.products by 24 %}
  {% for product in collection.products %}
    <div class="product-card">
      <span>{{ product.title }}</span>
      <span>{{ product.price_min | money }}</span>
      {%- if product.available -%}
        <span class="badge">Verfügbar</span>
      {%- endif -%}
    </div>
  {% endfor %}
  {{ paginate | default_pagination }}
{% endpaginate %}

Liquid-Regeln für Performance:

  • Immer paginieren: Nie mehr als 50 Produkte pro Seite
  • product.price_min statt alle Varianten durchloopen
  • {% capture %} für Berechnungen, die mehrfach ausgegeben werden
  • Verschachtelung auf maximal 2 Ebenen beschränken

Resource Hints

layout/theme.liquid
{%- comment -%} DNS-Prefetch für externe Ressourcen {%- endcomment -%}
<link rel="dns-prefetch" href="https://cdn.shopify.com">
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
 
{%- comment -%} Preconnect für kritische Third-Parties {%- endcomment -%}
<link rel="preconnect" href="https://cdn.shopify.com" crossorigin>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>

Performance-Budget und Monitoring

Realistische Budgets für Shopify

RessourceBudgetTypischer Shopify Store
JavaScript (total, gzip)< 200 KB300 bis 1.500 KB
CSS (total)< 80 KB80 bis 200 KB
Bilder (Above the Fold)< 150 KB100 bis 800 KB
Fonts< 80 KB50 bis 200 KB
Total Page Weight< 1,2 MB2 bis 5 MB

Automatisiertes Monitoring

  1. Google Search Console aktivieren

    Richten Sie die Google Search Console ein und reichen Sie Ihre Sitemap ein. Der Core-Web-Vitals-Bericht zeigt Ihnen, auf welchen URL-Gruppen echter Handlungsbedarf besteht, getrennt nach URL-Typ (Produktseiten, Collections, Blog).

  2. Baseline dokumentieren

    Exportieren Sie einen PageSpeed-Insights-Bericht als PDF, bevor Sie mit Optimierungen beginnen. Notieren Sie LCP, INP, CLS und den Gesamt-Score. Ohne Baseline können Sie keinen Fortschritt messen.

  3. Performance vor App-Installationen prüfen

    Messen Sie PageSpeed Insights immer vor und nach jeder App-Installation oder jedem Theme-Update. Viele Apps verschlechtern den Score still. Ohne diesen Vergleich merken Sie es erst Wochen später in der Search Console.

  4. PageSpeed Insights API automatisieren

    Nutzen Sie die kostenlose PSI-API (25.000 Anfragen/Tag) für tägliche automatische Messungen. Richten Sie einen Alarm ein, wenn LCP über 3 Sekunden steigt.

Quick-Win-Checkliste für heute

Sofort umsetzen (< 1 Stunde)

  • fetchpriority="high" am Hero-Image ergänzen
  • Alle anderen Bilder auf loading="lazy" prüfen
  • Bilder ohne width/height finden und ergänzen
  • font-display: swap für alle Webfonts prüfen
  • Nicht genutzte Apps vollständig deinstallieren
  • Search Console Core Web Vitals Bericht prüfen

Aufwand lohnt sich

  • Chat-Widget mit Fassade-Pattern ersetzen (2 bis 4h)
  • Critical CSS extrahieren und inlinen (4 bis 8h)
  • App-Coverage-Audit mit DevTools (1 bis 2h)
  • Liquid-Paginierung auf allen Collection-Seiten prüfen (2 bis 4h)
  • Performance-Budget definieren und Monitoring einrichten (2h)
  • Webfont-Metriken mit size-adjust angleichen (2 bis 4h)

Fazit: Performance ist Umsatz

Shopify-Performance-Optimierung ist keine optionale Verbesserung. Sie ist ein direkter Hebel auf Conversion-Rate und Google-Rankings. Die größten Gewinne liegen fast immer bei zwei Maßnahmen: JavaScript reduzieren (App-Audit, Fassade-Pattern, deferred Scripts) und das LCP-Bild priorisieren (fetchpriority="high", Preload).

Starten Sie heute mit dem Coverage-Audit in Chrome DevTools und dem Hero-Image-Fix. Diese zwei Maßnahmen kosten zusammen unter einer Stunde und können Ihren LCP um 1 bis 2 Sekunden verbessern.

Wenn Sie einen Store mit komplexem App-Stack, vielen Varianten oder einem maßgeschneiderten Theme haben und nicht selbst durch den Audit gehen wollen, helfe ich Ihnen gern.

Häufige Fragen

Was ist der Unterschied zwischen Shopify Speed Score und Core Web Vitals?

Der Shopify Speed Score ist ein relativer Vergleich mit anderen Shops auf einer Skala von 1 bis 100. Er basiert auf Lighthouse-Lab-Daten. Core Web Vitals hingegen werden von Google aus echten Nutzerdaten (Chrome UX Report) gemessen und sind der tatsächliche Ranking-Faktor. Ein Score von 70 bei Shopify kann bedeuten, dass Ihre Core Web Vitals trotzdem schlecht sind. Orientieren Sie sich deshalb immer an der Google Search Console.

Wie stark beeinflusst Performance das Google-Ranking?

Core Web Vitals sind seit 2021 ein offizieller Ranking-Faktor. Google selbst beschreibt den Einfluss als "tiebreak": Bei gleicher Content-Qualität gewinnt der schnellere Store. In der Praxis ist der direkte Ranking-Effekt moderat, aber der indirekte Effekt über Bounce-Rate und Conversion ist erheblich.

Schadet es dem SEO, wenn ich Apps deinstalliere?

Nein, im Gegenteil. Das Entfernen überflüssiger Apps verbessert fast immer Core Web Vitals und damit auch das SEO-Ranking. Achten Sie nur darauf, Apps wirklich zu deinstallieren (nicht nur zu deaktivieren) und danach auf verbleibende ScriptTags im Theme-Code zu prüfen.

Funktioniert das Fassade-Pattern für alle Chat-Widgets?

Ja, das Prinzip funktioniert für jedes Widget, das ein Script lädt. Sie ersetzen die Sofort-Einbindung durch eine optische Kopie (Fassade), die erst beim Klick das echte Script lädt. Das spart 150 bis 300 KB JavaScript beim ersten Seitenaufbau.

Wie messe ich INP korrekt?

INP können Sie nur über echte Nutzerdaten messen. Nutzen Sie die Google Search Console (Core Web Vitals Bericht) für aggregierte Field-Daten oder das Chrome-Extension "Web Vitals" für Live-Messungen während der Benutzung. Lighthouse misst INP nicht zuverlässig, weil es nur simulierte Interaktionen ausführt.

Welche Bilder soll ich im WebP-Format hochladen?

Shopify konvertiert alle Bilder automatisch ins WebP-Format über sein CDN. Laden Sie Bilder immer in der höchsten verfügbaren Qualität hoch (PNG für Logos/Grafiken, JPEG für Fotos). Shopify komprimiert optimal. Eigene Vorab-Komprimierung kann die Qualität durch doppelte Kompression sogar verschlechtern.

Weiterführende Artikel

Teilen
Justin Kreutzmann

Geschrieben von

Justin Kreutzmann

Shopify-Entwickler für Custom Apps, ERP-Integrationen und Prozessautomatisierung. Ich helfe Marken, technische Grenzen zu überwinden: mit Lösungen, die im Alltag von Händlern wirklich funktionieren.

Projekt anfragen