Tax

Australian individual income tax for someone with salary, contracting and share income.
Author

Benedict Thekkel

1. The big picture: how income tax works in Australia

  • As a resident for tax purposes you pay tax on your taxable income for the financial year (1 July to 30 June).
  • The system is progressive: a higher income attracts a higher marginal rate, but only on the portion of income inside that bracket.
  • You lodge a return with the Australian Taxation Office (ATO) each year declaring all assessable income, claiming allowable deductions, and calculating what you owe or are refunded.
  • On top of income tax there is the Medicare levy, generally 2% of taxable income once you are above the low income threshold.
  • If you hold a study loan (HELP, HECS, SFSS, VSL) a compulsory repayment is calculated from your repayment income. It is withheld alongside PAYG but it is a debt repayment, not a tax.

The interesting case, and the one this notebook works through, is having more than one kind of income at once: salary with PAYG withheld, contracting income with nothing withheld, and share income that arrives as dividends and capital gains. Each is declared differently and each carries a different deduction regime.


2. The three income types and what each one means

Employment income

  • Your employer withholds PAYG tax from each payslip, so tax on this income is largely pre-paid.
  • Your income statement (formerly the payment summary) is finalised by the employer and pre-fills into myTax, usually by mid July.
  • Employer superannuation contributions are not part of your taxable income. They go to your super fund and are taxed inside it at 15%.
  • Study loan repayments withheld appear on the payslip but are not a tax credit. They reduce the loan balance, and they do not reduce the tax you owe.

Contracting income

  • A private contractor is normally a sole trader unless a company has been set up. See the ATO guidance on working as an independent contractor.
  • Nothing is withheld, so you have to set money aside yourself. A common rule of thumb is 25% to 30% of contracting income.
  • Register a free ABN as a sole trader and quote it on invoices. Without an ABN the payer may be required to withhold 47%.
  • GST registration becomes compulsory once turnover passes $75,000. Below that it is optional and usually not worth the administration.
  • Where the income is essentially payment for your personal skills rather than a product, the Personal Services Income (PSI) rules can apply and restrict which deductions are available.

Investment income

  • All investment income must be declared: interest, dividends including franking credits, and capital gains or losses on share sales.
  • Under dividend imputation you declare the cash dividend plus the franking credit, then receive the franking credit back as a tax offset. A fully franked dividend has already had 30% company tax paid on it.
  • A share held more than 12 months qualifies for the 50% CGT discount for individuals.
  • A capital loss can only offset a capital gain, not salary. Unused losses carry forward indefinitely.
  • Whether you are an investor or a trader matters. A trader’s gains are ordinary income, with no CGT discount, but losses are deductible against other income.

3. Deductions: what is claimable and what is not

A deduction reduces taxable income, so it is worth your marginal rate, not its face value. A $100 deduction at the 30% marginal rate saves $30, not $100.

Work from home

Two methods, and you pick one for the whole year:

Method Rate What it covers Records needed
Fixed rate 70c per hour (2024-25 onward) Electricity, gas, internet, phone, stationery, computer consumables A record of actual hours worked from home for the full year, not an estimate
Actual cost Real expense apportioned Anything you can substantiate and apportion Bills, floor area or usage apportionment, a 4 week representative diary

Under the fixed rate method you cannot separately claim internet or phone. You can still separately claim depreciation on equipment such as a desk, chair or monitor.

The common no-go areas

  • Commuting between home and a regular workplace.
  • Conventional clothing, even if you only wear it to work.
  • Anything your employer reimbursed you for.
  • Study loan repayments.
  • The cost of managing tax affairs is deductible, but the tax itself is not.

Contractor business expenses

The rules differ from employee expenses. A sole trader deducts business expenses against business income: home office, tools, professional indemnity insurance, accounting fees, and the business portion of phone and internet. Where the PSI rules apply, deductions are restricted roughly to what an employee doing the same work could claim.


4. A worked example

The figures below are illustrative round numbers chosen to show the mechanics. They are not anyone’s actual return. The real calculation for this household lives in a private notebook that is excluded from the published site (see section 7).

Take a resident individual with:

  • Employment income: $60,000, with $10,000 of PAYG withheld
  • Contracting income: $8,000, nothing withheld
  • Investment income: $1,000 of fully franked dividends, carrying $428.57 of franking credits
  • Deductions: $2,000 of work-related expenses

Step 1: assessable income

Source Amount
Employment $60,000.00
Contracting $8,000.00
Dividends (cash) $1,000.00
Franking credits (grossed up) $428.57
Total assessable income $69,428.57

Step 2: taxable income

Item Amount
Assessable income $69,428.57
Less deductions -$2,000.00
Taxable income $67,428.57

Step 3: tax on taxable income

Using the 2024-25 resident rates:

Bracket Rate Tax
$0 to $18,200 0% $0.00
$18,201 to $45,000 16% $4,288.00
$45,001 to $67,428.57 30% $6,728.57
Income tax before offsets $11,016.57

Step 4: offsets, levy and credits

Item Amount
Income tax before offsets $11,016.57
Less LITO $0.00
Medicare levy at 2% +$1,348.57
Total tax liability $12,365.14
Less PAYG withheld -$10,000.00
Less franking credits -$428.57
Amount owed to the ATO $1,936.57

LITO is nil here because it tapers out completely at $66,667 of taxable income. The franking credit is worth its full face value as a credit, which is why a fully franked dividend is the most tax-efficient of the three income types at this marginal rate.

The shape of the result is the point: the salary was close to fully covered by PAYG, and almost the whole balance owing comes from the contracting income that had nothing withheld. That is the structural reason to set money aside from contracting as it arrives.


# Australian resident individual tax, 2024-25 and 2025-26 rates.
# Illustrative inputs. Substitute your own figures, or use the private notebook
# that reads the real payslips and invoices.

from dataclasses import dataclass, field

# Resident marginal rates. Each entry is (upper bound of bracket, rate).
# The Stage 3 cuts took effect on 1 July 2024, so 2024-25 and 2025-26 share these.
RESIDENT_BRACKETS_2024_25 = [
    (18_200, 0.00),
    (45_000, 0.16),
    (135_000, 0.30),
    (190_000, 0.37),
    (float("inf"), 0.45),
]

MEDICARE_LEVY_RATE = 0.02
LITO_MAX = 700.00


def income_tax(taxable, brackets=RESIDENT_BRACKETS_2024_25):
    """Tax before offsets on a taxable income, stepping through each bracket."""
    tax, lower = 0.0, 0.0
    for upper, rate in brackets:
        if taxable <= lower:
            break
        tax += (min(taxable, upper) - lower) * rate
        lower = upper
    return tax


def lito(taxable):
    """Low Income Tax Offset: $700 up to $37,500, then two taper rates."""
    if taxable <= 37_500:
        return LITO_MAX
    if taxable <= 45_000:
        return max(0.0, LITO_MAX - (taxable - 37_500) * 0.05)
    if taxable <= 66_667:
        return max(0.0, 325.00 - (taxable - 45_000) * 0.015)
    return 0.0


def medicare_levy(taxable, threshold=27_222):
    """Medicare levy at 2%, zero below the single-person threshold.

    The shade-in range just above the threshold is ignored here; it only matters
    for incomes between roughly $27k and $34k.
    """
    return taxable * MEDICARE_LEVY_RATE if taxable > threshold else 0.0


@dataclass
class Return:
    """One year's figures. Every amount is in dollars."""
    employment: float = 0.0
    contracting: float = 0.0
    dividends_cash: float = 0.0
    franking_credits: float = 0.0
    capital_gain_net: float = 0.0     # after any 50% discount
    deductions: float = 0.0
    payg_withheld: float = 0.0
    study_loan_withheld: float = 0.0  # reported, never a tax credit

    @property
    def assessable(self):
        return (self.employment + self.contracting + self.dividends_cash
                + self.franking_credits + self.capital_gain_net)

    @property
    def taxable(self):
        return max(0.0, self.assessable - self.deductions)

    def summary(self):
        taxable = self.taxable
        before = income_tax(taxable)
        offset = lito(taxable)
        levy = medicare_levy(taxable)
        liability = max(0.0, before - offset) + levy
        credits = self.payg_withheld + self.franking_credits
        return {
            "assessable income": self.assessable,
            "deductions": -self.deductions,
            "taxable income": taxable,
            "income tax before offsets": before,
            "less LITO": -offset,
            "medicare levy": levy,
            "total tax liability": liability,
            "less PAYG withheld": -self.payg_withheld,
            "less franking credits": -self.franking_credits,
            "amount owed (refund if negative)": liability - credits,
        }


def show(r):
    rows = r.summary()
    width = max(len(k) for k in rows)
    print("=" * (width + 18))
    for label, amount in rows.items():
        print(f"  {label:<{width}}  {amount:>14,.2f}")
    print("=" * (width + 18))
    if r.study_loan_withheld:
        print(f"  {'study loan withheld (not a credit)':<{width}}  "
              f"{r.study_loan_withheld:>14,.2f}")
    rate = rows["total tax liability"] / r.assessable * 100 if r.assessable else 0.0
    print(f"  {'effective tax rate':<{width}}  {rate:>13.1f}%")


# The illustrative return from section 4.
example = Return(
    employment=60_000.00,
    contracting=8_000.00,
    dividends_cash=1_000.00,
    franking_credits=428.57,
    deductions=2_000.00,
    payg_withheld=10_000.00,
    study_loan_withheld=1_200.00,
)
show(example)

5. Compliance and admin checklist

Item Why it matters Action
ABN for contracting income The ATO expects a contractor to operate as a business, and a payer may withhold 47% without one Register free as a sole trader and quote it on every invoice
Separate bank account for contracting Separates business from personal and makes deduction tracking possible Open one, and route all contracting income and expenses through it
Tax buffer on contracting income Nothing is withheld, so the whole liability lands at lodgement Move 25% to 30% of each invoice aside as it is paid
PAYG instalments Once the ATO sees a pattern of tax owing it will put you into the quarterly instalment system Expect it after the first year with significant contracting income
Work from home hours log The fixed rate method needs a record of actual hours for the whole year, not an estimate Keep a running log rather than reconstructing it in July
Broker statements You need correct cost bases and franking credits for CGT and dividend reporting Export the annual tax statement from each broker and keep it with the year’s records
Lodgement deadline Penalties apply for late lodgement 31 October if lodging yourself. A registered tax agent gets a later date, but you must be on their books before 31 October
Record retention The ATO can review a return for years afterward Keep records 5 years from lodgement, and for shares, 5 years after the asset is sold

6. Forward planning

  • Superannuation is the largest available lever. Concessional contributions are taxed at 15% inside super instead of your marginal rate. The concessional cap is $30,000 for 2024-25, and unused cap from the previous five years can be carried forward if your super balance is under $500,000. For someone on a 30% marginal rate that is a 15 cent saving per dollar, at the cost of locking the money up until preservation age.
  • Hold shares past 12 months where the decision is otherwise neutral. The 50% CGT discount is usually worth more than any short-term timing advantage.
  • Time capital gains and losses against each other. Losses only offset gains, so realising a loss in the same year as a gain is worth more than realising it in a year with no gains.
  • Watch the $75,000 GST threshold as contracting grows. Crossing it means registration, quarterly BAS lodgement, and charging GST on invoices.
  • Reconsider the structure only when the numbers justify it. A company pays a flat rate but adds real annual compliance cost, and the PSI rules often remove the benefit anyway for skills-based work.
  • A registered tax agent is itself deductible and is generally worth it once contracting and investments are both in play.

7. Where the real figures live

This notebook is published, so it deliberately contains no actual income, deduction or tax figures. Everything above is either a published ATO rate or an illustrative round number.

The real calculation lives in p_02_my_tax_2024-25.ipynb in this same folder. It reads the payslips, invoices and broker exports directly and produces the lodgement figures. The p_ prefix keeps it out of the site navigation, and the project.render exclude list in _quarto.yml keeps it out of the published site entirely.

See also:

  • 02_Personalise_Return.ipynb for the myTax “Personalise your return” screen, which decides which sections of the return you are shown.
  • tax_helpers.py and extract_payslips.py for the extraction code the private notebook uses.

References

Back to top