Skip to main content

Italy e-invoicing in Invoicerr

Invoicerr supports Italy

Italy is one of five countries with data files in the per-country catalogues, so the application runs for a company established there. Support is per mechanism, not a single yes or no.

Italy's entries name SdI as its invoice transmission platform, and FatturaPA as the format it carries. An Italian seller's foreign-currency invoice also states both its VAT and its taxable amount in euros, at the ECB's rate, frozen at issue.

Validate and the SdI mandate​

Invoicerr's Validate action normally only assigns an invoice's legal number and locks it, with no email or transmission of any kind (see the user guide). Issue #581's first owner decision (2026-10-01) named France only - the only country whose own legal question had been reviewed at that point - and flagged Italy as an unreviewed CONSEQUENCE: reusing the existing, country-blind channel-mandate check send already runs (transports/channel-policy/) meant a domestic Italian B2B invoice would also transmit through SdI on Validate, without that being a deliberate legal finding about Italian law.

The owner's revised decision, after reviewing that flag, makes it deliberate: Italy now declares its own invoiceValidation fact in its own policy section (countries/data/it.json), carrying D.Lgs. 127/2015 art. 1 comma 6's own text as provenance - without the accredited channel, "la fattura si intende non emessa" ("the invoice is deemed not issued"), the same constitutive-of-issuance reasoning CGI art. 289 bis I gives France (see France for the parallel), stronger here than DPR 633/1972 art. 21's own general electronic-invoice validity clause. Like France's own fact, it is validated at both load and seed time, and consulted the same way: Validate performs the real SdI send only when this fact is declared for the seller country AND the operation is bound by an active channel mandate right now (activeChannelMandateForOperation) - never a hand-written "country is Italy" branch. See Adding a country for the full mechanism.

Because the fact is now explicit, the confirmation dialog knows about it BEFORE anyone confirms: validating a domestic Italian B2B invoice shows a dedicated alert naming SdI and stating the action cannot be undone, a separate block from the generic "numbering and locking are final" warning every other locking action already shows.

The SdI mandate binds a private buyer too. D.Lgs. 127/2015 art. 1 comma 3 covers supplies « tra soggetti residenti o stabiliti nel territorio dello Stato », not only between taxable persons, and the same comma provides for e-invoices issued to final consumers. The sdi fact therefore carries no scope.buyerType: an Italian invoice to a client of type Individual still goes through SdI, and Validate still transmits it.

Partita IVA and codice fiscale​

DPR 633/1972 art. 21, comma 2 asks every invoice for the seller's Partita IVA (lettera d) and, for the buyer (lettera f), its Partita IVA, the VAT number of its own member state when it is established elsewhere in the Union, or its codice fiscale when it is resident in Italy and does not act as a business. The identifiers section of countries/data/it.json encodes it with the party's type standing in for "acts as a business", which the app does not record:

PartyMust be filled in to saveScheme
Your company (Settings, onboarding)Partita IVAVAT, required: true
Company clientPartita IVAVAT, required: true
Individual clientCodice fiscaleLEGAL_ID, requiredFor: ["INDIVIDUAL"]

A company client may leave the codice fiscale empty, and an individual client is not offered a Partita IVA field. A sole trader entered as an individual is therefore asked for a codice fiscale, not a Partita IVA.

Clients saved before

An Italian client saved without the number keeps its record. The client form asks for it at the next edit, and Validate and Send keep refusing an invoice to it until it is filled in.

This page is a pointer by design. Everything Invoicerr knows about Italy lives in its own data files, and two pages already say it without anyone retyping it:

To widen that coverage, or to add a country of your own, see Adding a country: the catalogue files listed on every other page in this directory are the ones Italy already has.

FatturaPA codes​

The FatturaPA builder (formats/national/fatturapa-provider.ts) reads three kinds of code from the einvoiceCodes section of countries/data/it.json, each entry quoting its source:

FatturaPA elementSection keyWhat selects the value
Natura and RiferimentoNormativo of a 0 % lineexemptionCodesThe exemption reason the tax engine resolved for the line (a VATEX code), then the seller's tax scheme, then the VAT rate entry picked on the line (appliesTo).
RegimeFiscaletaxRegimeCodesThe seller's tax scheme: RF19 (regime forfettario) when the company has the VAT exemption toggle on in Settings, RF01 otherwise.
CodiceDestinatario without an SdI coderecipientCodes0000000 for a buyer reached by PEC or through no known channel, XXXXXXX for a buyer established abroad.

What a line gets today:

SituationNatura
Seller under the forfettarioN2.2
Service to an EU business (reverse charge) or to a buyer outside the EUN2.1
Goods to an EU business (intra-Community supply)N3.2
Goods to a buyer outside the EU, or the it-non-imponibile rateN3.1
The it-esente rateN4

The other detailed codes the schema accepts (N1, N3.3 to N3.6, N5, N6.1 to N6.9, N7) are listed with their source but carry no appliesTo: nothing on an invoice can select them yet. The N6 codes in particular wait for the domesticReverseCharge categories to reach the tax engine.

The same Natura codes, and the full RegimeFiscale list, are declared a second time under codeLists (fatturaPaNatura, fatturaPaRegimeFiscale) for the declarations model, which needs them without importing the invoice builder. code-lists/country-data.spec.ts fails when the Natura copy stops matching exemptionCodes.

A 0 % line with no code is refused

A line without VAT that no entry matches (a bare legacy 0 rate, for instance) makes the build invalid with a message naming the line. The SdI has refused the generic codes N2, N3 and N6 since 2021-01-01 (error 00445 of its technical specifications), so there is no safe default to fall back on.

The schema the builder validates against, formats/vendored/it/Schema_VFPR12.xsd, is the official version 1.2.3 downloaded from fatturapa.gov.it (Schema_VFPR12_v1.2.3.xsd, identical to Schema_VFPA12_V1.2.3.xsd). The only change is its xmldsig import, pointed at the local copy of the W3C schema next to it. The schema does not carry the SdI's own controls: a generic Natura code or an XXXXXXX sent to an Italian buyer (error 00313) pass the XSD and are refused by the SdI. The specs in fatturapa-provider.spec.ts check those two controls on every case they build.

Not proven against the SdI

These codes follow the SdI technical specifications 1.9.1 and the Agenzia delle Entrate's guide to filling in electronic invoices (version 1.10). No invoice built with them has been submitted to the SdI yet, in test or production.

Fallback payment term​

The paymentTerms.fallbackTerm entry of countries/data/it.json is the 30 days an invoice's due date falls back to when the company has no default term of its own (see Payment terms). D.Lgs. 231/2002, art. 4, comma 2, lettera a) caps the payment period at 30 days from the debtor's receipt of the invoice, unless the parties agree otherwise (basis: "maximumWhenNotAgreed"). The application counts the 30 days from the invoice date, not from receipt of the invoice.

Company-law mentions​

The companyLaw section of countries/data/it.json prints, under the seller's name on invoices, quotes, credit notes and purchase orders (atti e corrispondenza), from codice civile art. 2250:

Legal formsPrintedParagraph
S.r.l., S.p.A., S.a.p.a., S.n.c., S.a.s."Registro delle imprese di Milano n. 01234567890"first
S.r.l., S.p.A., S.a.p.a."Capitale sociale versato 10000.00 EUR"second
S.r.l. and S.p.A. con unico socio"Società con unico socio"fourth
Ditta individuale, other formsnothingart. 2250 binds società

The sede is the company address. Text read at normattiva.it on 2026-10-25 (in force since 29-7-2009).

Art. 2250 prints nothing for a sole trader or an unlisted form, but that says nothing about the registro delle imprese: art. 2188 c.c. makes registration compulsory for every imprenditore. The hasRegisterEntry flag on each legal form of it.json states that fact separately from the printed mentions, and is true for every Italian form.

FatturaPA IscrizioneREA​

The FatturaPA export fills CedentePrestatore/IscrizioneREA from the same companyLaw section. The block is emitted only when every element the format makes mandatory is declared; otherwise it is omitted (IscrizioneREAType is minOccurs="0") rather than guessing a province or asserting that a company is not in liquidation.

ElementSource
UfficioregisterOfficeProvince: the two-letter province of the registro delle imprese office
NumeroREAregisterNumber: the registration number codice civile art. 2250 already asks for
CapitaleSocialeshareCapital, when its currency is EUR
SocioUnicoSU or SM from the legal form's singleMember; omitted for forms the field does not cover
StatoLiquidazioneliquidationStatus, declared as LN or LS

registerNumber, registerOfficeProvince and liquidationStatus are marked asked in it.json, so the company settings collect them even when no printed mention quotes them. An asked field is collected for a legal form the section covers with a printed mention or one that declares hasRegisterEntry. A ditta individuale and an unlisted Italian form therefore collect the register number, the register office province and the liquidation status too, and IscrizioneREA is filled from them: the two questions are independent, since a form with no printed mention still has a register entry.

The demo company's registerOfficeProvince follows the city it is seeded with (cityProvinces in it.json: Milano MI, Torino TO, Bologna BO). A declared value the block cannot carry (a province that is not two letters, a register number over 20 characters, a liquidation status other than LN or LS) refuses the export with an error naming the field, rather than dropping IscrizioneREA silently.

The NumeroREA decision. The issue left open whether NumeroREA could carry the registro delle imprese registration number or needed a second field. The specification settles it: Specifiche tecniche del formato della FatturaPA v1.4 §3.3.4 defines NumeroREA as « il numero di repertorio con il quale la società è iscritta nel Registro delle Imprese », which is the registration number art. 2250 names, not a distinct REA number. No second field is declared.

Text read on 2026-10-31 at fatturapa.gov.it, https://www.fatturapa.gov.it/export/documenti/fatturapa/v1.4/Specifiche_tecniche_del_formato_FatturaPA_V1.4.pdf (§3.3.4, pages 42-43).