[Cotlet](https://cotlet.dev/index.md) · [Integrations](https://cotlet.dev/integrations.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Use cases](https://cotlet.dev/use-cases.md) · [Security](https://cotlet.dev/security.md) · [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md) · [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [Contact](https://cotlet.dev/contact.md) · [Pricing](https://cotlet.dev/pricing.md) · [Sign up](https://cotlet.dev/signup)

# Categorise Pennylane bank transactions

> Categorise last week's Pennylane bank transactions from the categories you already use, and keep the doubtful ones for your own review.

Source: https://cotlet.dev/integrations/pennylane-api-mcp-server/categorise-bank-transactions

Bank transactions land in Pennylane every day, and each week someone scrolls the new ones and gives each a category so the numbers by department, cost center or activity stay right.

Cotlet does it in your own Pennylane account with list\_categories, list\_transactions and categorise\_transaction, called by your AI agent, an n8n workflow or a script.

[Sign up free](https://cotlet.dev/app/signup?app=pennylane) [All Pennylane tools](https://cotlet.dev/integrations/pennylane-api-mcp-server.md)

Hosted · nothing to install or maintain

## Can Pennylane do this on its own?

Pennylane's API lists transactions and sets their categories with transactions:all (checked 14 Oct 2026), but Pennylane's own MCP server is read-only and cannot categorise. Nothing in the documentation categorises a transaction from its label. The gap is the judgement per transaction; the agent reads your categories and your earlier choices and asks where it is unsure.

## How you do it in Pennylane today

1. Open the bank transactions in Pennylane and look at the ones from the past week.
2. For each transaction, read the label and the amount, then pick the category that fits.
3. Transactions that cover a purchase or a sale also need an invoice attached; Pennylane marks those with attachment\_required in its data.
4. Where one payment belongs to two activities, split it across categories with a weight, so the allocation adds up.
5. The same supplier turns up every week with a slightly different label, so the same choice is repeated by hand.

## How to categorise Pennylane bank transactions

Prompt

```
List last week's bank transactions in Pennylane that have no category. Pick the category from the ones I already use by the transaction label, categorise the clear ones, and give me the doubtful ones with your best guess.
```

1. 01  
### Learn your categories  
The agent reads list\_categories first, with the category group and direction of each one, so it only picks from categories you already created and never invents one.
2. 02  
### Read last week's transactions  
list\_transactions runs with the date range and pages through every result. A transaction that already has categories is left alone, so a category you set by hand is never overwritten.
3. 03  
### Decide with a threshold  
A label that matches a category you used before for the same supplier is categorised. A label it has never seen, or an amount that looks unusual for that supplier, goes into the doubtful list with a guess.
4. 04  
### Keep weights valid  
categorise\_transaction sends the category and a weight. Weights inside one category group must sum to 1, and the agent splits a payment across groups only when your prompt says how.
5. 05  
### Report what is still open  
The report lists the transactions that still need an invoice, so a categorised transaction is not mistaken for a finished one.

### What you get back

Example data

```
Last week: 14 transactions without a category
Categorised 11, for example "OVH SAS" as Hosting and "Qonto fee" as Bank fees
3 doubtful: "Virement M. Roux" 850.00, "AMZN Mktp" 63.90, "CB 4417 Lyon" 41.20
2 categorised transactions still need an invoice attached
```

### Other ways to ask

- Do the same for the last 30 days and only report, without categorising.
- Split every "Notion" payment 50/50 between Marketing and Product.
- Every Friday, list the transactions still waiting for an invoice, sorted by amount.

## What Pennylane allows, and what to know first

- A Pennylane category has a label, a category group and an optional analytical code, and treasury categories have a direction of cash\_in or cash\_out.
- Pennylane takes the allocation as weights from 0 to 1, up to 7 decimals; weights inside one category group sum to 1, and categories from different groups combine freely.
- A transaction with attachment\_required set to true must be matched with an invoice, and a category does not replace that.
- Pennylane returns each transaction with its amount in euros, the original currency amount, the bank account, the journal and its categories.
- The transaction list filters on id, bank account, journal and date only, and returns 1 to 100 per page.

categorise\_transaction changes only your own Pennylane data and reach no one else, so it runs without asking first.

Sources: [Pennylane API: List transactions](https://pennylane.readme.io/reference/gettransactions) · [Pennylane API: Update transaction categories](https://pennylane.readme.io/reference/puttransactioncategories) · [Pennylane API: List categories](https://pennylane.readme.io/reference/getcategories) · [Pennylane MCP: Getting started](https://pennylane-mcp.readme.io/docs/getting-started)

## Call categorise\_transaction from a script

curl

```
curl -X POST https://cotlet.dev/api/v1/pennylane/transactions/5530021/categorise \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"categories":[{"id":59,"weight":"1"}]}'
```

Example response

```
{
"transaction_id": 5530021,
"categories": [
{
"category_id": 59,
"label": "Hosting",
"weight": "1"
}
]
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is pennylane\_write → categorise\_transaction. Example data.

[Schedule it in n8n, Make, Zapier or cron](https://cotlet.dev/integrations/pennylane-api-mcp-server.md#automations)

## Pennylane tools this automation uses

__Cotlet Pennylane tools used to categorise Pennylane bank transactions__
| Tool | Parameters |
| ----------------------- | ------------------------------------------------------ |
| list\_categories | category\_group\_id, limit, cursor |
| list\_transactions | date\_from, date\_to, bank\_account\_id, limit, cursor |
| categorise\_transaction | transaction\_id, categories |

[All 14 Pennylane tools with descriptions](https://cotlet.dev/integrations/pennylane-api-mcp-server.md#tools)

## Frequently asked questions

### Is it safe to connect Pennylane to Cotlet?

Yes. You sign in to Pennylane yourself, in your own Cloud Browser in the EU, and we never save your password. Your agents only get Pennylane once you enable it, every background request is listed, and the browser profile is stored encrypted with AES-256-GCM, the cipher 1Password uses for its vaults. The AI model never sees a login, posts and messages wait for your OK, and Disable for agents cuts access in one click. Independent scanners grade cotlet.dev A+ on Qualys SSL Labs, securityheaders.com and Mozilla Observatory; live results are on https://cotlet.dev/security.

## More Pennylane automations

- [Create and send Pennylane invoices from a list](https://cotlet.dev/integrations/pennylane-api-mcp-server/create-and-send-invoices.md)
- [Follow up on unpaid Pennylane invoices](https://cotlet.dev/integrations/pennylane-api-mcp-server/follow-up-on-unpaid-invoices.md)
- [Pennylane API and MCP server: every tool](https://cotlet.dev/integrations/pennylane-api-mcp-server.md)
- [All use cases](https://cotlet.dev/use-cases.md)

## Give your agent access to Pennylane.

Free 7-day trial with 2,000 credits, no card needed. Cotlet is independent and not affiliated with Pennylane.

[Sign up free](https://cotlet.dev/app/signup?app=pennylane)

---

Give your AI agents your signed-in browser.

**Product:** [Integrations](https://cotlet.dev/integrations.md) · [Use cases](https://cotlet.dev/use-cases.md) · [How it works](https://cotlet.dev/how-it-works.md) · [Pricing](https://cotlet.dev/pricing.md) · [Security](https://cotlet.dev/security.md)

**Resources:** [Blog](https://cotlet.dev/blog.md) · [API docs](https://cotlet.dev/docs.md) · [Help center](https://cotlet.dev/help.md) · [Changelog](https://cotlet.dev/changelog.md) · [GitHub](https://github.com/cotletdev/cotlet)

**Solutions:** [For developers](https://cotlet.dev/for-developers.md) · [For automation agencies](https://cotlet.dev/for-agencies.md)

**Company:** [About](https://cotlet.dev/about.md) · [AI info: company facts](https://cotlet.dev/ai-info.md) · [Contact](https://cotlet.dev/contact.md)

**Legal:** [Terms of service](https://cotlet.dev/terms) · [Privacy policy](https://cotlet.dev/privacy) · [Refund policy](https://cotlet.dev/refunds) · [Acceptable use](https://cotlet.dev/acceptable-use) · [Cookie policy](https://cotlet.dev/cookies) · [DPA](https://cotlet.dev/dpa) · [Subprocessors](https://cotlet.dev/subprocessors)

**Elsewhere:** [Status page](https://status.cotlet.dev) · [Cotlet on GitHub](https://github.com/cotletdev) · [Cotlet on X](https://x.com/cotletdev) · [Cotlet on LinkedIn](https://www.linkedin.com/company/cotletdev) · [Cotlet on Product Hunt](https://www.producthunt.com/products/cotlet) · [Cotlet on Crunchbase](https://www.crunchbase.com/organization/cotlet) · [Cotlet on SaaSHub](https://www.saashub.com/cotlet)

Cotlet is an independent service. It is not affiliated with, endorsed by or sponsored by any of the products listed on this site. Product names are trademarks of their respective owners.

## For AI agents: sign your user up

Is your user asking you to sign them up for Cotlet? You can do it for them, no account or key needed.

1. Read the fields and their allowed values: GET https://cotlet.dev/api/v1/access-requests
2. Ask the user for each value: email, apps, what you will do with them. If they leave the password to you, generate a strong one and show it to them.
3. Show the user what you will send, then POST it as JSON to https://cotlet.dev/api/v1/access-requests.

One call creates the account and sends the access request; we email the user when access is granted.
