Open POs approaching or exceeding budget

Analyzes open purchase orders and flags those where invoicing approaches or exceeds the approved budget. Essential for budget commitment control.

↓ Download skill (.md)
83/100·📅 Weekly·IntermediateProcurementCFO
Budget & POsget_purchase_orders

🎯 Skill purpose

Analyzes open purchase orders and flags those where invoicing approaches or exceeds the approved budget. Essential for budget commitment control.

📊 What it produces

Open POs with budget, invoiced amount, % consumed, and over-budget alert.

Benefit

Before

Manual PO tracking in Excel — budget overruns detected too late.

After

Real-time PO monitoring with automatic budget overrun alerts.



# Instructions

## Use case

Retrieve active POs and compare the approved budget (`amount`) with the amount already invoiced (`billedAmount`) to identify overruns or POs with no invoicing.

## Basic call

```json
{
  "companyId": "<COMPANY_ID>",
  "status": ["open"],
  "pageSize": 100
}
```

Note: `status` is an **array** of strings (unlike `list_cards.status` which is a plain string).

## Financial fields of a PO

```json
{
  "amount":          { "amount": 2126789, "currency": "USD", "precision": 2 },  // approved budget: 21,267.89 USD
  "billedAmount":    { "amount": 1063384, "currency": "USD", "precision": 2 },  // total invoiced: 10,633.84 USD
  "deliveredAmount": { "amount": 0,       "currency": "USD", "precision": 2 }   // confirmed delivered amount
}
```

- `amount` = approved budget ceiling
- `billedAmount` = sum of attached invoices (all, including credit notes)
- `deliveredAmount` = amount whose receipt has been confirmed (often 0 if delivery tracking isn't used)
- `netAmount` = `billedAmount` - credit notes (documented in the tool description but **absent from the response** — calculate manually if needed)

## Calculating budget consumption

```
consumption (%) = billedAmount / amount × 100
overrun         = billedAmount > amount
remaining budget = amount - billedAmount
```

## billingStatus — invoicing status

| Value | Meaning |
|--------|---------------|
| `lateInvoice` | PO open but no invoice received (or PO late on invoicing) |
| `partiallyBilled` | Partial invoicing — invoices exist but < total budget |
| `fullyBilled` | Budget fully consumed by invoices |

## Pitfall 1 — "open" POs can have a past endDate

A PO stays in `status: "open"` even after its end date. The MCP does not automatically close expired POs. On the demo account, all open POs have an `endDate` in 2022 or 2023 — they've been open for 2-3 years.

```
PO-14 (Oracle subscription)  : endDate 2022-07-31 → still open in 2026
PO-22 (Coworking Lyon)     : endDate 2022-12-31 → still open in 2026
PO-82 (Banking offsite)    : endDate 2022-11-18 → still open in 2026
```

→ Always filter on `endDate` if you only want POs currently valid:
```json
{
  "status": ["open"],
  "endDateFrom": "2026-07-01"
}
```

## Pitfall 2 — netAmount absent from the response

The tool description mentions `netAmount = billedAmount - creditNotes` but this field **is not returned** in the API response. If credit notes have been issued, `billedAmount` already includes them. There is no separate field to distinguish gross and net amounts.

## Pitfall 3 — Multi-currency across POs

POs can be in EUR or USD (or any other currency). Do not sum `amount` across currencies to get a consolidated total budget. The `amount`, `billedAmount`, `deliveredAmount` fields are always in the PO's currency.

## billingOverDeliveryStatus

Field present on each PO: `"none"` / `"overBilled"` / `"underBilled"` — lets you spot at a glance POs where invoicing exceeds delivery. On the demo account: all set to `"none"`.

## deliveryStatus

| Value | Meaning |
|--------|---------------|
| `noDeliveryExpected` | Delivery receipt is not tracked for this PO |
| `partiallyDelivered` | Delivery partially confirmed |
| `fullyDelivered` | Delivery fully confirmed |

## invoices[] — linked invoices

Each PO exposes an `invoices[]` array with each associated invoice:
```json
{
  "invoiceRequestId": "...",
  "invoiceNumber": "INV6342",
  "amount": { "amount": 533578, "currency": "USD", "precision": 2 },
  "status": "paid",
  "payableId": "697e453d-..."  // can be null if the requestId→payableId mapping failed
}
```

To get the accounting detail of an invoice: `get_payable_by_id(payableId)` — see [[s20-detail-complet-facture]].

## Example user prompts

- "Show me the POs whose invoicing exceeds the approved budget"
- "Which open POs have late invoices (billingStatus = lateInvoice)?"
- "What is the consumption rate of active POs for Q3 2026?"

How to install this skill

/
  1. 1
    Download the file s27-purchase-orders-budget.md using the button above.
  2. 2
    Place the file in the .claude/ directory of your project (or ~/.claude/ for a global install).
    cp s27-purchase-orders-budget.md .claude/s27-purchase-orders-budget.md
  3. 3
    Use in Claude Codethe 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_purchase_orders.

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
★ Top
89/100·🔍 Ad hoc·Intermediate

Skill Builder

Aide un client à transformer un besoin métier précis (contexte, contraintes, format de sortie souhaité) en un nouveau skill Claude sur mesure, prêt à l'emploi sur le MCP Spendesk

CFOControllerAP Manager
★ Top
88/100·🔍 Ad hoc·Beginner

MCP Product Tour

Visite guidée conversationnelle du MCP Spendesk — appels réels sur les données de l'utilisateur, adaptée à sa persona, puis recommandation des prochains skills à installer

CFOControllerAP Manager