Skip to main content
Skip to main content

Personalized Products

This document guides you through the different documentation resources to help you build personalized products with Medusa.


Personalized products are products that customers can customize based on their need. For example, they can upload an image to print on a shirt or provide a message to include in a letter.

Medusa’s customizable architecture allows you to customize its entities or create your own to implement and store personalized products. Also, as the Medusa backend is headless, you have freedom in how you choose to implement the storefront. This is essential for ecommerce stores that provide personalized products, as you typically build a unique experience around your products.

Store Personalized Data

Most of the entities in Medusa’s core include a metadata attribute. This attribute helps store custom data in the core entities.

The Product entity represents the main product, whereas the ProductVariant is the different saleable options of that product. For example, a shirt is a Product, and each different color of the shirt is the ProductVariant. The LineItem entity is the product variant added to the cart.

So, you can use the metadata attribute of the LineItem entity to store the customer’s personalization. Optionally, you can use the metadata attribute in the Product or ProductVariant to store the expected format of personalized data. This depends on your use case and how basic or complex it is.

For example, if you’re asking customers to enter a message to put in a letter they’re purchasing, you can use the metadata attribute of the LineItem entity to set the personalized information entered by the customer.

Note that two Line Items in the cart having different metadata attributes are not considered the same item. So, each Line Item is managed separately and can have its own quantity.

In more complex cases, you can extend entities from the core, such as the Product entity, to add more attributes. You can also create new custom entities to hold your personalized data and logic.

Build a Custom Storefront

Medusa provides a headless backend that can be accessed through REST APIs. So, there are no restrictions on what language or framework you use to build the storefront or what design or experience you provide customers.

You can build a unique experience around your products that focuses on the customer’s personalization capabilities.

Medusa provides a Next.js storefront starter with basic ecommerce functionalities that can be used and modified. You can also build your own storefront by using Medusa’s client libraries or REST APIs to communicate with the backend from the storefront.

Pass Personalized Data to the Order

If you followed the basic approach of using the metadata attribute to store the personalized data, you can pass the personalization data when you add an item to the cart in the storefront using the Add a Line Item API Route. This API Route accepts a metadata request body parameter that will be stored in the created Line Item’s metadata attribute.

In the case that you’ve created a custom entity or extended a core entity, you can create a custom API Route that handles saving the personalization data. You can then call that API Route from the storefront before or after adding the item to the cart.

Access Personalized Data in the Order

If you stored the personalized data in the metadata of the Line Items, those same Line Items are associated with the placed order. So, by expanding the items relation on the Order entity, you can retrieve the metadata attribute of the Line Items.

In the case that you’ve created a custom entity or extended a core entity, you can create a custom API Route that handles retrieving the personalization data. If the entity you’ve created or customized is associated with the Order entity, you can alternatively expand it similarly to the items relation.

If you want to show the personalized data in the Medusa Admin, you can extend the Medusa Admin to add a widget, a UI route, or a setting page and show the personalized data.

Fulfill Personalized Products in Orders

Once a customer places an order, the order.placed event is emitted in the backend. You can listen to this event with a Subscriber to access the order’s details and fulfill its personalized products.

For example, if the customer personalizes a shirt to include an image or message, you can listen to the order.placed event to send their request to the printing fulfillment machine or service.

You can also listen to other Order-related events to perform this action at a different point if necessary, such as when the order.fulfillment_created is triggered.

Alternatively, you can create a fulfillment service that integrates a third-party service or mechanism to fulfill the personalized product. This is useful if you want the fulfillment of personalized products to be embedded into Medusa’s existing order fulfillment.

Additional Development

You can find other resources for your personalized products development in the Medusa Development section of this documentation.

Was this section helpful?