Compare top suppliers year on year

Ranks suppliers by spending amount and compares them to the prior period. Uses supplier IDs to ensure consistency across both periods.

CFOAP Manager๐Ÿ“† MonthlyBeginnerRead-only

Ask it like this

Who are our 10 largest suppliers this year compared with last year?

When to use it

When you want to know your largest suppliers and which ones are growing or shrinking.

What it produces

Top N suppliers with current period amount, prior period amount, and percentage variance.

How it works

  1. 1Ranks suppliers by spend over the period
  2. 2Compares each with the previous period of equal length
  3. 3Finds the name of suppliers returned without a label
  4. 4Flags newcomers and sharp changes
  5. 5Presents the ranking with each supplier's change

What protects you

  • This skill only reads: it changes nothing in Spendesk
  • It acts with your permissions and your role, never beyond
  • The assistant cannot approve or pay
โ–ธTechnical detail85/100 ยท 2 tools
SuppliersSpend analysisspendesk_analyze_spendget_suppliers

# Instructions โ€” Top suppliers with YoY comparison

## โš ๏ธ Suppliers returned without a name

`spendesk_analyze_spend` groupBy=supplier returns `key` = **supplier name** (when resolved) and `id` = supplier ID. `key` holds the raw ID only when `summary.limitations` reports `unresolved-names`.
The `name` field is not present in the response.

To display names:
1. Collect all IDs from the top-N suppliers
2. Call `get_suppliers(ids=[id1, id2, ...])` in a single call
3. Join names by ID

## โš ๏ธ amountChange on the "Others" row

The "Others" row also includes `previousAmount` and `amountChange`. If "Others" grows sharply, the supplier base is expanding faster than the top suppliers.

## Step 1 โ€” Top suppliers analysis with comparison

```json
{
  "companyId": "...",
  "fromDate": "YYYY-MM-DD",
  "toDate": "YYYY-MM-DD",
  "groupBy": ["supplier"],
  "compareWithPreviousPeriod": true,
  "limit": 15
}
```

โ†’ The previous period is automatically calculated (same duration, immediately before `fromDate`).
โ†’ `limit: 15` to see more than the default top-10.

## Step 2 โ€” Interpreting compareWithPreviousPeriod

Each row returns:
- `amount`: spend for the current period
- `share`: relative weight of the row within its breakdown (% of gross activity at that level, always between 0 and 100; not a share of `summary.totalAmount`)
- `previousAmount`: spend for the previous period
- `amountChange`: % change (positive = increase, negative = decrease)
  - `amountChange: null` โ†’ previousAmount = 0 (no defined percentage; quote the absolute amounts. null does not prove the supplier is new: the previous period may have netted to zero)
  - `amountChange: -100` โ†’ supplier no longer active (amount = 0)

On the summary (`summary.previousPeriod`):
- `period.from/to`: dates of the comparison period
- `totalAmount`: total for the previous period
- `amountChange`: overall % change

## Step 3 โ€” Resolving supplier names

```json
{ "companyId": "...", "ids": ["id1", "id2", "id3", ...] }
```

Join by ID (only if names are not resolved): `{ ...row, name: suppliers.find(s => s.id === row.id)?.name || row.key }`

## Step 4 โ€” Identifying anomalies

Alert the user about:
- `amountChange > 500%` โ†’ explosive growth (new contract, data entry error?)
- `amountChange < -50%` โ†’ sharp decline (termination, project ended?)
- `previousAmount = 0` AND `amount > threshold` โ†’ significant new supplier
- "Others" rising sharply โ†’ fragmentation of the supplier base

## Live example (real data, Jul 2025 โ†’ Jun 2026 vs Jul 2024 โ†’ Jun 2025)

Summary:
- Current period: **EUR 16,524,574.27** (7,199 payables)
- Previous period: EUR 17,108,631.54 (5,804 payables)
- **Overall change: -3.4%** (slight decrease)

Notable anomalies:
- Supplier `0qryRtMyYW`: +92,078% (EUR 424 โ†’ EUR 391,345) โ€” practically new
- Supplier `lt1euqhnunby1f`: +361.5% (EUR 131,938 โ†’ EUR 608,940) โ€” strong growth
- Supplier `9MCGQweUWi`: -68.3% (EUR 3,001,938 โ†’ EUR 951,166) โ€” sharp decline
- Supplier `8xs-s358mod4ps`: new (previousAmount=0), EUR 738,607
- "Others": +53.2% (expanding supplier base)

## Example prompt

- "Who are our top 10 suppliers this year vs last year?" โ†’ groupBy=supplier, compareWithPreviousPeriod=true, limit=10 + resolve names
- "Are there any suppliers whose spend has exploded?" โ†’ filter amountChange > 200%
- "Significant new suppliers this year?" โ†’ filter previousAmount=0 AND amount > threshold

How to install this skill

/
  1. 1
    Download the file s05-top-suppliers-comparison.md using the button above.
  2. 2
    Place the file in the .claude/ directory of your project (or ~/.claude/ for a global install).
    cp s05-top-suppliers-comparison.md .claude/s05-top-suppliers-comparison.md
  3. 3
    Use in Claude Code โ€” the skill is automatically discovered. Describe your need in natural language and Claude will apply the skill instructions.
๐Ÿ’ก Make sure the Spendesk MCP is configured in your .claude/settings.json with the tools spendesk_analyze_spend, get_suppliers.

Similar skills

โ˜… Top
95/100ยท๐Ÿ” Ad hocยทExpert

Audit what the MCP covers

Probes all available MCP tools, re-evaluates coverage of 50 persona use cases, detects new fields or tools, and regenerates the gap analysis report.

CFOControllerAP Manager
90/100ยท๐Ÿ” Ad hocยทIntermediate

Active vs archived cost centers

Distinguishes active cost centers from archived ones with correct use of get_cost_centers. Avoids the counter-intuitive isArchived vs isActive naming convention pitfall.

ControllerFinance Analyst
โ˜… Top
89/100ยท๐Ÿ” Ad hocยทIntermediate

Build a custom skill

Turns a precise business need into a brand-new tailored Claude skill, ready to use on the Spendesk MCP.

CFOControllerAP Manager

Interested in AI Agent services or Custom Integrations?