Check accounting accounts before export

Checks that expenses to export carry their expense, VAT and supplier accounts, and that none sits on an archived account.

Controller๐Ÿ“† MonthlyIntermediateRead-only

Ask it like this

Check that all my expenses to export have their accounting accounts

When to use it

Before an accounting export or when preparing the close, to make sure every expense carries a valid accounting code.

What it produces

A list of incomplete expenses with what is missing, the amount involved and a link to each.

How it works

  1. 1Lists the expenses to export over the period
  2. 2Reads each one's accounting accounts, line by line
  3. 3Spots those with no expense, VAT or supplier account
  4. 4Checks that the accounts used are not archived
  5. 5Presents the anomalies, the amount affected and a link to each expense

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 detail73/100 ยท 3 tools
ERP exportSettingsget_payablesget_payable_by_idget_chart_of_accounts

# Accounting accounts check before export

## Purpose

Check, before an export, that every expense to export carries its accounting accounts: an expense account on each line, a VAT account when there is VAT, a supplier account. An expense with no account goes into the journal incomplete.

This skill only reads. Fixing an account needs the `update_payable` tool ("Manage payables" write permission, in Beta) or the Spendesk app.

## Where the accounts are

The list returned by `get_payables` carries account **IDs**, and only when an account is assigned. Codes and names are read from an expense's detail (`get_payable_by_id`).

| Account | In the list (`get_payables`) | In the detail (`get_payable_by_id`) |
|---------|------------------------------|-------------------------------------|
| The line's expense account | `itemLines[].expenseAccountId` | `lineItems[].expenseAccount` |
| The line's VAT account | `itemLines[].taxAccountId` | `lineItems[].vatAccount` |
| Reverse-charge account, where relevant | โ€” | `lineItems[].reverseChargeAccount` |
| Supplier or employee account | `accountPayableId` | `counterparty.accountPayable` |

In the list, an unassigned account shows as a **missing** field; in the detail, as a `null` field. There is no `glCode` or `accountingCode` field.

## Step 1 โ€” List the expenses to check

State the exact dates, then:

```json
{
  "tool": "get_payables",
  "params": { "filters": { "operator": "and", "subfilters": [
    { "field": "payableDate", "operator": "between", "value": { "from": "2026-09-01T00:00:00.000Z", "to": "2026-09-30T23:59:59.999Z" } },
    { "field": "bookkeepingStatus", "operator": "=", "value": ["toPrepare", "toExport"] }
  ] } }
}
```

Include `toPrepare`: those are the expenses not yet reviewed, where accounts are most often missing. Page with `cursor`.

## Step 2 โ€” Spot missing accounts in the list

With no extra call, note for each expense in the list:

- lines with no `expenseAccountId`;
- lines with VAT (non-zero `vatAmount`) and no `taxAccountId`;
- a missing `accountPayableId`.

Say how many expenses were checked. Read the detail only for the expenses with an anomaly, to get the supplier name, the account codes and the `appUrl` link:

```json
{ "tool": "get_payable_by_id", "params": { "id": "<expense id>" } }
```

## Step 3 โ€” Check the accounts used are still valid

```json
{ "tool": "get_chart_of_accounts", "params": { "includeArchived": true, "pageSize": 1000 } }
```

Match the account IDs noted in the list against the chart of accounts. Flag an expense assigned to an **archived** account (`isArchived: true`) or one made unavailable (`isAvailable: false`). Without `includeArchived`, those accounts are invisible and the check would miss them.

## Report

```
Accounts check โ€” expenses from <date> to <date> (N checked)

โœ… Complete: N
โŒ No expense account: N โ€” X EUR
โŒ No VAT account although there is VAT: N
โŒ No supplier account: N
โš ๏ธ On an archived or unavailable account: N

| Expense | Supplier | Amount | What is missing | Link |
```

`appUrl` (in the expense's detail) is the direct link: give it as returned. Amounts are in each expense's own currency; total with `functionalAmount`.

## Limits to state

- This check says an account is present and active, not that it is the **right** account for that expense.
- If the chart of accounts is managed by the company's accounting software, accounts are fixed there.

## Observed result (demo account, 5 October 2026)

One September invoice still to prepare (EUR 15,779.40, with EUR 2,519.40 of VAT) had no expense account, no VAT account and no supplier account: all three IDs were missing from the list, and all three fields were `null` in the detail.

## Example prompts
- "Check that all my expenses to export have their accounting accounts"
- "Are there invoices with no expense account before my close?"
- "Which September expenses are assigned to an archived account?"

How to install this skill

/
  1. 1
    Download the file s48-gl-mapping-validation.md using the button above.
  2. 2
    Place the file in the .claude/ directory of your project (or ~/.claude/ for a global install).
    cp s48-gl-mapping-validation.md .claude/s48-gl-mapping-validation.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, get_payable_by_id, get_chart_of_accounts.

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?