[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)

# Create and send Pennylane invoices from a list

> Turn a billing list into Pennylane draft invoices, then finalize and email them after your OK. Runs from Claude Code, n8n or a script.

Source: https://cotlet.dev/integrations/pennylane-api-mcp-server/create-and-send-invoices

At month end you hold a list of customers, hours and rates, and every line becomes a customer record, an invoice with lines and VAT, and an email, typed into Pennylane one customer at a time.

Cotlet does it in your own Pennylane account with list\_customers, create\_customer, create\_customer\_invoice, finalize\_customer\_invoice and send\_customer\_invoice, 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 Company API v2 creates customers, draft and final invoices and sends them by email, with a token from an Essentiel plan or higher (checked 14 Oct 2026). Pennylane's own MCP server cannot do any of it because it is read-only, and the Zapier app creates customers and invoices but lists no action that sends one. The gap is an agent that works the whole list in your own account, without a token and without code.

## How you do it in Pennylane today

1. Add the customer to the customer catalogue in Pennylane, or import the catalogue, so the invoice has someone to bill.
2. Create the invoice and fill in the lines from your product catalogue or by hand, with quantity, unit price and VAT rate; Pennylane applies your default accounting mapping unless you pick a ledger account.
3. Check the totals and the due date, then finalize the invoice. Pennylane's API documents that a finalized invoice can no longer be edited.
4. Send the invoice by email from Pennylane, and follow the email sending status that Pennylane tracks per invoice.
5. Repeat for every customer on the list. Pennylane's setup guide asks for company details, bank details, a logo and sequential invoice numbering before the first invoice, and a missed field shows up only after the email is out.

## How to create and send Pennylane invoices from a list

Prompt

```
Here is this month's billing list with customer, hours and rate. For each line, create the customer in Pennylane if it does not exist, create a draft invoice due in 30 days and show me the drafts. When I say go, finalize and email them.
```

1. 01  
### Match customers first  
Your agent looks every name on the list up with list\_customers and only calls create\_customer for names with no match, so a customer billed last month is never duplicated.
2. 02  
### Build the lines from your list  
create\_customer\_invoice gets one line per row with quantity, unit price and VAT rate. If the total Pennylane returns differs from hours times rate on your list, the agent stops and names the customer.
3. 03  
### Keep every invoice a draft  
The agent creates each invoice with draft set to true and an external\_reference such as the month and customer, then shows you the list. Re-running the job finds the reference and skips an invoice that already exists.
4. 04  
### Wait for your go  
finalize\_customer\_invoice issues the invoice number and locks the invoice, so the agent asks before it runs and lists the customers and totals it is about to finalize.
5. 05  
### Email and report failures  
send\_customer\_invoice goes to the customer's email on file unless you gave recipients. If Pennylane says the PDF is not ready yet, the agent retries later instead of reporting a failure; a customer with no email is listed for you to fix.

### What you get back

Example data

```
Created 3 drafts for October
Atelier Lumen SARL, 12 h at 95.00, total 1,368.00 incl. VAT
Studio Marais SAS, 8 h at 120.00, total 1,152.00 incl. VAT
Bureau Nord (new customer), 4 h at 80.00, total 384.00 incl. VAT
Waiting for your go to finalize and email all three
```

### Other ways to ask

- Create the invoices as drafts only and leave finalizing to my accountant.
- Bill the same three customers on the last day of every month, using last month's lines as the template.
- Convert the open quote for Atelier Lumen into an invoice and email it.
- Create the invoices in the invoice template I use for retainers.

## What Pennylane allows, and what to know first

- Pennylane's API takes amounts as strings, and it answers 422 when the invoice totals do not add up or the VAT code is invalid.
- Without a ledger account on a line, Pennylane applies the company's default mapping for the chart of accounts and VAT.
- Pennylane emails an invoice from facturation@pennylane.com and routes replies to the address set under Paramètres > "Facturation clients".
- Pennylane sends the default invoice template in French or English depending on the customer's billing language, and the API does not accept CC or BCC.
- The invoice PDF is generated first, which can take a few minutes, and sending before then returns 409 in the API.

create\_customer, create\_customer\_invoice, finalize\_customer\_invoice and send\_customer\_invoice ask for your OK by default. To run it on a schedule without you, switch confirmation off for those tools in your dashboard.

Sources: [Pennylane API: Create a customer invoice](https://pennylane.readme.io/docs/create-a-customer-invoice-use-case) · [Pennylane API: Send documents by email](https://pennylane.readme.io/docs/sending-documents-by-email) · [Pennylane API: Finalize a customer invoice](https://pennylane.readme.io/reference/finalizecustomerinvoice) · [Pennylane: Invoicing software](https://www.pennylane.com/fr/logiciel-facturation) · [Pennylane on Zapier: triggers and actions](https://zapier.com/apps/pennylane/integrations)

## Call create\_customer\_invoice from a script

curl

```
curl -X POST https://cotlet.dev/api/v1/pennylane/customers/4021/invoice \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"date":"2026-10-31","deadline":"2026-11-30","draft":true,"external_reference":"2026-10-atelier-lumen","lines":[{"label":"Consulting, October","quantity":12,"unit":"hour","unit_price":"95.00","vat_rate":20}]}'
```

Example response

```
{
"invoice_id": 118390,
"customer": {
"customer_id": 4021,
"name": "Atelier Lumen SARL"
},
"status": "draft",
"draft": true,
"date": "2026-10-31",
"deadline": "2026-11-30",
"external_reference": "2026-10-atelier-lumen",
"amount_before_tax": "1140.00",
"tax": "228.00",
"amount": "1368.00",
"currency": "EUR"
}
```

MCP: add https://cotlet.dev/mcp/v1 with the same key; the call is pennylane\_write → create\_customer\_invoice. 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 create and send Pennylane invoices from a list__
| Tool | Parameters |
| --------------------------- | --------------------------------------------------------------- |
| list\_customers | name, limit, cursor |
| create\_customer | name, type, email |
| create\_customer\_invoice | customer\_id, date, deadline, lines, draft, external\_reference |
| finalize\_customer\_invoice | invoice\_id |
| send\_customer\_invoice | invoice\_id, recipients |

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

## Frequently asked questions

### Can I edit an invoice the agent finalized by mistake?

No. Pennylane documents that a finalized invoice can no longer be edited, which is why the agent keeps invoices as drafts until you say go.

### 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

- [Follow up on unpaid Pennylane invoices](https://cotlet.dev/integrations/pennylane-api-mcp-server/follow-up-on-unpaid-invoices.md)
- [Categorise Pennylane bank transactions](https://cotlet.dev/integrations/pennylane-api-mcp-server/categorise-bank-transactions.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.
