How the calculators work, and every test
The rules in the order we apply them, how days and dates are counted, and every test case with its result from this build.
Rules checked 10 November 2026.
The order we apply the rules
- Inherited property, farmland, business premises and the 2023 weather event sales are excluded first (IR1229 pp2, 24 to 28).
- The sale agreement date picks the rules: on or after 1 July 2024, the 2-year test; before that, the period set by the purchase agreement date (IR1229 p6, IR1227 p6).
- The period runs from the title registration date (the purchase agreement date for off the plans) to the sale agreement date. The sale is inside if the sale agreement is before the anniversary.
- If it was your main home, we test the land area and the days, ignoring construction, and apply the limits. For older sales of property acquired on or after 27 March 2021, we apportion as IR1227 shows.
- Gain is the sale price less the purchase price, purchase costs, capital improvements, selling costs and the holding costs you enter, times your ownership share.
- Tax is the difference between income tax on your other income plus the gain and income tax on your other income alone, for the tax year of settlement, using the shared IRD-tested brackets from Tax Calculator NZ.
Counting days and dates
We count days including both the first and the last day, which matches most IRD examples (Ari 590 days, Amelia 272, Zoe 1,096). IRD’s Mel example counts one day fewer; no example’s outcome changes. Dates are handled as calendar dates in UTC, so results never depend on your time zone. A 29 February start date reaches its anniversary on 1 March in a year without 29 February (our assumption).
The anniversary day
Neither IRD guide says what happens to a sale agreement signed exactly on the anniversary of the start date. IR1229 p39 says “taxable if sold before” the anniversary, so we treat the anniversary as outside the period, flag it in the result, and suggest signing a day later to be safe.
What the calculators do not model
- Other non-standard start dates (subdivided or partitioned land, perpetual leases, nominees, trustee changes, land overseas): enter the start date IR1229 p8 gives for your case.
- Different main homes for each co-owner, and the trust rules for main homes.
- The qualifying new build test itself (code compliance certificate dates): you tell us if it applies. It only matters for sales before 1 July 2024.
- Depreciation recovery, residential land withholding tax, GST, and tax rates for companies and trusts: we use individual rates.
- The intention test, dealer rules, shares, FIF and crypto are covered by the checker as likely outcomes, not calculated.
Every test, run at build time
28 of 28 current-law cases pass (127 checks), from IRD’s worked examples in IR1229 and IR1227. This build: 10 November 2026. If any case fails, the site is not built.
| Case | Source | Checks | Result |
|---|---|---|---|
TC01_mia_two_year_switch | IR1229 p7 (Mia) | 3 | Pass |
TC02_marie_dates | IR1229 p7 (Marie) | 6 | Pass |
TC03_bob_subdivided | IR1229 p9 (Bob) | 4 | Pass |
TC04_denise_off_the_plans | IR1229 p11 (Denise) | 3 | Pass |
TC05_kelly_perpetual_lease | IR1229 p12 (Kelly) | 2 | Pass |
TC06_helen_gift | IR1229 p14 (Helen) | 4 | Pass |
TC07_mel_main_home_applies | IR1229 p17 (Mel) | 7 | Pass |
TC08_ari_main_home_fails | IR1229 p18 (Ari) | 5 | Pass |
TC09_kate_short_rental | IR1229 p17 (Kate) | 3 | Pass |
TC10_amelia_construction_ignored | IR1229 p23 (Amelia) | 7 | Pass |
TC11_mele_area_test | IR1229 p16 (Mele) | 3 | Pass |
TC12_pinky_shop_with_living | IR1229 p16 (Pinky) | 3 | Pass |
TC13_emma_twice_in_two_years | IR1229 p20 (Emma) | 4 | Pass |
TC14_josh_off_plan_new_build | IR1229 p22 (Josh) | 3 | Pass |
TC15_debbie_mike_holding_costs_2yr | IR1229 pp43 to 44 (Debbie and Mike); net profit derived, IRD lists components only | 6 | Pass |
TC16_zac_ring_fenced_loss | IR1229 p47 (Zac); tax figure derived from IRD_TAX_RATES | 5 | Pass |
TC17_kai_anji_parent_child_rollover | IR1229 p32 (Kai and Anji) | 5 | Pass |
TC18_isla_heidi_ezra | IR1229 p32 (Isla, Heidi and Ezra) | 6 | Pass |
TC19_alex_karen_relationship_property | IR1229 p29 (Alex and Karen) | 5 | Pass |
TC20_hina_coowner_share | IR1229 p39 (Hina and Andy) | 4 | Pass |
TC21_omar_inherited | IR1229 p28 (Ali and Omar) | 2 | Pass |
TC22_felix_apportionment_area | IR1227 pp30 to 32 (Felix) | 7 | Pass |
TC23_bud_apportionment_partial_time | IR1227 pp33 to 35 (Bud) | 6 | Pass |
TC24_gordon_two_houses | IR1227 pp36 to 38 (Gordon) | 6 | Pass |
TC25_louis_full_exclusion_two_houses | IR1227 p28 (Louis) | 2 | Pass |
TC26_zoe_12_month_buffer | IR1227 p29 (Zoe) | 6 | Pass |
TC27_debbie_mike_five_year_regime | IR1227 pp63 to 64 (Debbie and Mike, 2020 version); net profit derived | 4 | Pass |
TC28_marginal_tax_on_gain | Derived from IRD_TAX_RATES (not an IRD worked example). Same figures as the Opes Partners example, checked here. | 6 | Pass |
Labour model tests (NOT LAW, counted separately)
5 of 5 cases pass. These check our model against Labour’s published examples; they say nothing about whether the proposal becomes law.
| Case | Source | Checks | Result |
|---|---|---|---|
P01_commercial_quick_example | labour.org.nz/capitalgainstax quick example (tax figure derived) | 3 | Pass |
P02_sarah_michael | labour.org.nz/capitalgainstax (tax figure derived) | 3 | Pass |
P03_jim_pat_family_home | labour.org.nz/capitalgainstax | 2 | Pass |
P04_higher_of_rule_bought_after_start | Derived from Labour's higher-of rule; illustrative only | 3 | Pass |
P05_national_dairy_claim | National Party release 2026-09-02 https://www.national.org.nz/news/260902-nicolawillis-1 (party claim) | 1 | Pass |
Our own logic checks
9 of 9 pass. These cover the end date finder, the checker and date handling.
| Case | Source | Checks | Result |
|---|---|---|---|
L01_end_date_two_year | Our logic, from cgt-rules.json | 2 | Pass |
L02_end_date_leap_day | Our logic, from cgt-rules.json | 1 | Pass |
L03_end_date_older_regime | Our logic, from cgt-rules.json | 2 | Pass |
L04_end_date_pre_2015 | Our logic, from cgt-rules.json | 1 | Pass |
L05_anniversary_flag | Our logic, from cgt-rules.json | 1 | Pass |
L06_checker_main_home | Our logic, from cgt-rules.json | 1 | Pass |
L07_checker_intention | Our logic, from cgt-rules.json | 1 | Pass |
L08_checker_fif | Our logic, from cgt-rules.json | 1 | Pass |
L09_utc_dates | Our logic, from cgt-rules.json | 2 | Pass |