The moving-average cost method for crypto KESt in Austria
Austria's gleitender Durchschnittspreis is struck per wallet, not across all a user's holdings. Here's how the moving-average basis actually works for KESt.

If you're withholding Austrian KESt on crypto, the rate is the easy part. The hard part is the number you apply it to. The gain turns entirely on cost basis, and Austria won't let you pick a method. It mandates the moving-average price, the gleitender Durchschnittspreis. One detail decides whether your engine is right from the very start: the average is struck per wallet, not across everything a user holds.
What the moving average is
The gleitender Durchschnittspreis is a running average cost for a given crypto asset. Buy more of that asset and the new purchase blends into a fresh average. When the user later disposes, the gain gets measured against that average, not against any particular lot. It's the same continuous-average logic Austria uses for securities. You never choose which coins were sold; every sale happens at the running average.
Per wallet, not per person
This is where a naive build goes wrong. The average isn't computed across the whole of a user's holdings. It's computed per wallet, meaning per address or custodial account. Hold the same asset in two wallets and you've got two separate moving averages, tracked independently. Pool everything a person owns into one universal average and you're not doing the Austrian method, you're producing the wrong gain.
For a provider, this is the more workable rule. You compute the average inside each account you actually custody, from data you already hold, instead of reaching into wallets you can't see. You're not expected to fold a user's external self-custody into your average. And you shouldn't.
What a transfer does
Moving crypto between a user's own wallets isn't a disposal and realises no gain. It does carry cost, though. The basis on the moved coins travels to the receiving wallet and folds into that wallet's running average. Transfers trigger no tax, yet they reshape the per-wallet averages on both sides, and your records have to show it.
Why it's still not trivial
Per-wallet beats universal pooling, but it's not free. Inside each wallet the average has to be recomputed on every acquisition, in the right order, in euro, and only realising events may lower it. And remember, crypto-to-crypto swaps are tax-neutral in Austria, so a swap inside a wallet isn't a disposal and must not disturb the gain the way a sale to fiat does. Get the ordering or the event classification wrong in one wallet and every withheld amount after it drifts.
Getting it right at source
Withholding happens at the moment of disposal, and it's final under Endbesteuerung. There's no annual reconciliation to catch a mistake later, so the per-wallet average has to be right in real time. Our tax withholding solution keeps the gleitender Durchschnittspreis per wallet per asset across the accounts you custody, treats swaps as tax-neutral, and carries basis correctly on internal transfers. The gain you withhold on is the gain Austria actually recognises. It shares a data layer with our CARF and DAC8 reporting, and the Austrian Federal Ministry of Finance publishes the underlying rules.



