Ga naar hoofdinhoud

BTW-aangifte (VAT filings)

Shillinq implements quarterly and monthly Dutch BTW-aangifte preparation on top of the existing bookkeeping foundation. VAT is derived declaratively from GL transactions marked vatApplicable: true; the operator reviews and submits the prepared return.

Overview​

ConceptSchemaPurpose
VATReturnone per period + regimeContainer with totals + lifecycle
VATDeclarationone per (type, rate) within returnPer-rubriek bucket
VATLineone per GL postingAudit link to source transaction

The return moves through draft → submitted → verified → filed. Lines are immutable once submitted; rebase to draft to recompute.

Workflow​

1. Create a return​

Navigate to BTW-aangifte → Nieuw. Pick:

  • Administration — which administration this return belongs to.
  • Period — quarter (default), month, or year.
  • Year + period number — e.g. 2026 + 1 = Q1 2026.
  • Regime — standard (21/9/0%), KOR (vrijgesteld), or reverse-charge (intra-EU).

The server validates that the period is not in the future and not before the administration's start date, then derives the VAT lines from GL: for every transaction in the period that posts to an account where vatApplicable = true, a VATLine is created and grouped into a VATDeclaration by (type, rate). Totals roll up into the parent VATReturn (totalVATCollected, totalVATPaid, vatBalance).

2. Review the declarations and lines​

The detail page shows three sections:

  • Summary — return number, period, regime, totals, balance.
  • Rubrieken (declarations) — one row per (type, rate) bucket.
  • Regels (lines) — every underlying GL posting with the audit link to its glTransactionId.

If you spot a posting that should not be VAT-bearing, adjust the GL entry — the VAT line will be re-derived on the next rebase.

3. Submit​

Click Indienen on a draft return. The server validates that the totals are non-negative and stamps submissionDate. The return is now read-only.

4. Rebase (re-open) if needed​

If new GL postings land in the same period after a submit, click Heropenen on the submitted return. The lifecycle transitions back to draft, the existing VAT lines are dropped, and the derivation runs again against the current GL.

Regimes​

Standard​

Applies the Dutch standard rate (21%) for high-rate sales, the reduced rate (9%) for food, books, energy, etc., and 0% for export. Mixed returns are grouped by rate.

KOR (Kleineondernemersregeling)​

Small-business exemption. totalVATCollected and totalVATPaid are forced to 0; no rubrieken are produced. The detail page shows a note explaining the KOR exemption.

Reverse-charge​

Intra-EU and import purchases / services. The VAT amount is captured on the operator's side via VATLine.type = 'reverse-charge' with reverseChargeApplicable = true. Reverse-charge VAT folds into totalVATPaid because the operator self-accounts.

FAQ​

Q: A GL entry is wrong — how do I fix the return? A: Adjust the GL entry, then rebase the return (draft → re-derive).

Q: The return is already filed but I have new invoices. A: Contact the Belastingdienst — Shillinq does not allow editing filed returns. The new postings will appear in the next period's return.

Q: Where is the XML export? A: T3 prepares the return data; XML export to the Belastingdienst gateway is a T4 / integration responsibility tracked separately.

Retention​

VAT returns and lines are retained for 7 years per article 52 of the Algemene Wet inzake Rijksbelastingen. The schema declares this explicitly via x-openregister-lifecycle.retention.

References​

  • Spec: openspec/changes/bookkeeping-vat-btw-filing/specs/bookkeeping-vat-btw-filing.md
  • Proposal: openspec/changes/bookkeeping-vat-btw-filing/proposal.md
  • Design: openspec/changes/bookkeeping-vat-btw-filing/design.md
  • Belastingdienst — Hoe vraag ik aangifte aan?: https://www.belastingdienst.nl