
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.
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.
| Metrik | Was sie misst | Gut | Verbesserungsbedarf | Schlecht |
|---|---|---|---|---|
| LCP | Größtes sichtbares Element | < 2,0 s | 2,0 bis 4,0 s | > 4,0 s |
| INP | Reaktionszeit auf Interaktionen | < 200 ms | 200 bis 500 ms | > 500 ms |
| CLS | Layout-Stabilität | < 0,1 | 0,1 bis 0,25 | > 0,25 |
Messung: Lab-Daten vs. Field-Daten
Bevor Sie optimieren, messen Sie den Ist-Zustand an den richtigen Stellen:
- Google Search Console → Core Web Vitals: Echte Nutzerdaten, wichtigste Quelle
- PageSpeed Insights: Kombiniert Lab (Lighthouse) + Field (CrUX)
- Chrome DevTools → Performance Tab: Detailed Waterfall für Debugging
- 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
{%- 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:
{%- 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.
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-Typ | Typische Script-Größe | Entscheidung |
|---|---|---|
| Chat-Widget (Tidio, Zendesk) | 150 bis 300 KB | Fassade verwenden |
| Review-App (Judge.me, Loox) | 80 bis 200 KB | Nur auf Produktseiten laden |
| Pop-up/Gamification | 50 bis 150 KB | Kosten-Nutzen prüfen |
| Heat-Map (Hotjar, Lucky Orange) | 100 bis 250 KB | Nur für Analysephasen aktiv lassen |
| Social Proof (Fomo, Nudgify) | 30 bis 80 KB | Entfernen, wenn Conversion-Impact < Kosten |
Chat-Widget mit Fassade-Pattern
Chat-Widgets gehören zu den schwersten Einzelscripts. Laden Sie sie erst bei echter Interaktion:
<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:
<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
{%- 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:
@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>:
<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
{%- 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_minstatt alle Varianten durchloopen{% capture %}für Berechnungen, die mehrfach ausgegeben werden- Verschachtelung auf maximal 2 Ebenen beschränken
Resource Hints
{%- 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
| Ressource | Budget | Typischer Shopify Store |
|---|---|---|
| JavaScript (total, gzip) | < 200 KB | 300 bis 1.500 KB |
| CSS (total) | < 80 KB | 80 bis 200 KB |
| Bilder (Above the Fold) | < 150 KB | 100 bis 800 KB |
| Fonts | < 80 KB | 50 bis 200 KB |
| Total Page Weight | < 1,2 MB | 2 bis 5 MB |
Automatisiertes Monitoring
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).
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.
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.
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
- SEO für Shopify: Ranking-Faktoren technisch verstehen: Core Web Vitals als Teil der technischen SEO-Strategie, mit Structured Data und Crawling-Optimierung
- Shopify Checkout anpassen: Schnellerer Checkout für mehr Conversion nach dem Performance-Uplift
- Shopify 2.0 Sections Everywhere: Wie die neue Theme-Architektur Performance-Vorteile mitbringt
- AI Act: KI-Chatbots im Shopify-Shop kennzeichnen: Wenn Sie das Chat-Widget per Fassade nachladen, muss der Kennzeichnungshinweis trotzdem beim ersten Kontakt sichtbar sein

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

