template-ecommerce-webapp-nextjs
template-ecommerce-webapp-nextjs copied to clipboard
Next.js ecommerce website starter template
Contentful Ecommerce Starter Template
An Ecommerce Starter Template powered by Next.js & Contentful, pre-designed with optimized & adjustable pages, components, and data management.

$~$
What is Contentful?
Contentful provides content infrastructure for digital teams to power websites, apps, and devices. Unlike a CMS, Contentful was built to integrate with the modern software stack. It offers a central hub for structured content, powerful management, and delivery APIs, and a customizable web app that enables developers and content creators to ship their products faster.
$~$
DISCLAIMER ⚠️
The Starter Templates experience is currently only available to new users.
To benefit from this experience, please follow this link to create a new account and select the template to install: https://www.contentful.com/starter-templates/ecommerce-website/sign-up/?action=create_starter_template.
Alternatively, to immediately start the auto installation of this template after creating a new account, please follow this link: https://www.contentful.com/starter-templates/ecommerce-website/sign-up/?action=create_starter_template&template_name=ecommerce.
$~$
Begin your journey with Contentful and the Ecommerce Starter Template
Follow this guide to understand the relationship between Contentful and the Starter Template source code through guided steps:
- Entry editing, and updates preview in the Starter Template application (online/locally)
- Content type editing in the Contentful web app, as well as in the Starter Template's code
$~$
Features
- Composable content through powerful & flexible content modeling.
- Localization ready.
- SEO ready.
- Server-side rendering with Next.js[^1].
- Generation of GraphQL[^2] typed code (schema, and types), in sync with the content types through graphql-codegen[^3].
- Enhanced Developer Experience with TypeScript[^4].
$~$
Getting started
To get started, read the following guidelines.
- Environment variables
- Dependencies
- Development
- Contentful API & GraphQL
- Deployment
$~$
Environment variables
In order to authenticate the requests to the Contentful APIs, the following values are necessary:
- Your space ID: https://www.contentful.com/help/find-space-id/
- Contentful Delivery API token: https://www.contentful.com/developers/docs/references/content-delivery-api/
- Contentful Preview API token: https://www.contentful.com/developers/docs/references/content-preview-api/
Rename the .env.example file to .env and add the necessary values.
$~$
Dependencies
To install the necessary dependencies, run:
yarn
Run the Starter Template in development mode
yarn dev
The Starter Template should be up and running on http://localhost:3000.
All necessary dependencies are installed under node_modules and any necessary tools can be accessed via npm scripts.
$~$
Development
Node
It is recommended to use the Node version listed in the .nvmrc file, we recommend using nvm to easily switch between Node versions.
$~$
Husky & git hooks
This repository makes use of Husky to enforce commit hooks.
The config for both the pre-commit and pre-push hooks can be found in the .husky folder, located in the root of the project.
Pre-commit
Before allowing a commit, we require a successful result from the TypeScript compiler (tsc) and our lint-staged script will be run.
This ensures all ESLint and Prettier rules are enforced on the files that are staged to be committed.
The tsc command is run separately from the lint-staged step because we require the Typescript compiler to sample all files.
This is important to ensure that no deviating types were introduced by the codegen for example.
Pre-push
The same two tasks are run for pre-push and for pre-commit.
Overriding the Husky git hooks
In case of wanting to bypass the pre-commit or pre-push hooks, pass a --noVerify flag to your Git commands.
⚠️ Make sure you only use this if you know why you're using it. ⚠️
$~$
Contentful API & GraphQL
This project makes use of Contentful's GraphQL API.
API calls made to the Contentful GraphQL endpoint are made through graphql-request.
The types are generated from the .graphql files located in the /lib/graphql/ directory:
lib/graphql/[fileName].graphqlis detected by the codegenlib/__generated/sdk.tsis generated- Within the generated file, their types and a new
getSdkfunction are generated - The
getSdkfunction can now be imported and used within thegetStaticPropsin the pages files
$~$
GraphQL & code generation
We use graphql-codegen to generate a type-safe API client, utilizing GraphQLClient as the "client".
The data for the hooks is pre-fetched on the server-side.
Commands
In order to (re-)generate the GraphQL schema, types and hooks, please use either of the following commands:
yarn graphql-codegen:generategenerates a schema, types and code to fetch data from the Contentful APIsyarn graphql-codegen:watchsimilar to thegeneratecommand, but it runs as a watch task which will rerun the steps when changes are made in the.graphqlfiles
The first steps of the codegen generate files that contain the GraphQL schema and matching TypeScript types.
They're generated to the src/lib/__generated folder and ought to be committed once altered/added to the repository.
Additionally, the codegen watches .graphql files in our src folder, if it runs successfully it generates a __generated folder collocated in the folder where the .graphql file was found.
One exception to this rule is the src/lib/fragments folder which contains shared GraphQL Fragments that are used in several other queries/fragments.
The TS types for these files are generated in the same location, in a __generated folder and like the other files ought to be committed.
Configuration
The configuration for the codegen can be found in codegen.ts, located in the root of the project.
$~$
$~$
Deployment
The Starter Template can be deployed to your hosting provider of choice.
We offer integrations with Vercel and Netlify to speed up the process by clicking one of the deploy buttons below. The GitHub repository and the necessary environment variables keys are pre-configured in the hosting provider space.
| Vercel | Netlify |
|---|---|
| Environment variables docs | Environment variables docs |
Make sure to add the necessary environment variables values to the hosting provider environment variables.
Content preview & live preview
Our Starter Templates are configured to make use of Next.js' preview mode. To make use of Contentful's Content Preview we requires a few changes to be made in the code, and in Contentful.
Adjustments in code
- Set a unique value for
process.env.CONTENTFUL_PREVIEW_SECRETin your environment variables. This value should be kept secret and only known to the API route and the CMS. - Configure the entry preview URLs in Contentful to match the preview API route's URL structure. This can be done in the Contentful web interface under "Settings" for each content type. For more information see: https://www.contentful.com/help/setup-content-preview/#preview-content-in-your-online-environment
- The preview API route is already written in the app and can be found in
pages/api/preview.js. This route checks for a valid secret and slug before redirecting to the corresponding page*. - To exit preview mode, use the
clearPreviewDatamethod and redirect the user back to the index page. This route is already written in the app and can be found inpages/api/exit-preview.js.
*The slug field is optional; When not passed we redirect the page to the root of the domain.
Adjustments in Contentful
- Next, you will need to configure your Contentful space to use the correct preview URLs. To do this, go to the "Settings" section of your space, and click on the "Content Preview" tab. From here, you can configure the preview URLs for each of your content models.
- Edit all content models that need a preview url. We usually expect that to only be the models prefixed with
📄 page -. - Add a new URL with the following format:
https://<your-site>/api/preview?secret=<token>&slug={entry.fields.slug}. Make sure to replace<your-site>with the URL of your Next.js site, and<token>with the value ofprocess.env.CONTENTFUL_PREVIEW_SECRET. Optionally, alocaleparameter can be passed. - Now, when you view an unpublished entry in Contentful, you should see a "Preview" button that will take you to the preview URL for that entry. Clicking this button should show you a preview of the entry on your Next.js site, using the preview API route that we set up earlier.
Exiting the Content Preview
Once the preview is enabled, it persists for the entire session. To exit preview mode, use the clearPreviewData method and redirect the user back to the index page. This route is already written in the app and can be found in pages/api/exit-preview.js.
For the live preview the basic field tagging for the inspector mode and live updates are already implemented. For custom components, you can find the instructions at our guide.
$~$
$~$
Support
If you have a problem with this Starter Template, post a message in our Contentful Community Slack.
Can't find your answer there? You can file a feedback issue through this template.
If you have other problems with Contentful not related to the Starter Template, you can contact the Customer Support.
$~$
Contributing
See CONTRIBUTING.md.
$~$
License
MIT License, see LICENSE.
$~$
[^1]: Next.js docs [^2]: GraphQL docs [^3]: graphql-codegen [^4]: TypeScript [^note]: React docs