Getting Started

Usage

Using the Nuxt Shopify module

To quickly get started building your Shopify-powered Nuxt application, you can use the useStorefront and useAdmin composables provided by the module. On the client side, you can also use the useAsyncStorefront composable for direct integration with Nuxt's async data fetching.

Depending on the module configuration, you will have access to either the Storefront API, the Admin API, or both. The composables are automatically provided when configured correctly.

See the module configuration reference for more details on how to configure the module.

Storefront API

First, ensure you have configured the module to use the Storefront API client in your nuxt.config.ts file:

nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/shopify'],

  shopify: {
    name: 'quickstart-abcd1234',

    clients: {
      storefront: {
        apiVersion: '2025-07',
        publicAccessToken: 'YOUR_ACCESS_TOKEN',
      },
    },
  },
})

Adding the publicAccessToken will enable the Storefront API client on the server and client side. If you only need access through Nitro you can set the privateAccessToken instead. When using the mock option, the client will be available on both server and client side with mock data.

See the Storefront API guide for more details on how to configure and use the Storefront API client.

Client side

Once configured, you can use the useStorefront and useAsyncStorefront composables to interact with the Storefront API.

~/app/pages/product.vue
<script setup lang="ts">
const storefront = useStorefront()

const { data: product } = await storefront.request(`#graphql
  query GetProduct($handle: String!) {
    product(handle: $handle) {
      id
      title
      description
    }
  }
`, {
  variables: {
    handle: 'high-top-sneakers',
  }
})
</script>

<template>
  <div v-if="product">
    <h1>{{ product.data.title }}</h1>

    <p>{{ product.data.description }}</p>
  </div>
</template>

Server side

On the server side, you can use the useStorefront composable in server routes, server middleware, or API routes.

~/server/api/product/[handle].ts
export default defineEventHandler(async (event) => {
  const { handle } = getQuery(event)

  const storefront = useStorefront()

  const { data: product } = await storefront.request(`#graphql
    query GetProduct($handle: String!) {
      product(handle: $handle) {
        id
        title
        description
      }
    }
  `, {
    variables: {
      handle,
    }
  })

  return product
})

Admin API

First, ensure you have configured the module to use the Admin API client in your nuxt.config.ts file:

nuxt.config.ts
export default defineNuxtConfig({
  modules: ['@nuxtjs/shopify'],

  shopify: {
    name: 'quickstart-abcd1234',

    clients: {
      admin: {
        apiVersion: '2025-07',
        accessToken: 'YOUR_ACCESS_TOKEN',
      },
    },
  },
})

Adding the accessToken will enable the Admin API client on the server side only. Using the Admin API on the client side is not supported due to security reasons. If you want to use admin functionality on the client side, you need to create server endpoints that use the Admin API client and call them from the client side.

See the Admin API guide for more details on how to configure and use the Admin API client.

Server side

Once configured, you can use the useAdmin composable within your Nitro endpoints.

~/server/api/products.ts
export default defineEventHandler(async (event) => {
  const admin = useAdmin()

  const { data: product } = await admin.request(`#graphql
    query GetProduct($handle: String!) {
      product(handle: $handle) {
        id
        title
        description
      }
    }
  `, {
    variables: {
      handle: 'high-top-sneakers',
    }
  })

  return product
})

Fragments

When using the Shopify GraphQL APIs, it's common to reuse fragments across multiple queries and mutations. The module provides a way to define and use fragments easily. You can define your fragments in a separate file and import them into your queries or mutations.

It is recommended to organize your fragments in the ~/graphql directory within your project structure. Files within this directory will be scanned for code generation and auto-imported by default.

Anywhere in the codebase, including the ~/graphql directory, files for the Storefront API will be evaluated by default. Files for the Admin API need to be placed in an admin subdirectory or use the file ending *.admin.{ts,js,vue}.

app/pages/product.vue
<script setup lang="ts">
const props = defineProps<{
  handle: string
}>()

const key = computed(() => `product-${props.handle}`)

const { data: products } = await useAsyncStorefront(key, `#graphql
  query GetProduct($handle: String!) {
    product(handle: $handle) {
      ...ProductFields
    }
  }
  ${PRODUCT_FRAGMENT}
`, {
  variables: props,
})
</script>

<template>
  <div
    v-for="product in products"
    :key="product.id"
  >
    <h2>{{ product.title }}</h2>
    <p>{{ product.description }}</p>
  </div>
</template>

Generated Types

The code generation process will automatically create TypeScript types for your GraphQL queries, mutations and fragments. These types will be based on the schema defined in your Shopify store and will be available for use throughout your application.

Generated types will be placed in the ./.nuxt/types/storefront and ./.nuxt/types/admin directories and will be auto-imported by default. When for example using the useAsyncStorefront composable, the types will be inferred automatically. When you want to be able to pass objects from a client response to another component or function, you can use the auto-imported types directly.

app/components/ProductCard.vue
<script setup lang="ts">
import type { ProductFieldsFragment } from '#shopify/storefront' // Auto-imported type

defineProps<{
  product: ProductFieldsFragment
}>()
</script>

<template>
  <div>
    <h2>{{ product.title }}</h2>
    <p>{{ product.description }}</p>
  </div>
</template>

Auto-Imports

The module provides auto-imports for all generated types from the Storefront and Admin APIs. You can find the generated types under the #shopify/storefront and #shopify/admin import paths.

For example, if you have a fragment named ProductFields in your Storefront API queries, you can import the generated type ProductFieldsFragment like this:

import type { ProductFieldsFragment } from '#shopify/storefront'

This allows you to use the generated types directly in your components, composables, or any other part of your application. You can also import types for queries and mutations. For example, if you have a query named GetProduct, you can import the generated type GetProductQuery like this:

import type { GetProductQuery } from '#shopify/storefront'

By default, the module will auto-import all generated types for the Storefront and Admin APIs, as well as the contents of the ~/graphql directory. You can customize this behavior in the module configuration:

nuxt.config.ts
export default defineNuxtConfig({
  shopify: {
    autoImports: {
      storefront: true,
      admin: true,
      graphql: true,
    }
  },
})