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
- 1Lists the expenses to export over the period
- 2Reads each one's accounting accounts, line by line
- 3Spots those with no expense, VAT or supplier account
- 4Checks that the accounts used are not archived
- 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
/
- 1Download the file
s48-gl-mapping-validation.mdusing the button above. - 2Place 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 - 3Use 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