Upgrading from 2.11 to 3.0
Preparation​
The new version introduces many new features as well as some breaking changes. As a result, most API clients such as Saleor Apps and storefronts will require changes.
Before you start the process, create a backup of your data. Also, let your Celery worker process the task queue before starting API migration.
Due to the scope of the upgrade, downtime will be required.
Multichannel​
Existing data will be assigned to the default-channel
created during the database migration. As long as the shop has only one channel defined, you are not required to specify the channel
argument. Thanks to that, you'll be able to migrate the storefront to 3.0 gradually.
After adding more channels, the channel
argument will become required. Because of that, we recommend always adding the channel argument, even if you have only one channel:
{
products(first: 5, channel: "default-channel") {
edges {
node {
id
name
description
}
}
}
}
Besides the impact on fetching the data, you'll be required to specify the channels during the checkout creation process. Read more at the Checkout page.
Editing channel related fields​
If you use the API to modify objects (for example, with an external app), please note that channel-depending fields have dedicated mutations. Updating product price requires using the productChannelListingUpdate mutation.
Object attributes that can be defined on a channel basis can be referenced.
- Collection Channel Listing
- Product Channel Listing
- ProductVariant Channel Listing
- Sale Channel Listing
- ShippingMethod Channel Listing
- Voucher Channel Listing
Email templates​
The email templates are stored in the database instead of static server files in the new email implementation. This change enables editing the templates in the dashboard and adds the integration with Sendgrid. If you modified the default email templates provided by Saleor, you need to migrate them to the Handlebars format and configure them in the dashboard.
Read more about user and admin email plugins here:
Editor.js rich text editor and description fields​
All rich text fields now use Editor.js instead of Draft.js. Our database migration should convert the old format to the new one, but visual inspection is recommended.
To render rich text in your storefront, you can use Editor.js in the read-only
mode, or use one of the libraries recommended by its authors.
Additionally, description
fields in the Saleor API have changed type from String
to JSONString
in the following objects:
Category
Collection
Product
Translation
for objects listed above
Pages
changed content
field type in the same way.
Product and Variant Images​
Saleor 3.0 extends the possibilities for presenting your products to customers. Now, you can use photos and videos. The old image
attribute and the ProductImage
objects are left for backward compatibility but marked as deprecated. If you want to leverage all new features, please use ProductMedia
.
Read documentation for the ProductMedia.
Removed fields from the Shop object​
The Shop.homepageCollection
field has been removed. The recommended way of getting a specific collection data in such a situation is to create a new collection and use the collection
query with the desired slug, for example:
query FeaturedProducts {
collection(slug: "featured", channel: "default-channel") {
products(first: 10) {
edges {
node {
name
}
}
}
}
}
Shop.navigation
has been dropped in favor of querying the desired menu by a slug:
query MainMenu {
menu(slug: "main-menu", channel: "default-channel") {
name
items {
name
}
}
}
Shop.geolocalization
has been removed.
Error handling​
The new version unifies error handling across the API. All mutation responses have an errors
field. It contains detailed information about the issue(s). For example:
mutation {
checkoutCreate(input: { lines: [] }) {
errors {
field
message
code
}
}
}
Server response:
{
"data": {
"checkoutCreate": {
"errors": [
{
"field": "channel",
"message": "You need to provide channel slug.",
"code": "MISSING_CHANNEL_SLUG"
}
]
}
}
}
Error codes can be used for indentifing the issue and displaying custom message for the customers.
Product filters​
The API for searching and filtering products has been changed.
Read documentation for product filters and sorting.
Attributes​
Attribute
:
Attribute.values
dropped in favor of paginated list calledchoices
. AttributeValue type:Attribute.type: AttributeValueType
dropped. Use theinputType
field to determine the type of attribute's value.
AttributeValueInput
:
value: String
changed tovalues
with type[String!]
Invoices​
- The
invoiceSendEmail
mutation is renamed toinvoiceSendNotification
.
Permissions​
MANAGE_SERVICE_ACCOUNTS
was removed. UseMANAGE_APPS
for managing external apps.MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES
was added. Staff users managing the accounts may need to add this permission.MANAGE_PAGE_TYPES_AND_ATTRIBUTES
was added. Staff users managing pages may need to add this permission.
Apps​
Service Accounts have been renamed to Apps.
Authorization keys​
The following mutations were dropped:
authorizationKeyAdd
authorizationKeyDelete
If you want to create access tokens, you can do that by creating an App.
Webhooks​
Webhook payloads have changed. You can reference examples at our documentation.
The following events have been added:
DRAFT_CREATED_FROM_REPLACE
ADDED_PRODUCTS
REMOVED_PRODUCTS
ORDER_REPLACEMENT_CREATED
ORDER_DISCOUNT_ADDED
ORDER_DISCOUNT_AUTOMATICALLY_UPDATED
ORDER_DISCOUNT_UPDATED
ORDER_DISCOUNT_DELETED
ORDER_LINE_DISCOUNT_UPDATED
ORDER_LINE_DISCOUNT_REMOVED
ORDER_LINE_PRODUCT_DELETED
ORDER_LINE_VARIANT_DELETED
CONFIRMED
FULFILLMENT_REFUNDED
FULFILLMENT_RETURNED
FULFILLMENT_REPLACED
Removed:
DRAFT_ADDED_PRODUCTS
in favor ofADDED_PRODUCTS
DRAFT_REMOVED_PRODUCTS
in favor ofREMOVED_PRODUCTS
The full list of available events can be found here.
Metadata​
The privateMeta
and meta
fields have been renamed to privateMetadata
and metadata
.
JWT​
The signature of JWT tokens has been replaced from HS256 to RS256. This change will require providing an RSA private key for the production environments.