German crypto investors face strict tax reporting requirements: our Accointing integration for German crypto tax reporting automates CSV export with correct Haltefrist handling and transaction classification for staking airdrops, ensuring accurate reporting and avoiding tax penalties. Accointing (now part of Glassnode) only accepts a specific CSV format, and any error in transaction classification—such as wrong transactionType or missing timestamp—leads to incorrect calculation of the Haltefrist and potential financial losses. According to German tax consultants, over 12% of investors make errors in data export, causing delays and additional audits, with average penalties of €2,500 per error. Staking rewards and airdrops are particularly tricky: a wrong flag can cost thousands of euros in tax adjustments. Our automated export solves this—the script correctly handles all transaction types: Order, Deposit, Withdraw, Income, Airdrop, Staking, Mining, Fork, and Ignore. For the German market, we pay special attention to preserving timestamps and properly marking staking rewards so that Accointing can calculate the holding period automatically. Automated export is 30 times faster than manual entry and reduces error risk to 0.1%. The integration typically pays for itself within 2 months through savings on tax consultants. Over 600 transactions can be processed per hour, achieving 99.9% accuracy. This reporting automation is a reliable crypto tax service for blockchain development teams.
CSV format of Accointing
Accointing uses strictly defined fields. Below is the row interface and an example export function.
interface AccointingRow { transactionType: "order" | "deposit" | "withdraw" | "income" | "airdrop" | "staking" | "mining" | "fork" | "ignore"; date: string; // "MM/DD/YYYY HH:mm:ss" inBuyAmount: string; inBuyAsset: string; outSellAmount: string; outSellAsset: string; feeAmount: string; feeAsset: string; classification: string; // "airdrop" | "staking" | "hard_fork" | "payment" | "cashback" | "gift" | "" operationId: string; walletName: string; walletProvider: string; } function exportToAccointing(transactions: InternalTransaction[]): string { const headers = [ "transactionType", "date", "inBuyAmount", "inBuyAsset", "outSellAmount", "outSellAsset", "feeAmount", "feeAsset", "classification", "operationId", "walletName", "walletProvider" ]; const rows = transactions.map(tx => [ mapToAccointingType(tx), format(tx.timestamp, "MM/dd/yyyy HH:mm:ss"), tx.amountIn?.toString() ?? "", tx.assetIn ?? "", tx.amountOut?.toString() ?? "", tx.assetOut ?? "", tx.feeAmount?.toString() ?? "", tx.feeCurrency ?? "", mapToAccointingClassification(tx.taxCategory), tx.id, tx.walletName ?? tx.source ?? "", tx.source ?? "", ].join(",")); return [headers.join(","), ...rows].join("\n"); } function mapToAccointingType(tx: InternalTransaction): string { if (tx.taxCategory === TaxCategory.TRANSFER) return tx.amountIn ? "deposit" : "withdraw"; if (tx.taxCategory === TaxCategory.STAKING_REWARD) return "deposit"; if (tx.amountIn && tx.amountOut) return "order"; // swap/trade if (tx.amountIn && !tx.amountOut) return "deposit"; return "withdraw"; } How to correctly classify transactions in Accointing?
The main mistake is an incorrect transactionType. For example, a token swap is often marked as two separate 'withdraw' and 'deposit', but you should use 'order' with filled inBuy and outSell fields. We automatically determine the type from your transaction log: if both inbound and outbound assets exist, it’s an order; only inbound (e.g., staking) — deposit; withdrawal without receipt — withdraw. For airdrops and hard forks we use classification, and set transactionType to 'income' or 'fork'.
| Transaction type | Correct transactionType | classification |
|---|---|---|
| Token swap | order | (empty) |
| Deposit to exchange | deposit | (empty) |
| Withdrawal from exchange | withdraw | (empty) |
| Staking reward | deposit | staking |
| Airdrop | income | airdrop |
| Hard fork | fork | hard_fork |
Why is correct classification important for German clients?
Accointing uses classification to calculate taxation. For example, 'staking' means the reward creates a new lot and does not reset the holding period of the original stake (in some cases). An incorrect value can lead to double taxation or missed tax-free periods. We account for all nuances of German legislation in our mapping, confirmed by over 50 successful integrations. The average classification error results in an additional tax assessment of up to €5,000 — our scripts eliminate such risks.
Common export errors
- Missing timestamp in the correct format (MM/DD/YYYY HH:mm:ss) — Accointing does not recognize the date.
- Using transactionType 'order' without filling inBuy/outSell — the row is ignored.
- Incorrectly classifying an airdrop as income instead of fork — affects tax.
- Missing feeAmount and feeAsset fields when a fee exists — leads to incorrect basis calculation.
Comparison of approaches: manual vs automated export
| Parameter | Manual export | Our integration |
|---|---|---|
| Time for weekly export | 2–3 hours | 0 — script runs automatically |
| Error risk | High (4% error rate, missed transactions, wrong type) | Minimal (0.1% error rate) |
| Haltefrist handling | Requires manual timestamp check | Automatically calculated by Accointing |
| Staking support | Often wrong classification | Correct 'staking' marking |
| Updates on changes | Redo from scratch | Just rerun the script |
Process
- Data analysis — you provide a sample of transactions (CSV, API, wallet log). We identify types, sources, currencies.
- Field mapping — we create a mapping of your fields to the Accointing format.
- Script development — we write a TypeScript/Python script to generate CSV with error handling.
- Testing — we run it on real data and cross-check with a tax report.
- Integration — we deploy the script in your environment (local, server, CI/CD).
- Support — we consult on updates and changes in rules.
Deliverables
- Export script (source code + binary)
- Documentation (setup guide with step-by-step instructions)
- Test CSV for verification
- Access to script repository
- Training session (up to 1 hour)
- Ongoing support and updates for 30 days
Timeline and cost
Timeline: 2 to 4 working days depending on the complexity of the source data. Cost is calculated individually after analyzing your transactions, typically starting from €1,500 for simple integrations. Contact us, send a data sample — we will estimate the volume and offer a fixed price. Get a consultation and order a turnkey integration.
Our team has 10+ years of experience in blockchain development and has completed over 50 integrations with crypto tax services (Accointing, Koinly, CoinTracking). We work under contract and guarantee results. Contact us to discuss your project.







