โ ๏ธ Breaking Change
Impact Score: 7/10
Saleor 3.17.0 โ Release Notes & Engineering Impact
Source available โ automated, not human-reviewed
Component: saleor ยท Channel: stable. Automated analysis, not a compatibility certification. How this works.
Analysis updated: 2026-11-01.
Breaking-change evidence from the source
Breaking changes - Deprecate `external_url` on `Invoice` GraphQL type in favor of `url`. No matter if the invoice is stored on Saleor or is a link to an external invoice it will get returned in the `url` field.
โก Executive Summary (TL;DR)
Saleor 3.17.0. Source highlight: Welcome to Saleor 3.17 release!
Who Does This Impact? (Role-Based Analysis)
๐ป Software Engineers & Devs
Check the source notes against the package and APIs you use before upgrading.
๐ Product & Engineering Leads
Use the documented changes to assess relevance to your product; release frequency alone is not a quality measure.
โ๏ธ DevOps & Security
Verify the target version, runtime requirements and rollback procedure in the official documentation.
โ ๏ธ Breaking Changes & Deprecations (1)
- Breaking changes - Deprecate `external_url` on `Invoice` GraphQL type in favor of `url`. No matter if the invoice is stored on Saleor or is a link to an external invoice it will get returned in the `url` field.
โจ New Features & Capabilities (5)
- Introduce promotions, that allow applying discounts based on certain conditions.
- Add new subscriptions:
- Add new event types:
- **Feature preview change**:
- Add a new `updatedAt` field and a filter for product categories. - #13825
๐ง Bug Fixes & Patches (1)
- Fix thumbnail redirects sometimes failing with an unsafe redirect warning - #14023
๐ View Raw Release Notes (Original Developer Log)
Welcome to Saleor 3.17 release!
### Highlights
- Introduce promotions, that allow applying discounts based on certain conditions.
The promotions are replacements for current sales, cover all sales functionalities, and provide additional features. - #12980 by @IKarbowiak @zedzior
- Add new types:
- `Promotion` - Represents the promotion.
- `PromotionRule` - Specifies conditions that must be met to apply the discount.
- `PromotionTranslation` - Represents promotion translations.
- `PromotionTranslatableContent` - Represents promotion's original translatable fields and related translations.
- `PromotionRuleTranslation` - Represents promotion rule translations.
- `PromotionRuleTranslatableContent` - Represents the promotion rule's original translatable fields and related translations.
- Add new mutations:
- `promotionCreate` - Creates a new promotion.
- `promotionUpdate` - Updates an existing promotion.
- `promotionDelete` - Deletes a promotion.
- `promotionBulkDelete` - Deletes multiple promotions.
- `promotionRuleCreate` - Creates a new promotion rule.
- `promotionRuleUpdate` - Updates an existing promotion rule.
- `promotionRuleDelete` - Deletes a promotion rule.
- `promotionTranslae` - Translates a promotion.
- `promotionRuleTranslae` - Translates a promotion rule.
- Add new webhooks:
- `PROMOTION_CREATED` - triggered when promotion is created.
- `PROMOTION_UPDATED` - triggered when the promotion is updated.
- `PROMOTION_DELETED` - triggered when the promotion is deleted.
- `PROMOTION_STARTED` - triggered when the promotion is started.
- `PROMOTION_ENDED` - triggered when the promotion is ended.
- `PROMOTION_RULE_CREATED` - triggered when the promotion rule is created.
- `PROMOTION_RULE_UPDATED` - triggered when the promotion rule is updated.
- `PROMOTION_RULE_DELETED` - triggered when the promotion rule is deleted.
- Add new subscriptions:
- `PromotionCreated` - Event sent when promotion is created.
- `PromotionUpdated` - Event sent when the promotion is updated.
- `PromotionDeleted` - Event sent when promotion is deleted.
- `PromotionStarted` - Event sent when promotion is started.
- `PromotionEnded` - Event sent when promotion is ended.
- `PromotionRuleCreated` - Event sent when promotion rule is created.
- `PromotionRuleUpdated` - Event sent when promotion rule is updated.
- `PromotionRuleDeleted` - Event sent when promotion rule is deleted.
- Add new event types:
- `PromotionCreatedEvent` - Represents the history log of the promotion created event.
- `PromotionUpdatedEvent` - Represents the history log of the promotion updated event.
- `PromotionStartedEvent` - Represents the history log of the promotion started event.
- `PromotionEndedEvent` - Represents the history log of the promotion ended event.
- `PromotionRuleCreatedEvent` - Represents the history log of the promotion rule created event.
- `PromotionRuleUpdatedEvent` - Represents the history log of the promotion rule updated event.
- `PromotionRuleDeletedEvent` - Represents the history log of the promotion rule deleted event.
- `PromotionEventInterface` - Interface for promotion-related event history log.
- `PromotionRuleEventInterface` - Interface for promotion rule-related event history log.
- Deprecate types (Saleor 4.0):
- `Sale` - Use `Promotion` and `PromotionRule` instead.
- `SaleChannelListing` - Use `PromotionRule` instead.
- Deprecate mutations (Saleor 4.0):
- `saleCreate` - Use the `promotionCreate` mutation instead.
- `saleUpdate` - Use the `promotionUpdate` mutation instead.
- `saleDelete` - Use the `promotionDelete` mutation instead.
- `saleBulkDelete` - Use the `promotionBulkDelete` mutation instead.
- `saleCataloguesAdd` - Use the `promotionRuleCreate` mutation instead.
- `saleCataloguesRemove` - Use `promotionRuleUpdate` or `promotionRuleDelete` mutations instead.
- `saleChannelListingUpdate` - Use `promotionRuleCreate` or `promotionRuleUpdate` mutations instead.
- `saleTranslate` - Use the `promotionTranslate` mutation instead.
- Deprecate webhooks (Saleor 4.0):
- `SALE_CREATED` - Use the `PROMOTION_CREATED` instead.
- `SALE_UPDATED` - Use the `PROMOTION_UPDATED` instead.
- `SALE_DELETED` - Use the `PROMOTION_DELETED` instead.
- `SALE_TOGGLE` - Use `PROMOTION_STARTED` and `PROMOTION_ENDED` instead.
- Deprecate subscriptions (Saleor 4.0):
- `SaleCreated` - Use the `PromotionCreated` instead.
- `SaleUpdated` - Use the `PromotionUpdate` instead.
- `SaleDeleted` - Use the `PromotionDeleted` instead.
- `SaleToggle` - Use `PromotionStarted` and `PromotionEnded` instead.
### Breaking changes
- Deprecate `external_url` on `Invoice` GraphQL type in favor of `url`. No matter if the invoice is stored on Saleor or is a link to an external invoice it will get returned in the `url` field.
### GraphQL API
- **Feature preview change**:
- Order bulk creation allows to import archive orders - #14177 by @kadewu
- `orderBulkCreate` now will attempt to create an order with the `IGNORE_FAILED` policy even if:
- `User` cannot be resolved and `email` wasn't provided.
- `Variant` wasn't provided but `product_name` was provided.
### Saleor Apps
### Other changes
- Fix thumbnail redirects sometimes failing with an unsafe redirect warning - #14023 by @patrys
- New environment variable `PUBLIC_URL` to define the URL on which Saleor is hosted (e.g., https://api.example.com/). Takes precedence over `ENABLE_SSL` and `Shop.domain` for URL generation - #13841 by @przlada
- Add a new `updatedAt` field and a filter for product categories. - #13825 by @rafiwts
- Made the triggering frequency of update-search Celery beat tasks customizable (settable using `BEAT_UPDATE_SEARCH_FREQUENCY`) - #14152 by @NyanKiyoshi