Chase invoices waiting for approval

Lists supplier invoices waiting for approval, with the expected approver and how long they have waited.

AP ManagerController๐Ÿ“… WeeklyIntermediateRead-only

Ask it like this

Which supplier invoices are waiting for approval, and with whom?

When to use it

Every week, to know which invoices are stuck in approval, with whom and since when.

What it produces

Total per currency, then a table of invoice / supplier / amount / due date / expected approver, overdue ones first.

How it works

  1. 1Counts pending invoices, with a total per currency
  2. 2Lists those invoices from oldest to most recent
  3. 3Finds the expected approver on each invoice
  4. 4Flags the ones already past their due date
  5. 5Prepares a chaser list, ready to send

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 ยท 4 tools
SuppliersComplianceget_invoices_summaryget_invoicesget_invoice_by_idget_users

# Supplier invoices waiting for approval

## What this skill covers โ€” and what it doesn't

The `get_invoices*` tools read **supplier invoices** (before and after approval). They are the right tools for "which invoices are waiting for approval" โ€” `get_requests` only covers card requests, and `get_payables` only holds an invoice once it is approved.

The MCP **cannot approve or reject** an invoice: no tool does that. This skill produces the list and the chaser draft; approval stays in Spendesk.

## Step 1 โ€” Volume and amounts (no paging)

```json
{ "tool": "get_invoices_summary", "params": { "approvalStatus": ["pending"] } }
```

Returns `count` and `totalsByCurrency` (one block per currency).

โš ๏ธ Three traps verified live:
- `amountDue` is **always 0** in the summary (not computed yet) โ€” never present it as an outstanding balance.
- `netAmount` is a lower bound: invoices with no captured net amount count as 0. Do not derive tax from it.
- Amounts are never added across currencies: present one total per currency.

## Step 2 โ€” List, oldest first

```json
{ "tool": "get_invoices", "params": { "approvalStatus": ["pending"], "sortBy": "createdAt", "sort": "asc", "pageSize": 100 } }
```

Useful fields: `invoiceNumber`, `supplier.name`, `grossAmount.formatted`, `dueDate`, `createdAt`, `purchaseOrders`.

- If `hasNextPage` is `true`, pass `meta.pagination.cursor` back as `cursor`.
- With no `type` filter, only invoices are listed; credit notes need a separate call with `type: "creditNote"`.
- Draft and incomplete invoices are never listed, not even under `pending`.
- `grossAmount` can be `null` on a pending invoice with no captured amount: `null` is not zero.

## Step 3 โ€” Who has to approve

The list does not carry the approval chain. For each invoice to chase:

```json
{ "tool": "get_invoice_by_id", "params": { "id": "<invoice id>" } }
```

Read `approval.steps`: the step whose `state` is `current` holds the expected `approvers`. These are raw `userId` values โ€” resolve them in one call:

```json
{ "tool": "get_users", "params": { "ids": ["<userId1>", "<userId2>"] } }
```

Never show a bare ID. If an ID does not resolve (a former member of the entity), say so. The invoice's `buyer` field also gives the requester, with their name.

## Recommended output format

```
Invoices waiting for approval โ€” <today's date>
Total: N invoices โ€” X EUR ยท Y USD (per currency, never added together)

| Invoice | Supplier | Amount | Due date | Received on | Expected approver(s) |
```

Flag first the invoices whose due date has already passed: they are late before even being approved.

## Observed result (demo account)

2 invoices pending: 1 in EUR (2,616.00) and 1 in USD (19,513.20). On the USD invoice, the current step expected two approvers, resolved with `get_users`. Both invoices were past their due date and had no linked purchase order.

## Example user prompts

- "Which supplier invoices are waiting for approval, and with whom?"
- "Draft a chaser for the approvers of invoices pending for more than 7 days"
- "How many invoices are stuck in approval, by currency?"

How to install this skill

/
  1. 1
    Download the file s70-factures-attente-approbation.md using the button above.
  2. 2
    Place the file in the .claude/ directory of your project (or ~/.claude/ for a global install).
    cp s70-factures-attente-approbation.md .claude/s70-factures-attente-approbation.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_invoices_summary, get_invoices, get_invoice_by_id, get_users.

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?