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
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.
- Part 9: QUALITY AND DOCUMENTATION REQUIREMENTS. Describes the required documentation about processes and bla bla, mostly PM stuff.
- Part 10: PRODUCT REQUIREMENTS. Describe the functional requirements the application must implement to fulfill the regulation.
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.
- R12, Commercial management data. Describes which data to store for invoices (i.e. business customers).
- R13, Sales and receipt data. Describes which data to store for receipts (i.e. regular customers).
- R19, Technical Event Log (aka JET). Describe the events that need to be logged to fulfill the regulation.
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.
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
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 modelFiscalArchive. 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 inTechincalEventLogs::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.
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 name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | FAC-NID | R12 | |
| customer_id | CLI-NUM / TIE-NUM | R12 | |
| customer_type | CLI-TYPE | R12 | |
| customer_full_name | CLI-RSO / TIE-RSO | R12 | |
| customer_company_name | CLI-RSO / TIE-RSO | R12 | |
| customer_full_address | CLI-ADR / TIE-ADR | R12 | |
| customer_town | CLI-VIL / TIE-VIL | R12 | |
| customer_zip | CLI-CCP / TIE-CCP | R12 | |
| customer_vat_number | CLI-TVA-NUM | R12 | |
| customer_siret_code | CLI-SIR | R12 | |
| customer_country | CLI-PAYS / TIE-PAYS | R12 | |
| number | FAC-NUM | R12 | |
| print_count | For compatibility with receipts.csv. It's value is always 1. | ||
| platform_name | FAC-VER-NAME | R12 | |
| platform_version | FAC-VER | R12 | |
| company_name | SOC-RSO | R12 | |
| address | SOC-ADR | R12 | |
| postal_code | SOC-CCP | R12 | |
| town | SOC-VIL | R12 | |
| country | SOC-PAYS | R12 | |
| siret_code | SOC-SIRET | R12 | |
| naf_code | SOC-NAF | R12 | |
| vat_number | SOC-TVA-NUM | R12 | |
| trade_registration_number | SOC-METIER | R12 | |
| city_registration_number | SOC-GREFFE | R12 | |
| profession_registration_number | SOC-RCS | R12 | |
| creation_user_id | FAC-OPS-NID | R12 | |
| creation_user_full_name | Not documented by NF525. | ||
| cash_register_number | For compatibility with receipts.csv. | ||
| operation_type | For compatibility with receipts.csv. | ||
| document_type | FAC-TYP | R12 | |
| line_items_count | |||
| ticket_status | It always has the value 'standard'. | ||
| invoiced_at | FAC-DAT / FAC-GD | R12 | |
| earned_loyalty_points | |||
| total_loyalty_points | |||
| discount_amount_cents | FAC-RIS-MTT | R12 | |
| net_price_cents | FAC-TOT-MHT | R12 | |
| gross_price_cents | FAC-TOT-TTC-MTN | R12 | |
| vat amount cents | FAC-TAX-TOT-MHT / FAC-TAX-TVA-NID | R12 | |
| vat_A_20.0%_total_amount_cents | FAC-TAX-TVA-TXX | R12 | |
| signature | FAC-SIG | R12 |
invoices_items.csv
| CSV field name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | FAC-LIG-NID | R12 | |
| checkout_id | FAC-LIG-NUM | R12 | |
| position | For compatibility with receipts_items.csv. | ||
| code | FAC-LIG-PRO-NID | R12 | A string that encodes the type of object associated. to the line item and its ID |
| name | FAC-LIG-PRO-LIB | R12 | |
| unit_price_cents | FAC-LIG-PRO-MHT | R12 | |
| quantity | FAC-LIG-PRO-QTE | R12 | |
| discount_amount_cents | FAC-LIG-PRO-REM-TXX | R12 | |
| discount_percentage | FAC-LIG-PRO-REM-TXX | R12 | |
| net_price_cents | FAC-LIG-TOT-MHT | R12 | |
| gross_price_cents | FAC-LIG-TOT-TTC | R12 | |
| vat_code | FAC-LIG-TVA-NID | R12 | |
| vat_percentage | FAC-LIG-TVA-TXX | R12 | |
| created_at | For compatibility with receipts_items.csv. |
receipts.csv
| CSV field name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | ENC-NID / ENC-TIK-ORI-NUM | R13 | |
| customer_id | For compatibility with invoices.csv. | ||
| customer_type | For compatibility with invoices.csv. | ||
| customer_full_name | For compatibility with invoices.csv. | ||
| customer_company_name | For compatibility with invoices.csv. | ||
| customer_full_address | For compatibility with invoices.csv. | ||
| customer_town | For compatibility with invoices.csv. | ||
| customer_zip | For compatibility with invoices.csv. | ||
| customer_vat_number | For compatibility with invoices.csv. | ||
| customer_siret_code | For compatibility with invoices.csv. | ||
| customer_country | For compatibility with invoices.csv. | ||
| number | ENC-TIK-NUM | R13 | |
| print_count | ENC-TIK-PRN-NBR | R13 | |
| platform_name | ENC-TIK-LOG | R13 | |
| platform_version | ENC-TIK-TAG-VER | R13 | |
| company_name | ENC-TIK-SOC-ETS | R13 | |
| address | ENC-TIK-SOC-ADR | R13 | |
| postal_code | ENC-TIK-SOC-CCP | R13 | |
| town | ENC-TIK-SOC-VIL | R13 | |
| country | ENC-TIK-SOC-PAY | R13 | |
| siret_code | ENC-TIK-SOC-SIR | R13 | |
| naf_code | ENC-TIK-SOC-NAF | R13 | |
| vat_number | ENC-TIK-SOC-TVA | R13 | |
| trade_registration_number | For compatibility with invoices.csv. | ||
| city_registration_number | Used only for invoices.csv. | ||
| profession_registration_number | Used only for invoices.csv. | ||
| creation_user_id | Used only for invoices.csv. | ||
| creation_user_full_name | Not documented by NF525. | ||
| cash_register_number | ENC-TIK-CAI-NID | R13 | |
| operation_type | ENC-OPE-TYP | R13 | |
| document_type | ENC-TIK-DOC-TYP | R13 | |
| line_items_count | ENC-TIK-LIG-NBR | R13 | |
| ticket_status | It always has the value 'standard'. | ||
| invoiced_at | ENC-TIK-HOR-GDH | R13 | |
| earned_loyalty_points | ENC-TIK-FID-PTS | R13 | |
| total_loyalty_points | ENC-TIK-FID-PTS-SOL | R13 | |
| discount_amount_cents | ENC-TIK-REM-MTN | R13 | |
| net_price_cents | ENC-TIK-TOT-MHT | R13 | |
| gross_price_cents | ENC-TIK-TOT-TTC | R13 | |
| vat amount cents | ENC-TIK-TVA-MTN / ENC-TIK-TVA-NID / ENC-TIK-TVA-TXX | R13 | |
| signature | ENC-TIK-TAG-SIG | R13 | |
| vat_A_20.0%_taxable_amount_cents | ENC-TIK-TOT-MHT | R13 | |
| vat_A_20.0%_total_amount_cents |
recepits_items.csv
| CSV field name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | ENC-NID | R13 | |
| checkout_id | ENC-TIK-ORI-NUM | R13 | |
| position | ENC-TIK-LIG-NUM | R13 | |
| code | ENC-TIK-LIG-PRO-NID | R13 | A string that encodes the type of object associated to the line item and its ID. |
| name | ENC-TIK-LIG-PRO-LIB | R13 | |
| unit_price_cents | ENC-TIK-LIG-PRO-ttc | R13 | |
| quantity | ENC-TIK-LIG-PRO-QTE | R13 | |
| discount_amount_cents | ENC-TIK-LIG-REM-TOT | R13 | |
| discount_percentage | ENC-TIK-LIG-REM-TXX | R13 | |
| net_price_cents | ENC-TIK-LIG-TOT-MHT | R13 | |
| gross_price_cents | ENC-TIK-LIG-TOT-TTC | R13 | |
| vat_code | ENC-TIK-LIG-TAX-NID | R13 | |
| vat_percentage | ENC-TIK-LIG-TAX-TXX | R13 | |
| created_at | ENC-TIK-LIG-HOR-GDH | R13 |
checkout_payment_methods.csv
| CSV field name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| checkout_id | ENC-NID | R13 | |
| original_document_number | ENC-TIK-ORI-NUM | R13 | |
| original_document_type | Undocumented by NF525. It can be either invoice or receipt. | ||
| payment_method | ENC-TIK-REG-MOD-LIB | R13 | |
| amount_cents | ENC-TIK-REG-MTN | R13 | |
| operation_type | Undocumented by NF525. It can be either cancellation or sell. | ||
| creation_user_id | ENC-TIK-REG-USR-NID | R13 | |
| created_at | ENC-TIK-REG-HOR-GDH | R13 |
checkout_reprints.csv
NF525 describe invoices and receipts reprints separately. We are using the same file for both.
| CSV field name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | FAC-DUP-NID / ENC-DUP-NID | R12 / R13 | |
| original_document_number | FAC-DUP-ORI-NUM / ENC-DUP-ORI-NUM | R12 / R13 | |
| original_document_type | FAC-DUP-TYP / ENC-DUP-TYP | R12 / R13 | |
| print_count | FAC-DUP-PRN-NUM / ENC-DUP-PRN-NUM | R12 / R13 | |
| platform_version | FAC-DUP-VER / ENC-DUP-VER | R12 / R13 | |
| reason | ENC-SIG-MOTIF | R13 | Used only for receipts. |
| creation_user_id | FAC-DUP-OPS-NID / ENC-DUP-OPS-NID | R12 / R13 | |
| created_at | FAC-DUP-HOR-GDH / ENC-DUP-HOR-GDH | R12 / R13 | |
| signature | FAC-DUP-SIG / ENC-DUP-TAG-SIG | R12 / R13 |
fiscal_summaries.csv
Also known as "grand totals" in NF525 terms.
| CSV field name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | FAC-GTP-ORI-ID/ENC-GTP-ORI-NUM | R12 / R13 | |
| summary_type | Not documented by NF525. | ||
| unique_id | FAC-GTP-ORI-NID/FAC-GTP-ORI-NID | R12 / R13 | |
| amount_cents | FAC-GTP-TTC/ENC-GTP-TTC | R12 / R13 | |
| incremental_amount_cents | FAC-GTP-PER-TTC/ENC-GTP-PER-TTC | R12 / R13 | |
| incremental_absolute_amount_cents | FAC-GTP-PER-TTC-ABS/ENC-GTP-PER-TTC-ABS | R12 / R13 | |
| vat_amounts | FAC-GTP-MTN-TVA-TTC/ENC-GTP-MTN-TVA-TTC | R12 / R13 | |
| created_at | FAC-GTP-HOR-GDH/ENC-GTP-HOR-GDH | R12 / R13 | |
| signature | FAC-GTP-TAG-SIG/ENC-GTP-TAG-SIG | R12 / R13 |
fiscal_archives.csv
Only the predecessor signature fields are documented by NF525.
Contains a single record of the currently generated fiscal archive.
| CSV field name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | |||
| archive_type | |||
| file_name | |||
| digest | |||
| created_at | |||
| predecessor_signature | TAG-ARC-SIG | R12 / R13 | |
| predecessor_signature_present | TAG-ARC-OEN | R12 / R13 | |
| signature | This 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 name | FIDELE label | NF525 reference | Notes |
|---|---|---|---|
| id | JET-NID | ||
| code | JET-EVT-NUM | ||
| name | JET-EVT-LIB | ||
| creation_user_id | JET-OPE-NID | ||
| description | JET-GDH | ||
| created_at | JET-INF | ||
| signature | JET-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:
- signature generation: performed by the module
Hairdressr::Signable, in case of French venues it delegates toHairdressr::Signable::Nf525. - 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
GenerateMonthlyFiscalArchiveInteractoremit an event with code 90 inTechicalEventLogto signal invalid signatures. SeeGenerateMonthlyFiscalArchiveInteractor#_validate_signaturesandTechnicalEventLog.track_invalid_signature). - archive signature generation: the archive signature is generated on the archive ZIP file content by the
GenerateMonthlyFiscalArchiveInteractor(search for theHairdressr::Signable::Nf525::Signer). After the signature was generated it is written in the archive record on the database.infoThe signature written in the file
fiscal_archives.csvinside the archive is a temporary signature that was computed on the database record. Thefiscal_archive.csvfile cannot possibly contain the signature of the file in which it is contained. - 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
The following diagram shows the signing process using receipt checkouts as an example.
Audit
See NF525 audit.