FrancodesystemsFran<code>systems
May 21, 2026 · 9 min read · By Juan Cantón Rodríguez

n8n + Holded: 5 real workflows that automate invoicing for small businesses

5 real n8n workflows built with our open source node n8n-nodes-holded: Shopify→Holded invoice, Stripe→contact+invoice, Calendly→CRM, HubSpot deal won→proforma, Asana delivery→billing. Diagrams and production considerations included.

Executive summary
Node usedn8n-nodes-holded · 42 resources · 323 operations · MIT
Platforms connectedShopify · Stripe · Calendly · HubSpot · Asana · Holded
When to use n8nWorkflows <10 nodes · no backend dev · fast prototyping
When NOT to use n8nHigh volume · complex tax logic · serious testing

Why n8n + Holded is a good fit for small businesses

n8n is the most widely adopted open source workflow engine for connecting SaaS tools without writing full code. Holded is the most widespread Spanish ERP among small businesses. The obvious intersection: when a small business has 4-5 SaaS tools connected and needs them to talk to each other, n8n gives you the glue without hiring a backend dev.

What was missing was an n8n node that truly covered Holded's API v2, not the 10 most common operations but all 323. That is why we published n8n-nodes-holded on npm under the MIT license with full coverage and a provenance attestation.

These are 5 workflows we see repeat across clients, all solved with n8n + the node, without custom backend code. If your case fits, you can have it in production in an afternoon.

Workflow #1 — Shopify order → Holded invoice

The classic one. Every confirmed order in Shopify generates the corresponding invoice in Holded with its customer, series and correct VAT.

Shopify Trigger
└─ event: order/created
If (customer email exists)
├─ Holded · Contact / Get by email
└─ Holded · Contact / Create (if not found)
Holded · Invoice / Create
├─ contactId from previous step
├─ items: mapped from order.line_items
└─ series: B2C / B2B intra-community (logic)

Production considerations: enable "Continue on fail" mode on the Holded node so that one error does not block the next order. Idempotency: use the Shopify order_id as the external reference in Holded so retries do not duplicate. For Verifactu, see the blog.

Workflow #2 — Stripe charge.succeeded → Holded contact + invoice

For services charged through Stripe (subscriptions, one-off payments). The charge.succeeded webhook comes into n8n and generates a formal invoice in Holded.

Stripe Trigger
└─ event: charge.succeeded
Stripe · Customer / Get
└─ retrieve metadata (tax ID, billing_address)
Holded · Contact / Upsert by email
Holded · Invoice / Create
├─ amount: charge.amount / 100
└─ description: charge.description

Considerations: if you use Stripe Tax as your main tax system, do NOT create an invoice in Holded, you would duplicate it. The decision is "who issues the formal invoice": Stripe (with Stripe Tax enabled) or Holded (recommended for Spain thanks to native Verifactu).

Workflow #3 — Calendly confirmed booking → Holded CRM contact

For professional services (consulting, coaching, design). Every confirmed Calendly booking creates/updates the contact in Holded's CRM with the prospect's information.

Calendly Trigger
└─ event: invitee.created
Holded · Contact / Upsert by email
├─ name, email from Calendly
├─ tag: "lead-calendly"
└─ customFields: scheduled_for, event_type
Holded · Opportunity / Create
└─ stage: "Diagnosis scheduled"
└─ value: estimated from event_type

Considerations: Calendly gives you few required fields (name + email). If you want to enrich (job title, company, tax ID) add a scraping/enrichment step with Clearbit or similar before the upsert.

Workflow #4 — HubSpot deal.stage = closed-won → Holded proforma

For sales teams that close deals in HubSpot. When a deal moves to "closed won", the proforma is automatically created in Holded to send to the customer.

HubSpot Trigger
└─ event: deal.stage changed
IF (newStage == "closed-won")
└─ HubSpot · Contact / Get (deal.contact_id)
Holded · Contact / Upsert
Holded · Proforma / Create
├─ contactId from previous
├─ items: from deal.line_items
└─ validUntil: now + 30 days

Considerations: HubSpot deals have line items but may not carry VAT applied. Make sure the mapping to Holded assigns a default VAT based on the customer's country. For intra-community B2B with a valid VIES tax ID → 0% VAT with an exemption code.

Workflow #5 — Asana task delivered → Holded hourly invoice

For agencies/consultancies that bill per project/hour. When an Asana task is marked as completed with the "billable" tag, an invoice is generated in Holded based on the logged hours.

Asana Trigger
└─ event: task.completed with tag "billable"
Asana · Task / Get details
└─ custom_fields.hours_logged
└─ project.client_id (custom field)
Holded · Contact / Get by reference
Holded · Invoice / Create
├─ hours × rate from contact metadata
└─ description: task.name

Considerations: group invoices by customer. Instead of generating one invoice per task (which can be dozens a month), set up a monthly cron that gathers all the "billable" tasks for the period and generates ONE consolidated invoice with each task as a line. Cleaner for the customer and for your month-end close.

Self-hosted n8n vs n8n Cloud vs custom backend service

If your case fits the 5 workflows above or simple variants, decide:

  • n8n Cloud: if you are just starting, the node is a community one so Cloud lets you install it without any prior configuration. Operational within hours. To consider: tax data passes through n8n Cloud servers, which may require a GDPR assessment for sensitive data depending on your sector.
  • Self-hosted n8n on a VPS: full control, tax data on your own infrastructure, without the plan's imposed limits on executions/users. Requires initial setup and maintenance (Docker Compose, updates, backups).
  • Custom backend service (fixed one-off project): when workflows become high volume, complex tax logic, Verifactu with multi-currency edge cases, serious testing requirements. This is where our custom integration services come in.

Frequently asked questions

Do I need self-hosted n8n or n8n Cloud to use the n8n-nodes-holded node?

It works on both. n8n Cloud makes it easy (Settings → Community Nodes → install @francodesystems-npm/n8n-nodes-holded). Self-hosted requires enabling N8N_COMMUNITY_PACKAGES_ENABLED=true. For small businesses starting out, Cloud is the simplest option. For high volumes (>10,000 executions/month) or data privacy requirements for tax data (recommended for Spain's Verifactu), go self-hosted on a dedicated VPS.

When should I use n8n and when should I write custom code?

n8n is a perfect fit for: workflows with fewer than 10 nodes, logic that fits into simple if/else branches, teams without a backend dev, fast prototyping to validate a use case. Custom code fits when: high volume with critical latency, complex tax logic (Verifactu with multi-currency edge cases), integrations with services that have no available node, serious testing requirements. The honest rule of thumb: if your n8n workflow starts having more than 20 nodes or you need complicated JS functions at every step, it is time to move it to code.

Are n8n workflows Verifactu compliant?

Yes, if they are well designed. What the n8n-nodes-holded node does is call Holded's API v2, which has native Verifactu (Holded is an AEAT Social Collaborator). The workflow has to respect: deduplication by external key (order_id, charge_id, etc.) so it does not create duplicate invoices on retries, strict creation order for invoices (concurrency 1 on the billing worker), validation of required fields before invoking the node. If that is missing, the problem is NOT Verifactu, it is the workflow.

Is the n8n-nodes-holded node official from Holded?

No, it is an open source community node maintained by Francodesystems under the MIT license. 'Holded' and its logo are trademarks of Holded Technologies S.L. used under nominative fair use. The node is not affiliated with or sponsored by Holded. Even so, it covers 100% of the official API v2 (42 resources · 323 operations), it is published on npm with a provenance attestation signed by GitHub Actions OIDC, and it is regenerated whenever Holded extends v2.

Can I combine n8n + a custom service for hybrid cases?

Yes, it is the most realistic pattern for small businesses that grow. n8n for the 80% of simple workflows (reminders, one-off syncs, notifications) and a dedicated backend service for the critical 20% (invoicing with Verifactu, bank reconciliation, high-volume integrations). The backend service exposes webhooks that n8n can call, and n8n notifies the service when events appear that require tax/complex logic.

Author

Juan Cantón Rodríguez

Founder & lead developer at Francodesystems. Maintains n8n-nodes-holded with 100% coverage of Holded's API v2. The workflows in this post are running in real small businesses.

Does your workflow fit one of these 5?

30 minutes. We tell you whether n8n is enough or your case needs a backend service.