UPA File Generator
Build UPA (Uniforme Pensioenaangifte) test files for Dutch pension administrations. Set the employer and the schemes, choose the life events you want in the population, decide which optional elements to fill, leave empty or omit, and download one XML file per declaration period plus a participant overview for your CRM. Up to 10,000 employments per period. Everything runs in your browser and all data is fictional.
CdRdnEindArbov code 31 was removed and codes 32, 33 and 34 were added.
The franchise and the maximum pensionable salary are round placeholders, not legal figures. Replace them with the values from your own scheme before you use the premium amounts.
UPA has no element for the scheme type. This choice only sets the defaults below and is recorded in the participant overview.
The one to feed into another tool, a script, pandas or R. No byte order mark and quotes only where a value truly needs them, because an importer that does not strip quotes would otherwise look for a column called BSN and find one called "BSN" instead. A Dutch or German Excel shows it as one column unless you import it through Data, From Text.
Press Generate to build the files.
UPA test files for Dutch pension administrations
UPA (Uniforme Pensioenaangifte) is the message Dutch employers send to a pension provider every payroll period. It carries the employment, the wage components and the pension scheme data for every employee, and it also carries civil status, partner name and date of death, so most life events reach the pension administration through this file.
This generator produces a whole run at once: one XML per declaration period, with the same population carried across the periods so joiners, leavers, deaths and civil status changes land in the period where they belong. Element names and code lists follow the Pensioenfederatie and SIVI product description. Every BSN passes the elfproef and every IBAN passes the mod-97 check, so a clean file gets past the first line of validation.
Edge cases are the point of a test file. Long surnames, accented characters, name prefixes, house number additions and addresses abroad break letter templates and fixed width columns. The deliberate defects do the opposite: they break one employment on purpose so you can see what the receiving system says about it.
Everything runs in your browser and nothing is uploaded, so the tool works on a locked down corporate laptop. All generated data is fictional.
How the UPA File Generator Works
- 01Fill in the employer header: name, payroll tax number (LhNr), affiliation number and the payroll package
- 02Pick the scheme type and set RegKnmrk and RegVrnt for the base scheme, plus a supplementary scheme or social fund if you need them
- 03Choose the start period, how many consecutive periods you want, and whether to split the result into smaller files
- 04Set the population size and the life event mix, or pin specific people by hand or from a CSV
- 05Set each optional element to fill, empty or omit, and switch on any deliberate defects
- 06Pick the participant overview format, press Generate and download the ZIP with one XML per period plus that overview
Building a UPA Test Set That Actually Finds Defects
Start small and clean: two or three periods, about 25 people, no defects. Once the message is accepted, raise the share of unusual names and foreign addresses, add the life events you care about, and extend the run to twelve periods so the year boundary and the holiday allowance peak are covered. Then make a second set with deliberate defects switched on and check that every one of them is rejected with a message you can act on. Write down the seed value: it makes both sets reproducible, so a defect found today can be recreated exactly next week.
When to Use the UPA File Generator
Use it when you need test data for a pension administration, a payroll to pension provider integration, a Wtp or FPR migration rehearsal, life event testing across a chain of systems, correspondence and letter testing, or a volume test that needs thousands of employments across many periods.
Common Use Cases
- Life event testing: joiners, leavers, re-employment, death in service, marriage, divorce, unpaid leave, sickness and early IVA in one population
- Chain testing: feed a run of consecutive periods through payroll, pension core and CRM in one go
- Migration rehearsal: build a population that spans a full year to check the year boundary and the annual recalculation
- Correspondence testing: long names and foreign addresses show how letter templates and address labels hold up
- Error handling: inject a deliberate defect and check the rejection message the provider returns
- Volume testing: up to 10,000 employments per period across as many as 24 periods, split into files of any size
- Version testing: generate the same population in UPA 2024, 2025 and 2026 to see how the receiving system handles the element and code list differences
Expert Tips
- Note the seed value in your test report, so the exact same file set can be regenerated later
- Keep the first run clean, then make a second run with defects switched on rather than mixing the two
- Set the holiday allowance period to the month your payroll pays it, so the cumulative maximum is actually reached
- Use one file per employment when a test needs a single letter or notification to be traceable to one person
- Feed the participant CSV back in through Import to pin the same population for a repeat run. The importer detects comma, semicolon and tab on its own
- Switch the schema version once your settings are set: the field list greys out anything the selected version does not have
Frequently Asked Questions
- UPA stands for Uniforme Pensioenaangifte, the Dutch standard for the periodic message an employer sends to a pension provider. It contains one block per employment with the person's details, the income period, the wage components and the pension scheme data. It is owned by the Pensioenfederatie and managed by SIVI, and nearly every Dutch pension administrator uses it.
- Many. A UPA message covers one administrative unit for one declaration period and normally holds every employee of that unit, so the default is one file per period with the whole population in it. You can override that: split into files of a fixed size, or produce one file per employment when you want a single letter or notification to be unambiguous.
- Up to 10,000 per period here. The default is 100, which is the right size while you are still checking that the message is accepted. Above a few thousand the live preview switches off and you press Generate when your settings are ready, because building that much XML takes a moment.
- Partly. The message holds CdBurgSt and DtIngBurgSt for civil status, DatOvl for a date of death, and DatEind with CdRdnEindArbov for the end of an employment, so those events do reach the pension administration through UPA. The partner name fields and the bank account number were removed from the standard in UPA 2022, so partner details have to come from another source. The generator writes what the standard still holds and keeps the rest in the participant overview.
- Less than you might expect, because the big clean-up happened in 2022 when the partner group, RekNr, ExtrSal and OpgRchtExtrSal were removed and TaalVoorkeur and IndEindDln were added. Across the three versions offered here there are two differences that matter: VerlofUReg was added in UPA 2025, so it is not written when you pick 2024, and the CdRdnEindArbov code list changed in UPA 2026, which dropped code 31 and added 32 for retirement, 33 for death and 34. The tool applies both automatically and greys out any element that does not exist in the version you selected.
- Plain comma CSV is the default and is the right choice when another tool, a script, pandas or R has to read the file. If you want to open it in Excel, pick the comma variant with the sep= line: it is still comma separated but Excel splits the columns correctly whatever language version you run. Semicolon and tab are there for tools that ask for them, and the Excel workbook removes the question entirely because a .xlsx has no separator or encoding to get wrong. Every text format is written as UTF-8 with a byte order mark, so accented names survive.
- The scheme type selector sets the defaults, but it is not written into the XML. UPA identifies a scheme by RegKnmrk and RegVrnt only, and the pension provider knows which scheme type belongs to those codes. The choice you make is recorded in the participant overview so your test data stays self-explanatory.
- No. They are randomly generated numbers that satisfy the elfproef, which is what validation software checks. They are not issued to any person. The deliberate defect option can also produce a BSN that fails the elfproef on purpose.
- Omit leaves the element out of the XML entirely. Empty writes the element with no content, for example a Voorl element with nothing between the tags. Validation code often handles those two cases differently, and the second one is the one that tends to be forgotten, so both are worth testing.
- Send a new full declaration for the same period with a later creation date. UPA has no separate mutation message: each period carries the current position, and the provider treats the most recently created declaration as the valid one. A supplementary declaration (AanvullendeAangifte) is also available for adding only the employees you want to top up.
- The same people as the XML, plus everything that is useful in a CRM but not always in the message: civil status, partner name and BSN, whether the partner is in the same fund, another fund or has no pension at all, ex-partner, number of children, IBAN, document number, the life event assigned to each person and any deliberate defect. You can also feed that CSV back in to pin the same people again.
- No. Generation runs entirely in JavaScript on your own machine and nothing is sent to a server. The tool also works offline once the page has loaded.
What is a UPA file?→
Does one file contain one person or many?→
How many employments can one file hold?→
Can UPA carry life events like marriage or death?→
What changed between UPA 2024, 2025 and 2026?→
Which participant overview format should I pick?→
Where do I choose between a flexible and a solidary scheme?→
Are the generated BSN numbers real?→
What is the difference between empty and omit?→
Can I correct an earlier period?→
What is in the participant CSV?→
Does my data leave the browser?→
Related tools
12 suggested- 01JSON Formatter & Validator - Instant ResultsFormat, validate, and minify JSON with instant error highlighting. Pinpoints syntax errors. Free, private, browser-based.
- 02JSON to CSV Converter - Export InstantlyConvert JSON arrays to CSV format with automatic header detection. Download as CSV file. Free, browser-based - no upload needed.
- 03CSV to JSON Converter - Auto-Detect FormatConvert CSV data to JSON format instantly. Auto-detects delimiters and headers. Free, private, browser-based - no upload needed.
- 04JSON to XML Converter - Instant & FreeConvert JSON data to XML format with proper indentation and escaping. Free, browser-based converter - no upload needed.
- 05JSON Tree Viewer - Expandable VisualizerVisualize JSON data as an expandable, collapsible tree. Search keys and values, copy JSON paths. Free online JSON explorer.
- 06JSON Schema Validator - Free Online ToolValidate JSON data against a JSON Schema instantly. Perfect for AI function calling and API validation. Free, browser-based.
- 07Regex Tester - Live Matching & HighlightingTest regular expressions with live matching and highlighting. Supports all flags and capture groups. Free online regex debugger.
- 08Base64 Encoder & Decoder - Free OnlineEncode text to Base64 or decode Base64 back to text instantly. Full Unicode support. Free, private, browser-based.
- 09URL Encoder & Decoder - Free Online ToolEncode or decode URLs and special characters for web use. Instant results, browser-based. Essential tool for web developers.
- 10HTML Entity Encoder & Decoder - FreeEncode special characters to HTML entities or decode entities back to text. Common entities reference included. Free online tool.
- 11JWT Decoder - Inspect Tokens InstantlyDecode and inspect JSON Web Tokens instantly. View header, payload, and expiration. Free, private - your tokens stay in your browser.
- 12Cron Expression Parser - Human-ReadableParse and explain cron expressions in plain English. See next run times and validate your schedule. Free online cron debugger.