├── .env.example ├── .gitignore ├── .vscode ├── launch.json └── settings.json ├── README.md ├── app ├── [page] │ ├── layout.tsx │ ├── opengraph-image.tsx │ └── page.tsx ├── api │ └── revalidate │ │ └── route.ts ├── error.tsx ├── favicon.ico ├── globals.css ├── layout.tsx ├── opengraph-image.tsx ├── page.tsx ├── product │ └── [handle] │ │ └── page.tsx ├── robots.ts ├── search │ ├── [collection] │ │ ├── opengraph-image.tsx │ │ └── page.tsx │ ├── children-wrapper.tsx │ ├── layout.tsx │ ├── loading.tsx │ └── page.tsx └── sitemap.ts ├── components ├── carousel.tsx ├── cart │ ├── actions.ts │ ├── add-to-cart.tsx │ ├── cart-context.tsx │ ├── delete-item-button.tsx │ ├── edit-item-quantity-button.tsx │ ├── modal.tsx │ └── open-cart.tsx ├── grid │ ├── index.tsx │ ├── three-items.tsx │ └── tile.tsx ├── icons │ └── logo.tsx ├── label.tsx ├── layout │ ├── footer-menu.tsx │ ├── footer.tsx │ ├── navbar │ │ ├── index.tsx │ │ ├── mobile-menu.tsx │ │ └── search.tsx │ ├── product-grid-items.tsx │ └── search │ │ ├── collections.tsx │ │ └── filter │ │ ├── dropdown.tsx │ │ ├── index.tsx │ │ └── item.tsx ├── loading-dots.tsx ├── logo-square.tsx ├── opengraph-image.tsx ├── price.tsx ├── product │ ├── gallery.tsx │ ├── product-context.tsx │ ├── product-description.tsx │ └── variant-selector.tsx ├── prose.tsx └── welcome-toast.tsx ├── fonts └── Inter-Bold.ttf ├── lib ├── constants.ts ├── shopify │ ├── fragments │ │ ├── cart.ts │ │ ├── image.ts │ │ ├── product.ts │ │ └── seo.ts │ ├── index.ts │ ├── mutations │ │ └── cart.ts │ ├── queries │ │ ├── cart.ts │ │ ├── collection.ts │ │ ├── menu.ts │ │ ├── page.ts │ │ └── product.ts │ └── types.ts ├── type-guards.ts └── utils.ts ├── license.md ├── next.config.ts ├── package.json ├── pnpm-lock.yaml ├── postcss.config.mjs └── tsconfig.json /.env.example: -------------------------------------------------------------------------------- 1 | COMPANY_NAME="Vercel Inc." 2 | SITE_NAME="Next.js Commerce" 3 | SHOPIFY_REVALIDATION_SECRET="" 4 | SHOPIFY_STOREFRONT_ACCESS_TOKEN="" 5 | SHOPIFY_STORE_DOMAIN="[your-shopify-store-subdomain].myshopify.com" 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | .playwright 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | .pnpm-debug.log* 28 | 29 | # local env files 30 | .env* 31 | !.env.example 32 | 33 | # vercel 34 | .vercel 35 | 36 | # typescript 37 | *.tsbuildinfo 38 | next-env.d.ts 39 | .env*.local 40 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Next.js: debug server-side", 6 | "type": "node-terminal", 7 | "request": "launch", 8 | "command": "pnpm dev" 9 | }, 10 | { 11 | "name": "Next.js: debug client-side", 12 | "type": "chrome", 13 | "request": "launch", 14 | "url": "http://localhost:3000" 15 | }, 16 | { 17 | "name": "Next.js: debug full stack", 18 | "type": "node-terminal", 19 | "request": "launch", 20 | "command": "pnpm dev", 21 | "serverReadyAction": { 22 | "pattern": "started server on .+, url: (https?://.+)", 23 | "uriFormat": "%s", 24 | "action": "debugWithChrome" 25 | } 26 | } 27 | ] 28 | } 29 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/typescript/lib", 3 | "typescript.enablePromptUseWorkspaceTsdk": true, 4 | "editor.codeActionsOnSave": { 5 | "source.fixAll": "explicit", 6 | "source.organizeImports": "explicit", 7 | "source.sortMembers": "explicit" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fvercel%2Fcommerce&project-name=commerce&repo-name=commerce&demo-title=Next.js%20Commerce&demo-url=https%3A%2F%2Fdemo.vercel.store&demo-image=https%3A%2F%2Fbigcommerce-demo-asset-ksvtgfvnd.vercel.app%2Fbigcommerce.png&env=COMPANY_NAME,SHOPIFY_REVALIDATION_SECRET,SHOPIFY_STORE_DOMAIN,SHOPIFY_STOREFRONT_ACCESS_TOKEN,SITE_NAME) 2 | 3 | # Next.js Commerce 4 | 5 | A high-performance, server-rendered Next.js App Router ecommerce application. 6 | 7 | This template uses React Server Components, Server Actions, `Suspense`, `useOptimistic`, and more. 8 | 9 |

10 | 11 | > Note: Looking for Next.js Commerce v1? View the [code](https://github.com/vercel/commerce/tree/v1), [demo](https://commerce-v1.vercel.store), and [release notes](https://github.com/vercel/commerce/releases/tag/v1). 12 | 13 | ## Providers 14 | 15 | Vercel will only be actively maintaining a Shopify version [as outlined in our vision and strategy for Next.js Commerce](https://github.com/vercel/commerce/pull/966). 16 | 17 | Vercel is happy to partner and work with any commerce provider to help them get a similar template up and running and listed below. Alternative providers should be able to fork this repository and swap out the `lib/shopify` file with their own implementation while leaving the rest of the template mostly unchanged. 18 | 19 | - Shopify (this repository) 20 | - [BigCommerce](https://github.com/bigcommerce/nextjs-commerce) ([Demo](https://next-commerce-v2.vercel.app/)) 21 | - [Ecwid by Lightspeed](https://github.com/Ecwid/ecwid-nextjs-commerce/) ([Demo](https://ecwid-nextjs-commerce.vercel.app/)) 22 | - [Geins](https://github.com/geins-io/vercel-nextjs-commerce) ([Demo](https://geins-nextjs-commerce-starter.vercel.app/)) 23 | - [Medusa](https://github.com/medusajs/vercel-commerce) ([Demo](https://medusa-nextjs-commerce.vercel.app/)) 24 | - [Prodigy Commerce](https://github.com/prodigycommerce/nextjs-commerce) ([Demo](https://prodigy-nextjs-commerce.vercel.app/)) 25 | - [Saleor](https://github.com/saleor/nextjs-commerce) ([Demo](https://saleor-commerce.vercel.app/)) 26 | - [Shopware](https://github.com/shopwareLabs/vercel-commerce) ([Demo](https://shopware-vercel-commerce-react.vercel.app/)) 27 | - [Swell](https://github.com/swellstores/verswell-commerce) ([Demo](https://verswell-commerce.vercel.app/)) 28 | - [Umbraco](https://github.com/umbraco/Umbraco.VercelCommerce.Demo) ([Demo](https://vercel-commerce-demo.umbraco.com/)) 29 | - [Wix](https://github.com/wix/headless-templates/tree/main/nextjs/commerce) ([Demo](https://wix-nextjs-commerce.vercel.app/)) 30 | - [Fourthwall](https://github.com/FourthwallHQ/vercel-commerce) ([Demo](https://vercel-storefront.fourthwall.app/)) 31 | 32 | > Note: Providers, if you are looking to use similar products for your demo, you can [download these assets](https://drive.google.com/file/d/1q_bKerjrwZgHwCw0ovfUMW6He9VtepO_/view?usp=sharing). 33 | 34 | ## Integrations 35 | 36 | Integrations enable upgraded or additional functionality for Next.js Commerce 37 | 38 | - [Orama](https://github.com/oramasearch/nextjs-commerce) ([Demo](https://vercel-commerce.oramasearch.com/)) 39 | 40 | - Upgrades search to include typeahead with dynamic re-rendering, vector-based similarity search, and JS-based configuration. 41 | - Search runs entirely in the browser for smaller catalogs or on a CDN for larger. 42 | 43 | - [React Bricks](https://github.com/ReactBricks/nextjs-commerce-rb) ([Demo](https://nextjs-commerce.reactbricks.com/)) 44 | - Edit pages, product details, and footer content visually using [React Bricks](https://www.reactbricks.com) visual headless CMS. 45 | 46 | ## Running locally 47 | 48 | You will need to use the environment variables [defined in `.env.example`](.env.example) to run Next.js Commerce. It's recommended you use [Vercel Environment Variables](https://vercel.com/docs/concepts/projects/environment-variables) for this, but a `.env` file is all that is necessary. 49 | 50 | > Note: You should not commit your `.env` file or it will expose secrets that will allow others to control your Shopify store. 51 | 52 | 1. Install Vercel CLI: `npm i -g vercel` 53 | 2. Link local instance with Vercel and GitHub accounts (creates `.vercel` directory): `vercel link` 54 | 3. Download your environment variables: `vercel env pull` 55 | 56 | ```bash 57 | pnpm install 58 | pnpm dev 59 | ``` 60 | 61 | Your app should now be running on [localhost:3000](http://localhost:3000/). 62 | 63 |
64 | Expand if you work at Vercel and want to run locally and / or contribute 65 | 66 | 1. Run `vc link`. 67 | 1. Select the `Vercel Solutions` scope. 68 | 1. Connect to the existing `commerce-shopify` project. 69 | 1. Run `vc env pull` to get environment variables. 70 | 1. Run `pnpm dev` to ensure everything is working correctly. 71 |
72 | 73 | ## Vercel, Next.js Commerce, and Shopify Integration Guide 74 | 75 | You can use this comprehensive [integration guide](https://vercel.com/docs/integrations/ecommerce/shopify) with step-by-step instructions on how to configure Shopify as a headless CMS using Next.js Commerce as your headless Shopify storefront on Vercel. 76 | -------------------------------------------------------------------------------- /app/[page]/layout.tsx: -------------------------------------------------------------------------------- 1 | import Footer from 'components/layout/footer'; 2 | 3 | export default function Layout({ children }: { children: React.ReactNode }) { 4 | return ( 5 | <> 6 |
7 |
{children}
8 |
9 |