# Saleor Core

> Saleor backend internals and behavior reference. Covers discount precedence, order-level discount allocation across lines (two-pass calculation, what the API does and doesn't expose, gift-line shape gotchas), stock availability modes (legacy vs direct, 3.23+), Dashboard UI rules, webhook trigger conditions, denormalized field semantics, and migration footguns. Use when working with Saleor discounts or stock availability, building Dashboard UI, building price-explanation tooling, or debugging backend behavior.

- Skill: `saleor/saleor-core` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds add saleor/saleor-core`
- Raw SKILL.md: https://api.skillmd.com/api/skills/saleor/saleor-core/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Integrations & APIs
- License: MIT
- Author: saleor (https://skillmd.com/u/saleor)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/saleor/saleor-core

---


# Saleor Core

Backend behavior reference derived from the Saleor core source code. Covers
internal mechanics that aren't fully documented in the public API reference —
discount precedence, stock availability modes, denormalized fields, and known
Dashboard gotchas.

## When to Apply

- Building or debugging discount/promotion UI in the Dashboard
- Investigating why a voucher or promotion isn't applying
- Understanding order-level vs line-level discount precedence
- Working with `OrderDiscount` / `OrderLineDiscount` objects
- Debugging `unit_discount_value` on `OrderLine`
- Deciding whether discounts stack or suppress each other
- Building price-explanation / waterfall tooling on confirmed orders
- Reconstructing how an order-level discount distributed across lines
- Handling free-gift order lines (`OrderLine.isGift = true`)
- Working on stock availability, shipping zones, warehouses, or `Shop.useLegacyShippingZoneStockAvailability`
- Debugging why `PRODUCT_VARIANT_*_IN_CHANNEL` webhooks aren't firing
- Building diagnostic / "doctor" tooling that explains availability problems
- Auditing Dashboard copy that uses "available" / "in stock" / "purchasable"

## Rule Categories

| Priority | Category   | Impact   | Prefix       |
| -------- | ---------- | -------- | ------------ |
| 1        | Discounts  | CRITICAL | `discount-`  |
| 2        | Stock      | CRITICAL | `stock-`     |

## Quick Reference

### 1. Discounts (CRITICAL)

- `discount-precedence` — Full precedence hierarchy, stacking rules, manual vs voucher vs promotion interactions, denormalized field semantics, known Dashboard bug
- `order-discount-allocation` — Two-pass calculation of order-level discounts (Pass A collapses records into a single subtotal_discount; Pass B distributes proportionally across lines with last-line absorbing rounding), what the API exposes (per-line totals, per-record-at-order amounts) and what it doesn't (per-record-per-line decomposition), gift-line shape gotcha (`ORDER_PROMOTION` on `OrderLine.discounts[]` when `isGift = true`), reconstruction guidance for consumers

### 2. Stock (CRITICAL)

- `stock-availability-modes` — `Shop.useLegacyShippingZoneStockAvailability` (3.23+), purchasability vs shippability, server queryset dispatch, mode-conditional webhooks, Dashboard UI / copy / severity rules, migration footguns, test fixtures

## How to Use

Read individual rule files for detailed explanations and source-level evidence:

```
rules/discount-precedence.md
rules/order-discount-allocation.md
rules/stock-availability-modes.md
```

Each rule file contains:

- Precedence hierarchy or computation rules
- Source code references from `saleor/` with function names and file paths
- Anti-patterns and known bugs

