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
- Cartridge SKUs: 12,878 (4,565 primary)
- Distinct classes: 1,552
- In-stock SKUs: 2,322 (bins 1–9)
- dcf-default (unclassed primaries): 278
- Anchor SKUs: 43 (A: 25 · B: 12 · C: 6)
Primary SKUs by house × natural grade:
| house × natural | A | B | C | D | F |
|---|---|---|---|---|---|
| a | 22 | 33 | 310 | 1002 | 17 |
| b | 7 | 20 | 119 | 127 | 1 |
| c | 1 | 10 | 302 | 172 | 1 |
| d | 88 | 588 | 2 | ||
| f | 1709 | 34 |
1. Three parameters
Every SKU carries three independent signals; their combination drives both bid priority and price.
| Parameter | Case | Meaning | Channel |
|---|---|---|---|
| House grade | lowercase a b c d f | Marketing 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 grade | uppercase A B C D F | Assigned 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
| Grade | Criteria | Bid Strategy |
|---|---|---|
| a | Top performers, in-stock, high margin | Aggressive bids, high caps |
| b | High revenue / lots of orders | Controlled spend, slightly lower bids |
| c | Lower volume, rare searches, very high conversion rate when they hit | Low bids |
| d | Few sales, if any | Deliberately under-bid — avoids expensive clicks |
| f | No sales + no clicks | Deliberately 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
- Shopping-only — grade-driven logic operates only in Google Shopping via GMC labels.
- Search campaigns are NOT grade-aware (old "whole" attribution method) — a key restructuring target.
- No automated feedback loop — grades are manually maintained, not driven by conversion/margin/performance data (known limitation / future automation).
- 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)
| Grade | Criteria |
|---|---|
| A | Averaged at least 1 order per quarter over 10 years (calculated), up to 8 orders per quarter (32/year). In-stock status is irrelevant. |
| B | Averages over 1.5 orders per year (range 1–4 orders per year). |
| C | 3–16 orders in the last 10 years. |
| D | 1 or 2 orders, or more than 5 pageviews over 10 years. |
| F | Less 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
- No sibling inheritance — house grades inherit across class siblings; natural grades do not.
- Uppercase
A B C D Fvs lowercasea b c d f. - In-stock is irrelevant (house grade: in-stock ⇒
a). xhas no natural-grade equivalent — every variant gets a real 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
- High search volume — what customers type into Google.
- High competitive pressure — competitors bid hardest on these SKUs.
- Low ROI (2x–6x range) — not negative, but disproportionate ad capital at the lowest returns in the portfolio.
- ~12% impression share — DF shows for roughly 1 in 8 eligible auctions.
- Estimated 25–50 SKUs qualify as anchors; ~43 carry the designation today (col 92
TRUE, 2026-09-04).
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:
| Concept | Meaning | Context |
|---|---|---|
| Anchor SKU (this doc) | Popular competitive entry-point product | Business strategy, ad bidding |
| Class reference product | Modal nominal member of a dimensional class | Classification 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
- Lower per-click bids, keep or raise budgets (currently paying a premium per click while capturing low impression share).
- Separate ad groups for closer monitoring and custom bid settings.
- 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 (*)
aA*— a confirmed Anchor SKU. Spend and revenue are BIG; the goal is to turn a profit, not a loss. Competitive market pricing, variable pricing that reacts quickly to the market. Win the right share of high-volume anchor auctions at the right price. (#formulaic-profit)- Zach: cron job to watch competitor pricing and inform the anchor line.
bA*/bB*— some anchors can beb(not in-stock), e.g. Clark part numbers DF sells a lot of but is underwater on from stiff ad competition. Below top-tier but still "anchor" qualities. (cC*is unlikely but possible — nothing says an anchor can't be one.)
Standard combos
House a (in-stock):
| Combo | Premium |
|---|---|
aA | list price (0%) |
aB | +3% |
aC | +5% |
aD | +7% |
aF | +10% |
House b (top seller, not in stock):
| Combo | Premium |
|---|---|
bA | 0% |
bB | +3% |
bC | +5% |
bD | +7% |
bF | +10% |
House c (lower volume, high conversion):
| Combo | Premium | Note |
|---|---|---|
cA | 0% | 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):
| Combo | Verdict |
|---|---|
dA | Should not exist. Misgraded a if in stock, b if not. |
dB | Should not exist. Misgraded b. |
dC | Likely a misgraded c (exceptions possible — be conservative). |
dD | True d. No orders, few pageviews. |
dF | Likely a misgraded f. |
House f (no sales, no clicks):
| Combo | Verdict |
|---|---|
fA | Should not exist. Misgraded a if in stock, b if not. |
fB | Should not exist. Misgraded b. |
fC | Should not exist. Misgraded c. |
fD | Likely a true d. |
fF | Strong 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:
| Combo | Correction |
|---|---|
dA | → a if in stock, else b |
dB | → b |
fA | → a if in stock, else b |
fB | → b |
fC | → c |
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 (A→a, B→b, C→c, D→d, F→f), 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)
Order of operations:
- Catalog-wide +3% on cartridges, applied first. In-stock bin pricing is excluded (a separate schedule exists for it).
- Grade-combo premium from §5, applied after the 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:
- 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).
- Track 2 — cost-implied. Implied unit cost from PO matches (
po-cost.csvrate) and sibling (class) matches, thenbase 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
docs/domain-model.md— classes (the thing being priced).docs/media-taxonomy.md— the DF media catalog (exotic taxonomy).docs/architecture.md— database schema and data model.docs/column-map.md— authoritative 0-indexed column offsets.