Skip to content
Back to skills

003 Name Skill 9f6e9d65

ASecurity

Process invoice emails: download PDF attachments, extract vendor + date, generate normalized filename, and send to Holded inbox via n8n webhook.

  • 9 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 31, 2026
content-marketinggo

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned May 31, 2026

npx -y skills add tools-only/X-Skills --skill 003-name-skill_9f6e9d65 --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of 003 Name Skill 9f6e9d65?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for 003 Name Skill 9f6e9d65
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tools-only-003-name-skill-9f6e9d65/badge)](https://www.skillsdirectory.com/skills/tools-only-003-name-skill-9f6e9d65)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: holded-invoices
description: "Process invoice emails: download PDF attachments, extract vendor + date, generate normalized filename, and send to Holded inbox via n8n webhook."
---

# Holded invoices (Gmail → PDF → n8n webhook → Holded inbox)

Goal: when an email contains an invoice PDF, upload it to Holded via an n8n webhook.

## Destinations

Configure defaults in `~/.config/skills/config.json` under `holded_invoices`:
- `company_email`
- `freelancer_email`
- `webhook`

Example:
```json
{
  "holded_invoices": {
    "company_email": "empresa@holdedbox.com",
    "freelancer_email": "autonomo@holdedbox.com",
    "webhook": "https://n8n.example.com/webhook/..."
  }
}
```

Webhook fields:
- `email` (Holded inbox) (HTTP header)
- `nombre` (base filename, without extension) (HTTP header)
- Body: raw PDF (`Content-Type: application/pdf`)

Filename convention:
- `<company>-<YYYY>-<MM>.pdf`
- Vendor slug: lowercased, spaces → dashes, simplified (e.g. "Google INC" → `google`).

## Scripts

### 1) Extract vendor + date from a PDF

- `scripts/invoice-extract.js --pdf /path/to/invoice.pdf`
  - Outputs JSON: `{ vendor, vendorSlug, year, month }`

### 2) Upload a PDF to Holded via n8n

- `scripts/holded-upload.sh --pdf /path/to/invoice.pdf --email <holdedbox> --nombre google-2026-01.pdf`
  - If not configured, pass `--webhook` explicitly.

### 3) End-to-end: from a Gmail message ID

Downloads the first PDF attachment, suggests a filename, and (optionally) uploads.

- `scripts/holded-from-gmail.sh --account <gmail-account> --message-id <id> --type empresa|autonomo`
  - If not configured, pass `--email-empresa`, `--email-autonomo`, and/or `--webhook`.

Flags:
- `--yes` skip confirmation and upload

## Agent workflow

When reviewing an email thread with a PDF invoice:
1) Ask: is it `empresa` or `autonomo`.
2) Download the PDF attachment.
3) Run `invoice-extract.js` to infer vendor + year/month.
4) Propose filename and ask for confirmation.
5) Call webhook via `holded-upload.sh`.

If extraction fails, ask for vendor + date and continue.

Files in this skill

  • README.md866 B
  • skill.md2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.