France - e-Invoicing
Invoice
Change — VAT numbers must now be sent explicitlyA decree from the French Ministry of Finance (DGFiP), published in August 2026, applies from the 1 September 2026 mandate go-live: when the recipient is VAT-registered, the invoice must explicitly carry the VAT number of both the sender and the recipient — VAT status is no longer inferred from the Annuaire. Send the recipient's FR VAT number in
recipient.taxId, or inrecipient.customInfo.fra.vatNumberwhentaxIdalready holds the SIREN or SIRET. Your organisation's own VAT number must be captured on your eezi organisation profile. See France - Recipient Identifiers & Routing.
Changes to generic fields
type Invoice {
// ...all generic invoice fields
dueDate?: string;
salesOrderRef?: string;
purchaseOrderRef?: string;
lines: [
{
// ...other line item fields
unit: UnitsOfMeasure;
vat:{
code: VatCodeUNTDID;
exemptReason?: string;
exemptReasonCode?: string;
}
}
];
sender?: {
// ...other sender fields
taxRepresentative?:{
name:string;
taxId: string;
address: {
country: string;
}
}
};
recipient:{
taxId: string; // SIREN, SIRET, or FR VAT number
peppolId: {
endpointId?: string;
};
taxRepresentative?:{
name:string;
taxId: string;
address: {
country: string;
}
}
};
shipToParty?:{
name: string;
taxId: string;
address:{
line1?: string;
line2?: string;
city?: string;
state?: string;
country: string;
postalCode?: string;
}
};
paymentMeans?: [{
ref: string;
code: string;
account: {
iban?: string;
number?: string;
name: string;
branch: string;
};
card: {
pan: string;
network: string;
holderName: string;
};
other: {};
}];
customInfo?:{
fra?: {
taxPointDate?: string;
paymentTerms?: string;
serviceStartDate?: string;
serviceEndDate?: string;
siren?: string; // deprecated — use recipient.taxId
siret?: string; // establishment, when taxId holds the SIREN or VAT number
vatNumber?: string; // required if VAT-registered and taxId isn't the VAT number
routingCode?: string; // "code de routage" (Annuaire: identifiantRoutage) — needs a SIRET
suffix?: string; // "suffixe d'adressage" (Annuaire: suffixeAdressage)
};
};
}
Field information
| Name | Type | Required | Description |
|---|---|---|---|
dueDate | string (ISO 8601 date) | No | Due date of invoice |
lines[].unit | string | Yes | A value from an enumerated list as outlined on Units of Measure |
lines[].vat.code | string | Yes | A value from an enumerated list as outlined on VAT code classification (UNTDID 5305) |
lines[].vat.exemptReason | string | Conditional | If the line VAT amount is 0, an exemption reason is required. |
lines[].vat.exemptReasonCode | string | Conditional | If the line VAT amount is 0, an exemption code is required. |
recipient.taxId | string | Yes | Accepts any of the three French business identifiers: SIREN (9 digits), SIRET (14 digits), or FR VAT number. See France - Recipient Identifiers & Routing. |
recipient.name | string | Yes | Recipients' name |
recipient.address.line1 | string | No | Address line 1 (Street address/PO Box/Company name). |
recipient.address.line2 | string | No | Address line 2 (Apartment/Suite/Unit/Building). |
recipient.address.city | string | No | City/District/Suburb/Town/Village. |
recipient.address.state | string | No | State/County/Province/Region. |
recipient.address.country | string | Yes | Three-letter country code (ISO 3166-1 alpha-3) |
recipient.address.postalCode | string | No | ZIP or postal code |
recipient.peppolId.endpointId | string | No | Peppol ID of the recipient. When omitted, eezi derives it from recipient.taxId and recipient.customInfo.fra; when set, it is parsed by the 0225 convention and feeds the four-step Annuaire lookup. See France - Recipient Identifiers & Routing. |
recipient.customInfo.fra.siren | string | No | Deprecated — use recipient.taxId instead. 9-digit French legal entity registration number. |
recipient.customInfo.fra.siret | string | No | SIRET of the recipient (14-digit establishment number = SIREN + 5-digit NIC). Lets the Annuaire lookup resolve a per-establishment receiving platform. |
recipient.customInfo.fra.vatNumber | string | Conditional | FR VAT number of the recipient. Required when the recipient is VAT-registered and recipient.taxId is not already the VAT number. |
recipient.customInfo.fra.routingCode | string | No | Routing code (identifiantRoutage) discriminating a per-service receiving platform within a SIRET. Only meaningful together with a SIRET. |
recipient.customInfo.fra.suffix | string | No | Address suffix (suffixeAdressage) discriminating a receiving platform within a SIREN. |
recipient.taxRepresentative | Object | No | For instances where a third-party tax representative is used. |
recipient.taxRepresentative.name | string | Yes | Name of Tax Representative |
recipient.taxRepresentative.taxId | string | Yes | Tax ID of Tax Representative |
recipient.taxRepresentative.address.country | string | Yes | Country of Tax Representative |
salesOrderRef | string | No | Sales order reference. An identifier of a referenced sales order, issued by the Seller. |
purchaseOrderRef | string | No | Purchase order reference. An identifier of a referenced purchase order, issued by the Buyer. |
shipToParty | Object | No | For instances where the ship-to party details differ and need to be explicitly stated. |
shipToParty.name | string | No | The name of the party to which the goods and services are delivered. |
shipToParty.taxId | string | No | TIN of the shipping recipient assigned by IRBM |
shipToParty.address.line1 | string | No | Deliver to address line 1. The main address line in an address. |
shipToParty.address.line2 | string | No | Deliver to address line 2. An additional address line in an address that can be used to give further details supplementing the main line. |
shipToParty.address.city | string | No | Deliver to city. The common name of the city, town or village, where the deliver to address is located. |
shipToParty.address.state | string | No | Deliver to country subdivision. The subdivision of a country. |
shipToParty.address.country | string | No | Deliver to country code. A code that identifies the country. |
shipToParty.address.postalCode | string | No | Deliver to post code. The identifier for an addressable group of properties according to the relevant postal service. |
paymentMeans | Object Array | No | For instances where the payment means need to be explicitly stated. |
paymentMeans.ref | string | No | Remittance information A textual value used to establish a link between the payment and the Invoice, issued by the Seller. Used for creditor's critical reconciliation information. This information element helps the Seller to assign an incoming payment to the relevant payment process. |
paymentMeans.code | string | No | Payment means type code The means, expressed as code, for how a payment is expected to be or has been settled. |
customInfo.fra.taxPointDate | string | Conditional | This field is only needed if the actual tax/VAT point date is different from the main Invoice Issue Date. Required for VAT on debit. |
customInfo.fra.paymentTerms | string | No | A textual description of the payment terms that apply to the amount due for payment (Including description of possible penalties) |
customInfo.fra.serviceStartDate | string | No | Start date of the service |
customInfo.fra.serviceEndDate | string | No | End date of the service |
notes | string | No | Any applicable or additional note |
Lifecycle Status
type LifeCycleStatus {
status: string;
issued?: string;
amount?: number;
rejectReason?: string;
rejectCode?: string;
customInfo?:{
fra?:{
notes?: string
}
}
}
Field information
| Name | Type | Required | Description |
|---|---|---|---|
status | string | Yes | Valid values: paid, rejected |
issued | string (ISO 8601 date) | Optional | Date of payment. Will use status update date when not specified. |
amount | number | Optional | Will use original invoice amount when not specified. |
rejectReason | string | Conditional | Textual field for reason of rejection. |
rejectCode | string | Conditional | A value from an enumerated list Refusal Reason Codes |
customInfo.fra.notes | string | Optional | Any additional comments |
Example CSV file
Updated 9 days ago
Did this page help you?