SaaS subscriptions inventory

Lists and analyzes all company SaaS subscriptions via the payableType=subscription filter. Identifies active subscriptions, their total cost, and recurrence.

↓ Download skill (.md)
83/100Β·πŸ“† MonthlyΒ·IntermediateCFOFinance AnalystProcurement
CardsSpend analysisget_payableslist_cards

🎯 Skill purpose

Lists and analyzes all company SaaS subscriptions via the payableType=subscription filter. Identifies active subscriptions, their total cost, and recurrence.

πŸ“Š What it produces

SaaS subscription inventory with supplier, monthly or annual amount, and status.

⚑ Benefit

Before

No consolidated subscription view β€” discovered only at renewal time.

After

Complete SaaS subscription inventory in seconds, ready to optimize costs.



# SaaS subscriptions β€” payableType=subscription

## Base query

```json
{
  "companyId": "<companyId>",
  "filters": {
    "field": "payableType",
    "operator": "=",
    "value": ["subscription"]
  },
  "pageSize": 20
}
```

β†’ `hasNextPage: true` if more than 20 results β€” paginate with the cursor to retrieve everything.

## ⚠️ spendingAmount β‰  subscription amount

This is the main pitfall on subscriptions. `spendingAmount` is the **limit of the dedicated card**, not the billed amount:

| Description | amount (actual) | spendingAmount (card limit) |
|-------------|---------------|---------------------------------|
| Google Apps subscription | 32.26 EUR | 4,500 EUR |
| Auto-recharge on Twilio | 14.65 EUR | 50 EUR |
| MessageBird | 27.36 EUR | 5,000 EUR |
| CRM 5 users | 276.25 USD β†’ 257 EUR | 400 USD |

β†’ **NEVER sum `spendingAmount`** to calculate the total subscription cost β€” the result would be 10 to 200x higher than reality.
β†’ Always use `amount` (local currency) or `functionalAmount` (EUR) for actual amounts.

```json
// Good practice
const totalEUR = payables.reduce((sum, p) => sum + p.functionalAmount.amount / Math.pow(10, p.functionalAmount.precision), 0)

// Do not do this
const wrongTotal = payables.reduce((sum, p) => sum + p.spendingAmount.amount / ..., 0)  // can be 100x too high
```

## Currencies: majority in USD (international SaaS)

SaaS subscriptions are mostly billed in USD. Use `functionalAmount` for the EUR total:

```json
{
  "currency": "USD",
  "functionalCurrency": "EUR",
  "functionalExchangeRate": 0.9315,
  "amount": { "amount": 27625, "currency": "USD", "precision": 2 },
  "functionalAmount": { "amount": 25722, "currency": "EUR", "precision": 2 }
}
```

β†’ Sum `functionalAmount` to get the consolidated EUR total across all currencies.

## Filtering by period

For subscriptions in a given period:

```json
{
  "companyId": "<companyId>",
  "filters": { "field": "payableType", "operator": "=", "value": ["subscription"] },
  "fromDate": "2026-01-01",
  "toDate": "2026-06-30",
  "pageSize": 20
}
```

## Linking subscription β†’ supplier

Each payable exposes `counterparty.supplierId` (no name):

```json
{ "counterparty": { "type": "supplier", "supplierId": "S1mrHIIp" } }
```

β†’ `get_supplier_by_id("S1mrHIIp")` to get the name (`legalName`), IBAN, VAT number.

## Aggregated analysis with spendesk_analyze_spend

For a quick total grouped by supplier:

```json
{
  "companyId": "<companyId>",
  "fromDate": "2026-01-01",
  "toDate": "2026-06-30",
  "groupBy": ["supplier"],
  "filters": { "field": "payableType", "operator": "=", "value": ["subscription"] }
}
```

⚠️ `groupBy=supplier` returns IDs (not names) β€” a `get_suppliers(ids=[...])` call is needed for display (see skill S05).

## Useful fields

| Field | Description |
|-------|-------------|
| `description` | Subscription label |
| `amount` / `functionalAmount` | Actual amount in local currency / EUR (integer coefficient / 10^precision) |
| `spendingAmount` | Card limit β€” do not use for totals |
| `counterparty.supplierId` | ID of the SaaS supplier |
| `currency` | Billing currency (often USD) |
| `functionalExchangeRate` | Exchange rate applied |
| `creationDate` | Date of the payable |
| `state` | Accounting status (`exported`, `toExport`, `toPrepare`) |

## Example prompts

- "What are our SaaS subscriptions and their monthly cost?"
- "Show me the total spent on subscriptions in Q1"
- "Which subscriptions are still active?" (filter by recent `fromDate`)
- "List all subscriptions billed in USD"
- "What is the average monthly cost of our Google Apps subscription?"

How to install this skill

/
  1. 1
    Download the file s16-abonnements-subscriptions.md using the button above.
  2. 2
    Place the file in the .claude/ directory of your project (or ~/.claude/ for a global install).
    cp s16-abonnements-subscriptions.md .claude/s16-abonnements-subscriptions.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 get_payables, list_cards.

Similar skills

β˜… Top
95/100Β·πŸ” Ad hocΒ·Expert

MCP coverage audit & gap analysis

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Β·πŸ“… WeeklyΒ·Beginner

Card requests via get_requests

Explains how to use get_requests for card requests and why expense reimbursements don't appear there. Avoids a frequent source of confusion between two distinct workflows.

ControllerFinance Analyst
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