Add connected apps
Integrations
Use Kinde as the authentication provider for your Shopify store’s customer accounts. Shopify’s third-party identity provider lets customers sign in to your store through Kinde, so you control sign-in methods, branding, and user management in one place.
This guide walks you through connecting Kinde to Shopify using OpenID Connect. It also covers the legacy Shopify Multipass integration for stores that still rely on that approach.
Sign in to your Shopify account and go to Settings > Customer accounts > Third-party identity provider
Enter Discovery URL:
<YOUR_DOMAIN>/.well-known/openid-configurationReplace <YOUR_DOMAIN> with your custom domain (e.g., https://auth.yourbusiness.com) or Kinde domain (e.g., https://your_business.kinde.com)
Enter the Client ID and Client secret you copied from the Kinde app.
Optional: In the Additional scopes field, add offline to enable refresh token support.
Kinde uses the offline scope instead of offline_access as defined in the OIDC specification.
Select Save.
Copy the Shopify callback URL. You will need it in the next step.
Shopify no longer recommends Multipass for new integrations. The steps below are kept here for legacy stores that still depend on Multipass to sign customers into Shopify from an external application.
This example uses Next.js, but you can configure Multipass in other languages and frameworks.
npm i multipass-js @kinde/jwt-decoderpnpm add multipass-js @kinde/jwt-decoderyarn add multipass-js @kinde/jwt-decoderbun add multipass-js @kinde/jwt-decoderAdd Shopify and Multipass settings to your .env file.
SHOPIFY_MULTIPASS_SECRET=<your-multipass-secret>SHOPIFY_STORE_URL=<your-shopify-store-url>Create an endpoint file—for example, app/api/multipass/route.tsx—and add the following code:
Replace the placeholder values with your domain and Multipass secret.
import { NextResponse } from "next/server";import { jwtDecoder, type JWTDecoded } from "@kinde/jwt-decoder";import { cookies } from "next/headers";import { Multipass } from "multipass-js";
export async function GET() { const decodedToken = jwtDecoder<JWTDecoded & {email: string}>(cookies().get("id_token")?.value);
if (decodedToken) { const multipass = new Multipass(process.env.SHOPIFY_MULTIPASS_SECRET as string);
const customerData = { // Required email: decodedToken?.email, created_at: decodedToken?.iat // add additional fields here };
const url = multipass .withCustomerData(customerData) .withDomain(process.env.SHOPIFY_STORE_URL as string) .url();
return NextResponse.redirect(url, 302); } else { const params = new URLSearchParams(); params.append("post_login_redirect_url", `${process.env.KINDE_SITE_URL}/api/multipass`); return NextResponse.redirect( `${process.env.KINDE_SITE_URL}/api/auth/login?${params.toString()}`, 302 ); }}Shopify Multipass is now configured with Kinde.
When you redirect users to /api/multipass, the endpoint generates a Multipass token and redirects them to your Shopify store, signed in.