Every Turkish pension provider has a recapture engine. Every one of them, on paper, calculates the correct amount of state contribution (devlet katkısı) and tax deduction to claw back when a participant exits their BES contract before the qualifying threshold. The math is not the problem. The problem is that when a participant lawyer sends a written objection three years after the exit, nobody can reconstruct why the number was what it was.
This is the single most legally exposed computation in a Turkish pension book, and most data teams do not treat it that way.
What the Regulation Actually Requires
When a participant leaves BES before completing ten years, or before reaching age 56, the system must recapture:
- The 25% state contribution paid on their contributions, subject to a vesting schedule (15% vested after 3 years, 35% after 6, 60% after 10, 100% at retirement eligibility)
- Withholding tax on the earnings portion, at rates that depend on the exit reason and tenure
- In employer-sponsored plans, the additional employer contribution portion under its own vesting rules
Each of those numbers is not a single calculation. It is a function applied across every contribution the participant ever made, using the state contribution rate, matching rules, and tax regime that were in force on the date of each individual contribution. Not today's rules. Not the rules at exit. The rules on the payment date.
That is where the pipelines quietly break.
The Storage Mistake Nearly Every Provider Made
Around 2013 to 2016, when BES volumes exploded after the state contribution was introduced, most insurers built their contribution ledgers to store the result of the state contribution calculation, not the inputs. A typical row looks like this:
contribution_idparticipant_idcontribution_amountstate_contribution_amountbooking_date
That is enough to reconcile with the clearing house. It is not enough to defend a recapture in front of a regulator or a court.
What is missing:
- The state contribution rate applied (25%, but was it capped that month against annual gross minimum wage? Which minimum wage figure?)
- The annual cap status at the moment of that contribution (was the participant already at 25% of gross minimum wage cumulative for that year?)
- The effective legal reference — which version of the regulation and which circular
- The vesting clock anchor date, which for transferred contracts is not the same as the contribution date
- The employer's matching rule version for that specific payroll period, if applicable
When the recapture engine runs, it re-derives all of this from current reference tables. That works, until reference tables change, and they change every year.
The Failure Pattern in Production
Every portfolio I have audited in the last decade shows the same three defects, in the same order of severity.
First, the contribution history table has been re-keyed at least once during a core system migration, and the migration collapsed same-day contributions into aggregate rows. This destroys the per-payment cap tracking. When you recompute recapture on the aggregated row, you get a number that is off by anywhere from 40 TL to 400 TL per participant. Small individually, catastrophic across a book of 800,000 participants.
Second, transferred contracts (participants who moved from another provider) inherit a vesting anchor that was communicated by the ceding company in a transfer file, but that anchor is stored as a single date on the participant record — not on the contribution rows. When the participant later transfers out again, or exits, the recapture uses whichever anchor is current, not the one that was legally binding at the time of each contribution vesting event.
Third, tax withholding at exit is calculated using the current tax rate table, but the earnings portion being taxed accrued over years during which withholding rates and the definition of the taxable base changed. Nobody stored the yearly earnings decomposition, so the calculation implicitly assumes all gains occurred under today's rules.
The recapture engine gives a clean, deterministic number. That number is legally indefensible because the data underneath it is a reconstruction, not a record.
What Auditable Recapture Data Looks Like
The fix is not clever code. It is boring, disciplined event storage. For every contribution, every state contribution accrual, every vesting tick, and every reference rate change, the pipeline needs to store:
- The full input vector used at the time of the original calculation
- The version identifier of the reference table consulted
- The rule engine version that produced the output
- An immutable event timestamp separate from the business date
In practice this means treating the contribution ledger as an append-only event stream, not a mutable state table. Every recalculation, every correction, every backdated adjustment is a new event with a reason code, not an UPDATE on an existing row.
The SGK and Hazine do not care that your recapture logic is elegant. They care whether, on demand, you can show that participant Ayşe Yılmaz's 340.75 TL recapture in March 2024 was computed using the state contribution rate, cap status, vesting schedule, and tax regime that were legally in force for each of her 87 historical contributions between 2015 and 2024. If you cannot produce that reconstruction from stored inputs — not from a re-run of today's engine against today's reference tables — you do not have a defensible calculation. You have a plausible one.
Where This Bites
The exposure is not theoretical. Three places it materializes:
- Individual participant disputes: A lawyer requests the calculation basis under KVKK data access rights. If the response is a re-derivation, and the re-derivation differs from what was actually deducted at exit, the provider owes the difference plus interest, and the participant has cause for a complaint filing.
- Regulatory sampling: Hazine sample audits pick 50 to 200 exits and ask for full calculation traceability. Reconstruction rather than reproduction fails this test immediately.
- Portfolio transfers and M&A due diligence: The acquiring insurer's actuaries will price the book assuming a percentage of historical recaptures are indefensible. That discount is real money.
The recapture engine is almost never the problem. In ten years of these projects, I have found engine bugs perhaps twice. I have found unreproducible input data every single time.
Fix the ledger, not the calculator.