🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@getpopapi/n8n-nodes-pop

Package Overview
Dependencies
Maintainers
2
Versions
9
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@getpopapi/n8n-nodes-pop

n8n community node for POP Cloud API (v2) — Italian SdI and Peppol e-invoicing

latest
Source
npmnpm
Version
0.2.1
Version published
Weekly downloads
186
48.8%
Maintainers
2
Weekly downloads
 
Created
Source

n8n-nodes-pop

POP Cloud API License n8n community

Community node for n8n that integrates with POP for automated electronic invoicing.

POP is an e-invoicing platform that automates the generation, delivery, and management of legally compliant electronic invoices. It supports both the Italian SdI (Sistema di Interscambio / FatturaPA) and the European Peppol network.

This node lets you create, send, and track electronic invoices directly from n8n workflows. Authenticate once with a POP credential (sent as the X-API-Key header) or supply the license key per operation — both are supported.

Table of Contents

Installation

Follow the n8n community nodes installation guide.

  • In n8n, go to Settings > Community Nodes
  • Select Install
  • Enter @getpopapi/n8n-nodes-pop
  • Click Install

Authentication

Get Your License Key

🔑 New to POP? Visit popapi.io to create your account and get your license key.

API-only users can activate their account and obtain a license_key with this flow:

  • Open https://popapi.io/otp-login/
  • Enter your email address
  • Receive a one-time password (OTP) by email and enter it
  • Complete the configuration wizard
  • Open https://popapi.io/Account > API
  • Copy the default generated license_key

Key management:

  • Your account includes one default license_key, visible under Account > API
  • You can generate additional keys linked to the same account from that same page
  • Every license_key must be treated as a secret credential — do not commit it to source control

Recommended first steps:

  • Get your license_key
  • Test it with GET /account-profile
  • Send one document-generation request with a real payload
  • Add optional delivery integrations only after local generation works

How the credential is sent

POP (v2) accepts the license key in two forms:

MethodHowStatus
X-API-Key HTTP headerX-API-Key: <your_license_key>Preferred
license_key body param{ "license_key": "<your_license_key>", ... }Legacy fallback

When both are present, the header wins. The body fallback exists so older POP deployments continue to work without changes.

How to provide the key in n8n

This node supports two ways of supplying the key, which can be combined:

  • POP credential (recommended) — In n8n, go to Credentials → New → POP API, paste the license key, and select that credential on the POP node. The node will send X-API-Key: <your_license_key> on every request automatically.
  • Per-operation License Key field — In Form Fields input mode, every invoice operation exposes a License Key field. When non-empty it overrides the credential and is sent both as the X-API-Key header and as license_key in the request body. Useful when one workflow needs to drive multiple licenses.

For Use Incoming JSON, JSON, and Raw input modes the credential is the simplest option — the header is injected automatically. You can still embed license_key in the body if you prefer; the API accepts both.

What the node sends

ModeX-API-Key headerlicense_key in body
Form (key field set)The form field value (overrides credential)The form field value
Form (key field empty)Credential value (if any)Empty ("") — relies on header auth
Use Incoming JSONCredential value (if any)Whatever the upstream item provides
JSONCredential value (if any)Whatever you put in the JSON body
RawCredential value (if any)n/a (raw payload)

The Verify SdI Document (XML) operation auto-detects the license key from the upstream Create SdI Invoice node — that detected key is sent both as the header and in the body, taking precedence over the credential.

Self-hosted POP deployments

If you operate your own POP deployment, make sure it includes the auth-header support — see LicenseHelper::buildLicenseInfo and Utils::apiPermissionCallback in pop-cloud-api, which prefer X-API-Key and fall back to license_key. Older deployments without that change still work because this node also sends license_key in the body whenever it has a key to send.

Configuration

Environment

Each invoice operation includes an Environment selector. The published node exposes only Production (https://popapi.io/wp-json/api/v2/).

Note for developers: The Staging option (https://staging7.popapi.io/wp-json/api/v2/) is commented out in the source and can be re-enabled locally for testing against a staging deployment.

Operations

Resource: Invoice

Create SdI Invoice (XML)

Generates an Italian e-invoice in FatturaPA format and optionally submits it to the Sistema di Interscambio.

  • Endpoint: POST /create-xml
  • Invio Fattura: Toggle to Yes to include the SdI integration object and trigger submission via POP
  • Input modes: Passthrough, Form Fields, JSON, Raw

Create Peppol Invoice (UBL)

Generates a Peppol invoice in UBL format and optionally submits it to the Peppol network.

  • Endpoint: POST /create-ubl
  • Invio Fattura: Toggle to Yes to include the Peppol integration object
  • Input modes: Passthrough, Form Fields, JSON, Raw
  • Customer type is limited to Company or Freelance (Peppol does not support Private individuals)

Create KSeF Invoice (FA(3) XML)

Generates a Polish KSeF FA(3) invoice or credit note.

  • Endpoint: POST /create-ksef-xml
  • Input modes: Passthrough, Form Fields, JSON, Raw
  • Submit via KSeF Provider: optionally adds the KSeF provider integration object
  • Provider submission requires completed KSeF onboarding and legal-entity setup.

Create ZUGFeRD Invoice

Generates a ZUGFeRD/Factur-X package containing visual PDF, CII XML, and hybrid PDF output.

  • Endpoint: POST /create-zugferd
  • Input modes: Passthrough, Form Fields, JSON, Raw

Get Invoice Status

Retrieves document notifications for a previously submitted SdI invoice.

  • Endpoint: POST /sdi/document-notifications
  • Form payload: { license_key, integration: { uuid } }
  • Input modes: Passthrough, Form Fields, JSON, Raw

Get Peppol Document

Retrieves a Peppol document by integration UUID.

  • Endpoint: POST /peppol/document-get
  • Form payload: { license_key, integration: { uuid, zone? } }
  • The zone field (e.g. "BE") is required for Belgian VAT numbers; it is normalised to uppercase automatically
  • Input modes: Passthrough, Form Fields, JSON, Raw

Verify SdI Document (XML)

Validates an SdI XML document via the POP document-verify endpoint. Designed to be used immediately after Create SdI Invoice (XML) in a workflow — it reads the XML from the incoming item, base64-encodes it, and auto-detects the license key from the upstream node.

  • Endpoint: POST /sdi/document-verify
  • Input: Always passthrough — connects directly to the output of the Create SdI Invoice (XML) node
  • License key: Auto-detected from the upstream POP node (supports both Form Fields and JSON input modes of the upstream node). No manual entry required.
  • Payload sent: { license_key, skip_business_check: true, integration: { xml: "<base64-encoded XML>" } }

Sync Document to Zoho

Syncs an invoice or credit note to Zoho Books/Invoice via POP's native Zoho connector. All Zoho-side mapping (tax, customer, payment terms, document status) happens server-side in the POP API — this node only gates the request and forwards the payload.

  • Prerequisite: The Zoho integration must be activated for your account from the POP account panel before this action can succeed — see Setting Up the Zoho Connector below.
  • Status check: With Check Connector Status First set to Yes (the default), the node first calls GET /integration/zoho/status and confirms data.active_connector === "zoho" and data.zoho_connected === true. If the connector isn't active, the operation fails immediately with a clear error instead of attempting the sync.
  • Sync endpoint: POST /integration/zoho/sync
  • Document Type: Reuses the Invoice Details → Document Type field — TD01 (Invoice) or TD04 (Credit Note).
  • Credit notes (TD04): The POP API requires a connected invoice reference. Set Additional Options → Connected Invoice Data (JSON) to an array whose first entry has a numeric id, e.g. [{"id": 123}]. The node validates this locally before sending the request and fails fast if it's missing.
  • Input modes: Passthrough, Form Fields, JSON (no Raw — the endpoint only accepts JSON)
  • Output shape:
    {
      "connector_active": true,
      "status_checked": true,
      "sync_attempted": true,
      "response": { "...": "raw POP API response" }
    }
    

Setting Up the Zoho Connector (Prerequisite)

Before you can use Sync Document to Zoho, you need to connect your Zoho account to POP. This is a one-time setup done in the POP dashboard, not in n8n. Full documentation: docs.popapi.io/en/api/zoho.

  • Go to popapi.io/my-account/api-integrations/zoho-connector/connect and log in to your POP account.

  • Choose the Zoho product you actually use:

    • Zoho Invoice — if your account uses Zoho Invoice.
    • Zoho Books — if your account uses Zoho Books.

    Once connected, POP will create invoices or credit notes directly in that Zoho account.

  • Create a Zoho OAuth app:

    • Open the Zoho API Console and create a Server-based Application.
    • Set the Redirect URI to exactly:
      https://popapi.io/it/wp-json/api/v2/integration/oauth/callback?connector=zoho
      
    • Zoho validates the Redirect URI character-for-character — if you set up the app before this screen showed you the final URL, update the Redirect URI in Zoho and paste the exact value shown on the POP connector page, including ?connector=zoho.
  • Copy the credentials into POP:

    • After creating the Zoho app, copy its Client ID and Client Secret into the corresponding fields on the POP connector page.
    • In Zoho Invoice or Zoho Books, go to Settings → Organization Profile and copy the Organization ID into the POP connector page.
  • Save and authorize the connection. Once active_connector is zoho and the connection shows as connected, the Sync Document to Zoho operation in this node will succeed (you can verify this with Check Connector Status First = Yes, the default).

Resource: VAT Validation

Validate VAT

Validates a VAT number against the official EU VIES (VAT Information Exchange System) SOAP service.

  • Service: https://ec.europa.eu/taxation_customs/vies/services/checkVatService
  • Supported countries: All 27 EU member states + Northern Ireland (XI)
  • Retry logic: Up to 5 attempts with exponential backoff (1s, 2s, 4s, 8s…) when the VIES service is temporarily unavailable
  • Returns: valid (boolean), name, address, requestDate, attempts (number of retries), latencyMs
FieldDescription
Country CodeEU country code from dropdown (e.g. IT, DE, EL, XI)
VAT NumberVAT number without the country prefix (e.g. 01234567890)

Input Modes

Most invoice operations support the same four input modes:

ModeDescription
Use Incoming JSONForwards the input item's JSON data directly to the API. Default mode, ideal for automated pipelines.
Form FieldsStructured form with all relevant fields. Best for manual entry or mapping from other nodes.
JSONPaste or build the full request JSON payload manually.
Raw (XML/Other)Send a raw string body (e.g. XML). Sets Content-Type: application/xml unless overridden via headers.

Sync Document to Zoho only supports Use Incoming JSON, Form Fields, and JSON — the integration/zoho/sync endpoint accepts JSON only, so Raw is not offered for this operation.

Form Fields Reference

The Form Fields input mode for Create SdI Invoice (XML) and Create Peppol Invoice (UBL) exposes the following sections. Fields marked with an asterisk (*) are required.

A. Top-level Fields

FieldSDIPeppolDescription
License KeyPOP license key. Optional when a POP credential is configured. When set, sent both as X-API-Key header and license_key body param.
Invoice / Order ID *Numeric ID of the invoice or order
Filename *FatturaPA / Peppol filename (e.g. IT99900088876_00009)
Customer Type *Private / Company / Freelance (Peppol: no Private)
SDI Type (Codice Destinatario) *SdI destination code (7 chars). Defaults to 0000000 for private customers without a code; forced to XXXXXXX for foreign clients
Invoice Number *Full invoice number (e.g. WEB9/2025)
Invoice Date *Invoice date in YYYY-MM-DD format
Total Document Amount *Total amount including taxes

B. Transmitter Data

FieldSDIPeppolDescription
CountryISO country code of the transmitter
EmailTransmitter contact email
ID CodeTransmitter identification code
PhoneTransmitter contact phone
ProgressiveProgressive identifier for the transmission
Recipient PECPEC (certified email) of the recipient
SDI CodeCodice destinatario SdI (7 chars)
Transmitter FormatFPR12 (Private) or FPA12 (Public Admin)

C. Sender (Lender)

FieldSDIPeppolDescription
AddressStreet address
CityCity name
Company NameCompany or business name
CountryISO country code of the sender address
EmailContact email
PhoneContact phone
ProvinceProvince abbreviation (e.g. CT, MI)
Tax RegimeItalian tax regime code (e.g. RF01 — Ordinary)
VAT CountryISO country code for VAT identification
VAT ID CodeFull VAT identification code
ZIP CodePostal / ZIP code

D. Recipient (Client)

FieldSDIPeppolDescription
AddressStreet address
CityCity name
Company NameCompany name (leave empty for individuals)
CountryISO country code of the recipient address
EmailEmail address
First NameFirst name (individuals)
Last NameLast name (individuals)
ProvinceProvince abbreviation
Tax ID Code (Codice Fiscale)Italian fiscal code of the recipient
VAT CountryISO country code for VAT identification
VAT ID CodeVAT identification code
ZIP CodePostal / ZIP code

E. Invoice Details

FieldDescription
Document TypeTD01 (Invoice) or TD04 (Credit Note)
CurrencyISO 4217 currency code (default: EUR)
Invoice PrefixPrefix portion of the invoice number (e.g. WEB)
Invoice SuffixSuffix portion of the invoice number (e.g. 2025)

F. Order Items

Each line item supports multiple values. Fields apply to both SDI and Peppol unless noted.

FieldDescription
Description *Item description text
DiscountNo (default) or Yes. When Yes, sets discount_type = SC in the payload
Discount PercentRequired when Discount is Yes. Percentage to apply (e.g. 10.00)
Gift ProductNo or Yes — whether the item is a gift / free product
Item Code TypeType of item code (e.g. INTERNO, EAN)
Item Code ValueValue of the item code
Item TypeProduct, Shipping, or Fee
QuantityQuantity (e.g. 1.00)
Total TaxTax amount for this line item
UnitUnit of measure (e.g. N., KG, LT)
Unit PricePrice per unit (e.g. 4.09)
VAT RateVAT rate percentage (e.g. 22.00, 10.00, 0.00)

Discount behaviour: When Discount is set to Yes, Discount Percent is required. The discount_amount and total_price are automatically calculated by the node — they are not editable inputs:

  • total_price = unit_price × quantity
  • discount_amount = total_price × discount_percent / 100
  • total_price (sent to API) = total_price − discount_amount

G. Payment Data

Payment Method — select from the dropdown (code is sent in the payload):

LabelPayload value
Bank TransferMP05
CashMP01
CheckMP02
Credit CardMP08
Direct DebitMP16
PagoPAMP23
RIBAMP12
SEPA Core Direct DebitMP21
SEPA Direct DebitMP19
Special Account RIBAMP15
Withholding on PaymentsMP22

Payment Data (fixedCollection):

FieldDescription
Payment AmountAmount to be paid (typically equals the total document amount)
Payment TermsTP01 (Instalment), TP02 (Full — default), TP03 (Advance)

Bank Details — shown only when Payment Method is Bank Transfer:

FieldDescription
Beneficiary *Name of the payment beneficiary
Financial Institution *Name of the bank or institution
IBAN *IBAN for bank transfer payments

H. Additional Options

Optional advanced fields available in both SDI and Peppol form modes:

FieldDescription
Connected Invoice Data (JSON)Connected invoice references as a JSON array
Document Type (String)Document type string (e.g. invoice, credit_note)
Purchase Order DateDate of the related purchase order (YYYY-MM-DD)
Purchase Order IDReference to the related purchase order
Tax Exemption ReasonNormative reference text for VAT exempt operations
VAT Exemption CodeNature code for VAT exempt operations (e.g. N1, N2, N3, N4)
VIESWhether the transaction is intra-EU and VIES validated (true/false)

Example Workflow

E-invoice creation and verification

[Webhook] → [POP: Create SdI Invoice] → [POP: Verify SdI Document] → [POP: Get Invoice Status] → [Slack]
  • A Webhook node receives order data from your e-commerce platform
  • The POP node creates an SdI invoice using Use Incoming JSON mode — the webhook payload is forwarded as-is
  • A second POP node (Verify SdI Document) validates the generated XML — no configuration needed, it reads everything from the previous node
  • A third POP node checks the invoice status using the UUID from the create response
  • A Slack node notifies the team of the result

VAT number validation

[Manual Trigger] → [POP: Validate VAT] → [IF: valid?] → [Send Invoice / Flag for review]
  • Trigger with a customer's country code and VAT number
  • The POP node (VAT Validation resource) calls the EU VIES service and returns validity, company name, and address
  • Branch on the valid field to decide whether to proceed with invoicing

Example Payloads

SdI Invoice (XML) — POST /create-xml

{
  "license_key": "your_license_key",
  "data": {
    "id": 2575,
    "filename": "IT99900088876_00009",
    "type": "invoice",
    "version": "FPR12",
    "sdi_type": "",
    "customer_type": "private",
    "nature": "",
    "ref_normative": null,
    "vies": false,
    "transmitter_data": {
      "transmitter_id": { "country_id": "IT", "id_code": "IT99900088876" },
      "progressive": "5b27a73cab",
      "transmitter_format": "FPR12",
      "sdi_code": "0000000",
      "transmitter_contact": { "phone": "", "email": "" },
      "recipient_pec": ""
    },
    "transfer_lender": {
      "personal_data": {
        "tax_id_vat": { "country_id": "IT", "id_code": "IT99900088876", "tax_regime": "RF01" },
        "company_name": "TEST123"
      },
      "place": { "address": "Via Roma, 123", "zip_code": "95100", "city": "Catania", "province_id": "CT", "country_id": "IT" },
      "contact": { "phone": "", "email": "" }
    },
    "transferee_client": {
      "personal_data": {
        "tax_id_vat": { "country_id": "IT", "id_code": "" },
        "tax_id_code": "PCCLFA75L04A494S",
        "company_name": "",
        "first_name": "Alfio",
        "last_name": "Piccione"
      },
      "place": { "address": "Via Roma 123", "zip_code": "95100", "city": "Catania", "province_id": "CT", "country_id": "IT" }
    },
    "invoice_body": {
      "general_data": {
        "doc_type": "TD01",
        "currency": "EUR",
        "date": "2025-01-31",
        "invoice_number": "WEB9/2025",
        "invoice_prefix": "WEB",
        "invoice_suffix": "2025"
      },
      "total_document_amount": "16.38"
    },
    "purchase_order_data": { "id": "#2575", "date": "2025-01-31" },
    "connected_invoice_data": [],
    "order_items": [
      {
        "item_code": { "type": "INTERNO", "value": "2563" },
        "item_type": "product",
        "gift_product": "no",
        "description": "Product A",
        "quantity": "1.00",
        "unit": "N.",
        "discount_type": "",
        "discount_percent": "",
        "discount_amount": "",
        "unit_price": "4.09",
        "total_price": "4.09",
        "rate": "0.00",
        "total_tax": 0
      }
    ],
    "payment_data": {
      "terms_payment": "TP02",
      "payment_amount": "16.38",
      "payment_details": "MP02",
      "beneficiary": "",
      "financial_institution": "",
      "iban": ""
    }
  },
  "integration": {
    "use": "sdi-via-pop",
    "action": "create"
  }
}

Peppol Invoice (UBL) — POST /create-ubl

{
  "license_key": "your_license_key",
  "data": {
    "id": 2855,
    "xml_style": "",
    "view": false,
    "save": false,
    "save_bulk": false,
    "filename": "BE0123456789_0000T",
    "type": "invoice",
    "version": "FPR12",
    "sdi_type": "",
    "customer_type": "company",
    "nature": "",
    "ref_normative": null,
    "vies": false,
    "transmitter_data": {
      "transmitter_id": { "country_id": "BE", "id_code": "BE0123456789" },
      "progressive": "cea0d365b4",
      "transmitter_format": "FPR12",
      "sdi_code": "0000000",
      "transmitter_contact": { "phone": "", "email": "info@company.com" },
      "recipient_pec": ""
    },
    "transfer_lender": {
      "personal_data": {
        "tax_id_vat": { "country_id": "BE", "id_code": "BE0123456789", "tax_regime": "" },
        "company_name": "My Company SRL"
      },
      "place": { "address": "Via Roma, 123", "zip_code": "1000", "city": "Brussels", "province_id": "", "country_id": "BE" },
      "contact": { "phone": "", "email": "info@company.com" }
    },
    "transferee_client": {
      "personal_data": {
        "tax_id_vat": { "country_id": "BE", "id_code": "BE0727506532" },
        "tax_id_code": "",
        "company_name": "Client Company NV",
        "first_name": "",
        "last_name": ""
      },
      "place": { "address": "Rue du Test 12", "zip_code": "4444", "city": "Liege", "province_id": "", "country_id": "BE" }
    },
    "invoice_body": {
      "general_data": {
        "doc_type": "TD01",
        "currency": "EUR",
        "date": "2025-10-03",
        "invoice_number": "WEB097/2025",
        "invoice_prefix": "WEB",
        "invoice_suffix": "2025"
      },
      "total_document_amount": "4.80"
    },
    "purchase_order_data": { "id": "#2855", "date": "2025-10-03" },
    "connected_invoice_data": [],
    "order_items": [
      {
        "item_code": { "type": "INTERNO", "value": "2636" },
        "item_type": "product",
        "gift_product": null,
        "description": "Product B",
        "quantity": "1.00",
        "unit": "N.",
        "discount_type": "",
        "discount_percent": "",
        "discount_amount": "",
        "unit_price": "4.80",
        "total_price": "4.80",
        "rate": "0.00",
        "total_tax": 0
      }
    ],
    "payment_data": {
      "terms_payment": "TP02",
      "payment_amount": "4.80",
      "payment_details": "MP01",
      "beneficiary": "",
      "financial_institution": "",
      "iban": ""
    }
  },
  "integration": {
    "use": "peppol-via-pop",
    "action": "create"
  }
}

Get Invoice Status — POST /sdi/document-notifications

{
  "license_key": "your_license_key",
  "integration": {
    "uuid": "your-integration-uuid"
  }
}

Get Peppol Document — POST /peppol/document-get

{
  "license_key": "your_license_key",
  "integration": {
    "uuid": "your-integration-uuid",
    "zone": "BE"
  }
}

Verify SdI Document — POST /sdi/document-verify

This operation has no manual payload — it is always passthrough. The node reads the XML from the incoming item (output of Create SdI Invoice (XML)), base64-encodes it, and auto-detects the license key from the upstream node.

The request sent to the API looks like:

{
  "license_key": "<auto-detected from upstream node>",
  "skip_business_check": true,
  "integration": {
    "xml": "<base64-encoded FatturaPA XML>"
  }
}

Sync Document to Zoho — POST /integration/zoho/sync

Invoice (TD01):

{
  "license_key": "your_license_key",
  "data": {
    "id": 0,
    "filename": "",
    "type": "invoice",
    "customer_type": "private",
    "transferee_client": {},
    "invoice_body": {
      "general_data": {
        "doc_type": "TD01",
        "date": "2025-01-31",
        "currency": "EUR"
      }
    },
    "order_items": [{}]
  }
}

Credit note (TD04) — requires connected_invoice_data:

{
  "license_key": "your_license_key",
  "data": {
    "id": 0,
    "filename": "",
    "type": "invoice",
    "customer_type": "private",
    "transferee_client": {},
    "invoice_body": {
      "general_data": {
        "doc_type": "TD04",
        "date": "2025-01-31",
        "currency": "EUR"
      }
    },
    "connected_invoice_data": [{ "id": 123 }],
    "order_items": [{}]
  }
}

The status check that runs first (unless disabled) calls GET /integration/zoho/status with no body.

Validate VAT (VIES)

This operation calls the EU VIES SOAP service, not the POP Cloud API.

Example response:

{
  "valid": true,
  "name": "GOOGLE ITALY S.R.L.",
  "address": "VIA FEDERICO CONFALONIERI 4\n20124 MILANO MI",
  "requestDate": "2026-04-02",
  "attempts": 1,
  "latencyMs": 412
}

Project Structure

n8n-nodes-pop/
├── nodes/Pop/
│   ├── Pop.node.ts                  # Node definition and metadata
│   ├── Pop.node.json                # Codex metadata (categories, aliases, docs links)
│   ├── pop.svg                      # Node icon
│   ├── router.ts                    # Per-item operation dispatcher
│   ├── types/pop.ts                 # TypeScript resource/operation type map
│   ├── utils/request.ts             # Shared HTTP helper (base URL + error wrapping)
│   ├── invoices/
│   │   ├── index.ts                 # Operation aggregator for the invoices resource
│   │   ├── invoiceFields.ts         # Form field factory (shared by SdI, Peppol, and Zoho)
│   │   ├── invoicePayloadBuilder.ts # Assembles API payloads from form values
│   │   ├── createSdiInvoiceXml.ts   # Operation: Create SdI Invoice
│   │   ├── createPeppolInvoiceUbl.ts# Operation: Create Peppol Invoice
│   │   ├── createKsefInvoiceXml.ts  # Operation: Create KSeF FA(3) XML
│   │   ├── createZugferdInvoice.ts  # Operation: Create ZUGFeRD package
│   │   ├── getInvoiceStatus.ts      # Operation: Get Invoice Status
│   │   ├── getPeppolDocument.ts     # Operation: Get Peppol Document
│   │   ├── verifySdiDocument.ts     # Operation: Verify SdI Document (XML)
│   │   └── syncZohoDocument.ts      # Operation: Sync Document to Zoho
│   └── vies/
│       ├── index.ts                 # Operation aggregator for the vies resource
│       └── validateVat.ts           # Operation: Validate VAT (EU VIES SOAP)
├── package.json
├── tsconfig.json
└── eslint.config.mjs

Local Development

Prerequisites

  • Node.js v22+ (use .nvmrc: nvm use)
  • npm

Steps

npm install       # Install dependencies
npm run build     # Compile TypeScript → dist/
npm run lint      # Check for linting issues
npm run lint:fix  # Auto-fix linting issues where possible
npm run dev       # Start watch mode + n8n

npm run dev (via @n8n/node-cli):

  • Symlinks the package into ~/.n8n-node-cli/.n8n/custom/node_modules/
  • Starts tsc --watch, which recompiles on every file save
  • Downloads and starts n8n@latest via npx (first run may take a while)
  • Sets N8N_DEV_RELOAD=true so n8n picks up changes automatically

Open http://localhost:5678, search for POP in the node panel, and start testing. Code changes are picked up automatically — no restart needed.

Verifying the node works

  • Create a new workflow
  • Add a Manual Trigger node
  • Add the POP node and connect it to the trigger
  • Select Invoice as the resource and an operation (e.g. Create SdI Invoice (XML))
  • Set Input Mode to JSON and paste one of the example payloads above
  • Click Execute node — you should see a successful API response or a descriptive error with the full URL, HTTP status, and response body

Publishing

npm login        # Log in to your npm account
npm run release  # Builds, versions, and publishes via @n8n/node-cli

From May 1st, 2026, all community nodes must be published via a GitHub Action that includes a provenance statement. See the n8n community node publishing guide for details.

Resources

License

MIT — Babini Mazzari S.r.l.

Keywords

n8n-community-node-package

FAQs

Package last updated on 06 Aug 2026

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts