Creating A New Tax Feature On An Investment App
- Priank Ravichandar
- May 18
- 13 min read
Updated: Jun 9
Designing a process description for a new tax feature on a German investment app that allows users to claim additional tax exemptions on capital gains.

Context
Investment platforms must withhold capital gains taxes and only pay out income to clients after taxes. Clients (users) can use tax allowances to maximize tax savings, helping them retain more of their investment earnings. Currently, clients can only claim tax exemptions on capital gains up to €1,000 limit. We want to introduce a new process for an additional tax allowance – the non-assessment certificate (NV-Bescheinigung). This would allow certain clients to claim additional tax exemptions beyond the €1,000 limit.
Stakeholder FAQs
Here is some information you may need for context before we dive into the new process:
Capital Gains (Kapitalerträge)
1. How do we determine if a client has made a capital gain?
Each time the client sells a financial investment, they either make a profit or a loss. The client only makes a capital gain when the total of the profits and losses across all sales results in a net profit. When a capital gain occurs, taxes may need to be withheld before depositing funds into the client's account.
For example, suppose the client’s sales result in the following outcomes: a profit of €1,000 from selling stocks in Company A, a profit of €2,000 from selling stocks in Company B; and a loss of €1,000 from selling stocks in Company C. The net profit in this case would be (€1,000 + €2,000 - €1,000) → €2,000. Therefore, the client has made a capital gain of €2,000, and taxes may need to be withheld on this gain.
2. What is the YTD capital gain?
YTD (Year-To-Date) capital gains represent the total returns the client has made from selling their investments during the current year. It’s important to track this amount because certain tax exemptions can only be applied if the client’s YTD capital gains have not exceeded specific thresholds.
Capital Gains Taxes
3. How are capital gains taxed?
Capital gains are subject to a flat tax rate of 25% plus a 5.5% solidarity surcharge (plus church tax if applicable) for individual investors → Capital Gains Tax = Withholding Tax (25% of Capital Gain) + Solidarity Surcharge (5.5% of Withholding Tax) + Church Tax (if applicable).
4. When are capital gains taxes withheld?
Taxes are withheld at the source where capital gains are and paid to the tax office. Therefore, when a client sells financial investments (stocks, ETFs, etc.), the app must withhold taxes before depositing the payment to the client’s account.
5. How can clients claim a capital gains tax reduction (Kapitalerträge mit Steuerabzug)?
Clients can claim a capital gains tax reduction by applying for tax allowances and submitting the relevant tax documentation on the app. After the documents have been received and validated, when the client sells their investments, the app Capital will not withhold capital gains taxes if their YTD capital gains have not exceeded the thresholds for relevant tax exemptions.
Exemption Order (Freistellungsaufträge)
6. What is an exemption order?
An exemption order allows clients to claim a capital gains tax exemption of €1,000 per year (for single individuals) or €2,000 euros (for married individuals or registered partnerships). All German tax residents can apply for this exemption. Currently, the app’s clients can add an exemption order to their account in their profile on the mobile and web apps.
Non-Assessment Certificate (NV-Bescheinigung)
7. What is the non-assessment certificate?
A non-assessment certificate allows clients with little income but high capital gains to claim a capital gains tax exemption of €12,096 per year (for single individuals) or €24,192 per year (for married individuals or registered partnerships). Only German tax residents with income below the basic allowance can apply for this exemption. The non-assessment certificate is valid for 3 years.
Note: The non-assessment certificate is only valid as long as the client’s salary income and capital gains combined do not exceed their basic allowance → (Salary Income + Capital Gains) < Basic Allowance.
8. What is the basic allowance (Grundfreibetrag)?
The basic allowance represents the minimum amount people need to cover living expenses, which is set at €12,096 per year for single individuals and €24,192 per year for married individuals. German tax residents whose income does not exceed the basic allowance do not have to pay any taxes.
9. What does it mean for a client to have a valid non-assessment certificate?
The non-assessment is valid IF the following conditions are met:
The client has uploaded a non-assessment certificate to their profile.
The client has uploaded the correct tax document.
The certificate is valid for the current year.
The client’s YTD capital gains and income combined do not exceed their basic allowance.
Note: if only condition 4 is not met, then the client cannot claim the tax allowance this year but it may be possible to claim it in subsequent years. The client should be informed of this, perhaps in the success message they see after uploading the certificate.
10. What’s the difference between an exemption order and a non-assessment certificate?
Tax Allowance | Income Threshold | Tax Exemption Threshold | Limitations |
Exemption Order | None | Capital gains up to €1,000 remain tax-free. | None |
Non-Assessment Certificate | Below Basic Allowance | Capital gains up to €12,096 (for single individuals) and €24,192 (for married individuals) remain tax-free. | (Income + Capital Gains) must not exceed the basic allowance |
Losses
11. How are capital losses handled?
Where a single investor holds multiple capital instruments, the app must set off capital profits and losses in calculating the withholding tax paid to the fiscal authorities. Taxes are not withheld when the clients make a net loss on their investments. Unused tax losses can be carried forward into the next year (and to unlimited years after that, if needed), but cannot be carried back.
12. What is a loss offset pot?
The loss offset pot keeps track of the client’s total losses during the fiscal year. Each time the client makes a profit on a sale of financial investments, they offset this profit with the previous losses to determine IF there is a capital gain and the amount of capital gain → Capital Gain = Profit – Loss Offset.
IF (Profit – Loss Offset) > 0, then there is a capital gain but the total capital gain is reduced due to the losses, which reduces the taxable amount.
IF (Profit – Loss Offset) < 0, then there is no capital gain, which means no taxes are applicable, but the total loss offset pot is reduced by the amount offset.
IF there is a loss, the loss amount is added to the loss offset pot.
For example, suppose the client’s sales result in the following outcomes: a loss of €500 from selling stocks in Company A, and a loss of €500 from selling stocks in Company B. Then, the client’s loss offset pot records a total loss of €1,000.
The client now makes another sale that results in a profit of €2,000. They offset this profit with the previous losses → Capital Gain = Profit – Previous Losses = €2000 - €1,000 = €1,000. The client’s loss offset pot now records a total loss of €0.
New Non-Assessment Certificate Process
To implement the new non-assessment certificate process, we need to make three major changes: create a support page for the non-assessment certificate, create a non-assessment certificate upload option, and update the existing tax withholding process.
1. Create A Support Page
We need to add a support page for clients on the app and website with details about the non-assessment certificate (instructions, FAQs, etc.).
2. Create A Certificate Upload Option
We need to add an option for clients to upload a non-assessment certificate in the app's Taxes/Set up tax exemption section. The new certificate upload process can potentially be entirely automated.
High-Level Process Overview
1. The client is notified that a non-assessment certificate can now be uploaded.
2. The client is directed to a certificate submission screen.
3. The client uploads the certificate.
4. The system validates the certificate and provides a success or failure message.
Process Overview Diagram

Detailed Process Description
Step 1: Notify Clients
The client is notified that they can now upload a non-assessment certificate. It’s important to include enough context to highlight tax savings, eligibility, and application details. This can be done by using a combination of email, in-app messages, push notifications, etc.
Note: Only relevant clients should be notified, such as clients with capital gains exceeding the €1,000 limit but below the basic allowance.
Step 2: Certificate Submission Screen
The client should be directed to the Taxes/Set up tax exemption section, where they see an upload screen. The user should be able to:
Enter their annual income.
Tooltip message – “To claim this tax exemption, annual income cannot exceed €12,096/ year for single individuals and €24,192 per year for married individuals.”
Field Validation – IF input of the annual income field exceeds the client’s basic allowance, an error message should be displayed.
Upload a non-assessment certificate.
Click a link to access the support page.
A simple mockup of a screen the user might see:

Step 3: Client Uploads Certificate
Once the client enters their income details and uploads the certificate, the system validates the certificate. It checks for the following:
1. The correct document has been uploaded.
2. The certificate is currently valid.
3. The client’s YTD capital gains and income combined do not exceed their basic allowance.
Note: if only condition 3 is not met, then the client cannot claim the tax allowance this year but it may be possible to claim it in subsequent years. The client should be informed of this in the success message.
Consideration: It might be possible to use OCR to extract and review the certificate details. If not, then we would need a tax professional to review the certificate, which would delay confirmation. In that case, we would need to display a “Certificate sent for review” message.
Step 4: Success/Failure Message
The client should see a success or failure message after they have uploaded their certificate.
IF the client has a valid certificate, they should see a success message confirming that their certificate was accepted and indicate how much in capital gains they receive tax-free → Tax-Free Capital Gains = Client’s Basic Allowance – Annual Salary Income.
IF the client does not have a valid certificate, they should see a failure message directing them to check if they uploaded the right document OR check the support page.
Note: Users should be able to update their income even after uploading the certificate. This ensures that the tax allowance is accurately applied.
3. Update Existing Tax Withholding Process
We need to modify how the system withholds taxes on client payments by adding a check for the non-assessment certificate. The new tax withholding process can be entirely automated.
High-Level Process Overview
Here’s what happens when a client sells an investment (shares in an ETF, individual stocks, etc.):
The client sells an investment.
The system calculates capital gain.
The system determines capital gains tax withholdings.
The system calculates and withholds capital gains taxes.
The client receives a payment (with taxes deducted).
Process Overview Diagram
Current Process

Current Process

Introducing the non-assessment certificate will only affect Step 3. The other steps of the current process will remain the same.
Detailed Process Description
Step 1: Sale of a financial investment
The client (user) decides to cash out a financial investment (stocks, ETFs, etc.) by manually clicking “Sell” OR setting an instruction to sell at a certain price (take-profit or stop-loss order).
Step 2: Calculate Capital Gain
Step 2A: Calculate Gross Profit/Loss
To determine if there is a capital gain, we need to first calculate if the sale of the financial investment resulted in a profit or loss → Profit/Loss = (Final Return - Initial Investment)
1. IF there is a loss from the sale, there is no capital gain.
Update loss amount in the loss offset pot → New Loss Offset Pot Amount = Current Loss Offset Pot Amount + Loss From Sale.
Proceed to Step 5A.
IF there is a profit from the sale, there may be a capital gain, so proceed to Step 2B.
Step 2B: Check Loss Offset Pot
The system checks the loss offset pot amount to see if losses from the client's previous transactions can offset their profits. This reduces the capital gain, which reduces the capital gains tax.
Step 2C: Calculate Net Profit/Loss
To determine if there is a capital gain, we need to calculate if the net profit or loss after offsetting the profit from the sale of the financial investment resulted in the losses → Net Profit/Loss = Total Profit - Loss Offset Pot Amount.
1. IF there is a net loss means, there is no capital gain.
Update loss amount in the loss offset pot → New Loss Offset Pot Amount = Net Loss.
Proceed to Step 5A.
IF there is a net profit, there is a capital gain.
Define the capital gain → Capital Gain Amount = Net Profit.
Proceed to Step 3.
Step 3: Determine Tax Withholding
Step 3A: Check YTD Capital Gains
The system checks the total of YTD (Year-To-Date) capital gains to determine the relevant tax allowances to review: the exemption order OR the non-assessment certificate. The YTD capital gain is the total of all capital gains from sales of investments during the fiscal year. Depending on the amount, a different tax document may be applicable when determining tax withholdings.
IF the YTD capital gains ≤ €1,000, either the exemption order OR the non-assessment certificate may be applicable, so proceed to Step 3B.
IF the YTD capital gains > €1,000, only the non-assessment certificate may be applicable, so proceed to Step 3C.
Step 3B: Check for a valid Exemption Order
The system checks if the client has uploaded an exemption order AND IF the order is valid for the current year.
IF the exemption order is NOT valid, proceed to Step 3C.
IF the exemption order is valid, proceed to Step 5A.
Step 3C: Check for a valid Non-Assessment Certificate
The system checks if the client has uploaded a non-assessment certificate AND IF the certificate is valid for the current year.
IF the non-assessment certificate is NOT valid, proceed to Step 5B.
IF the non-assessment certificate is valid, proceed to Step 5A.
Step 4: Calculate Capital Gains Taxes
In the case neither the exemption certificate nor the non-assessment certificate is valid (or available), the app must withhold capital gains taxes from the funds being deposited to the client’s account. The taxes are charged only on the capital gain NOT the client’s investment return.
Step 5: Deposit Funds
Step 5A: Deposit funds without withholding Capital Gains Taxes
Generate a contract note for the completed trade and deposit the investment return into the client's account without withholding any capital gains taxes.
Step 5B: Deposit funds and withhold Capital Gains Taxes
Generate a contract note for the completed trade and deposit the investment return into the client's account after deducting capital gains taxes. The taxes withheld are then sent to the tax agency.
Step 6: Remind clients to upload the certificate (Optional)
For clients who may qualify, it can be helpful to trigger a reminder to upload a non-assessment certificate when they sell investments and capital gains taxes are withheld. Highlighting potential tax savings at the moment taxes are deducted can make the benefit clearer.
Example
A client sells €2,000 worth of shares in an ETF.
The client initially purchased the shares for €500 and sold them at €2,000, making a profit of €1,500. The client’s loss offset pot records a total loss of €500. The client offsets their profit by €500. This means a net profit is €1,000. Therefore, the client’s capital gain is €1,000.
Suppose the client has a YTD capital gain of €500 this year, when we add the capital gain from the current sale (€1,000), the YTD capital gain is €1,500. This puts the client above the €1,000 threshold, so we need to check if they have a valid non-assessment certificate.
Scenario 1 – Taxes Not Withheld: The client has a valid non-assessment certificate, so no capital gains taxes will be withheld. The client receives the entire investment return of €2,000.
Scenario 2 – Taxes Withheld: The client does NOT have a valid non-assessment certificate, so capital gains taxes will be withheld. Since the client has made a capital gain of €1,000, we charge capital gains tax on this amount NOT the return (€2,000) from selling their shares. The taxes would be as follows:
Total Capital Gains Taxes = Withholding Tax (25% of Capital Gain) + Solidarity Surcharge (5.5% of Withholding Tax) = €250 + €13.75 = €263.75
The client is charged a total capital gains tax of €263.75 on their sale of €2,000 worth of shares.
The client receives the following amount in their account:
Funds To Deposit = Investment Return – Total Capital Gains Taxes = €2,000 - €263.75 = €1736.25
After taxes, the client receives €1736.25 and the tax agency receives the taxes withheld.
Possible Scenarios And Outcomes
# | Scenario | Outcome |
1 |
| Deposit funds (Investment Return) into the Client’s account |
2 |
| Deposit funds (Investment Return) into the Client’s account |
3 |
| Deposit funds (Investment Return) into the Client’s account |
4 |
| Deposit funds (Investment Return) into the Client’s account |
5 |
| Deposit funds (Investment Return) into the Client’s account |
6 |
| Deposit funds (Investment Return - Taxes) into the Client’s account AND deposit taxes to the Tax Agency’s account |
7 |
| Deposit funds (Investment Return - Taxes) into the Client’s account AND deposit taxes to the Tax Agency’s account |
8 |
| Deposit funds (Investment Return - Taxes) into the Client’s account AND deposit taxes to the Tax Agency’s account |
Considerations
Tax-Free Capital Gains Available The client may not know how much tax-free capital gains they have left. Therefore, it may be helpful to indicate the available limit by either displaying the available limit in the app’s tax exemptions section OR periodically sending reminder messages (For example, You can still claim €2,000 worth of capital gains tax-free this year!”).
Income Accuracy: The non-assessment certificate is only valid when the client’s salary income and capital gains combined do not exceed their basic allowance. If clients provide incorrect income data, the app might fail to withhold taxes, when necessary, which complicates tax filing for clients. Therefore, we need to regularly remind these clients to verify their income.
Support Request Post-Rollout: The non-assessment certificate is a new tax document for clients. They may initially have questions, which would increase support requests. Therefore, it’s important to create a robust support page (with FAQs, instructions, tutorials, etc.) and ensure support channels (support staff, chatbots, etc.) are prepared to assist clients after the rollout.
Future Tax Allowances: Once this process is implemented, clients might be interested in claiming other tax allowances. When updating the withholding step (Step 3), the engineering team should consider how they can make it easier to add checks for other tax allowances in the future.