Skip to main content

NF525

What is an NF525?​

NF525 refers to France fiscal certification. Every year we must do recurring checks if we are still compliant with the France fiscal certification or if we have point of vigilance that we need to maintain. The current requirements version implemented by Treatwell Pro, as of July 3rd 2026, is 2.3.

Reference documentation​

info

This paragraph references the version 2.3 of the regulation. It may be outdated by the time you read it. The auditing company is able to provide with a copy of the current regulation.

The NF525 requirements are split among several files. We know about the following files.

The data dictionaries (aka "R" files) describe the data that we are required to store and sign to fulfill the regulation. Each file details which data has to be stored in the database and in the fiscal archives.

note

The versioning of the "R" files is on its own, the version 4.2 belongs to the version 2.3 of the regulation.

The Treatwell Pro POS Technical Documentation (aka the documentation produced by Treatwell) can be usually found on this Google drive folder inside the current year audit folder (i.e. for 2026, it's here). It provides a comprehensive overview of NF525.

info

The Treatwell Pro documentation here refers to the 2026 audit. By now it can be all over the place! Ask your PM or something, they should know where it is.

NF525 main concepts​

warning

You don't know yet, but you are going to get confused by fiscal summaries and fiscal archives.

  • Fiscal Summary: It is a database record of the model FiscalSummary. It keeps track of some fiscal information for the associated period. It is generated per checkout, daily, monthly, and yearly. The summary content is described in the documents R12 and R13 (see ref doc) where it is referred as periodic cumulative data (grand totals).

  • Fiscal Archive: It is a ZIP file containing fiscal data about a venue. Among other things, it happens to also contain data from the summaries in fiscal_summaries.csv. Archives are also database records of the model FiscalArchive. It is generated monthly, and yearly. The archive content is described int documents R12 and R13 (see ref doc) where it is referred as tax archive.

    See the Archives documentation for more details.

  • Signatures: the data included in the archives must be digitally signed. These signatures form a cryptographic chain, ensuring that no records have been maliciously inserted, altered, or deleted between valid entries. The general requirements for signatures are described in Part 10; the technical details about the signature generation can be found in R12 and R13 (see ref doc)

    See the Signatures documentation for more details.

  • Technical event log (aka JET): it is just a log of some events we are required to keep track of. It is stored using the model TechincalEventLog. The list of events that Pro actually records can be found in TechincalEventLogs::Validations. The JET events to be logged and the structure of the log entries is described in R19 (see ref doc).

Generation of fiscal summaries and archives, general flow diagram

Archives​

The archive generation is performed, for venues in France, by Venues::Nf525::GenerateFiscalArchiveInteractor. The same interactor also generates a yearly archive on the first day of the year.

The generation of the archives is triggered by the execution of Venues::Nf525::GenerateFiscalSummaryInteractor.

The actual archive data is stored on S3 directory bucket named fiscal-archives.

The structure of a monthly archive file is as follows:

monthly_archive_venue_{ID}_{YYYYMMDD}_with_digest.zip
├── monthly_archive_venue_{ID}_{YYYYMMDD}.sha256
├── monthly_archive_venue_{ID}_{YYYYMMDD}.signature
└── monthly_archive_venue_{ID}_{YYYYMMDD}.zip
├── checkout_payment_methods.csv
├── checkout_reprints.csv
├── fiscal_archives.csv
├── fiscal_summaries.csv
├── invoices.csv
├── invoices_items.csv
├── receipts.csv
├── receipts_items.csv
└── technical_event_logs.csv

The actual archive is the inner ZIP file monthly_archive_venue_{ID}_{YYYYMMDD}.zip. The *.signature file contains the signature of the actual archive as calculated by Hairdressr::Signable::Nf525. The *.sha256 file contains a SHA256 digest of the actual fiscal archive content. The same digest is saved on the database as FiscalArchive#digest.

Yearly archives contain similar *.signature and *.sha256 files, and an actual archive containing all the monthly archives for that year.

Archives content​

The files invoices.csv and receipts.csv contain data on checkouts made by the venue during the current month, with one record per line. This data is derived from the Checkout model.

For each checkout listed in those files, invoices_items.csv and receipts_items.csv provide detailed information about the associated line items. This data is derived from the LineItem model.

The file checkout_payment_methods.csv contains, for each checkout, the information about the payment methods used and the amount of money payed with that method. The data is taken from the Checkout model.

The file fiscal_summaries.csv contains data about all the fiscal summaries of the period, taken from the FiscalSummary model.

The file fiscal_archives.csv should contain information about the same fiscal archive we are currently generating. This file includes the archive signature, this is a temporary signature computed on the content of the record. It wouldn't be possible to include the archive signature inside the archive itself.

The file technical_event_logs.csv contains the information registered in the model TechnicalEventLog.

Archives detailed content​

Field names in the context of the NF525 documentation are called FIDELE labels.

When there is more than one FIDELE label specified, it usually means that the CSV field can be related to different part of the regulation (ex. customer_id in invoices.csv).

Sometimes the same FIDELE label is associated with more than one CSV field (ex. customer_full_name and customer_company_name in invoices.csv).

VAT column headers are not fixed; they are added to the file depending on the VAT amounts associated with all the checkouts involved.

warning

The following tables may not be accurate!

They may not be updated to the current version of the application or regulation, but they should be a good starting point to figure out where to search for things inside the regulation.

invoice.csv
CSV field nameFIDELE labelNF525 referenceNotes
idFAC-NIDR12
customer_idCLI-NUM / TIE-NUMR12
customer_typeCLI-TYPER12
customer_full_nameCLI-RSO / TIE-RSOR12
customer_company_nameCLI-RSO / TIE-RSOR12
customer_full_addressCLI-ADR / TIE-ADRR12
customer_townCLI-VIL / TIE-VILR12
customer_zipCLI-CCP / TIE-CCPR12
customer_vat_numberCLI-TVA-NUMR12
customer_siret_codeCLI-SIRR12
customer_countryCLI-PAYS / TIE-PAYSR12
numberFAC-NUMR12
print_countFor compatibility with receipts.csv. It's value is always 1.
platform_nameFAC-VER-NAMER12
platform_versionFAC-VERR12
company_nameSOC-RSOR12
addressSOC-ADRR12
postal_codeSOC-CCPR12
townSOC-VILR12
countrySOC-PAYSR12
siret_codeSOC-SIRETR12
naf_codeSOC-NAFR12
vat_numberSOC-TVA-NUMR12
trade_registration_numberSOC-METIERR12
city_registration_numberSOC-GREFFER12
profession_registration_numberSOC-RCSR12
creation_user_idFAC-OPS-NIDR12
creation_user_full_nameNot documented by NF525.
cash_register_numberFor compatibility with receipts.csv.
operation_typeFor compatibility with receipts.csv.
document_typeFAC-TYPR12
line_items_count
ticket_statusIt always has the value 'standard'.
invoiced_atFAC-DAT / FAC-GDR12
earned_loyalty_points
total_loyalty_points
discount_amount_centsFAC-RIS-MTTR12
net_price_centsFAC-TOT-MHTR12
gross_price_centsFAC-TOT-TTC-MTNR12
vat amount centsFAC-TAX-TOT-MHT / FAC-TAX-TVA-NIDR12
vat_A_20.0%_total_amount_centsFAC-TAX-TVA-TXXR12
signatureFAC-SIGR12
invoices_items.csv
CSV field nameFIDELE labelNF525 referenceNotes
idFAC-LIG-NIDR12
checkout_idFAC-LIG-NUMR12
positionFor compatibility with receipts_items.csv.
codeFAC-LIG-PRO-NIDR12A string that encodes the type of object associated. to the line item and its ID
nameFAC-LIG-PRO-LIBR12
unit_price_centsFAC-LIG-PRO-MHTR12
quantityFAC-LIG-PRO-QTER12
discount_amount_centsFAC-LIG-PRO-REM-TXXR12
discount_percentageFAC-LIG-PRO-REM-TXXR12
net_price_centsFAC-LIG-TOT-MHTR12
gross_price_centsFAC-LIG-TOT-TTCR12
vat_codeFAC-LIG-TVA-NIDR12
vat_percentageFAC-LIG-TVA-TXXR12
created_atFor compatibility with receipts_items.csv.
receipts.csv
CSV field nameFIDELE labelNF525 referenceNotes
idENC-NID / ENC-TIK-ORI-NUMR13
customer_idFor compatibility with invoices.csv.
customer_typeFor compatibility with invoices.csv.
customer_full_nameFor compatibility with invoices.csv.
customer_company_nameFor compatibility with invoices.csv.
customer_full_addressFor compatibility with invoices.csv.
customer_townFor compatibility with invoices.csv.
customer_zipFor compatibility with invoices.csv.
customer_vat_numberFor compatibility with invoices.csv.
customer_siret_codeFor compatibility with invoices.csv.
customer_countryFor compatibility with invoices.csv.
numberENC-TIK-NUMR13
print_countENC-TIK-PRN-NBRR13
platform_nameENC-TIK-LOGR13
platform_versionENC-TIK-TAG-VERR13
company_nameENC-TIK-SOC-ETSR13
addressENC-TIK-SOC-ADRR13
postal_codeENC-TIK-SOC-CCPR13
townENC-TIK-SOC-VILR13
countryENC-TIK-SOC-PAYR13
siret_codeENC-TIK-SOC-SIRR13
naf_codeENC-TIK-SOC-NAFR13
vat_numberENC-TIK-SOC-TVAR13
trade_registration_numberFor compatibility with invoices.csv.
city_registration_numberUsed only for invoices.csv.
profession_registration_numberUsed only for invoices.csv.
creation_user_idUsed only for invoices.csv.
creation_user_full_nameNot documented by NF525.
cash_register_numberENC-TIK-CAI-NIDR13
operation_typeENC-OPE-TYPR13
document_typeENC-TIK-DOC-TYPR13
line_items_countENC-TIK-LIG-NBRR13
ticket_statusIt always has the value 'standard'.
invoiced_atENC-TIK-HOR-GDHR13
earned_loyalty_pointsENC-TIK-FID-PTSR13
total_loyalty_pointsENC-TIK-FID-PTS-SOLR13
discount_amount_centsENC-TIK-REM-MTNR13
net_price_centsENC-TIK-TOT-MHTR13
gross_price_centsENC-TIK-TOT-TTCR13
vat amount centsENC-TIK-TVA-MTN / ENC-TIK-TVA-NID / ENC-TIK-TVA-TXXR13
signatureENC-TIK-TAG-SIGR13
vat_A_20.0%_taxable_amount_centsENC-TIK-TOT-MHTR13
vat_A_20.0%_total_amount_cents
recepits_items.csv
CSV field nameFIDELE labelNF525 referenceNotes
idENC-NIDR13
checkout_idENC-TIK-ORI-NUMR13
positionENC-TIK-LIG-NUMR13
codeENC-TIK-LIG-PRO-NIDR13A string that encodes the type of object associated to the line item and its ID.
nameENC-TIK-LIG-PRO-LIBR13
unit_price_centsENC-TIK-LIG-PRO-ttcR13
quantityENC-TIK-LIG-PRO-QTER13
discount_amount_centsENC-TIK-LIG-REM-TOTR13
discount_percentageENC-TIK-LIG-REM-TXXR13
net_price_centsENC-TIK-LIG-TOT-MHTR13
gross_price_centsENC-TIK-LIG-TOT-TTCR13
vat_codeENC-TIK-LIG-TAX-NIDR13
vat_percentageENC-TIK-LIG-TAX-TXXR13
created_atENC-TIK-LIG-HOR-GDHR13
checkout_payment_methods.csv
CSV field nameFIDELE labelNF525 referenceNotes
checkout_idENC-NIDR13
original_document_numberENC-TIK-ORI-NUMR13
original_document_typeUndocumented by NF525. It can be either invoice or receipt.
payment_methodENC-TIK-REG-MOD-LIBR13
amount_centsENC-TIK-REG-MTNR13
operation_typeUndocumented by NF525. It can be either cancellation or sell.
creation_user_idENC-TIK-REG-USR-NIDR13
created_atENC-TIK-REG-HOR-GDHR13
checkout_reprints.csv
note

NF525 describe invoices and receipts reprints separately. We are using the same file for both.

CSV field nameFIDELE labelNF525 referenceNotes
idFAC-DUP-NID / ENC-DUP-NIDR12 / R13
original_document_numberFAC-DUP-ORI-NUM / ENC-DUP-ORI-NUMR12 / R13
original_document_typeFAC-DUP-TYP / ENC-DUP-TYPR12 / R13
print_countFAC-DUP-PRN-NUM / ENC-DUP-PRN-NUMR12 / R13
platform_versionFAC-DUP-VER / ENC-DUP-VERR12 / R13
reasonENC-SIG-MOTIFR13Used only for receipts.
creation_user_idFAC-DUP-OPS-NID / ENC-DUP-OPS-NIDR12 / R13
created_atFAC-DUP-HOR-GDH / ENC-DUP-HOR-GDHR12 / R13
signatureFAC-DUP-SIG / ENC-DUP-TAG-SIGR12 / R13
fiscal_summaries.csv
note

Also known as "grand totals" in NF525 terms.

CSV field nameFIDELE labelNF525 referenceNotes
idFAC-GTP-ORI-ID/ENC-GTP-ORI-NUMR12 / R13
summary_typeNot documented by NF525.
unique_idFAC-GTP-ORI-NID/FAC-GTP-ORI-NIDR12 / R13
amount_centsFAC-GTP-TTC/ENC-GTP-TTCR12 / R13
incremental_amount_centsFAC-GTP-PER-TTC/ENC-GTP-PER-TTCR12 / R13
incremental_absolute_amount_centsFAC-GTP-PER-TTC-ABS/ENC-GTP-PER-TTC-ABSR12 / R13
vat_amountsFAC-GTP-MTN-TVA-TTC/ENC-GTP-MTN-TVA-TTCR12 / R13
created_atFAC-GTP-HOR-GDH/ENC-GTP-HOR-GDHR12 / R13
signatureFAC-GTP-TAG-SIG/ENC-GTP-TAG-SIGR12 / R13
fiscal_archives.csv
note

Only the predecessor signature fields are documented by NF525.

note

Contains a single record of the currently generated fiscal archive.

CSV field nameFIDELE labelNF525 referenceNotes
id
archive_type
file_name
digest
created_at
predecessor_signatureTAG-ARC-SIGR12 / R13
predecessor_signature_presentTAG-ARC-OENR12 / R13
signatureThis field contains a signature of the content of the fiscal archive DB record. It is not the NF525 required signature, that will be generated after this file will be zipped on the whole archive binary content.
technical_event_logs.csv
CSV field nameFIDELE labelNF525 referenceNotes
idJET-NID
codeJET-EVT-NUM
nameJET-EVT-LIB
creation_user_idJET-OPE-NID
descriptionJET-GDH
created_atJET-INF
signatureJET-TAG-SIG

Archives generation flow charts​

General flow
Monthly archive generation
Yearly archive generation

Summaries and archives generation class diagrams​

Fiscal summaries generation
Fiscal archive generation

Signatures​

Most of the records we use to store fiscal information are required to be cryptographically signed.

Each record's signature is computed using a subset of its own fields and the signature of the previous record, creating a continuous cryptographic chain.

All the models that includes the module Hairdressr::Signable are subject to be signed. Depending on the country of the venue associated with them, the signature is computed by a specific object.

The signature management process consists of the following steps:

  1. signature generation: performed by the module Hairdressr::Signable, in case of French venues it delegates to Hairdressr::Signable::Nf525.
  2. signature validation: while generating the archive, the signature for each record il validated before it is written into the archive, to ensure the signature chain is kept. In case of a failure the GenerateMonthlyFiscalArchiveInteractor emit an event with code 90 in TechicalEventLog to signal invalid signatures. See GenerateMonthlyFiscalArchiveInteractor#_validate_signatures and TechnicalEventLog.track_invalid_signature).
  3. archive signature generation: the archive signature is generated on the archive ZIP file content by the GenerateMonthlyFiscalArchiveInteractor (search for the Hairdressr::Signable::Nf525::Signer). After the signature was generated it is written in the archive record on the database.
    info

    The signature written in the file fiscal_archives.csv inside the archive is a temporary signature that was computed on the database record. The fiscal_archive.csv file cannot possibly contain the signature of the file in which it is contained.

  4. archive signature validation (optional): the archive itself can be validated using the tool we provide for the purpose, i.e. https://fiscal-validator.twpro.twtools.io. More details in the NF525 audit documentation.
Signatures generation components class diagram
Signatures generation components sequence diagram
note

The following diagram shows the signing process using receipt checkouts as an example.

Audit​

See NF525 audit.