Ein Link im Newsletter, in einer Instagram-Story oder in der Warenkorb-Erinnerung: Wer eure App installiert hat, sollte damit direkt in der App landen und nicht im mobilen Browser. In der App sind Kund:innen eingeloggt, ihre Zahlungsdaten sind hinterlegt, der Kauf geht schneller. Dafür gibt es Universal Links (iOS) und App Links (Android).
Technisch reichen dafür zwei kleine Dateien auf eurer Shop-Domain. Bei Shopify hat sich der Weg dorthin zuletzt geändert, er führt heute über die Admin API. Wir haben das für die App eines Kunden mit zwei Länder-Domains umgesetzt, gemeinsam mit dem Shopify-Plus-Support. Diese Anleitung zeigt Schritt für Schritt, wie es geht. Stand: Oktober 2026.
Was ihr dafür braucht: eine eigene App im Dev Dashboard, zwei Scopes, die der Shopify-Support freischaltet, und je eine Mutation über die Admin API für eure iOS- und Android-App. Die Dateien erzeugt Shopify dann selbst, auf jeder verbundenen Domain.
Was sich bei Shopify geändert hat
iOS und Android öffnen einen Link nur dann in einer App, wenn die Domain das ausdrücklich erlaubt. Das regeln zwei Dateien: /.well-known/apple-app-site-association für iOS und /.well-known/assetlinks.json für Android. Bei Shopify müsst ihr sie nicht selbst hochladen: Shopify erzeugt sie automatisch, aus einem Eintrag pro App, der im System MobilePlatformApplication heißt.
Früher hat man diese Einträge in einer Custom App angelegt, die direkt im Shopify-Admin erstellt wurde: unter „Storefront API integration“ in den Bereichen „iOS Buy SDK“ und „Android Buy SDK“. Solche Apps entstehen heute im Dev Dashboard, und den Teil für die Storefront API hat Shopify in den Headless-Kanal verlegt. Die App-Registrierung läuft seitdem über die Admin API. Eine Einstellung im Admin oder im Headless-Kanal gibt es dafür nicht.
Wer von Shopifys Anleitung in der Checkout-Kit-Doku kommt („Handle offsite payments“), findet dort noch die Einrichtung über diese Einstellungen. Den aktuellen Weg über die Admin API beschreiben wir im Folgenden.
Theme oder Headless: Wer liefert die Dateien aus?
Bevor ihr loslegt, klärt eine Frage: Wohin zeigt eure Domain?
Die Domain zeigt auf Shopify. So ist es, wenn euer Webshop als Shopify-Theme läuft. Dann liefert Shopify die beiden Dateien aus, und ihr braucht den Weg aus diesem Artikel.
Die Domain zeigt auf euer eigenes Hosting. So ist es bei einem Headless-Frontend, etwa mit Next.js auf Vercel. Dann erreichen diese Anfragen Shopify gar nicht erst. Ihr legt die beiden Dateien selbst ab und bestimmt selbst, welche Pfade die App öffnen.
Shopify liefert die Dateien nur aus, solange die Domain auf Shopify zeigt. Zieht ihr später auf ein Headless-Frontend um, legt die Dateien vor der DNS-Umstellung auf dem neuen Hosting ab. Sonst öffnen Links ohne jede Fehlermeldung wieder den Browser statt der App.
Schritt für Schritt: So registriert ihr die Apps
1. Eine eigene App im Dev Dashboard anlegen
Die Einträge legt eine kleine, eigene App über die Admin API an. Mit eurem Storefront hat sie nichts zu tun, der Headless-Kanal bleibt, wie er ist. Legt die App im Dev Dashboard an, erstellt eine erste Version und installiert sie auf dem Shop, bei Bedarf auch auf dem Staging-Shop.
Die App gehört in die Organisation des Händlers. Wer als Agentur darin arbeitet, braucht dort die Rolle „App developer“. Der einfachste Weg zum Access Token (Schritt 4) funktioniert nur, wenn App und Shop zur selben Organisation gehören.
Nehmt keine Wegwerf-App. Laut Shopify-Support hängen die Einträge an der Installation dieser App. Sie muss also dauerhaft installiert bleiben. Notiert das am besten im Betriebshandbuch.
2. Die Scopes beim Shopify-Support beantragen
Ihr braucht die Scopes read_mobile_platform_applications und write_mobile_platform_applications. Die könnt ihr nicht selbst auswählen, und es reicht auch nicht, sie in der App-Konfiguration einzutragen. Shopify muss sie für eure App freischalten. Bis dahin lehnt die API die Anfragen ab.
Schickt dem Support den Namen der App, ihre Client ID und die Shops, auf denen sie installiert ist. Bei uns lief das über den Shopify-Plus-Support. Der hat uns den Weg ausführlich erklärt, und zwei Tage nach der ersten Antwort waren die Scopes freigeschaltet. Ob Shops ohne Plus sie genauso bekommen, wissen wir nicht.
3. Eine neue Version mit den Scopes freigeben
Nach der Freischaltung könnt ihr die beiden Scopes im Dev Dashboard auswählen. Erstellt eine neue Version der App, fügt die Scopes hinzu und gebt die Version frei. Neue Scopes gelten auf bereits installierten Shops aber nicht automatisch. Ihr müsst sie im Shopify-Admin jedes Shops noch einmal bestätigen.
4. Ein Access Token holen
Weil App und Shop zur selben Organisation gehören, reicht der Client-Credentials-Grant. Ihr tauscht Client ID und Client Secret aus den App-Einstellungen gegen ein Token, das 24 Stunden gilt. Einen Server oder eine Weiterleitung braucht ihr dafür nicht.
curl -X POST "https://{shop}.myshopify.com/admin/oauth/access_token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=$SHOPIFY_CLIENT_ID" \
-d "client_secret=$SHOPIFY_CLIENT_SECRET"Das Feld scope in der Antwort zeigt, welche Scopes die App tatsächlich hat. So seht ihr sofort, ob die Freischaltung angekommen ist. Das Secret gehört nicht ins Repository, sondern in eine Umgebungsvariable oder eine Datei außerhalb des Projekts.
5. Je eine Mutation für iOS und Android
Die Eingabe von mobilePlatformApplicationCreate nimmt entweder apple oder android an, nie beides. Ihr ruft dieselbe Mutation also zweimal auf:
mutation Register($input: MobilePlatformApplicationCreateInput!) {
mobilePlatformApplicationCreate(input: $input) {
mobilePlatformApplication {
... on AppleApplication { id appId universalLinksEnabled }
... on AndroidApplication { id applicationId appLinksEnabled }
}
userErrors { field message }
}
}Für iOS besteht die appId aus eurer Team-ID und der Bundle-ID:
{
"input": {
"apple": {
"appId": "ABCDE12345.com.example.shop",
"universalLinksEnabled": true,
"sharedWebCredentialsEnabled": false
}
}
}Für Android braucht ihr den Paketnamen und den SHA-256-Fingerprint:
{
"input": {
"android": {
"applicationId": "com.example.shop",
"sha256CertFingerprints": ["AB:CD:EF:…"],
"appLinksEnabled": true
}
}
}Nehmt für den Fingerprint den App-Signaturschlüssel aus der Play Console (Play App Signing), nicht euren Upload-Key. Sonst schlägt die Prüfung bei jeder Installation aus dem Play Store fehl. Weitere Fingerprints, etwa für Testbuilds, ergänzt ihr am besten per mobilePlatformApplicationUpdate im bestehenden Eintrag statt mit einem zweiten Create.
Ob alles angekommen ist, zeigt diese Abfrage:
{
mobilePlatformApplications(first: 10) {
nodes {
... on AppleApplication { id appId universalLinksEnabled }
... on AndroidApplication { id applicationId sha256CertFingerprints }
}
}
}Alle Anfragen gehen an https://{shop}.myshopify.com/admin/api/2026-07/graphql.json, mit dem Token im Header X-Shopify-Access-Token. Danach ist die Arbeit der App erledigt. Sie bleibt installiert, muss aber nichts mehr tun.
6. Prüfen, ob alles ankommt
Zuerst direkt auf eurer Domain:
curl -s https://www.example.com/.well-known/apple-app-site-association
curl -s https://www.example.com/.well-known/assetlinks.jsoniPhones holen die Datei nicht direkt von eurer Domain, sondern über Apples CDN, das sie zwischenspeichert. Was Apple gerade ausliefert, seht ihr hier:
curl -s https://app-site-association.cdn-apple.com/a/v1/www.example.comFür Android bietet Google eine eigene Prüfung. Die Antwort muss "linked": true enthalten:
curl -s "https://digitalassetlinks.googleapis.com/v1/assetlinks:check\
?source.web.site=https://www.example.com\
&relation=delegate_permission/common.handle_all_urls\
&target.androidApp.packageName=com.example.shop\
&target.androidApp.certificate.sha256Fingerprint=AB:CD:EF:…"Testet nicht auf eurer *.myshopify.com-Domain. Dort liefert Shopify die Dateien bewusst nicht aus und antwortet mit 404. Prüft stattdessen jede eigene Domain einzeln, mit und ohne www.
Was die App können muss
In der App gehört jede Domain einzeln in die Konfiguration. Apple und Google behandeln example.com und www.example.com als verschiedene Hosts. Bei zwei Länder-Domains sind das schon vier Einträge, dazu kommt Staging.
Für iOS in den Associated Domains der App:
<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:example.com</string>
<string>applinks:www.example.com</string>
</array>Für Android als Intent-Filter mit autoVerify in der AndroidManifest.xml:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" android:host="example.com" />
<data android:scheme="https" android:host="www.example.com" />
</intent-filter>Getestet haben wir mit TestFlight und dem internen Test-Track von Google Play. Mit Debug-Builds im Simulator hat die Prüfung bei uns nicht funktioniert.
Welche Links die App öffnet
Welche Pfade in der App landen, legt Shopify in der Datei fest. Eine eigene Liste lässt sich derzeit nicht hinterlegen. Die Datei endet mit einem Platzhalter für alle Pfade (/*), ausgenommen sind nur /admin/*, zwei Rücksprung-Adressen von Zahlungsanbietern und die Checkout-Pfade. Shopifys Doku zeigt drei solcher Ausnahmen, in der Datei unseres Kunden stehen inzwischen sechs. Die Liste ändert sich also, und die App sollte sich nicht auf eine bestimmte Form verlassen.
Für eigene Ausnahmen gibt es einen Feature-Request. Shopify schrieb dort im Oktober 2026, Verbesserungen seien „on our radar“. Einen Termin gibt es noch nicht.
Jeder Link auf eure Domain kann also die App öffnen, auch Blogartikel, Rechtstexte und Landingpages. Die App muss mit jeder URL etwas Sinnvolles anfangen. Bei unserem Kunden erledigt das ein kleiner Resolver:
Bekannte Pfade öffnen den passenden Screen: Startseite, Produkt (auch unter
/collections/…/products/…), Kategorie, Suche, Warenkorb, Konto und Merkliste.Sprachpräfixe von Shopify Markets wie
/enoder/de-atentfernt er vorher.Alles andere zeigt die App in ihrer Webansicht. So endet kein Link auf einer leeren Seite.
Alte Pfade aus der Zeit vor Shopify bildet er ebenfalls ab, denn die stecken noch in älteren Newslettern.
Auch Warenkorb-Links aus Erinnerungs-Mails (/cart/c/…) sind nicht ausgenommen. Wer die App installiert hat, landet damit in der App, und die muss diese Links verarbeiten können.
Häufige Stolperfallen
Nur über die Admin API: Für die App-Registrierung gibt es keine Einstellung im Admin, auch nicht im Headless-Kanal.
Scopes nur über den Support: Eintragen allein reicht nicht, Shopify muss sie freischalten.
Neue Scopes bestätigen: im Admin jedes Shops, auf dem die App installiert ist.
Zwei Aufrufe:
appleundandroidnie in derselben Eingabe.Richtiger Fingerprint: der App-Signaturschlüssel aus Play App Signing, nicht der Upload-Key.
Kein Test auf myshopify.com: Dort gibt es nur eine 404.
Mit und ohne www: Normale Seiten leitet Shopify auf die Hauptdomain um, die beiden Dateien liefert es aber auf jeder verbundenen Domain direkt aus. Sind Links ohne www im Umlauf, gehören beide Hosts in die App.
Alle Domains, dieselben Dateien: Jede mit dem Shop verbundene Domain liefert identische Dateien aus. Eine Einstellung pro Domain gibt es nicht.
Nur mit DNS bei Shopify: Zeigt die Domain woandershin, liefert Shopify nichts mehr aus.
Geduld beim Cache: Apple liefert über sein CDN mit Verzögerung aus, Android prüft bei Installation und Update. Nach Änderungen hilft es, die App neu zu installieren.
Fazit
Die Einrichtung hat ein paar Schritte mehr als früher. Einmal eingerichtet, läuft sie aber ohne Pflege: zwei Mutations, danach ruht die Konfigurations-App. Ins Betriebshandbuch gehören drei Punkte: Die App darf nicht deinstalliert werden, die Domains müssen auf Shopify zeigen, und ein neuer Signaturschlüssel braucht einen neuen Fingerprint.
Shopify hat das Thema nach eigener Aussage auf dem Radar. Sobald sich etwas ändert, aktualisieren wir diesen Artikel.
Ihr plant eine eigene Shopping-App für euren Shopify-Shop oder hängt gerade an genau dieser Stelle? Schreibt uns. Ob sich eine App für euren Shop überhaupt lohnt, lest ihr in diesem Artikel.

