List subscriptions and their cost

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

CFOFinance AnalystProcurementπŸ“† MonthlyIntermediateRead-only

Ask it like this

What are our subscriptions and their monthly cost?

When to use it

When you want to see spend paid by subscription card and what it costs.

What it produces

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

How it works

  1. 1Lists expenses paid by subscription card
  2. 2Separates the amount paid from the original currency
  3. 3Ties each subscription to its supplier
  4. 4Totals the cost per supplier over the period
  5. 5Flags subscriptions with no recent payment

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 detail83/100 Β· 2 tools
CardsSpend analysisget_payableslist_cards

# 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 described by the server as the amount in the card currency; on subscriptions it has been observed far above the billed amount, so do not treat it as 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": { "operator": "and", "subfilters": [
    { "field": "payableType", "operator": "=", "value": ["subscription"] },
    { "field": "payableDate", "operator": "between", "value": { "from": "2026-01-01T00:00:00.000Z", "to": "2026-06-30T23:59:59.999Z" } }
  ] },
  "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": { "payableTypes": ["subscription"] }
}
```

`groupBy=supplier` returns the supplier name in `key` and its ID in `id`. Raw IDs only show up in `key` when the token lacks the supplier read scope; `summary.limitations` then flags it (type `unresolved-names`).

## 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 |
| `bookkeepingStatus` | 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

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

Interested in AI Agent services or Custom Integrations?