Produce and reconcile a SAF-T or tax audit file from your ERP
A tax audit file is a structured export of your accounting data: the chart of accounts, customers and suppliers, journal entries and, in some countries, invoices, stock or fixed assets. Some countries require it on a fixed schedule. Others ask for it only during a tax audit. In both cases the authority expects the file to agree with your books. A file that validates against the schema but does not reconcile to the trial balance is not finished.
Part 1 of 3 in the series Audit files and audits. Next: Respond to a tax audit data request: runbook and evidence index.
This guide covers the work that sits around the export button. You confirm which file applies, prepare the master data, generate a test file, tie it out to the ledger and log every validation error until it is closed. It does not tell you which country requires what. Use SAF-T and audit files for that, and open the country row for the official source.
Confirm which file applies
Start from the requirement, not from the ERP menu. The table below is built from this site's audit-file data. It separates files that are submitted periodically from files that are produced on request. That distinction drives everything else: a periodic file needs a monthly or annual production routine; an on-request file needs a tested capability you can run quickly when an auditor asks.
For each legal entity, record:
- the file or format named by the authority, and the schema version you will produce;
- whether it is periodic or on request, and the period it covers (month, quarter, year);
- the sections in scope, such as general ledger, receivables, payables, invoices, stock or assets;
- the channel: portal upload, a filing system, or delivery to an auditor;
- who signs off the file before it leaves the company.
Where the site marks a row as unverified, treat the frequency and scope as a lead and confirm them in the authority's current notice before you plan the work.
Check what your ERP can produce
Open the ERP comparison on the SAF-T page for your country and product. A documented export is a starting point, not proof that your configuration will produce a valid file. Ask three questions:
- Does the export come from the standard product, a country localization, an add-on or a partner tool?
- Which schema version does it produce, and who updates it when the authority publishes a new one?
- Which sections does it cover? Some exports cover the general ledger but not stock or assets.
If you use a separate tool, decide where the data is extracted, who owns the mapping and how a change in the ERP reaches that tool. See verify ERP localization support for the evidence to collect.
Prepare the master data
Most validation errors come from master data, not from the export logic. Before the first test file, check:
- Chart of accounts. Every posting account carries the mapping the schema asks for, such as a standard account code or account type. New accounts cannot be created without it.
- Customers and suppliers. Tax identifiers, country codes and addresses are complete and in the expected format. One-time and sundry accounts have a defined treatment.
- Tax codes. Each tax code maps to the code list in the schema. Retired codes still map, because historical entries use them.
- Journals and document types. Every journal and source document type maps to a value the schema accepts.
- Company data. Registration numbers, fiscal year, currency and contact fields are filled.
The master data readiness guide gives a wider checklist.
Generate a test file and tie it out
Produce a file for a closed period first. Then reconcile it at three levels. All three must agree before you trust the file.
- Opening balances. The opening balance of each account in the file equals the closing trial balance of the previous period.
- Movements. Total debits and credits in the file equal the period's debits and credits in the ledger, per account and in total. Check the entry count too.
- Closing balances. Opening balance plus movements equals the closing balance in the file and in the trial balance.
Also compare the customer and supplier sections to the receivables and payables subledgers, and any invoice section to the sales and purchase journals. A difference at this level usually points to entries posted outside the subledger, such as manual journals to a control account.
Worked example: one month tied out
A company produces its first test file for March. The amounts are illustrative round numbers for the example. During March it books one sale and one supplier payment.
| Step | Account | Debit | Credit | Note |
|---|---|---|---|---|
| Sale on credit | Trade receivables | 1,250.00 | ||
| Sales revenue | 1,000.00 | |||
| Output VAT | 250.00 | example rate | ||
| Supplier payment | Trade payables | 600.00 | ||
| Bank | 600.00 |
The tie-out sheet compares the file to the trial balance:
| Account | Opening (ledger) | Opening (file) | Movements (file) | Closing (file) | Closing (ledger) | Difference |
|---|---|---|---|---|---|---|
| Trade receivables | 4,000 Dr | 4,000 Dr | +1,250 | 5,250 Dr | 5,250 Dr | 0 |
| Sales revenue | 0 | 0 | +1,000 Cr | 1,000 Cr | 1,000 Cr | 0 |
| Output VAT | 0 | 0 | +250 Cr | 250 Cr | 250 Cr | 0 |
| Trade payables | 2,500 Cr | 2,500 Cr | −600 | 1,900 Cr | 1,900 Cr | 0 |
| Bank | 3,000 Dr | 3,000 Dr | −600 | 2,400 Dr | 2,400 Dr | 0 |
| Total debits / credits in file | 1,850 / 1,850 | 0 |
Now suppose the first file showed bank closing at 3,000 Dr. The movement total in the file was 1,250, not 1,850. The supplier payment had been posted in a journal that was not mapped to a schema journal type, so the export skipped it. The fix is in the mapping, not in the file. You correct the journal mapping, regenerate, and record the error in the log below.
Keep a validation-error log
Log every error from the schema validator, the authority's checker or your own tie-out. Close an error only when a regenerated file passes.
| # | Source | Message or difference | Root cause | Fix (where) | Owner | Retest file | Closed |
|---|---|---|---|---|---|---|---|
| 1 | Tie-out | Movements 600 short | Payment journal not mapped | Journal mapping | ERP team | March v2 | Yes |
| 2 | Validator | Missing tax ID on supplier | Supplier master incomplete | Supplier master | AP lead | March v2 | Yes |
| 3 | Validator | Unknown tax code | Retired code not mapped | Tax-code mapping | Tax owner | March v3 | Open |
Patterns in this log tell you which controls to add. Repeated master-data errors mean the creation workflow needs required fields, not that someone should fix the file by hand.
Run it as a routine
For a periodic file, add production, tie-out and sign-off to the close calendar. For an on-request file, regenerate a test file after every ERP upgrade, new legal entity or change to the chart of accounts, and keep the last good file with its tie-out. Keep the submitted file, the tie-out, the validator result and any receipt together. Never edit an exported file by hand; fix the source and regenerate.
If an auditor asks for the file, the tax audit data request runbook covers the response.
Worksheet
Use the audit file readiness and tie-out worksheet for each entity and file.
Worksheet: Audit file readiness and tie-out worksheet
Copy this worksheet for each case. It records decisions and evidence; it does not determine the tax or legal treatment.
Show the worksheet
Use with the SAF-T and audit file guide. One copy per legal entity and file.
Requirement
- Legal entity and country:
- File name and schema version (from the authority's notice):
- Periodic or on request; period covered:
- Sections in scope (ledger, receivables, payables, invoices, stock, assets):
- Channel and sign-off owner:
- Row on this site and its status (verified or unverified):
Readiness
- ☐ Export source confirmed (standard, localization, add-on or separate tool)
- ☐ Owner of schema updates named
- ☐ Every posting account mapped to the schema's account fields
- ☐ Customers and suppliers have tax IDs, country codes and addresses
- ☐ Every tax code, including retired codes, mapped
- ☐ Every journal and document type mapped
- ☐ Company registration data, fiscal year and currency filled
Tie-out (per test period)
| Check | Ledger | File | Difference | Explained by |
|---|---|---|---|---|
| Opening balances (total and per account) | ||||
| Total debits | ||||
| Total credits | ||||
| Entry count | ||||
| Closing balances | ||||
| Receivables subledger vs customer section | ||||
| Payables subledger vs supplier section |
Validation-error log
| # | Source | Message or difference | Root cause | Fix (where) | Owner | Retest file | Closed |
|---|
Sign-off
- File, tie-out and validator result stored together:
- Approved by and date:
Sources checked: 27 October 2026. Country scope, frequency and format come from the linked rows on this site, each with its official source. This guide does not restate any national schema; use the authority's current technical documentation.
Related guides and data
Part 1 of 3 in the series Audit files and audits. Next: Respond to a tax audit data request: runbook and evidence index.
- Respond to a tax audit data request: runbook and evidence index
- Map ERP tax codes to VAT return boxes and file the periodic return
- Chart of accounts, statutory journals and document numbering for a new country
- How to replace an ERP without losing tax-reporting history
Data on this site: SAF-T and audit files by country · ERP profiles and country support
In VAT and tax: previous How to reconcile European e-commerce sales across OSS, IOSS and marketplaces · next Map ERP tax codes to VAT return boxes and file the periodic return · Guides by task · All guides
Vendor documentation is cited only as an example of the level of evidence to ask for; it is not a recommendation or a ranking. This guide is general information, not tax or legal advice. Checked 2026-10-27.
Related: Glossary – abbreviations and terms used in these guides (SAF-T, Peppol, CTC, EN 16931, IFRS and more).
Page last updated: · Markdown version · Suggest a correction