* initialized next.js project * finished markdown sections * added operation schema component * change page metadata * eslint fixes * fixes related to deployment * added response schema * resolve max stack issue * support for different property types * added support for property types * added loading for components * added more loading * type fixes * added oneOf type * removed console * fix replace with push * refactored everything * use static content for description * fixes and improvements * added code examples section * fix path name * optimizations * fixed tag navigation * add support for admin and store references * general enhancements * optimizations and fixes * fixes and enhancements * added search bar * loading enhancements * added loading * added code blocks * added margin top * add empty response text * fixed oneOf parameters * added path and query parameters * general fixes * added base path env variable * small fix for arrays * enhancements * design enhancements * general enhancements * fix isRequired * added enum values * enhancements * general fixes * general fixes * changed oas generation script * additions to the introduction section * added copy button for code + other enhancements * fix response code block * fix metadata * formatted store introduction * move sidebar logic to Tags component * added test env variables * fix code block bug * added loading animation * added expand param + loading * enhance operation loading * made responsive + improvements * added loading provider * fixed loading * adjustments for small devices * added sidebar label for endpoints * added feedback component * fixed analytics * general fixes * listen to scroll for other headings * added sample env file * update api ref files + support new fields * fix for external docs link * added new sections * fix last item in sidebar not showing * move docs content to www/docs * change redirect url * revert change * resolve build errors * configure rewrites * changed to environment variable url * revert changing environment variable name * add environment variable for API path * fix links * fix tailwind settings * remove vercel file * reconfigured api route * move api page under api * fix page metadata * fix external link in navigation bar * update api spec * updated api specs * fixed google lint error * add max-height on request samples * add padding before loading * fix for one of name * fix undefined types * general fixes * remove response schema example * redesigned navigation bar * redesigned sidebar * fixed up paddings * added feedback component + report issue * fixed up typography, padding, and general styling * redesigned code blocks * optimization * added error timeout * fixes * added indexing with algolia + fixes * fix errors with algolia script * redesign operation sections * fix heading scroll * design fixes * fix padding * fix padding + scroll issues * fix scroll issues * improve scroll performance * fixes for safari * optimization and fixes * fixes to docs + details animation * padding fixes for code block * added tab animation * fixed incorrect link * added selection styling * fix lint errors * redesigned details component * added detailed feedback form * api reference fixes * fix tabs * upgrade + fixes * updated documentation links * optimizations to sidebar items * fix spacing in sidebar item * optimizations and fixes * fix endpoint path styling * remove margin * final fixes * change margin on small devices * generated OAS * fixes for mobile * added feedback modal * optimize dark mode button * fixed color mode useeffect * minimize dom size * use new style system * radius and spacing design system * design fixes * fix eslint errors * added meta files * change cron schedule * fix docusaurus configurations * added operating system to feedback data * change content directory name * fixes to contribution guidelines * revert renaming content * added api-reference to documentation workflow * fixes for search * added dark mode + fixes * oas fixes * handle bugs * added code examples for clients * changed tooltip text * change authentication to card * change page title based on selected section * redesigned mobile navbar * fix icon colors * fix key colors * fix medusa-js installation command * change external regex in algolia * change changeset * fix padding on mobile * fix hydration error * update depedencies
11 KiB
description, addHowToData
| description | addHowToData |
|---|---|
| Learn how to integrate Contentful with the Medusa backend and a Gatsby storefront. Contentful is a headless CMS backend that provides rich CMS functionalities. | true |
Contentful
In this document, you’ll learn how to integrate a Medusa backend with Contentful to add rich Content Management System (CMS) functionalities
Overview
Contentful is a headless CMS service that allows developers to integrate rich CMS functionalities into any platform.
By integrating Contentful to Medusa, you can benefit from powerful features in your ecommerce store including detailed product CMS details, easy-to-use interface to use for static content and pages, localization, and much more.
Prerequisites
Needed Accounts
- Contentful account with a space created. A space is created by default when you create a new account.
Required Tools
- PostgreSQL with an empty database created. You can follow this documentation to learn how to install it for your operating system.
- Redis. You can follow their documentation to learn how to install it.
- Git’s CLI tool. You can follow this documentation to learn how to install it for your operating system.
- Gatsby’s CLI tool. You can follow this documentation to install it.
- Medusa’s CLI tool. You can follow this documentation to install it.
Install Medusa Backend Using Contentful Starter
Instead of using the default Medusa backend starter, you must use the Contentful starter to install a backend that is ready to be used with Contentful. This backend contains all the necessary files to make the integration work.
In your terminal, run the following command to install the backend:
npx @medusajs/medusa-cli@latest new medusa-contentful https://github.com/medusajs/medusa-starter-contentful
This installs a new Medusa backend in the directory medusa-contentful.
Add Contentful Environment Variables
Change to the medusa-contentful directory. In .env you’ll find three variables:
CONTENTFUL_SPACE_ID=
CONTENTFUL_ACCESS_TOKEN=
CONTENTFUL_ENV=
Value of CONTENTFUL_ENV
Set the value for CONTENTFUL_ENV to master.
Value of CONTENTFUL_SPACE_ID
To retrieve the value of CONTENTFUL_SPACE_ID:
- Go to your Contentful Space dashboard. Then, choose Settings in the navigation bar and select API keys from the dropdown.
- On the APIs page, click Add API Key.
- In the form, enter a name for the API key and click Save.
- Copy the value of Space ID and set it as the value of
CONTENTFUL_SPACE_ID.
Value of CONTENTFUL_ACCESS_TOKEN
To retrieve the value of CONTENTFUL_ACCESS_TOKEN:
- Go back to the API Keys page and click on the Content management tokens tab.
- Click on Generate personal token.
- In the pop-up that opens, enter a name for the token.
- Click the Generate button. A personal access token will be generated. Use it to set the value of
CONTENTFUL_ACCESS_TOKEN.
:::warning
Once you close the pop-up, you won’t be able to get the value of the personal access token again. Make sure to copy it first.
:::
Configure Redis
In .env set the value of your Redis URL:
REDIS_URL=<YOUR_REDIS_URL>
Where <YOUR_REDIS_URL> is the URL of your Redis service.
:::tip
The default Redis URL is redis://localhost:6379.
:::
Configure PostgreSQL
In .env set the value of your PostgreSQL URL:
DATABASE_URL=<YOUR_DB_URL>
Where <YOUR_DB_URL> is the URL of your PostgreSQL database.
:::tip
You can find the format of the PostgreSQL database URL in PostgreSQL’s documentation.
:::
Then, in medusa-config.js in the exported object, add the PostgreSQL database configurations:
module.exports = {
projectConfig: {
// ...
database_url: DATABASE_URL,
database_type: "postgres",
},
}
Migrate Content Types to Contentful
The Contentful starter provides the necessary scripts to create content types in your Contentful space.
Run the following commands to migrate the content types into Contentful:
npm run migrate:contentful
Once this command finishes executing, in your Contentful Space dashboard click on Content Model in the navigation bar. You should see a list of new content models added.
Seed Content to Contentful
The next step is to seed the Contentful Space with some content data.
Run the following command to seed some data into it:
npm run seed:contentful
After this command finishes running, in your Contentful Space dashboard click on Content in the navigation bar. You should see a list of new content added.
(Optional) Seed Medusa Database
This step seeds your Medusa database with demo data to easily add products as well as other data to your Medusa backend.
Run the following command to seed the Medusa database:
npm run seed
Start the Backend
To start the backend run the following command:
npx medusa develop
If you seeded the database with demo data, you should see that events related to the products are triggered.
The Contentful integration ensures a sync between the Medusa backend and Contentful. So, when new products are added to Medusa, these products will be added to your Contentful Space as well.
(Optional) Add Products with the Medusa Admin
Using the Medusa admin, you can add products to your Medusa backend. This will trigger product events that subsequently add these products to Contentful.
(Optional) Two-way Sync with Contentful
This section explains how you can establish a two-way sync between Medusa and Contentful. This would ensure that not only is the data updated from the Medusa backend to Contentful, but also ensure the updates are relayed from Contentful to the Medusa backend.
However, to perform this sync, it's required that you deploy your backend so that it can be publicly accessible. You can learn how to do that through the backend deployment guides.
Configuring two-way sync requires configuring Webhooks in Contentful. To do that:
- On your Contentful Space Dashboard, click on Settings from the navigation bar, then choose Webhooks.
- Click on the Add Webhook button.
- In the form, enter a name for the webhook.
- In the URL field, choose the method
POSTand in the input next to it enter the URL<BACKEND_URL>/hooks/contentfulwhere<BACKEND_URL>is the URL of your production Medusa backend. - Scroll down to find the Content Type select field. Choose
application/jsonas its value. - You can leave the rest of the fields the same and click on the Save button.
Now, every time you change a product’s data on your Contentful Space it will be updated on your Medusa backend as well.
Manage Contentful Data
Publish Products
Products added through the integration with the Medusa backend are by default saved as drafts. To show them on the storefront, you must set them as published.
To do that, open your Contentful Space Dashboard and click on Content in the Navigation bar. Then, change Any to Product in the select field next to the search bar. This shows only the content of the type Product, rather than all content.
Click on the checkbox at the top of the table to select all products then click Publish to publish these products.
Added Featured Products
On the homepage of the storefront, there’s a featured products tile that shows a set of products. Before running the storefront, you must add at least one product to the list.
To do that:
- Open your Contentful Space Dashboard and click on Content in the Navigation bar.
- Set the select field next to the search bar Any and search for Featured Products. You should find one content of the type Tile Section.
- Click on the result. You should find on the page an empty Tiles section where you can add tiles and products.
- Click on the "Add content" button, then on "Add existing content" from the dropdown.
- Pick some of the products you want to show on the homepage.
- Once you’re done adding products, click on Publish changes in the right sidebar.
Setup Gatsby Storefront
:::warning
This Gatsby storefront is deprecated. It's recommended to integrate Contentful into either the Next.js Starter Template or your custom storefront.
:::
In this section, you’ll set up the Gatsby storefront of your Medusa backend.
In your terminal in a different directory of the Medusa backend, run the following command:
gatsby new medusa-contentful-storefront https://github.com/medusajs/medusa-contentful-storefront
This will install the storefront in the directory medusa-contentful-storefront.
Set Contentful Environment Variables
Change to the newly created directory and rename .env.template:
mv .env.template .env
Then, open .env. You should find the following environment variables:
CONTENTFUL_SPACE_ID=
CONTENTFUL_ACCESS_TOKEN=
The value of CONTENTFUL_SPACE_ID is the same value you retrieved while setting up the Medusa backend.
To retrieve the value of CONTENTFUL_ACCESS_TOKEN:
- On your Contentful Space dashboard click on Settings in the navigation bar then choose API keys.
- Choose the API key you created in the previous section.
- You should find the field "Content Delivery API - access token”. Copy its value and set it as the value of
CONTENTFUL_ACCESS_TOKEN.
Start Storefront
Make sure the Medusa backend is still running. Then, start the storefront:
npm run start
This starts the storefront at localhost:8000. Open it in your browser and you should see on the homepage the Featured Product section with the products you chose on Contentful.
Make Changes to Content
You can update the CMS content of your storefront in your Contentful Space. This includes the CMS pages or product details.
:::note
If you make changes to the data while your Gatsby storefront is running, the changes are not reflected instantly. That’s because the data is fetched from Contentful during build time. Instead, you must restart your Gatsby storefront to see the changes you make.
:::
What’s Next
Learn How to customize your Contentful backend and storefront.
See Also
- How to deploy your Medusa backend to Heroku, or DigitalOcean, or other providers