Canon logo
DF Canon
Product database handbook — confidential, internal use

Grade × Anchor × Pricing Model (Regrade / Reprice)

Status: canonical business rules for the regrade/reprice pass. Source: Viktor, 2026-09-01 (grading model). House / natural / anchor / cost detail consolidated here from the former house-grades.md / natural-grades.md / anchor-skus.md / cost-model.md (2026-09-03). Scope: Google Shopping grade + pricing strategy. Complements (does not replace) the class model in domain-model.md; grading and pricing are layered on top of classes.


Current classification snapshot — derived 2026-09-08

pie showData title "Cartridge SKUs by natural grade" "A" : 34 "B" : 76 "C" : 1252 "D" : 11353 "F" : 163
pie showData title "Primary SKUs by house grade" "a" : 1384 "b" : 274 "c" : 486 "d" : 678 "f" : 1743
pie showData title "All cartridge SKUs by house grade" "a" : 2534 "b" : 276 "c" : 490 "d" : 689 "f" : 1747 "x (non-primary)" : 7098 "blank" : 44

Primary SKUs by house × natural grade:

house × naturalABCDF
a2233310100217
b7201191271
c1103021721
d885882
f170934

1. Three parameters

flowchart TD A["Every SKU"] --> B["House grade a–f · inherits to siblings"] A --> C["Natural grade A–F · per SKU, no inheritance"] A --> D["Anchor * · competitive loss-leader"] B --> E["Combo = house × natural × anchor"] C --> E D --> E E --> F["Bid priority + price premium"]

Every SKU carries three independent signals; their combination drives both bid priority and price.

ParameterCaseMeaningChannel
House gradelowercase a b c d fMarketing focus — structures ad spend priorities; carries ownership bias (influencing spend toward products ownership/sales wants to prioritize). Product-level, inherited by class siblings.#general-priorities
Natural gradeuppercase A B C D FAssigned by relative strength of pageviews and/or order count. Per-SKU, no sibling inheritance.#general-popularity
Anchor* (true/false)Competitive loss-leader SKU (e.g. P191889 et al). ~43 today (col 92 TRUE, 2026-09-04).#volume-standouts

Full definitions: house (§2), natural (§3), anchor (§4).


2. House grades (a–f; no e)

Business-performance grade that class siblings inherit (vs natural grade, which is per-SKU and does not). Operational since mid-2024 (~2 years); the analysis period (July 2024 onward) is when grades began actively driving Shopping bid decisions.

Official metafield: mm-google-shopping.custom_label_0 (single_line_text_field). In the database: products.gmc_custom_label_0 (product-level grade a–f) and variants.gmc_custom_label_0 (variant-level; primary position carries the grade a–f, secondary/tertiary positions carry x).

Grade definitions

GradeCriteriaBid Strategy
aTop performers, in-stock, high marginAggressive bids, high caps
bHigh revenue / lots of ordersControlled spend, slightly lower bids
cLower volume, rare searches, very high conversion rate when they hitLow bids
dFew sales, if anyDeliberately under-bid — avoids expensive clicks
fNo sales + no clicksDeliberately under-bid — defensive coverage

d and f grades serve a purpose: bidding low means Google doesn't push expensive clicks to those part numbers, but DF still captures the occasional sale at a cheaper acquisition cost.

Mechanism

Shopify custom_label_0 (a–f, x) → Matrixify bulk export/import → GMC custom_label_1 / custom_label_2 → Google Shopping bid strategy.

Assigners

People authorized to maintain grades: Viktor Tarm, Zach Smullen, Rachel Leland, Brandon Brigham, Carl Goossen, Jason Thomson. Bulk grade operations via Matrixify: Viktor, Carl, Rachel.

Limitations

  1. Shopping-only — grade-driven logic operates only in Google Shopping via GMC labels.
  2. Search campaigns are NOT grade-aware (old "whole" attribution method) — a key restructuring target.
  3. No automated feedback loop — grades are manually maintained, not driven by conversion/margin/performance data (known limitation / future automation).
  4. Inventory disconnect — all Shopify products are marked in-stock regardless of actual availability, so "in-stock" in the a-grade criteria is assumed, not verified.

House-grade distribution is DERIVED — see classification_report.py, not this doc.


3. Natural grades (A–F)

A natural grade reflects how DF originally scored an individual SKU's importance — and that of its corresponding website product page. It is the per-SKU, data-driven sibling of the house grade: assigned to each SKU on its own, from its own traffic and orders. Arbitrary cutoffs, decided by Viktor.

Official metafield: sku.natural_grade (single_line_text_field), variant-level. In edit_db.csv: col 136, working name sku_natural_grade (row-1 label SKU.NATURAL_GRADE), joined by Variant ID (the only clean key — Variant SKU has duplicates + blanks, and the source export is not row-aligned with edit_db.csv).

Grade definitions (uppercase A / B / C / D / F)

GradeCriteria
AAveraged at least 1 order per quarter over 10 years (calculated), up to 8 orders per quarter (32/year). In-stock status is irrelevant.
BAverages over 1.5 orders per year (range 1–4 orders per year).
C3–16 orders in the last 10 years.
D1 or 2 orders, or more than 5 pageviews over 10 years.
FLess than one pageview every two years, or none (automatic).

Units inconsistent — the A/B/C/D/F thresholds above mix per-quarter, per-year, and per-10-years units, and B (1–4/yr) overlaps C (3–16/10yr). Restate all five in one unit pending Viktor's ruling.

How it differs from house grade

Most anchor SKUs are natural As (see §4).

Source & population

Source imports/natural_grade.csv (one row per variant, grade in the last column); populate via src/tools/populate_natural_grade.py (dry-run default, --apply writes). Distribution is DERIVED — see classification_report.py.


4. Anchor SKUs

Status: authoritative business concept. Source: Viktor, 2026-08-05. Scope: competitive bid strategy, not product classification.

Definition

An Anchor SKU is a popular entry-point product that holds a product group together — the SKU customers actually search for by OEM part number. These are the best-known part numbers in each dimensional family. Examples: P191889, P191920 (oval cartridge filters).

Business characteristics

Mid-tier SKUs (B, C, non-anchor A) deliver stronger ERS because no one is fighting over them. The long tail is the competitive advantage; anchors are the cost of doing business.

Not to be confused with

"Anchor" is overloaded:

ConceptMeaningContext
Anchor SKU (this doc)Popular competitive entry-point productBusiness strategy, ad bidding
Class reference productModal nominal member of a dimensional classClassification terminology (see AGENTS.md Reserved words)
ANCHOR column (edit_db.csv col 92)Flag for Anchor SKUs (TRUE on primary row)Product database

The ANCHOR column marks Anchor SKUs specifically; it is NOT related to the classification algorithm's class reference products.

Strategy

  1. Lower per-click bids, keep or raise budgets (currently paying a premium per click while capturing low impression share).
  2. Separate ad groups for closer monitoring and custom bid settings.
  3. Formalize the designation — a yes/no Anchor field for systematic tracking.

5. Grade combinations

The combination houseGrade naturalGrade (e.g. aA, dC) is the unit of analysis. Premium percentage in brackets; applied after the base price (and after the catalog-wide 3% increase — see §7).

Anchor combos (*)

Standard combos

House a (in-stock):

ComboPremium
aAlist price (0%)
aB+3%
aC+5%
aD+7%
aF+10%

House b (top seller, not in stock):

ComboPremium
bA0%
bB+3%
bC+5%
bD+7%
bF+10%

House c (lower volume, high conversion):

ComboPremiumNote
cA0%candidate for b promotion; possibly misgraded a/b
cB+3%possibly misgraded b
cC+5%a true c
cD+7%last slot where actual orders live (a handful of D's have 1–2 orders; natural C needs 3 total orders for promotion)
cF+10%likely a misgraded f or d

House d (few sales):

ComboVerdict
dAShould not exist. Misgraded a if in stock, b if not.
dBShould not exist. Misgraded b.
dCLikely a misgraded c (exceptions possible — be conservative).
dDTrue d. No orders, few pageviews.
dFLikely a misgraded f.

House f (no sales, no clicks):

ComboVerdict
fAShould not exist. Misgraded a if in stock, b if not.
fBShould not exist. Misgraded b.
fCShould not exist. Misgraded c.
fDLikely a true d.
fFStrong candidate for archive/delete.

Default (unless noted otherwise): d/D SKUs are priced +7% over the market/list price of related sibling classes; F SKUs at +10%.


6. Misgrade correction (the regrade half)

The "Should not exist" combos are unambiguous contradictions between the objective natural grade and the assigned house grade. They are corrected in a supervised pass:

ComboCorrection
dAa if in stock, else b
dBb
fAa if in stock, else b
fBb
fCc

The "Likely" combos (dC, dF, fD, fF, plus cA/cB/cF) are flagged for human review, not auto-corrected — they are conservative / judgment calls.

De-stock demotion. When a SKU is pulled from its physical bin (media split, exotic isolation, stock correction — the SKU leaves in-stock and has no bin), the in-stock grade a no longer applies. Set the house grade (63/93, both) to the lowercased natural-grade letter (Aa, Bb, Cc, Dd, Ff), record the overwritten grade in sku_prev_grade (116) — here a — and add a grade-note (CHANGED A TO <letter> (…; de-stocked, grade = natural <letter>)). This is the demotion half of the in-stock→a promotion.

Corrections are applied to the primary row only: variant grade (col 93) and house grade (col 63) are both set to the new grade (93 authoritative; 63 mirrors it). Non-primary variants keep their x (inherit) — except in-stock non-primary variants, which carry a (in-stock ⇒ a overrides the x position marker; see docs/final-export-fields.md §Grade duplication). sku_prev_grade (116) is left untouched — it already holds the pre-correction grade. Each change is logged to a durable CSV (imports/house-grade-regrade.csv) plus a grade-note.


7. Pricing model (the reprice half)

flowchart TD A["Base price (per class)"] --> B["+3% catalog-wide, cartridges"] B --> C["+ grade-combo premium"] C --> D["Final price"] A2["In-stock bins"] -.-> E["Excluded from 3% · own schedule"] A3["Anchor SKUs"] -.-> F["Competitive / variable pricing"]

Order of operations:

  1. Catalog-wide +3% on cartridges, applied first. In-stock bin pricing is excluded (a separate schedule exists for it).
  2. Grade-combo premium from §5, applied after the 3%.
  3. Anchor SKUs use competitive/variable pricing, not the fixed premium.

Base price problem

The current base price is disorderly and widely inaccurate — a & b pricing is more accurate/consistent; c less so; d and f are the worst. The current price is already preserved as a backup in sku_prev_price (col 114). Do not rely on the current price to compute the increase or as a baseline for natural-grade premiums — inaccuracy is guaranteed, especially among the large profitable C group.

A new starting base price must be computed on more than one track, then compared:

  1. Track 1 — old-price-derived. A clean base price reconstructed from the current/old sell price (class-level consolidation, grade-aware clustering, or primary-row price).
  2. Track 2 — cost-implied. Implied unit cost from PO matches (po-cost.csv rate) and sibling (class) matches, then base price ≈ cost / 0.35 (~65% margin).

New TEMP columns hold each track's base-price result; an evaluation/impact review then compares them. ("How to get the price" detail — e.g. the exact cost-extension and old-price-consolidation rules — lands in a follow-up directive; the two-track shape above is the standing framework.)


8. Cost model

Home for the PO-cost + vendor metafields + the D2 sibling-cost → PO rule: sibling cost may create the PO, with an email notification (not a PO note). Referenced by docs/domain-model.md §7 #10.

The cost rules to fold in are historical — archive/po-cost-matching.md + archive/po-cost-matching-exec-summary.md (content pending, per PLAN-2026-08-19-SIMPLIFICATION-AND-RELEASE-1.md §4).


Related