Tax module (DE / AT / CH)

WheelTrading computes the tax view of your wheel pipeline fully automatically from your IBKR/Lynx FlexQuery XML. The output is a non-binding estimate and does not replace tax advice, but it gives you an up-to-date view for reserves and quarterly prepayments.

Hub page: Taxes in the BottomTabBar → /steuern.

What does the module compute?

Each trade or dividend row turns into one tax event (TaxEvent), gets dropped into one of four buckets and is converted to EUR using the FX rate from FlexQuery:

BucketContents
Option premiumsPremiums collected (expiration + buy-back)
DividendsCash dividends; creditable withholding tax tracked separately
StocksRealised stock P/L (FIFO)
OtherDebit interest, fees, leftovers

The engine then derives the estimated tax liability per year.

Countries

Germany (DE)

  • Capital gains tax 25 % on net gains after netting
  • Sparerpauschbetrag 1,000 EUR (single) is deducted before KapSt
  • Solidarity surcharge 5.5 % on top of KapSt
  • Church tax optional 8 % (BY/BW) or 9 % (other states) on KapSt
  • Creditable withholding tax reduces KapSt directly (never below 0)

Example: 2,000 EUR option premiums, no church tax → 1,000 EUR taxable base → 250 EUR KapSt + 13.75 EUR Soli = 263.75 EUR.

Austria (AT)

  • Flat 27.5 % KESt on gains (premiums, dividends, stocks)
  • No solidarity surcharge, no church tax in the model
  • No tax-free allowance

Switzerland (CH)

  • Private capital gains are generally tax-free in Switzerland.
  • The module therefore returns 0 EUR. Dividends are handled via income

tax — this is not modelled today.

Change settings any time via Taxes → Country & church tax.

FlexQuery import

  1. Create an Activity FlexQuery in Lynx/IBKR (or reuse the one you

already have — see Flex import setup).

  1. Download the XML.
  2. In the UI: Taxes → FlexQuery import → upload (or drag & drop).

The import is idempotent: existing events (same tradeID and type) are skipped, new ones inserted, affected tax years are recomputed. You can upload the same XML as often as you like.

The result shows:

  • Parsed — rows in the XML we considered tax-relevant
  • New — events actually inserted
  • Already present — duplicates skipped
  • Updated tax years — years whose summary was recomputed

Detail views + CSV export

Each of the four bucket tiles opens a detail page with every event of the year. Top-right offers a CSV export (semicolon-separated, UTF-8 with BOM, Excel-friendly) you can hand to your tax advisor.

Limits & disclaimer

  • The calculation is an estimate and does not replace tax advice.
  • Complex situations (German 20k cap on derivative losses, joint

assessment, foreign broker netting) are currently not modelled.

  • For cross-border cases the country selected under *Country & church

tax* wins.

  • FX conversion uses the FlexQuery rate on the trade date.
  • Spin-offs (e.g. VSNT from CMCSA) are booked at cost basis 0

according to German sec. 20(4a) EStG - requires the Corporate Actions section in your Flex query (see Flex import setup, section 2b). Without that section the module incorrectly uses IBKR's pro-rated cost basis and shows a negative G/L on sale.

When should I refresh?

At least once per quarter before your KapESt prepayment, and again at year end to reconcile against the broker tax report.