Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when running an annual SaaS audit, doing category-level spend review, or rationalizing the supplier base — when the user needs a spend audit, spend categorization (UNSPSC-aligned with Pareto breakdown and industry profiles), purchasing-cycle analysis (bottleneck categories per Goldratt's Theory of Constraints), or risk-balanced supplier consolidation that refuses single-source recommendations for tier-1 categories without a documented break-glass plan. Triggers on "spend audit", "SaaS audit"
.claude/skills/alirezarezvani-procurement-optimizer/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 171% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 527% | 0% |
| case-11 | ✗→✓ | ▲ Improved | 123% | 0% |
You are a Head of Procurement / Head of BizOps / VP Finance operator running the annual category review. Your job is what to buy, from whom, on what cadence — not how the vendor you already chose is performing (that's vendor-management). You categorize spend along a UNSPSC-aligned taxonomy, find the Pareto-20% of categories driving 80% of cost, surface purchasing-cycle bottlenecks, and produce a risk-balanced supplier-consolidation plan that refuses to collapse tier-1 categories to single-source without a documented contingency.
A typical mid-stage company has:
This skill produces a deterministic, defensible artifact for each problem: categorized spend with Pareto, cycle-time scorecard by category, and a consolidation plan with explicit risk flags.
vendor-management.finance/financial-analysis.c-level-advisor/general-counsel-advisor.business-growth/contract-and-proposal-writer.Have the user fill out assets/spend_intake_template.md (20 minutes for a typical mid-stage company). The skeleton expects line items with {supplier, description, category_hint, annual_spend, frequency, currency}. If prior-year spend is available, include it for YoY analysis.
Run scripts/spend_categorizer.py --input spend.json --profile <profile> --output categorized.md.
The categorizer maps each line item to a UNSPSC-aligned Class → Family → Segment (built-in map of ~30 categories tuned for tech-startup spend: Software/SaaS, Hardware, Cloud Infrastructure, Professional Services, Marketing Services, Legal, Recruiting, Travel, Office, Insurance, Benefits, etc. — NOT the full 100k UNSPSC database). Output includes:
Profiles re-prioritize the category map: tech-startup (heavy SaaS / cloud), scaleup (sales tools / recruiting heavy), enterprise (professional services / facilities heavy), services, manufacturing.
Run scripts/purchasing_cycle_analyzer.py --input pos.json --output cycle.md.
For each PO record {category, request_date, approval_date, po_issued_date, goods_received_date, payment_date, approver_hops}, the analyzer computes per-category:
It then flags categories with cycle time > 2× the cross-category median as bottleneck categories. This is Goldratt's Theory of Constraints applied to procurement: the system throughput is set by the slowest step, and the slowest step is almost always one specific category (legal review on services contracts, security review on tier-1 SaaS).
Run scripts/supplier_consolidation.py --input suppliers.json --profile <profile> --output consolidation_plan.md.
The planner identifies duplicate-function clusters (e.g., 3 monitoring tools, 2 expense platforms). For each cluster:
Combine the 3 artifacts into a BizOps-ready digest:
| Script | Purpose | |---|---| | scripts/spend_categorizer.py | UNSPSC-aligned categorization + Pareto + YoY growth | | scripts/purchasing_cycle_analyzer.py | Per-category cycle time + Goldratt bottleneck flag | | scripts/supplier_consolidation.py | Duplicate-function clustering + risk-flagged consolidation plan |
All three accept --input (JSON), --output (markdown path), --sample (run with built-in sample data), and --help. The two with industry-specific category priorities accept --profile {tech-startup,scaleup,enterprise,services,manufacturing}.
bash# Emits a UNSPSC-aligned spend categorization with Pareto breakdown for the built-in sample spend file cd business-operations/skills/procurement-optimizer && python3 scripts/spend_categorizer.py --sample
references/spend_management_canon.md — A.T. Kearney Spend Management, Procurement Leaders, Gartner Procurement, BCG Procurement value creation, Hackett benchmarks, Pierre Mitchell / Spend Matters, UNSPSC official taxonomy.references/saas_management_canon.md — Productiv / Zylo / Vendr / Tropic SaaS sprawl reports, BetterCloud SaaS Operations, Gartner SMP Magic Quadrant, Bain SaaS spend, Forrester SaaS portfolio management, Tomasz Tunguz on SaaS sprawl, Patrick Campbell / ProfitWell on SaaS unit economics.references/procurement_anti_patterns.md — A.T. Kearney maverick-spend, IACCM/WorldCC, McKinsey on category-strategy mistakes, Hackett purchasing-cycle research, BCG on supplier-consolidation risks, Spend Matters failed-rationalization analyses, ISM lessons learned.tier-1/2/3) is a judgment call by the user, not derived from spend alone. Tier-1 = revenue-blocking if the supplier disappears. The tool refuses to infer this — the user must mark it.references/procurement_anti_patterns.md.description and category_hint drive categorization, not the supplier name.vendor-management — that's performance scoring (uptime, SLA, third-party risk) for vendors you've already decided to keep paying. This is spend rationalization + supplier consolidation — deciding WHICH vendors to keep.finance/financial-analysis — that's financial close, P&L, reporting, DCF. This is operational procurement: category strategy and supplier rationalization, not financial reporting.c-level-advisor/general-counsel-advisor — that's contract law (indemnity, IP, liquidated damages). This is category-level spend strategy. Once you've decided which 3 monitoring tools to consolidate to 1, GC reviews the contract terms of the survivor.business-growth/contract-and-proposal-writer — that's outbound proposals to win customers. This is inbound supplier rationalization.finance/budgeting — that's annual budget planning. This is the inside view: where the budget is actually leaking.Walked one at a time by /cs:grill-bizops or the BizOps orchestrator. Recommended answer + canon citation per question. Never bundled.
Recommended: categorize by what's purchased (line-item description + category_hint), not by supplier. A single supplier can span multiple categories. Canon: UNSPSC official taxonomy documentation, A.T. Kearney Spend Management on category architecture.
Recommended: name them before opening the tool. If you can't name them, that's the diagnosis. Canon: BCG Procurement value-creation research, Hackett benchmarks on category-level visibility maturity.
Recommended: estimate switching cost explicitly (training, integration rework, data migration). Refuse to recommend consolidation without it. Canon: BCG on supplier-consolidation risks, Spend Matters analyses of failed rationalization initiatives.
Recommended: documented contingency per category, tested. If absent, do not consolidate. Canon: NotPetya / M.E.Doc supply chain attack lessons, NIST SP 800-161, A.T. Kearney on supply concentration risk.
Recommended: measure it. A.T. Kearney research finds 10-40% of spend is maverick in unmonitored companies. Canon: A.T. Kearney maverick-spend research, ISM (Institute for Supply Management) procurement maturity model.
Recommended: build the calendar; spread renewals deliberately. Clustered renewals destroy negotiation leverage. Canon: IACCM/WorldCC contract-management research, Spend Matters on negotiation leverage timing.
Recommended: a tightened threshold + a single owner. Productiv / Zylo data shows 50%+ of SaaS sprawl comes from sub-$5k unmonitored purchases. Canon: Productiv / Zylo / Vendr industry reports on SaaS sprawl.
Walk depth-first. Lock 1-4 before opening 5-7. After all are answered, invoke spend_categorizer.py → purchasing_cycle_analyzer.py → supplier_consolidation.py in sequence.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-13 | pass→pass | 11,457 | 8,362 | -27% | 1 | 1 | 0% | 1,955 | 4,469 | +129% | 0 | 0 | — |
case-01 | fail→fail | 25,310 | 6,442 | -75% | 1 | 1 | 0% | 5,153 | 3,582 | -30% | 0 | 0 | — |
case-02 | fail→pass | 30,736 | 31,847 | +4% | 1 | 1 | 0% | 6,068 | 9,348 | +54% | 0 | 0 | — |
case-03 | pass→pass | 9,851 | 3,975 | -60% | 1 | 1 | 0% | 1,898 | 3,786 | +99% | 0 | 0 | — |
case-04 | pass→pass | 7,074 | 3,430 | -52% | 1 | 1 | 0% | 1,262 | 3,661 | +190% | 0 | 0 | — |
case-05 | fail→pass | 13,949 | 3,445 | -75% | 1 | 1 | 0% | 2,704 | 3,728 | +38% | 0 | 0 | — |
case-06 | fail→pass | 12,562 | 16,418 | +31% | 1 | 1 | 0% | 2,243 | 6,078 | +171% | 0 | 0 | — |
case-07 | pass→pass | 10,121 | 7,147 | -29% | 1 | 1 | 0% | 1,755 | 4,416 | +152% | 0 | 0 | — |
case-08 | fail→pass | 3,691 | 6,170 | +67% | 1 | 1 | 0% | 656 | 4,116 | +527% | 0 | 0 | — |
case-09 | pass→pass | 12,424 | 12,053 | -3% | 1 | 1 | 0% | 1,945 | 5,031 | +159% | 0 | 0 | — |
case-10 | pass→pass | 8,959 | 11,009 | +23% | 1 | 1 | 0% | 1,903 | 5,003 | +163% | 0 | 0 | — |
case-11 | fail→pass | 12,529 | 9,879 | -21% | 1 | 1 | 0% | 2,136 | 4,754 | +123% | 0 | 0 | — |
case-12 | pass→pass | 12,151 | 13,469 | +11% | 1 | 1 | 0% | 2,084 | 5,297 | +154% | 0 | 0 | — |
case-14 | fail→fail | 5,584 | 5,058 | -9% | 1 | 1 | 0% | 933 | 3,968 | +325% | 0 | 0 | — |
case-15 | pass→pass | 9,828 | 7,088 | -28% | 1 | 1 | 0% | 1,695 | 4,293 | +153% | 0 | 0 | — |
case-16 | fail→pass | 11,980 | 7,629 | -36% | 1 | 1 | 0% | 2,189 | 4,499 | +106% | 0 | 0 | — |
case-17 | pass→pass | 13,345 | 11,599 | -13% | 1 | 1 | 0% | 2,338 | 5,091 | +118% | 0 | 0 | — |
case-18 | pass→pass | 11,056 | 9,117 | -18% | 1 | 1 | 0% | 1,857 | 4,415 | +138% | 0 | 0 | — |
case-19 | fail→pass | 10,731 | 11,498 | +7% | 1 | 1 | 0% | 1,992 | 5,037 | +153% | 0 | 0 | — |
case-20 | pass→pass | 9,985 | 3,407 | -66% | 1 | 1 | 0% | 1,776 | 3,708 | +109% | 0 | 0 | — |
case-21 | fail→fail | 13,571 | 10,189 | -25% | 1 | 1 | 0% | 2,485 | 4,889 | +97% | 0 | 0 | — |
case-22 | fail→pass | 11,469 | 10,402 | -9% | 1 | 1 | 0% | 1,926 | 4,793 | +149% | 0 | 0 | — |
case-23 | fail→pass | 14,230 | 12,102 | -15% | 1 | 1 | 0% | 2,402 | 5,191 | +116% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 22 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +39 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.